You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -39,6 +39,7 @@ Docs: https://docs.openclaw.ai
39
39
- Providers: honor env-proxy settings for guarded provider model fetches when no explicit dispatcher policy is configured, preserving explicit transport overrides. Fixes #70453. (#72480) Thanks @mjamiv.
40
40
- Feishu: accept and honor `channels.feishu.blockStreaming` at the top level and per account, while keeping the legacy default off so Feishu cards no longer reject documented config or silently drop block replies. Fixes #75555. Thanks @vincentkoc.
41
41
- Gateway/update: avoid `launchctl kickstart -k` immediately after fresh macOS update bootstraps, and unlink dangling global plugin-runtime symlinks during packaged postinstall and `doctor --fix` so upgrades no longer SIGTERM the newly booted Gateway or leave bundled plugin imports pointed at pruned `plugin-runtime-deps` trees. Completes #76261 and fixes #76466. (#76929)
42
+
- Agents/subagents: route completion announces through the requester session's internal steer/queue path before direct fallback, preventing synchronous announce turns and timeout retries from piling up behind busy requester sessions.
42
43
- Google Chat: normalize custom Google auth transport headers before google-auth/gaxios interceptors run, restoring webhook token verification when certificate retrieval expects Fetch `Headers`. Fixes #76742. Thanks @donbowman.
43
44
- Doctor/plugins: reset stale `plugins.slots.memory` and `plugins.slots.contextEngine` references during `doctor --fix`, so cleanup of missing plugin config does not leave unrecoverable slot owners behind. Fixes #76550 and #76551. Thanks @vincentkoc.
44
45
- Docs/WhatsApp: merge the duplicate top-level `web` objects in the gateway channel config example so copy-pasted WhatsApp config keeps both `web.whatsapp` and reconnect settings. Fixes #76619. Thanks @WadydX.
- OpenClaw tries direct `agent` delivery first with a stable idempotency key.
84
-
- If direct delivery fails, it falls back to queue routing.
83
+
- OpenClaw steers completion events into an active requester run when possible.
84
+
- If the requester run cannot be steered but its session exists, OpenClaw queues an internal follow-up independent of the channel queue mode.
85
+
- Direct `agent` delivery is only a fallback when queue routing is unavailable, and uses a stable idempotency key.
86
+
- If fallback direct `agent` delivery times out, OpenClaw falls back to direct message delivery instead of starting another agent turn, because the timed-out turn may still be running server-side.
85
87
- If queue routing is still not available, the announce is retried with a short exponential backoff before final give-up.
86
88
- Completion delivery keeps the resolved requester route: thread-bound or conversation-bound completion routes win when available; if the completion origin only provides a channel, OpenClaw fills the missing target/account from the requester session's resolved route (`lastChannel` / `lastTo` / `lastAccountId`) so direct delivery still works.
87
89
@@ -379,11 +381,15 @@ Delivery depends on requester depth:
379
381
- Nested requester subagent sessions receive an internal follow-up injection (`deliver=false`) so the orchestrator can synthesize child results in-session.
380
382
- If a nested requester subagent session is gone, OpenClaw falls back to that session's requester when available.
381
383
382
-
For top-level requester sessions, completion-mode direct delivery first
383
-
resolves any bound conversation/thread route and hook override, then fills
384
-
missing channel-target fields from the requester session's stored route.
385
-
That keeps completions on the right chat/topic even when the completion
386
-
origin only identifies the channel.
384
+
For top-level requester sessions, completion-mode delivery first resolves any
385
+
bound conversation/thread route and hook override, then steers the requester run
386
+
or queues an internal follow-up with that route. This queue path is used even
387
+
when the channel queue mode would otherwise run direct, so child completions do
388
+
not start synchronous waiter turns behind busy requester sessions. If no
389
+
requester session can be queued, direct fallback still fills missing
390
+
channel-target fields from the requester session's stored route. That keeps
391
+
completions on the right chat/topic even when the completion origin only
392
+
identifies the channel.
387
393
388
394
Child completion aggregation is scoped to the current requester run when
389
395
building nested completion findings, preventing stale prior-run child
it("uses direct fallback for completion DMs without a thread id when announce-agent returns no visible output",async()=>{
794
+
it("uses direct fallback for completion DMs without a thread id when queue routing is unavailable and announce-agent returns no visible output",async()=>{
0 commit comments