Skip to content

fix #69443: [Bug] Subagent RPC callback to WeChat session key routed to main session instead#90231

Merged
sliverp merged 5 commits into
openclaw:mainfrom
zhangguiping-xydt:feat/issue-69443
Jun 15, 2026
Merged

fix #69443: [Bug] Subagent RPC callback to WeChat session key routed to main session instead#90231
sliverp merged 5 commits into
openclaw:mainfrom
zhangguiping-xydt:feat/issue-69443

Conversation

@zhangguiping-xydt

@zhangguiping-xydt zhangguiping-xydt commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Fixes [Bug] Subagent RPC callback to WeChat session key routed to main session instead #69443: subagent callback RPCs that pass a full agent-scoped session key in to should select that session instead of falling back to agent:main:main.
  • Promotes complete agent: session keys from to to sessionKey only when no stronger sessionKey or sessionId selector is present.
  • Keeps the promoted selector out of outbound delivery targets in the CLI gateway dispatch path, generic gateway agent RPC handler, bare /reset / /new ack delivery, and the direct embedded agentCommand path.
  • Adds direct embedded coverage so consumed to selectors reject mismatched explicit agents and are not forwarded to delivery as peer IDs.
  • Out of scope: external WeChat account delivery, session migrations, config/schema/protocol changes, and unrelated channel routing behavior.

Reviewers should focus on the selector precedence invariant: explicit sessionKey / sessionId still outrank to; plain external to values still use existing delivery/session derivation; only complete agent: keys are promoted.

  • Fix classification: Root cause fix.
  • Maintainer-ready confidence: High — the author-side follow-up is implemented, synced to current origin/main, and covered by fresh targeted validation.
  • Why it matters / User impact: Without this fix, callbacks from subagents to channel-specific sessions can silently continue the wrong main session and lose the intended WeChat conversation context. Reset acknowledgements and direct embedded delivery could also attempt to use the full agent: session key string as a peer target.
  • Root cause: The ingress/session-selection boundary treated a complete agent-scoped session key carried in to as a direct destination/context value instead of as a session selector. That violated the session selector contract because non-group direct context normalization could resolve the callback to agent:main:main, and later delivery code could still reuse the raw selector string as an outbound peer.
  • Why this is root-cause fix: The patch restores the canonical selector decision before session loading and delivery planning, then sanitizes the consumed selector before any outbound target resolution path can read it. That fixes the resolver/session-state invariant directly instead of adding a downstream fallback for one channel.
  • Patch quality notes: The diff keeps the change at the session selector boundary, preserves explicit selector precedence, and adds regression tests for each touched ingress/delivery path rather than masking the symptom in WeChat-specific code.
  • What did NOT change: This PR only changes complete agent: session-key values in to when neither sessionKey nor sessionId is present. It does not change plain external destinations, config, schema, protocol fields, session-store format, provider defaults, or WeChat transport behavior.
  • Architecture / source-of-truth check: classifySessionKeyShape() remains the canonical classifier for complete agent session keys; explicit sessionKey and sessionId remain stronger selectors than to. The compatibility/default behavior for plain external to values is unchanged, and the contract surface stays limited to the existing gateway/agent session selector semantics.
  • Related open PR scan: No broader same-contract or canonical replacement PR was identified before preparing this task branch; this PR stays limited to the gateway/agent session selector contract for complete agent: keys and the same contract's delivery branches.

Linked context

Closes #69443.

Related review context:

  • ClawSweeper requested proof that the full agent: session key is not reused as an outbound peer target.
  • sliverp commented that they would take a look; this update folds the follow-up direct embedded guardrails into the PR before maintainer review.

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: Subagent callback RPCs that pass a WeChat agent session key in params.to no longer default back to agent:main:main; the callback is accepted against the requested agent:main:openclaw-weixin:direct:[email protected] session key. Bare reset acknowledgements with deliver: true and direct embedded delivery also no longer reuse that full agent session key as an outbound peer target.

  • Real environment tested: Local Linux OpenClaw repair worktree with installed dependencies, plus an earlier real OpenClaw dev gateway process on ws://127.0.0.1:19144 using an isolated OpenClaw home and config. The latest direct embedded follow-up was validated with focused local tests after syncing to current origin/main.

  • Exact steps or command run after this patch: After syncing with current origin/main, ran npm test -- src/commands/agent.test.ts src/commands/agent-via-gateway.test.ts src/commands/agent/session.test.ts src/gateway/server-methods/agent.test.ts. Earlier gateway proof for this PR started the patched repair worktree dev gateway and ran pnpm openclaw gateway call agent --url ws://127.0.0.1:19144 --json --timeout 10000 --params '{"message":"daily-fix current-head proof for session-key routing","to":"agent:main:openclaw-weixin:direct:[email protected]","idempotencyKey":"proof-90231-current-head-to-session-key","timeout":1}' with the local proof gateway token configured for that isolated process.

  • Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output): Fresh post-sync targeted validation passed 2 shards: gateway shard 308 tests passed and commands shard 99 tests passed.

    > [email protected] test
    > node scripts/test-projects.mjs src/commands/agent.test.ts src/commands/agent-via-gateway.test.ts src/commands/agent/session.test.ts src/gateway/server-methods/agent.test.ts
    
    Test Files  2 passed (2)
         Tests  308 passed (308)
    
    Test Files  3 passed (3)
         Tests  99 passed (99)
    

    Earlier local gateway proof returned {"runId":"proof-90231-current-head-to-session-key","sessionKey":"agent:main:openclaw-weixin:direct:[email protected]","status":"accepted"}.

  • Observed result after fix: The gateway accepted the agent RPC and reported the same WeChat agent-scoped session key that was supplied in params.to, proving it did not resolve the callback to agent:main:main. The reset ack regression proves the promoted selector is sanitized before delivery and the ack is sent to the selected session's stored WeChat target instead of to the full agent: key string. The direct embedded regressions prove the same promoted selector is rejected when it conflicts with an explicit agent and is not forwarded to delivery as an outbound peer.

  • What was not tested: I did not perform an external WeChat network round trip or use a third-party WeChat account.

  • Proof limitations or environment constraints: The verified real-behavior boundary is the OpenClaw gateway agent RPC callback path and session selection behavior that caused this issue. The latest direct embedded follow-up does not change the external gateway transport; it is covered by focused regression tests in the command shard.

  • Before evidence (optional but encouraged): The pre-fix behavior treated the full agent:main:openclaw-weixin:direct:[email protected] value in to as a direct destination/context value, which could normalize the callback to agent:main:main and could reuse the full agent: key string as a delivery target.

