Skip to content

Commit df9e433

Browse files
authored
Merge branch 'main' into alix/codex-supervisor-stdio-stream-errors
2 parents bd9acd0 + 6620aba commit df9e433

1,513 files changed

Lines changed: 38036 additions & 10985 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci-build-artifacts-testbox.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ jobs:
9898
run: |
9999
set -euo pipefail
100100
101-
cache_prefix="${RUNNER_OS}-dist-build-"
101+
cache_prefix="${RUNNER_OS}-dist-build-v2-"
102102
declare -A seen=()
103103
104104
resolve_tag_sha() {
@@ -150,7 +150,8 @@ jobs:
150150
.artifacts/build-all-cache/
151151
dist/
152152
dist-runtime/
153-
key: ${{ runner.os }}-dist-build-${{ github.sha }}
153+
packages/*/dist/
154+
key: ${{ runner.os }}-dist-build-v2-${{ github.sha }}
154155
restore-keys: ${{ steps.dist-cache-seeds.outputs.restore-keys }}
155156

156157
- name: Build dist on cache miss
@@ -170,6 +171,7 @@ jobs:
170171
171172
test -d dist
172173
test -d dist-runtime
174+
test -f packages/ai/dist/internal/runtime.mjs
173175
if [[ ! -f dist/index.js && ! -f dist/index.mjs ]]; then
174176
echo "Missing dist/index.js or dist/index.mjs" >&2
175177
exit 1
@@ -185,7 +187,8 @@ jobs:
185187
.artifacts/build-all-cache/
186188
dist/
187189
dist-runtime/
188-
key: ${{ runner.os }}-dist-build-${{ github.sha }}
190+
packages/*/dist/
191+
key: ${{ runner.os }}-dist-build-v2-${{ github.sha }}
189192

190193
- name: Prepare Testbox shell
191194
shell: bash

.github/workflows/ci.yml

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,9 @@ jobs:
344344
requires_dist: shard.requiresDist,
345345
runner: shard.runner,
346346
timeout_minutes: shard.timeoutMinutes,
347+
requires_go:
348+
shard.shardName === "core-tooling" ||
349+
shard.groups?.some((group) => group.shard_name === "core-tooling"),
347350
}))
348351
: [];
349352
const nodeTestNonDistShards = nodeTestShards.filter((shard) => !shard.requires_dist);
@@ -669,9 +672,10 @@ jobs:
669672
path: |
670673
dist/
671674
dist-runtime/
675+
packages/*/dist/
672676
extensions/*/src/host/**/.bundle.hash
673677
extensions/*/src/host/**/*.bundle.js
674-
key: ${{ runner.os }}-dist-build-${{ needs.preflight.outputs.checkout_revision }}
678+
key: ${{ runner.os }}-dist-build-v2-${{ needs.preflight.outputs.checkout_revision }}
675679

676680
- name: Build dist
677681
if: steps.dist_build_cache.outputs.cache-hit != 'true'
@@ -684,7 +688,7 @@ jobs:
684688
run: pnpm ui:i18n:check
685689

686690
- name: Pack built runtime artifacts
687-
run: tar --posix -cf dist-runtime-build.tar.zst --use-compress-program zstdmt dist dist-runtime
691+
run: tar --posix -cf dist-runtime-build.tar.zst --use-compress-program zstdmt dist dist-runtime packages/*/dist
688692

689693
- name: Upload built runtime artifacts
690694
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
@@ -830,6 +834,7 @@ jobs:
830834
path: |
831835
dist/
832836
dist-runtime/
837+
packages/*/dist/
833838
extensions/*/src/host/**/.bundle.hash
834839
extensions/*/src/host/**/*.bundle.js
835840
key: ${{ steps.dist_build_cache.outputs.cache-primary-key }}
@@ -922,7 +927,7 @@ jobs:
922927
contents: read
923928
name: QA Smoke CI (${{ matrix.name }})
924929
needs: [preflight]
925-
if: needs.preflight.outputs.run_checks_fast == 'true'
930+
if: ${{ false }} # Temporarily disabled while QA smoke sharding is repaired.
926931
runs-on: ${{ github.event_name == 'workflow_dispatch' && 'ubuntu-24.04' || (github.repository == 'openclaw/openclaw' && 'blacksmith-16vcpu-ubuntu-2404' || 'ubuntu-24.04') }}
927932
timeout-minutes: 60
928933
strategy:
@@ -1009,7 +1014,7 @@ jobs:
10091014
contents: read
10101015
name: QA Smoke CI
10111016
needs: [preflight, qa-smoke-ci-shard]
1012-
if: always() && needs.preflight.outputs.run_checks_fast == 'true'
1017+
if: ${{ false }} # Temporarily disabled while QA smoke sharding is repaired.
10131018
runs-on: ubuntu-24.04
10141019
timeout-minutes: 5
10151020
steps:
@@ -1149,6 +1154,13 @@ jobs:
11491154
node-version: "${{ matrix.node_version || '24.x' }}"
11501155
install-bun: "false"
11511156

