chore(sync): merge upstream main (29k commits) β repairs the fork CI baseline, includes openai 7 - #6
Conversation
* feat(buzz): support flat replies with committed tool-state tracking Keep automatic reply and typing placement in the Buzz plugin, preserving default threading and explicit targets. Reconcile with canonical schema, transcript-cache, live-argument, and correlation-ID owners on main; retire pending results only after persistence and before callbacks. * docs(buzz): keep release notes in the PR
β¦131963) Unify accepted-send recording and remove duplicate participant, Activity, avatar, and listener projection paths. Preserve identity, timing, visibility, and storage contracts; retain boundary coverage and isolate the pre-existing shared /tmp test fixture.
Relay Claude CLI partial assistant snapshots through the canonical parser while keeping nested tool-result text out of visible replies. Co-authored-by: Ayaan Zaidi <hi@obviy.us>
β¦law#131961) * test(exec): characterize companion response loss without local replay Exercise signed Unix socket requests, real native execution, and enforced routing after a lost response. Clarify that HOST=app already requires the companion; FALLBACK does not change current routing. This records the nullable transport ambiguity without changing production behavior. * test(exec): stabilize transport proof fixtures Use socket-owner readiness and awaited shutdown for the real native proof. Freeze the JSONL deadline instead of asserting wall-clock latency, and align fixture types with the existing test helpers. * test(macos): observe native cancellation fixture readiness Wait for registered PID-marker observation or a real native terminal response before injecting cancellation. Gate the sentinel delay on readiness and drain failure cleanup before removing fixture state. Cover slow admission, early native failures, and incomplete PID publication without changing production behavior. * test(exec): register and validate native proof client
* feat(ui): keep latest assistant actions visible * fix(ui): scope latest actions to group footer * fix(ui): hide assistant actions after user follow-up
β¦1811) * improve(ui): refine chat image presentation and controls * fix(ui): address chat image review findings * style(ui): format chat image coverage
* feat(profile): enable Git co-author credit by default Verified GitHub identities now get public `Co-authored-by` credit unless the person explicitly opts out. An absent `git.coauthor.enabled` row is the default rather than a refusal, resolved through one shared helper used by both the attribution resolver and the Control UI toggle. * fix(profile): fail closed on malformed co-author preference values The preference API persists arbitrary JSON, so `value !== false` let a non-boolean row read as consent to publish a verified person's public Git trailer. Only a missing row or literal `true` now enables credit, with regression coverage at the attribution resolver and the profile toggle. * docs(vision): state the team-assistant direction alongside personal use The privacy rule governs what leaves an install, not what teammates see on a shared Gateway. Say that explicitly so co-author credit and other shared-session attribution are not read as a violation of the telemetry opt-in rule, and name team.openclaw.ai as where OpenClaw is built with OpenClaw.
* perf(installer): use blobless PowerShell clones * fix(installer): preserve clone compatibility on older git * fix(installer): recognize modern git filter help
* fix(ui): retain prompts after cloud startup failures Keep the initial submission in its existing scoped tab recovery until delivery is confirmed. Retry known failures on the created session and captured target; check uncertain delivery without replaying work. Preserve attachment ownership and newer submissions. Refs openclaw#131452. * test(ui): clarify placement startup fixture names * fix(ui): preserve initial-turn ordering across reconnects Keep unresolved placement submissions ahead of ordinary chat admission while transport is disconnected, without exposing content or executing through stale credentials. Preserve lazy and memory-only recovery ownership and distinguish first dispatch after an explicit create retry from placement reconciliation. * docs(ui): describe automatic transcript text recovery * fix(ui): hold chat admission until initial recovery settles Keep later input behind credential recovery and the retained initial turn. Wake the canonical outbox drain when readiness or initial ownership resolves, after projecting the initial handoff. Cover cold Hello, accepted receipt and invalid-record release through the browser boundary; retain ordinary offline queuing.
β¦#131827) * test(agents): reproduce diagnostic loss in context guard Refs openclaw#131824. Expected-RED diagnostic baseline only; runtime behavior is unchanged. * test(agents): extend tool-result diagnostic baseline * fix(agents): unify bounded tool-result projection * docs(agents): explain bounded content array invariant
Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com> Co-authored-by: Vito Cappello <3279061+VACInc@users.noreply.github.com>
β¦2018) * improve(ui): clarify picker selection and keyboard focus * test(ui): observe renewed dashboard frame before sampling colors
β¦2010) Optional memory maintenance must not reset unsummarized conversation history. Preserve ordinary replies after exhausted flush retries and surface required compaction failures through the existing recovery outcome. Fixes openclaw#131957
openclaw#117166) * feat(tooling): add isolated template markdownlint policy for workspace templates * feat(tooling): wire isolated template markdownlint lane into docs check * fix(ci): include template markdownlint config in docs change detection * test(ci): guard template markdownlint config in docs change detection * chore: retrigger CI
Expose the existing page-error log to agents with requests-style limits, untrusted-content wrapping, node proxy routing, and browserTab metadata. Share bounded debug-log formatting and hide unsupported Chrome MCP actions. Follow up on openclaw#131592, which added requests, text, and emulate actions.
Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
* fix(webchat): show per-file attachment failures * fix(webchat): announce completed attachment failures * fix(media): preserve plugin error codes
β¦131918) * refactor(codex): simplify native override policy and tests * test(codex): retain native teardown after timeouts
Keep Beam terminal work until the remote receiver confirms success. Bound and fairly rotate retry state, gate terminal sends on confirmed inactivity, and document the process-local restart limit. Co-authored-by: Leon-SK668 <0668001470@xydigit.com> Co-authored-by: Ayaan Zaidi <hi@obviy.us>
β¦claw#131960) The schema-driven config form and the hand-written settings pages each rendered their own circular "Reset to default" icon button next to any overridden row. It was persistent chrome on a surface that is already dense, and every affected control can reach its default directly. Deletes both implementations (`renderRestoreDefaultButton`, `renderSettingsDefaultState`) and the callback chains that existed only to feed them. The "Default: x" / "Using default: x" descriptions stay.
β¦w#131966) Prevent timer-only Gateway stalls from restarting channel connections while replies or agent startup work remains active. Recovery now closes admission, defers reconnect until the canonical active-work inventory is idle, and retries only incomplete account handoffs. Co-authored-by: PollyBot13 <pollybot13@gmail.com> Co-authored-by: Ayaan Zaidi <hi@obviy.us>
β¦nclaw#132227) * fix(sessions): preserve fork lifecycle ownership and context Preserve incognito storage, revalidate message-cut authority at commit, and keep late UI fork results scoped to their presentation. Carry prepared child identity and actual context through subagent cleanup and receipts. Verify native source cuts with canonical projection and preserve supervision connection and cleanup ownership. Document the separate canonical-descendant initialization limitation. * refactor(agents): remove unused subagent prompt task input * test(codex): validate native fork fixture request shapes * fix(codex): avoid inherited labels in native session forks * fix(test): align fork prompt fixtures and session type imports * refactor(agents): reuse subagent attachment result type
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Restore machine choices from the canonical mapped class catalog, including Machine0, while retaining unknown resources and unmapped-provider handling. Fixes openclaw#132291.
`agentic-gateway-core` is striped by file, and two of its files -- `gateway-active-memory` and `gateway-concurrent-streams` -- are registered in `runtimeConsumers`, so any stripe holding one inherits `pretestBuildMode` and runs `pnpm build:ci-artifacts` before its tests. Striping spread them, so every gateway-core job paid that build. Measured on run 33215955822, `checks-node-compact-large-6` spent 275s building to run 118.2s of tests, and the three gateway-core jobs were the three slowest in CI at 512s, 436s and 368s against a 9:30 wall. Pull those files into one `agentic-gateway-core-runtime` shard, derived from `runtimeConsumers` rather than hardcoded so the two lists cannot drift. The ordinary stripes lose their build entirely; exactly one job builds, on both the blacksmith and hybrid profiles. Weight that shard at 145s and mark it exclusive so the packer neither stacks partners onto the one job paying the build nor stripes it in two above the 150s `COMPACT_GITHUB_MAX_PREDICTED_SECONDS` threshold, which would restore the duplicate build this change removes. Guards move with the plan: the gateway expectation now asserts the invariant directly -- no stripe carries a build mode, exactly one sibling shard does -- and the stripe-coverage check spans the stripes plus that shard, so a dropped file still fails it (it caught 552 against 554 while this was being written).
* fix(native): keep TLS tests out of operator storage * fix(macos): close live native test storage escapes Keep dashboard probes on their owning dependency, make preview Talk projections non-live, and restrict menu and WebChat test work to owned resources. Preserve normal TLS and recovery behavior; remove obsolete test mirrors and shared-connection fallbacks.
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
β¦w#130958) * fix(auto-reply): preserve channel context in command prompts * fix(auto-reply): honor channel threading adapters * fix(auto-reply): keep provider ids out of action targets * refactor(agents): share runtime prompt resolution * test(agents): preserve absent runtime action targets * test(telegram): prove command prompt channel context * fix(qa): preserve typed Crabline thread targets * fix(qa): retain logical Matrix room targets * test(qa): use Telegram native export command * test(qa): authorize Telegram export operator * fix(qa): preserve versioned targets through actions * test(qa): expect versioned group thread target * fix(qa): preserve typed Matrix targets --------- Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
β¦32255) * fix(ui): keep session desktops connected to their execution machine * refactor(ui): remove obsolete desktop focus wrapper * test(ui): cover session desktop authentication in side rails * fix(ui): preserve the global desktop picker on chat routes * fix(ui): follow session placement changes in desktop popouts * test(ui): wait for desktop menu transitions to finish
β¦openclaw#132336) * test(onepassword): reuse immutable client interpreter fixture * test(onepassword): compile resolver fixtures once per suite
β¦er results (openclaw#131585) * fix(web-fetch): honor cancellation in the provider fallback Pass the optional AbortSignal execution context through fetch providers and the Firecrawl adapter. Reject late provider results before wrapping or caching, recheck after asynchronous payload construction, and preserve cancellation through HTML fallback recovery. * fix(web-fetch): finalize cancellation before caching results Reject pre-aborted cache hits and preserve cancellation when a provider or guard cleanup fails after abort. Centralize direct and provider cache publication after the complete fetch lifecycle so cancellation during release cannot leave a successful entry. Extend all four fallback cancellation cases with late provider failures, cover direct/provider pre-aborted cache hits and guard-release races, and document the completed cancellation boundary. * fix(web-fetch): scope the post-cancellation guard to provider failures The cancellation guard sat in runWebFetch's catch, so a fetch that rejected *because of* the abort had its original error replaced by signal.reason. That discarded the transport's own failure detail and changed an existing contract: web-tools.fetch.test.ts asserts the tool surfaces the aborted fetch's error. fetchWebPayload already rethrows the original error when the signal aborted, so the outer guard only ever needed to cover the provider-fallback path, where a late failure should surface the caller's abort reason rather than an error from work the caller had already abandoned. Move it there and drop the outer catch. * docs(web-fetch): state cancellation forwarding and error preservation accurately Two wording corrections from deep review. The inline comment claimed an abort-caused fetch rejection "already carries the caller's reason", which the regression test deliberately shows is not always true; the code preserves the right object regardless. The docs implied cancellation stops provider work, when core only forwards the signal and rejects late results.
β¦olesale The fork was 2 commits ahead and 29,161 commits (3 months) behind upstream. Both fork commits are obsoleted by upstream itself: - #1 (engines node >=20): upstream now declares >=22.22.3 <23 || >=24.15.0 <25 || >=25.9.0 β stricter and correct. - #2 (@types/node 26 + CI action majors): upstream is on @types/node 26.2.0 and maintains its own workflow pins. So this merge resolves everything in upstream's favor: the resulting tree is byte-identical to upstream b6306da β the most recent upstream main commit with a fully green upstream CI run. This repairs the fork's red baseline lanes (build-artifacts, check-shrinkwrap, checks-fast-bun-launcher, security-fast, check-docs) the way upstream keeps them green, instead of patching lanes one by one against a 3-month-old tree. The openai 6β7 bump this fork wanted (closed PR #5) is already included: upstream ships openai 7.5.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WqKqMnHQHSmkGFfc5t7Rxn
Dependency GuardThis PR changes dependency-related files. Maintainers should confirm these changes are intentional. Changed files:
Maintainer follow-up:
|
Dependency graph changes notedThis PR includes dependency graph changes. The dependency guard is informational because the PR author is a repository admin or a member of
Security review is still recommended before merge when the dependency graph change is intentional. |
| - name: Setup Node.js | ||
| id: setup-node | ||
| shell: bash | ||
| env: | ||
| REQUESTED_NODE_VERSION: ${{ inputs.node-version }} | ||
| OPENCLAW_NODE_TOOLCHAIN_ROOT: ${{ inputs.cache-mode != 'off' && runner.os != 'Windows' && format('{0}/openclaw-node-toolchain/node', runner.temp) || '' }} | ||
| run: | | ||
| set -euo pipefail | ||
| source "$GITHUB_ACTION_PATH/../setup-pnpm-store-cache/ensure-node.sh" | ||
| openclaw_ensure_node "$REQUESTED_NODE_VERSION" | ||
| echo "resolved-version=$(node -p 'process.versions.node')" >> "$GITHUB_OUTPUT" | ||
| # Only a download populates the cached root. An image whose toolcache | ||
| # already clears the floor leaves it absent, and saving a missing path | ||
| # warns without producing an entry. | ||
| if [ -n "${OPENCLAW_NODE_TOOLCHAIN_ROOT:-}" ] && [ -d "${OPENCLAW_NODE_TOOLCHAIN_ROOT}" ]; then | ||
| echo "toolchain-populated=true" >> "$GITHUB_OUTPUT" | ||
| fi | ||
|
|
||
| - name: Configure dependency cache store |
| - name: Setup pnpm | ||
| id: setup-pnpm | ||
| uses: ./.github/actions/setup-pnpm-store-cache | ||
| with: | ||
| node-version: ${{ inputs.node-version }} | ||
| use-actions-cache: ${{ inputs.use-actions-cache }} | ||
| # On an exact dependency-cache hit, the same archive already restored | ||
| # the complete store. Every miss can seed it from the coarser cache, | ||
| # including legacy Blacksmith callers that disabled that old fallback. | ||
| cache-mode: ${{ inputs.cache-mode != 'off' && (inputs.dependency-cache != 'true' || steps.dependency-cache.outputs.cache-hit != 'true') && 'restore' || 'off' }} | ||
|
|
||
| - name: Setup TruffleHog |
| - name: Setup TruffleHog | ||
| if: inputs.install-trufflehog == 'true' | ||
| shell: bash | ||
| run: bash scripts/install-trufflehog.sh | ||
|
|
||
| - name: Restore Vitest transform cache |
| - name: Run agents delete shared workspace Docker CLI smoke | ||
| env: | ||
| OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE: openclaw-dockerfile-smoke:local | ||
| OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD: "1" | ||
| run: bash scripts/e2e/agents-delete-shared-workspace-docker.sh | ||
|
|
||
| - name: Run Docker gateway network e2e |
| - name: Run Docker gateway network e2e | ||
| env: | ||
| OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE: openclaw-dockerfile-smoke:local | ||
| OPENCLAW_GATEWAY_NETWORK_E2E_SKIP_BUILD: "1" | ||
| run: bash scripts/e2e/gateway-network-docker.sh | ||
|
|
||
| - name: Smoke test Dockerfile with matrix extension build arg |
| - name: Pack ClawHub package artifact | ||
| env: | ||
| CLAWHUB_REGISTRY: ${{ env.CLAWHUB_REGISTRY }} | ||
| SOURCE_REPO: ${{ github.repository }} | ||
| SOURCE_COMMIT: ${{ needs.preview_plugins_clawhub.outputs.ref_revision }} | ||
| SOURCE_REF: ${{ github.ref }} | ||
| SOURCE_REF: ${{ inputs.release_tag != '' && format('refs/tags/{0}', inputs.release_tag) || github.ref }} | ||
| PACKAGE_TAG: ${{ matrix.plugin.publishTag }} | ||
| PACKAGE_DIR: ${{ matrix.plugin.packageDir }} | ||
| run: bash scripts/plugin-clawhub-publish.sh --dry-run "${PACKAGE_DIR}" | ||
| OPENCLAW_CLAWHUB_PACK_OUTPUT_DIR: ${{ runner.temp }}/clawhub-package-artifact | ||
| run: bash scripts/plugin-clawhub-publish.sh --pack "${PACKAGE_DIR}" | ||
|
|
||
| publish_plugins_clawhub: | ||
| needs: [preview_plugins_clawhub, preview_plugin_pack, validate_release_publish_approval] | ||
| if: github.event_name == 'workflow_dispatch' && needs.preview_plugins_clawhub.outputs.has_candidates == 'true' | ||
| - name: Upload ClawHub package artifact |
| - name: Preview npm pack contents | ||
| run: bash scripts/plugin-npm-publish.sh --pack-dry-run "${{ matrix.plugin.packageDir }}" | ||
| env: | ||
| OPENCLAW_PLUGIN_NPM_PUBLISH_TAG: ${{ inputs.npm_dist_tag == 'extended-stable' && inputs.npm_dist_tag || '' }} | ||
| run: bash .release-tooling/scripts/plugin-npm-publish.sh --repo-root "$GITHUB_WORKSPACE" --pack-dry-run "${{ matrix.plugin.packageDir }}" | ||
|
|
||
| - name: Prepare immutable npm preflight artifact |
| - name: Setup Node environment | ||
| uses: ./.github/actions/setup-node-env | ||
| with: | ||
| cache-mode: restore | ||
| node-version: ${{ env.NODE_VERSION }} | ||
| install-bun: "false" | ||
|
|
||
| - name: Verify complete plugin registry readback |
| - name: Verify complete plugin registry readback | ||
| env: | ||
| PACKAGE_NAME: ${{ matrix.plugin.packageName }} | ||
| PACKAGE_VERSION: ${{ matrix.plugin.version }} | ||
| run: node scripts/verify-plugin-npm-published-runtime.mjs "${PACKAGE_NAME}@${PACKAGE_VERSION}" | ||
| run: | | ||
| set -euo pipefail | ||
| exact_version=missing | ||
| tagged_version=missing | ||
| for attempt in {1..12}; do | ||
| exact_version="$(npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" version 2>/dev/null || true)" | ||
| tagged_version="$(npm view "${PACKAGE_NAME}@extended-stable" version 2>/dev/null || true)" | ||
| if [[ "${exact_version}" == "${PACKAGE_VERSION}" && "${tagged_version}" == "${PACKAGE_VERSION}" ]]; then | ||
| echo "Verified ${PACKAGE_NAME}@${PACKAGE_VERSION} and @extended-stable." | ||
| exit 0 | ||
| fi | ||
| if [[ "${attempt}" != "12" ]]; then | ||
| sleep 10 | ||
| fi | ||
| done | ||
| echo "npm registry did not converge for ${PACKAGE_NAME}@${PACKAGE_VERSION} (exact=${exact_version:-missing}, extended-stable=${tagged_version:-missing})." >&2 | ||
| echo "This OIDC-only source workflow does not mutate tags on an already-published package; use credential-isolated release tooling for manual tag repair." >&2 | ||
| exit 1 |
| - name: Setup manifest pnpm | ||
| uses: ./.github/actions/setup-pnpm-store-cache | ||
| with: | ||
| cache-mode: restore | ||
| node-version: "24.x" | ||
|
|
||
| - name: Install manifest dependencies |
Failing-lane classification before mergeAnchor fact: this PR's tree is byte-identical to upstream Verdict: 0 real regressions. 200 lanes pass (every build / type-check / unit-shard / docs / lint lane). All 16 fails + 1 stuck-queued lane are environmental or artifacts of the PR's 29k-commit shape. Class A β permanently environmental on this fork (do not chase these)
Class Aβ² β one-time artifacts of a 29k-commit sync PR (self-heal once this IS main)
Merging with a merge commit (not squash) so future upstream syncs share history. π€ Generated with Claude Code |
Repairs the fork's red CI baseline by syncing with upstream instead of patching lanes one by one.
Divergence measured: fork was 2 commits ahead, 29,161 commits (3 months) behind upstream
openclaw/openclaw(fork based4b4a65802026-06-06). Both fork commits are obsoleted by upstream itself:node >=20) β upstream now declares>=22.22.3 <23 || >=24.15.0 <25 || >=25.9.0@types/node26 + CI action majors) β upstream ships@types/node26.2.0 and maintains its own workflow pinsWhat this PR is: a single merge commit whose tree is byte-identical to upstream
b6306da1a9aff3fb21dc4f8e753721304c7c780dβ the most recent upstream main commit with a fully green upstream CI run (verified viagh run list --repo openclaw/openclaw). All conflicts resolved in upstream's favor; nothing hand-written.Red lanes on fork main this should fix (baseline run 33454090314):
build-artifacts,check-shrinkwrap,checks-fast-bun-launcher,security-fast,check-docsβ plus thecheck-test-typesimplicit-any failures that sank PR #5 (upstream's current tree type-checks in its own CI).openai 6β7 (the goal of closed PR #5): already included β upstream ships
openai 7.5.0. No separate bump PR needed after this lands.Merge method: use a merge commit (not squash) so future upstream syncs share history; squashing 29k commits would orphan the fork from upstream's DAG permanently.
Production is untouched: the gateway installs from npm-global and runs its own nvm Node 22.
π€ Generated with Claude Code
https://claude.ai/code/session_01WqKqMnHQHSmkGFfc5t7Rxn