Tests and validation

Commands run:

  • RED check before the direct embedded fix: npm test -- src/commands/agent.test.ts failed with the new tests because agentCommand({ agentId: "work", to: "agent:main:..." }) resolved instead of rejecting, and delivery still received the raw agent:... to value.
  • GREEN check before sync: npm test -- src/commands/agent.test.ts passed 27 tests.
  • Fresh post-sync validation: npm test -- src/commands/agent.test.ts src/commands/agent-via-gateway.test.ts src/commands/agent/session.test.ts src/gateway/server-methods/agent.test.ts passed 2 Vitest shards: gateway shard 308 tests, commands shard 99 tests.
  • Latest lint-fix validation: pnpm lint --threads=8 passed, and the same targeted test command passed again with gateway shard 308 tests and commands shard 99 tests.

Regression coverage added or updated:

  • Target test file: src/commands/agent.test.ts, src/commands/agent-via-gateway.test.ts, src/commands/agent/session.test.ts, and src/gateway/server-methods/agent.test.ts.
  • Scenario locked in: Complete agent: session-key values supplied through to are promoted only when no explicit sessionKey or sessionId exists; the promoted selector is used for session loading, rejects explicit-agent mismatches, and is removed before delivery target resolution.
  • Why this is the smallest reliable guardrail: These regression tests cover the resolver, CLI dispatch, gateway RPC, reset ack, and direct embedded command boundaries touched by the fix. They avoid broad end-to-end transport setup while still locking the session-state and message-delivery contract that caused the bug.
  • src/commands/agent/session.test.ts: resolver returns an agent-scoped to value as the requested session key.
  • src/commands/agent-via-gateway.test.ts: CLI gateway dispatch forwards the promoted value as params.sessionKey and removes it from params.to.
  • src/gateway/server-methods/agent.test.ts: gateway agent RPC loads the requested session and bare /reset delivery uses the selected session target.
  • src/commands/agent.test.ts: direct embedded agentCommand rejects an agent-scoped to selector that conflicts with an explicit agent and removes the consumed selector before delivery.

Risk checklist

Did user-visible behavior change? Yes — complete agent: values in to now select an existing agent session when no explicit sessionKey or sessionId is present.

Did config, environment, or migration behavior change? No.

Did security, auth, secrets, network, or tool execution behavior change? No.

What is the highest-risk area? Gateway/session routing and message-delivery target selection.

  • Risk labels considered: availability, message-delivery, session-state.
  • Risk explanation: The merge risk is that gateway availability, session-state selection, or message-delivery target resolution could regress if a normal external to value were mistakenly promoted or if a consumed session selector were still reused as a peer target.
  • Why acceptable: The change is constrained to complete agent: session-key selectors, preserves explicit sessionKey / sessionId precedence, keeps plain external to behavior unchanged, and has focused regression tests for resolver, gateway RPC, CLI dispatch, reset ack, and direct embedded delivery paths.

How is that risk mitigated?

  • The promotion is limited to values already classified by classifySessionKeyShape() as complete agent-scoped session keys.
  • Explicit sessionKey and sessionId still take precedence.
  • Plain external to values are not promoted.
  • Reset ack and direct embedded delivery paths sanitize consumed selectors before outbound target resolution.
  • Focused tests cover resolver, CLI gateway dispatch, gateway RPC handling, reset ack delivery, and direct embedded agentCommand behavior.

Current review state

What is the next action?

  • Ready for maintainer review after this branch/body update lands.

What is still waiting on author, maintainer, CI, or external proof?

  • Author-side code follow-up and fresh post-sync validation are complete.
  • CI should rerun on the pushed branch update.
  • External WeChat network round trip remains untested; the verified boundary is gateway/session selection and delivery planning before the channel transport.