1157+
- name: Setup Go for docs i18n
1158+
if: matrix.requires_go == true
1159+
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6
1160+
with:
1161+
go-version-file: scripts/docs-i18n/go.mod
1162+
cache-dependency-path: scripts/docs-i18n/go.sum
1163+
11521164
- name: Configure Node test resources
11531165
run: echo "OPENCLAW_VITEST_MAX_WORKERS=2" >> "$GITHUB_ENV"
11541166

.github/workflows/openclaw-npm-release.yml

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on:
44
workflow_dispatch:
55
inputs:
66
tag:
7-
description: Release tag to publish, or a full 40-character workflow-branch commit SHA for validation-only preflight (for example v2026.3.22 or 0123456789abcdef0123456789abcdef01234567)
7+
description: Release tag to publish, or any full 40-character commit SHA for validation-only preflight (for example v2026.3.22 or 0123456789abcdef0123456789abcdef01234567)
88
required: true
99
type: string
1010
preflight_only:
@@ -133,6 +133,7 @@ jobs:
133133
- name: Validate npm release request
134134
env:
135135
BYPASS_EXTENDED_STABLE_GUARD: ${{ inputs.bypass_extended_stable_guard }}
136+
PREFLIGHT_ONLY: ${{ inputs.preflight_only }}
136137
RELEASE_NPM_DIST_TAG: ${{ inputs.npm_dist_tag }}
137138
RELEASE_TAG: ${{ inputs.tag }}
138139
NPM_WORKFLOW_REF: ${{ github.ref }}
@@ -207,19 +208,16 @@ jobs:
207208
RELEASE_SHA=$(git rev-parse HEAD)
208209
RELEASE_BRANCH_REF="refs/remotes/origin/${WORKFLOW_REF_NAME}"
209210
export RELEASE_SHA RELEASE_BRANCH_REF
210-
# Fetch the workflow branch so merge-base ancestry checks keep working
211-
# for older tagged commits contained in a release branch.
212-
git fetch --no-tags origin "+refs/heads/${WORKFLOW_REF_NAME}:refs/remotes/origin/${WORKFLOW_REF_NAME}"
213211
if [[ "${RELEASE_REF}" =~ ^[0-9a-fA-F]{40}$ ]]; then
214-
BRANCH_SHA="$(git rev-parse "${RELEASE_BRANCH_REF}")"
215-
if [[ "${RELEASE_SHA}" != "${BRANCH_SHA}" ]]; then
216-
echo "Validation-only SHA mode only supports the current ${WORKFLOW_REF_NAME} HEAD." >&2
217-
exit 1
218-
fi
219212
RELEASE_TAG="v$(node -p "require('./package.json').version")"
220213
export RELEASE_TAG
214+
RELEASE_BRANCH_REF="${RELEASE_SHA}"
215+
export RELEASE_BRANCH_REF
221216
echo "Validation-only SHA mode: using synthetic release tag ${RELEASE_TAG} for package metadata checks."
222217
else
218+
# Tagged release validation still proves the commit is contained in
219+
# the workflow branch selected by the operator.
220+
git fetch --no-tags origin "+refs/heads/${WORKFLOW_REF_NAME}:refs/remotes/origin/${WORKFLOW_REF_NAME}"
223221
RELEASE_TAG="${RELEASE_REF}"
224222
export RELEASE_TAG
225223
fi
@@ -231,8 +229,58 @@ jobs:
231229
# IF A CHECK CAN TAKE A LONG TIME, NEEDS LIVE CREDENTIALS, OR IS KNOWN TO BE FLAKY,
232230
# IT BELONGS IN openclaw-release-checks.yml INSTEAD OF BLOCKING npm PUBLISH.
233231
- name: Verify release contents
232+
env:
233+
OPENCLAW_RELEASE_CHECK_LOCAL_PACKAGE_TARBALL_DIR: ${{ steps.ai_runtime_tarballs.outputs.dir }}
234234
run: pnpm release:check
235235