Which bot or reviewer comments were addressed?

  • RF-001 / RF-002 / ClawSweeper incomplete-review signals: disclosed. The PR body now maps the real-behavior gateway proof, fresh post-sync targeted validation, reset ack delivery regression, and direct embedded delivery sanitization regression. The proof limitation is disclosed: no external WeChat network round trip was performed.
  • RF-003 / sliverp maintainer signal: addressed as a status update in this body. The update keeps the PR ready for maintainer review and adds the direct embedded guardrails found during review before asking for another look.
  • RF-004 / real behavior proof request: addressed with the local gateway agent RPC proof showing the supplied WeChat agent-scoped session key is accepted as the selected sessionKey, plus regression coverage that the consumed selector is not reused as an outbound peer target. The remaining boundary is disclosed: no external WeChat network round trip was performed.

@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime commands Command implementations agents Agent runtime and tooling size: S proof: supplied External PR includes structured after-fix real behavior proof. labels Jun 4, 2026
@clawsweeper

clawsweeper Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 13, 2026, 7:23 AM ET / 11:23 UTC.

Summary
The PR promotes complete agent: session keys supplied through to into the session selector path and strips consumed selectors before gateway, CLI, reset-ack, and embedded delivery target resolution.

PR surface: Source +42, Tests +230. Total +272 across 8 files.

Reproducibility: yes. source inspection gives a high-confidence reproduction path: current main derives session context from to and later reuses request.to for delivery planning, so a full agent: key is not consistently treated as the selected session key.

Review metrics: 1 noteworthy metric.

  • Selector boundary coverage: 4 paths covered. The PR updates CLI dispatch, gateway RPC, reset acknowledgement delivery, and direct embedded command paths that must agree on consumed to semantics before merge.

Stored data model
Persistent data-model change detected: serialized state: src/commands/agent/session.test.ts. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🦞 diamond lobster
Proof: 🦞 diamond lobster
Patch quality: 🦞 diamond lobster
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Risk before merge

  • [P1] This intentionally changes selector precedence for complete agent: values in to; if a missed path still treats a consumed selector as a peer target, it could mis-associate session state or send a callback to the wrong destination.
  • [P1] External WeChat network delivery was not exercised; the submitted proof validates the OpenClaw gateway/session-selection boundary and delivery planning before the channel transport.

Maintainer options:

  1. Accept the bounded routing risk after green gates (recommended)
    Proceed once maintainers are satisfied with the current-head checks, source review, and gateway proof because the remaining risk is limited to the changed selector/delivery boundary.
  2. Ask for an external WeChat round trip
    Require one redacted live WeChat callback proof before merge if maintainers want transport-level confidence beyond the gateway/session boundary.
  3. Pause for broader selector policy
    Pause the PR only if maintainers want a wider protocol decision about whether to should ever act as a session selector.

Next step before merge

  • No ClawSweeper repair lane is needed because the PR has no actionable review findings; the remaining action is ordinary maintainer review and merge-gate handling.

Security
Cleared: The diff does not change dependencies, CI, credentials, permissions, auth scopes, or external code execution, and the new to promotion reuses existing session-key validation semantics.

Review details

Best possible solution:

Land the boundary fix after normal maintainer approval, keeping explicit sessionKey and sessionId precedence plus the consumed-selector regression coverage.

Do we have a high-confidence way to reproduce the issue?

Yes, source inspection gives a high-confidence reproduction path: current main derives session context from to and later reuses request.to for delivery planning, so a full agent: key is not consistently treated as the selected session key.

Is this the best way to solve the issue?

Yes, this is the best fix shape: it repairs the selector boundary and strips the consumed value before delivery, while avoiding a WeChat-specific workaround or a downstream fallback that would leave sibling paths inconsistent.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 6314c377bba1.

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes copied live gateway output showing the supplied WeChat agent-scoped key returned as the accepted sessionKey, plus current-head targeted tests for reset and embedded delivery sanitization.
  • add rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body includes copied live gateway output showing the supplied WeChat agent-scoped key returned as the accepted sessionKey, plus current-head targeted tests for reset and embedded delivery sanitization.
  • remove rating: 🌊 off-meta tidepool: Current PR rating is rating: 🦞 diamond lobster, so this older rating label is no longer current.

Label justifications:

  • P2: This is a normal-priority bugfix for bounded gateway/session routing and callback delivery behavior.
  • merge-risk: 🚨 session-state: Merging changes how complete agent: values in to select stored sessions, so a missed precedence edge could mis-associate an agent run with the wrong session.
  • merge-risk: 🚨 message-delivery: The patch also changes how consumed selectors are stripped before outbound delivery planning, where mistakes could target the wrong peer or suppress the intended callback.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body includes copied live gateway output showing the supplied WeChat agent-scoped key returned as the accepted sessionKey, plus current-head targeted tests for reset and embedded delivery sanitization.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes copied live gateway output showing the supplied WeChat agent-scoped key returned as the accepted sessionKey, plus current-head targeted tests for reset and embedded delivery sanitization.
Evidence reviewed

PR surface:

Source +42, Tests +230. Total +272 across 8 files.

View PR surface stats
Area Files Added Removed Net
Source 4 67 25 +42
Tests 4 230 0 +230
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 8 297 25 +272

What I checked:

  • Current main still treats to as sender context: On current main, resolveSessionKeyForRequest builds a MsgContext from opts.to and derives a session key from that context unless sessionKey or sessionId is explicit, which explains how a complete agent: key in to can be misread as a delivery/context value. (src/agents/command/session.ts:274, 6314c377bba1)
  • Gateway main path also reuses raw to for delivery planning: Current main computes explicitTo and turnSourceTo from request.to, so a consumed selector can still leak into outbound target resolution without the PR's sanitization. (src/gateway/server-methods/agent.ts:2191, 6314c377bba1)
  • PR fixes CLI dispatch selector promotion: The PR normalizes a complete agent: value in to into sessionKey before gateway dispatch, while clearing to, when no stronger selector is present. (src/commands/agent-via-gateway.ts:291, 34802125b5ab)
  • PR fixes shared session resolver selector precedence: The PR makes resolveSessionKeyForRequest prefer a complete agent: key from to only when sessionKey and sessionId are absent, preserving explicit selector precedence. (src/agents/command/session.ts:256, 34802125b5ab)
  • PR sanitizes gateway delivery planning: The PR derives sessionKeyFromTo, clears the local to value when that selector is consumed, and then uses the sanitized value for delivery planning inputs. (src/gateway/server-methods/agent.ts:1284, 34802125b5ab)
  • PR covers direct embedded command path: The direct embedded command path now promotes a complete agent: to selector, rejects explicit-agent mismatch through the existing session-key check, and passes sanitized options downstream. (src/agents/agent-command.ts:596, 34802125b5ab)