236+
- name: Exercise all extended-stable plugin npm packages
237+
id: plugin_npm_preflight
238+
if: ${{ inputs.npm_dist_tag == 'extended-stable' }}
239+
env:
240+
OPENCLAW_PLUGIN_NPM_PUBLISH_TAG: extended-stable
241+
run: |
242+
set -euo pipefail
243+
plan="$RUNNER_TEMP/plugin-npm-extended-stable-preflight.json"
244+
artifact_dir="$RUNNER_TEMP/openclaw-plugin-npm-preflight"
245+
rm -rf "$artifact_dir"
246+
mkdir -p "$artifact_dir"
247+
node --import tsx scripts/plugin-npm-release-plan.ts \
248+
--selection-mode all-publishable \
249+
--npm-dist-tag extended-stable > "$plan"
250+
cp "$plan" "$artifact_dir/plugin-npm-release-plan.json"
251+
252+
mapfile -t package_dirs < <(jq -r '.all[].packageDir' "$plan")
253+
if [[ "${#package_dirs[@]}" == "0" ]]; then
254+
echo "Extended-stable plugin preflight resolved no publishable packages." >&2
255+
exit 1
256+
fi
257+
258+
runtime_args=()
259+
for package_dir in "${package_dirs[@]}"; do
260+
runtime_args+=(--package "$package_dir")
261+
done
262+
node scripts/check-plugin-npm-runtime-builds.mjs "${runtime_args[@]}"
263+
264+
for package_dir in "${package_dirs[@]}"; do
265+
OPENCLAW_PLUGIN_NPM_RUNTIME_BUILD=0 \
266+
OPENCLAW_PLUGIN_NPM_PACK_OUTPUT_DIR="$artifact_dir" \
267+
bash scripts/plugin-npm-publish.sh --pack "$package_dir" >/dev/null
268+
done
269+
270+
(cd "$artifact_dir" && sha256sum ./*.tgz > SHA256SUMS)
271+
package_count="$(jq -r '.all | length' "$plan")"
272+
echo "dir=$artifact_dir" >> "$GITHUB_OUTPUT"
273+
echo "Extended-stable plugin preflight exercised ${package_count} publishable packages."
274+
echo "- Extended-stable plugin packages exercised: ${package_count}" >> "$GITHUB_STEP_SUMMARY"
275+
276+
- name: Upload extended-stable plugin npm packages
277+
if: ${{ inputs.npm_dist_tag == 'extended-stable' }}
278+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
279+
with:
280+
name: openclaw-plugin-npm-preflight-${{ inputs.tag }}
281+
path: ${{ steps.plugin_npm_preflight.outputs.dir }}
282+
if-no-files-found: error
283+
236284
- name: Generate dependency release evidence
237285
id: dependency_evidence
238286
env:

.github/workflows/openclaw-performance.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,23 @@ jobs:
246246
chmod 0755 "$HOME/.local/bin/kova"
247247
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
248248
249+
- name: Configure OCM local workspace dependencies
250+
if: steps.lane.outputs.run == 'true'
251+
shell: bash
252+
run: |
253+
set -euo pipefail
254+
npm_wrapper="$PERFORMANCE_HELPER_DIR/scripts/ocm-npm-workspace-deps.mjs"
255+
workspace_dependency_dirs=""
256+
if [[ -f "${GITHUB_WORKSPACE}/packages/ai/package.json" ]]; then
257+
workspace_dependency_dirs="${GITHUB_WORKSPACE}/packages/ai"
258+
fi
259+
chmod 0755 "$npm_wrapper"
260+
{
261+
echo "OCM_INTERNAL_NPM_BIN=$npm_wrapper"
262+
echo "OPENCLAW_OCM_REAL_NPM_BIN=$(command -v npm)"
263+
echo "OPENCLAW_OCM_WORKSPACE_DEPENDENCY_DIRS=$workspace_dependency_dirs"
264+
} >> "$GITHUB_ENV"
265+
249266
- name: Pin Kova OpenAI model to GPT 5.5
250267
if: steps.lane.outputs.run == 'true'
251268
shell: bash

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ Docs: https://docs.openclaw.ai
2323

2424
### Fixes
2525

26+
- **Browser actions on Node 24:** keep browser request cancellation bound to the client and response lifetime instead of Node 24.16+'s prematurely aborted body-stream signal, preventing valid POST actions from failing after JSON parsing. Thanks @obviyus and @vincentkoc.
27+
- **SecretRef model credentials:** keep resolved provider secrets behind process-local sentinels through auth storage, stream setup, SDK configuration, and managed local-provider probing, then inject plaintext only at the final network or provider-plugin boundary while retaining exact-value log redaction. (#102008, #102009)
28+
- **Lean local model shell access:** keep `exec` directly visible beside the default structured Tool Search controls so coding-tuned local models can use their shell fallback instead of searching for missing domain tools. (#87587) Thanks @vincentkoc.
29+
- **OAuth refresh contention diagnostics:** keep local lock paths out of user-facing refresh failures and avoid duplicate failure prefixes while preserving structured provider and profile classification. (#83383) Thanks @vincentkoc.
2630
- **Exec approval prompts:** keep background-disabled fallback warnings out of pending gateway/node approvals and show them only after a command actually runs in the foreground. (#78184) Thanks @vincentkoc.
2731
- **Direct poll delivery:** route direct and hybrid channel polls through the owning outbound adapter while preserving gateway-mode routing and channel option checks. (#99950) Thanks @NianJiuZst.
2832
- **Agent wait hard-timeout snapshots:** preserve canonical hard-timeout phase and timestamps when the outer `agent.wait` timer wins the retry-grace race, while leaving queue, draining, and restart-cancelled waits correctable. (#89367) Thanks @Pick-cat.
@@ -43,12 +47,13 @@ Docs: https://docs.openclaw.ai
4347
- **Microsoft Teams attachment metadata:** bound Bot Framework `attachmentInfo` JSON reads and cancel oversized streams before they can exhaust Gateway memory. (#99125) Thanks @ly85206559.
4448
- **Agent auth copy order:** preserve the source agent's portable auth-profile precedence when copying credentials to a new agent while excluding skipped profiles and transient auth state. (#100833) Thanks @machine3at.
4549
- **Memory session repair:** keep daily dreaming ingestion bookkeeping outside session-corpus audit and repair so `memory status --fix` preserves healthy daily state. (#93389) Thanks @Alix-007 and @vincentkoc.
46-
- **Remote browser CDP policy:** allow the configured CDP control host through an existing hostname allowlist without widening page navigation policy. (#100986, #100819) Thanks @NianJiuZst.
50+
- **Remote browser CDP policy:** allow the configured CDP control host through an existing hostname allowlist without widening page navigation policy, while keeping strict-policy discovery bound to the configured control authority. (#100986, #100819) Thanks @NianJiuZst.
4751
- **Config unset diagnostics:** explain when an inherited or default configuration value cannot be unset instead of reporting a misleading successful deletion. (#96557) Thanks @moeghashim.
4852
- **Crestodian command probes:** contain stdout and stderr stream failures while keeping child-process close and spawn errors authoritative, preventing unhandled probe crashes. (#100741) Thanks @lsr911.
4953
- **Feishu mention forwarding:** fail closed when the bot Open ID is unavailable so group messages cannot be misclassified as explicit bot mentions. (#100891) Thanks @zhangguiping-xydt.
5054
- **Cron edit delivery:** preserve each job's implicit delivery mode when applying partial delivery updates, so disabling best-effort delivery no longer turns detached job announcements off. (#100846) Thanks @machine3at.
5155
- **Control UI session creation:** keep newly created sessions at the front of the stable sidebar order after selecting another session. Thanks @shakkernerd.
56+
- **Control UI file previews:** keep large Skill Workshop files responsive with cached, offscreen-contained text chunks while preserving wrapped content, stable file switching, full-file copy, and clean focus behavior. (#101319) Thanks @xianshishan and @shakkernerd.
5257
- **FTS-only memory startup:** skip plugin capability discovery when `memorySearch.provider` is explicitly `none`, avoiding an unnecessary cold-start scan.
5358
- **Control UI agent model labels:** show each selected agent's effective model in the Default picker option instead of the global model. (#100719, #77690, #77440) Thanks @hyspacex.
5459
- **Control UI inbound image previews:** render canonical inbound media references through the authenticated ticket route after chat-history reloads. (#100725, #90172, #89591) Thanks @sweetcornna.

0 commit comments

Comments
 (0)