Likely related people:

  • steipete: Recent commits touch the gateway agent handler, bare reset command behavior, CLI dispatch, and agent command documentation around this selector/delivery surface. (role: recent area contributor; confidence: high; commits: 2c6a3f6b0478, 32c0279cec80, c5d6764f5629; files: src/gateway/server-methods/agent.ts, src/commands/agent-via-gateway.ts, src/agents/agent-command.ts)
  • Kaspre: Authored the merged explicit CLI session-key support that this PR extends to the to selector boundary. (role: introduced related behavior; confidence: medium; commits: eb7f3b7b50c5; files: src/agents/command/session.ts)
  • openperf: Recent merged work in the gateway agent handler addressed stale followups after session rebinds, a closely related session-key/session-id routing invariant. (role: adjacent session-state contributor; confidence: medium; commits: 2ffbea20d2f6; files: src/gateway/server-methods/agent.ts)
  • vincentkoc: Recent session routing compatibility and CLI/session metadata changes overlap the selector and session-store behavior reviewed here. (role: recent adjacent owner; confidence: medium; commits: 61a18e5596c8, 7f1d82ab2518; files: src/agents/command/session.ts, src/commands/agent-via-gateway.ts)
  • sliverp: Assigned themselves and reviewed the PR discussion, stating the fix is in the right layer and asking only for confirmation of a local test timeout that the author followed up on. (role: reviewer; confidence: medium; files: src/gateway/server-methods/agent.ts, src/agents/command/session.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. labels Jun 4, 2026
@openclaw-barnacle openclaw-barnacle Bot added size: M and removed size: S proof: sufficient ClawSweeper judged the real behavior proof convincing. labels Jun 4, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 4, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 10, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 10, 2026
@zhangguiping-xydt

Copy link
Copy Markdown
Contributor Author

@sliverp @frankekn Could one of you take a maintainer look? This fixes subagent RPC callback routing for WeChat session keys; proof is sufficient and it is ready for maintainer look.

@sliverp sliverp self-assigned this Jun 10, 2026
@sliverp

sliverp commented Jun 10, 2026

Copy link
Copy Markdown
Member

Thanks for your contribution, I will have a look~

@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 11, 2026
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 11, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 15, 2026
@sliverp

sliverp commented Jun 15, 2026

Copy link
Copy Markdown
Member

Landed via temp rebase onto main.

  • Gate: skipped per maintainer request (PR ships with its own tests)
  • Land commit: 5b6a927
  • Merge commit: ba1be23

Thanks @zhangguiping-xydt!

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 16, 2026
… routed to main session instead (openclaw#90231)

* fix agent session-key callback routing

* fix reset ack session-key delivery

* fix direct agent to session key routing

* fix lint in direct agent session routing

* fix: route subagent RPC callbacks to agent-shaped --to session key instead of main session (openclaw#90231) (thanks @zhangguiping-xydt)

---------

Co-authored-by: sliverp <[email protected]>
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Jun 16, 2026
…26.6.8) (#1144)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/openclaw/openclaw](https://openclaw.ai) ([source](https://github.com/openclaw/openclaw)) | patch | `2026.6.6` → `2026.6.8` |

---

### Release Notes

<details>
<summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary>

### [`v2026.6.8`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202668)

[Compare Source](openclaw/openclaw@v2026.6.6...v2026.6.8)

##### Highlights

- Telegram and WhatsApp channel delivery are richer and less brittle: Telegram can send structured rich text with tables, lists, expandable blockquotes, prompt-preserving CLI backend delivery, retired native draft migration, and safer rich-media boundaries, while WhatsApp now honors configured ACP bindings. ([#&#8203;92679](openclaw/openclaw#92679), [#&#8203;84082](openclaw/openclaw#84082), [#&#8203;89421](openclaw/openclaw#89421), [#&#8203;92513](openclaw/openclaw#92513)) Thanks [@&#8203;obviyus](https://github.com/obviyus), [@&#8203;jzakirov](https://github.com/jzakirov), [@&#8203;spacegeologist](https://github.com/spacegeologist), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Agent and Gateway recovery is sharper across account-scoped DM sends, generated media completions, restart shutdown aborts, yielded subagent pauses, yielded cron media, heartbeat dedupe, session identity prompts, and unknown OpenAI agent selector rejection. ([#&#8203;92788](openclaw/openclaw#92788), [#&#8203;91246](openclaw/openclaw#91246), [#&#8203;91357](openclaw/openclaw#91357), [#&#8203;92631](openclaw/openclaw#92631), [#&#8203;92146](openclaw/openclaw#92146), [#&#8203;91287](openclaw/openclaw#91287), [#&#8203;92468](openclaw/openclaw#92468), [#&#8203;92510](openclaw/openclaw#92510)) Thanks [@&#8203;yetval](https://github.com/yetval), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;ooiuuii](https://github.com/ooiuuii), [@&#8203;openperf](https://github.com/openperf), [@&#8203;IWhatsskill](https://github.com/IWhatsskill), [@&#8203;ZengWen-DT](https://github.com/ZengWen-DT), and [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- Provider/model handling expands and tightens with GLM-5.2, Claude Haiku 4.5 catalog rows, OpenRouter and Google Vertex provider-prefix normalization, managed SecretRef auth, bounded model browse discovery, storeless OpenAI Responses replay gating, and Claude 4.5 Copilot tool-streaming safety. ([#&#8203;92796](openclaw/openclaw#92796), [#&#8203;90116](openclaw/openclaw#90116), [#&#8203;92627](openclaw/openclaw#92627), [#&#8203;91218](openclaw/openclaw#91218), [#&#8203;90686](openclaw/openclaw#90686), [#&#8203;92247](openclaw/openclaw#92247), [#&#8203;90706](openclaw/openclaw#90706), [#&#8203;75393](openclaw/openclaw#75393)) Thanks [@&#8203;arkyu2077](https://github.com/arkyu2077), [@&#8203;liuhao1024](https://github.com/liuhao1024), [@&#8203;bymle](https://github.com/bymle), [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi), [@&#8203;samson910022](https://github.com/samson910022), [@&#8203;snowzlm](https://github.com/snowzlm), and [@&#8203;Kailigithub](https://github.com/Kailigithub).
- `/usage` and reply payload hooks now have a native full footer renderer, default template, fixed-decimal formatting, credential-aware limits, better partial-count handling, and warnings for broken templates instead of silent bad output. ([#&#8203;92657](openclaw/openclaw#92657), [#&#8203;89835](openclaw/openclaw#89835), [#&#8203;89629](openclaw/openclaw#89629)) Thanks [@&#8203;Marvinthebored](https://github.com/Marvinthebored).
- UI and mobile flows are steadier: workspace files can collapse and start collapsed, WebChat backscroll survives streaming, the sidebar session picker remains interactive above the desktop workbench, reset soft args survive UI dispatch, stale dashboard session parent lineage is preserved, and iOS reconnects stale foreground gateways. ([#&#8203;92779](openclaw/openclaw#92779), [#&#8203;92622](openclaw/openclaw#92622), [#&#8203;92705](openclaw/openclaw#92705), [#&#8203;91353](openclaw/openclaw#91353), [#&#8203;90658](openclaw/openclaw#90658), [#&#8203;92552](openclaw/openclaw#92552)) Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;NianJiuZst](https://github.com/NianJiuZst), [@&#8203;zhouhe-xydt](https://github.com/zhouhe-xydt), [@&#8203;luoyanglang](https://github.com/luoyanglang), and [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin).
- Memory, state, and diagnostics recover cleaner: oversized OpenAI embedding batches split before 431s, QMD memory search stays available in transient mode, SQLite avoids WAL on NFS state volumes, stuck-session recovery scheduling no longer resets warning backoff, and Infinity chunk limits stay genuinely unbounded. ([#&#8203;92650](openclaw/openclaw#92650), [#&#8203;92618](openclaw/openclaw#92618), [#&#8203;92639](openclaw/openclaw#92639), [#&#8203;91247](openclaw/openclaw#91247), [#&#8203;92752](openclaw/openclaw#92752), [#&#8203;92735](openclaw/openclaw#92735)) Thanks [@&#8203;mushuiyu886](https://github.com/mushuiyu886), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;849261680](https://github.com/849261680), [@&#8203;gnanam1990](https://github.com/gnanam1990), and [@&#8203;yhterrance](https://github.com/yhterrance).

##### Changes

- Providers/models: add GLM-5.2 support and Claude Haiku 4.5 catalog entries while keeping provider-qualified model IDs normalized across OpenRouter and Google Vertex paths. ([#&#8203;92796](openclaw/openclaw#92796), [#&#8203;90116](openclaw/openclaw#90116), [#&#8203;92627](openclaw/openclaw#92627), [#&#8203;91218](openclaw/openclaw#91218)) Thanks [@&#8203;arkyu2077](https://github.com/arkyu2077), [@&#8203;liuhao1024](https://github.com/liuhao1024), and [@&#8203;bymle](https://github.com/bymle).
- Channel plugins: ship Telegram rich-message delivery and WhatsApp ACP binding support, including rich prompt handoff to CLI backends and transport fixtures for richer drafts. ([#&#8203;92679](openclaw/openclaw#92679), [#&#8203;92513](openclaw/openclaw#92513)) Thanks [@&#8203;obviyus](https://github.com/obviyus) and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Agent commands: support `/btw` in CLI-backed sessions and keep CLI usage-error exits classified as usage failures instead of successful runs. ([#&#8203;92669](openclaw/openclaw#92669), [#&#8203;92162](openclaw/openclaw#92162)) Thanks [@&#8203;joshavant](https://github.com/joshavant) and [@&#8203;Pandah97](https://github.com/Pandah97).
- Usage hooks: add built-in full footer rendering, default footer templates, per-turn usage state, credential-aware limits, and fixed-decimal formatting for usage-bar templates. ([#&#8203;92657](openclaw/openclaw#92657), [#&#8203;89835](openclaw/openclaw#89835), [#&#8203;89629](openclaw/openclaw#89629)) Thanks [@&#8203;Marvinthebored](https://github.com/Marvinthebored).
- Docs and operator guidance: document node config examples, clarify before-install hook scope, correct agent default concurrency comments, refresh ZAI provider docs, and update channel/group docs for current Telegram and WhatsApp behavior. ([#&#8203;92677](openclaw/openclaw#92677), [#&#8203;92766](openclaw/openclaw#92766), [#&#8203;92695](openclaw/openclaw#92695)) Thanks [@&#8203;liuhao1024](https://github.com/liuhao1024), [@&#8203;sallyom](https://github.com/sallyom), and [@&#8203;ArielSmoliar](https://github.com/ArielSmoliar).

##### Fixes

- Onboarding/skills: show the Homebrew install recommendation only on macOS and Linux, so FreeBSD and other unsupported platforms no longer get a misleading brew prompt. Fixes [#&#8203;68893](openclaw/openclaw#68893); carries forward [#&#8203;68894](openclaw/openclaw#68894), [#&#8203;68910](openclaw/openclaw#68910), [#&#8203;68941](openclaw/openclaw#68941), [#&#8203;68943](openclaw/openclaw#68943), [#&#8203;69002](openclaw/openclaw#69002), and [#&#8203;69545](openclaw/openclaw#69545). Thanks [@&#8203;yurivict](https://github.com/yurivict), [@&#8203;Sanjays2402](https://github.com/Sanjays2402), [@&#8203;Eruditi](https://github.com/Eruditi), [@&#8203;JustInCache](https://github.com/JustInCache), [@&#8203;nnish16](https://github.com/nnish16), and [@&#8203;Mlightsnow](https://github.com/Mlightsnow).
- Channels and delivery: preserve account-scoped DM channel send policy, rich Telegram final replies, rich Telegram tables and lists, Telegram thread-create CLI remapping, Slack outbound `message_sent` hooks, contributed message-tool schema optionality, same-channel generated media completions, and channel chunking around surrogate pairs and Infinity limits. ([#&#8203;92788](openclaw/openclaw#92788), [#&#8203;92679](openclaw/openclaw#92679), [#&#8203;89421](openclaw/openclaw#89421), [#&#8203;89943](openclaw/openclaw#89943), [#&#8203;91137](openclaw/openclaw#91137), [#&#8203;91246](openclaw/openclaw#91246), [#&#8203;92735](openclaw/openclaw#92735)) Thanks [@&#8203;yetval](https://github.com/yetval), [@&#8203;obviyus](https://github.com/obviyus), [@&#8203;spacegeologist](https://github.com/spacegeologist), [@&#8203;rishitamrakar](https://github.com/rishitamrakar), [@&#8203;lundog](https://github.com/lundog), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), and [@&#8203;yhterrance](https://github.com/yhterrance).
- Auto-reply/groups: keep ordinary group text replies on automatic final-reply delivery while allowing `message(action=send)` for files, images, and other attachments to the same group or topic. Carries forward [#&#8203;43276](openclaw/openclaw#43276); refs [#&#8203;48004](openclaw/openclaw#48004). Thanks [@&#8203;NayukiChiba](https://github.com/NayukiChiba) and [@&#8203;ShakaRover](https://github.com/ShakaRover).
- Auto-reply/skills: preserve multiline payloads for `/skill` and direct skill slash commands while keeping command-head normalization for aliases, colon syntax, and bot mentions. Fixes [#&#8203;79155](openclaw/openclaw#79155); carries forward [#&#8203;81305](openclaw/openclaw#81305). Thanks [@&#8203;web3blind](https://github.com/web3blind).
- iMessage: normalize leading NUL sent-message echo prefixes while preserving interior NUL bytes and the leading attributedBody marker handling from [#&#8203;73942](openclaw/openclaw#73942). Carries forward [#&#8203;63581](openclaw/openclaw#63581). Thanks [@&#8203;drvoss](https://github.com/drvoss).
- Discord: give generated auto-thread titles a 60-second timeout and 4,096-token reasoning-model output budget, clamped to the selected model output cap. ([#&#8203;64734](openclaw/openclaw#64734)) Thanks [@&#8203;hanamizuki](https://github.com/hanamizuki).
- Agent, cron, and Gateway runtime: mark active main sessions before restart shutdown aborts, pause yielded subagent runs whose terminal also signals abort, preserve yielded media completions, de-duplicate main-session heartbeat events, expose session identity in runtime prompts, reject unknown OpenAI agent selectors, keep generated media completions and slash-command block replies in WebChat, preserve fresh post-compaction usage while clearing stale usage snapshots, and require admin privileges for HTTP session/model override surfaces. ([#&#8203;91357](openclaw/openclaw#91357), [#&#8203;92631](openclaw/openclaw#92631), [#&#8203;92146](openclaw/openclaw#92146), [#&#8203;91287](openclaw/openclaw#91287), [#&#8203;92468](openclaw/openclaw#92468), [#&#8203;92510](openclaw/openclaw#92510), [#&#8203;91246](openclaw/openclaw#91246), [#&#8203;50795](openclaw/openclaw#50795), [#&#8203;50845](openclaw/openclaw#50845), [#&#8203;82874](openclaw/openclaw#82874), [#&#8203;92651](openclaw/openclaw#92651), [#&#8203;92646](openclaw/openclaw#92646)) Thanks [@&#8203;ooiuuii](https://github.com/ooiuuii), [@&#8203;openperf](https://github.com/openperf), [@&#8203;IWhatsskill](https://github.com/IWhatsskill), [@&#8203;ZengWen-DT](https://github.com/ZengWen-DT), [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt), [@&#8203;Hollychou924](https://github.com/Hollychou924), [@&#8203;leno23](https://github.com/leno23), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Agents/exec: default empty-success background completion notices on only for real chat channels, preserving explicit opt-outs and keeping generic providers silent while carrying forward the narrow UX intent from [#&#8203;39726](openclaw/openclaw#39726) and [#&#8203;46926](openclaw/openclaw#46926). Thanks [@&#8203;Sapientropic](https://github.com/Sapientropic) and [@&#8203;wenkang-xie](https://github.com/wenkang-xie).
- Providers and model replay: preserve storeless OpenAI Responses replay compatibility, avoid eager tool streaming for Claude 4.5 in Copilot, honor profile auth for SecretRef model entries, bound model browsing, strip provider prefixes where runtimes need bare IDs, and surface nested embedding fetch failures. ([#&#8203;90706](openclaw/openclaw#90706), [#&#8203;75393](openclaw/openclaw#75393), [#&#8203;90686](openclaw/openclaw#90686), [#&#8203;92247](openclaw/openclaw#92247), [#&#8203;92627](openclaw/openclaw#92627), [#&#8203;91218](openclaw/openclaw#91218), [#&#8203;92628](openclaw/openclaw#92628)) Thanks [@&#8203;snowzlm](https://github.com/snowzlm), [@&#8203;Kailigithub](https://github.com/Kailigithub), [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi), [@&#8203;samson910022](https://github.com/samson910022), [@&#8203;liuhao1024](https://github.com/liuhao1024), [@&#8203;bymle](https://github.com/bymle), and [@&#8203;mushuiyu886](https://github.com/mushuiyu886).
- Memory, state, diagnostics, and config: split header-too-large embedding batches, keep QMD memory search enabled in transient mode, avoid SQLite WAL on NFS volumes, preserve recovery scheduling outside stuck-session warning backoff, and keep shell environment fallbacks contained in config write tests. ([#&#8203;92650](openclaw/openclaw#92650), [#&#8203;92618](openclaw/openclaw#92618), [#&#8203;92639](openclaw/openclaw#92639), [#&#8203;91247](openclaw/openclaw#91247), [#&#8203;92752](openclaw/openclaw#92752)) Thanks [@&#8203;mushuiyu886](https://github.com/mushuiyu886), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;849261680](https://github.com/849261680), and [@&#8203;gnanam1990](https://github.com/gnanam1990).
- Workspace setup state: store setup completion outside the workspace dot directory using an OpenClaw-named root file, migrate valid legacy state forward, and avoid clobbering generic root `workspace-state.json` files for TigerFS-style dot-path compatibility. This Clownfish replacement carries forward the focused [#&#8203;53326](openclaw/openclaw#53326) fix idea because the original branch was closed and uneditable. ([#&#8203;53326](openclaw/openclaw#53326), [#&#8203;44783](openclaw/openclaw#44783), [#&#8203;39446](openclaw/openclaw#39446)) Thanks [@&#8203;1qh](https://github.com/1qh).
- UI/mobile/TUI: preserve dashboard session parent lineage, WebChat backscroll, reset soft command args, sidebar session picker interactivity, collapsed workspace files, resolved `/model` confirmation refs, and stale foreground iOS Gateway reconnects. ([#&#8203;90658](openclaw/openclaw#90658), [#&#8203;92622](openclaw/openclaw#92622), [#&#8203;91353](openclaw/openclaw#91353), [#&#8203;92705](openclaw/openclaw#92705), [#&#8203;92779](openclaw/openclaw#92779), [#&#8203;92773](openclaw/openclaw#92773), [#&#8203;92552](openclaw/openclaw#92552)) Thanks [@&#8203;luoyanglang](https://github.com/luoyanglang), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;zhouhe-xydt](https://github.com/zhouhe-xydt), [@&#8203;NianJiuZst](https://github.com/NianJiuZst), [@&#8203;shakkernerd](https://github.com/shakkernerd), [@&#8203;NarahariRaghava](https://github.com/NarahariRaghava), and [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin).
- TUI: reload the active session after external `/new` or `/reset` session-change events so stale transcript and stream state clear promptly. Fixes [#&#8203;38966](openclaw/openclaw#38966); carries forward [#&#8203;40472](openclaw/openclaw#40472). Thanks [@&#8203;yizhanzjz](https://github.com/yizhanzjz) and [@&#8203;wsyjh8](https://github.com/wsyjh8).
- Control UI: preserve Gateway Access tokens during same-normalized WebSocket URL edits and reload gateway-scoped tokens when switching endpoints. Fixes [#&#8203;41545](openclaw/openclaw#41545); repairs [#&#8203;42001](openclaw/openclaw#42001) with additional source PRs [#&#8203;41546](openclaw/openclaw#41546), [#&#8203;41552](openclaw/openclaw#41552), and [#&#8203;41718](openclaw/openclaw#41718). Thanks [@&#8203;wsyjh8](https://github.com/wsyjh8), [@&#8203;llagy0020](https://github.com/llagy0020), [@&#8203;llagy007](https://github.com/llagy007), [@&#8203;pingfanfan](https://github.com/pingfanfan), and [@&#8203;zheliu2](https://github.com/zheliu2).
- Gateway CLI: tolerate a single transient clean WebSocket close before `hello-ok` so one-shot RPC calls reconnect instead of failing noisily, while repeated clean pre-hello closes still surface. Carries forward source PRs [#&#8203;54475](openclaw/openclaw#54475) and [#&#8203;54774](openclaw/openclaw#54774); [#&#8203;85253](openclaw/openclaw#85253) covered adjacent connect assembly diagnostics. Thanks [@&#8203;ruanrrn](https://github.com/ruanrrn).
- Gateway/Linux: keep root-owned systemd user service lifecycle commands on root's user manager when a stale `SUDO_USER` remains in a root shell with root's user bus environment. Fixes [#&#8203;81410](openclaw/openclaw#81410). Thanks [@&#8203;Ericksza](https://github.com/Ericksza) and [@&#8203;ChuckClose-tech](https://github.com/ChuckClose-tech).
- Release and test reliability: extend slow Gateway/full-suite watchdogs, split local full-suite shards when throttled, stabilize plugin auth marker fixtures, avoid brittle provider-ref error text, and keep QA Lab bootstrap selection assertions aligned with flow-only scenarios. ([#&#8203;92652](openclaw/openclaw#92652))
- macOS Peekaboo bridge: update the embedded Peekaboo package to 3.5.2 and route bundled-skill CLI commands through the OpenClaw app bridge so they inherit its Screen Recording and Accessibility grants.
- Agent routing: route subagent RPC callbacks addressed to an agent-shaped `--to` target to the correct session key instead of falling back to the main session, so WeChat (and other channel) session-key callbacks reach the intended subagent session. ([#&#8203;90231](openclaw/openclaw#90231)) Thanks [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- Cron: preserve model, fallback, thinking, timeout, light-context, unsafe-content, and tool allow-list overrides on implicit text payloads by promoting them to agent turns, while explicit system events still prune those fields. Fixes [#&#8203;28905](openclaw/openclaw#28905); carries forward [#&#8203;64060](openclaw/openclaw#64060) and [#&#8203;73946](openclaw/openclaw#73946). Thanks [@&#8203;liaoandi](https://github.com/liaoandi).
- QQBot delivery: keep markdown table chunks self-contained across message boundaries by preserving table state across block deliveries, flushing unfinished table-row fragments as plain text, and detecting short pipe-terminated rows by column count so split rows are not sent as malformed markdown. ([#&#8203;92428](openclaw/openclaw#92428)) Thanks [@&#8203;sliverp](https://github.com/sliverp).

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/1144
crh-code pushed a commit to crh-code/openclaw that referenced this pull request Jun 18, 2026
… routed to main session instead (openclaw#90231)

* fix agent session-key callback routing

* fix reset ack session-key delivery

* fix direct agent to session key routing

* fix lint in direct agent session routing

* fix: route subagent RPC callbacks to agent-shaped --to session key instead of main session (openclaw#90231) (thanks @zhangguiping-xydt)

---------

Co-authored-by: sliverp <[email protected]>
badgerbees pushed a commit to badgerbees/openclaw that referenced this pull request Jul 8, 2026
… routed to main session instead (openclaw#90231)

* fix agent session-key callback routing

* fix reset ack session-key delivery

* fix direct agent to session key routing

* fix lint in direct agent session routing

* fix: route subagent RPC callbacks to agent-shaped --to session key instead of main session (openclaw#90231) (thanks @zhangguiping-xydt)

---------

Co-authored-by: sliverp <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling commands Command implementations gateway Gateway runtime merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P2 Normal backlog priority with limited blast radius. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: M status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Subagent RPC callback to WeChat session key routed to main session instead

2 participants