Skip to content

fix(ui): preserve dashboard session parent lineage when session list is stale#90658

Merged
vincentkoc merged 1 commit into
openclaw:mainfrom
luoyanglang:wolf/dashboard-session-parent-lineage
Jun 13, 2026
Merged

fix(ui): preserve dashboard session parent lineage when session list is stale#90658
vincentkoc merged 1 commit into
openclaw:mainfrom
luoyanglang:wolf/dashboard-session-parent-lineage

Conversation

@luoyanglang

@luoyanglang luoyanglang commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Summary

Dashboard-created agent sessions (agent:<id>:dashboard:*) could lose their parent lineage. In the Control UI, createChatSession only kept parentSessionKey when the previously selected session key already appeared in state.sessionsResult. When that session list was stale, filtered, or not yet loaded, the parent link was dropped, the dashboard session was created unparented, and default tree visibility then omitted it from sessions_list — so assistant replies were written to the transcript but never shown in the dashboard UI.

Fixes #90623.

Affected surface

  • ui/src/ui/app-render.helpers.tscreateChatSession now derives parentSessionKey from the normalized currently-selected state.sessionKey instead of requiring it to be present in the possibly stale/filtered state.sessionsResult. The gateway's existing parent validation remains the backstop for genuinely unknown parents.
  • ui/src/ui/app-render.helpers.node.test.ts — RED/GREEN regression.

Scope

  • Only the Control UI session-creation lineage is changed. iOS/shared ChatViewModel already passes the parent unconditionally; this aligns the Control UI path with that existing contract.
  • No change to unrelated session visibility logic, gateway validation, or other channels.

Real behavior proof

Behavior or issue addressed: a dashboard child session created from the currently selected parent should keep parentSessionKey even when the Control UI session list is not loaded yet. After the gateway returns the dashboard child and sessions.list includes the parent-linked child row, the child should stay visible in the Control UI and assistant replies should render in that child session.

Real environment tested: local macOS development machine on darwin, branch wolf/dashboard-session-parent-lineage. The proof used real Playwright Chromium launched against the repository Control UI E2E Vite server and the repository installMockGateway WebSocket helper with redacted local-only data. No production endpoint, token, or model credential was used. Screenshot artifact captured locally under the contributor's temporary artifacts directory.

Exact steps or command run after this patch:

node scripts/ensure-playwright-chromium.mjs
node scripts/run-vitest.mjs ui/src/ui/app-render.helpers.node.test.ts
node --import tsx --input-type=module  # starts Control UI E2E server, opens Chromium, installs mock Gateway, captures screenshot/JSON proof

Browser proof scenario:

  1. Opened real Control UI /chat with selected parent agent:ops:main.
  2. Left the session list intentionally unloaded before creating the dashboard child; proof observed preCreateSessionsListRequestCount: 0.
  3. Clicked the visible New session control in the UI.
  4. Captured the real mock-gateway sessions.create request.
  5. Mock gateway returned child key agent:ops:dashboard:new-proof, then sessions.list returned a visible child row labeled Proof child visible with parentSessionKey: agent:ops:main.
  6. Sent a chat turn in the child session and emitted an assistant final event for that same child session.
  7. Verified the child label, prompt, and assistant final reply were visible in the browser page; captured screenshot and JSON evidence.

Evidence after fix: focused RED/GREEN test proof and copied live Chromium Control UI proof output.

Focused RED/GREEN test proof:

  • Before the fix, the stale/missing-list regression resolves parentSessionKey to undefined when state.sessionsResult does not contain the selected parent.
  • After the fix, createChatSession passes parentSessionKey: "agent:ops:main" even when sessionsResult is stale.
  • node scripts/run-vitest.mjs ui/src/ui/app-render.helpers.node.test.ts passed: 68/68 tests.

Real Chromium Control UI proof output:

{
  "platform": "darwin",
  "head": "6286e0522b9c85d93faaabb0aa95f9b247b44bea",
  "proofKind": "real Chromium Control UI with repository mock Gateway helper",
  "url": "http://127.0.0.1:51110/chat?session=agent%3Aops%3Adashboard%3Anew-proof",
  "parentKey": "agent:ops:main",
  "childKey": "agent:ops:dashboard:new-proof",
  "preCreateSessionsListRequestCount": 0,
  "createParams": {
    "agentId": "ops",
    "parentSessionKey": "agent:ops:main",
    "emitCommandHooks": true
  },
  "sendParams": {
    "sessionKey": "agent:ops:dashboard:new-proof",
    "message": "show the proof reply in the dashboard child session",
    "deliver": false,
    "hasRunId": true
  },
  "sessionsListRequestCountAfterCreate": 2,
  "observed": {
    "childLabelVisible": true,
    "childUrlContainsSessionKey": true,
    "promptVisible": true,
    "assistantReplyVisible": true
  }
}

Screenshot proof was captured locally under the contributor's temporary artifacts directory.

The screenshot shows the real Control UI with:

  • Proof child visible selected in the chat session control
  • Proof child visible visible in the left recent sessions list
  • the sent prompt visible in the child session transcript
  • Proof reply visible in dashboard child session. visible as the assistant reply

Observed result after fix: the Control UI created the dashboard child from an unloaded session-list state while still sending parentSessionKey: "agent:ops:main". The returned child session became the active dashboard chat, appeared in the UI session controls/recent list, and rendered the assistant final reply in the child transcript.

What was not tested:

  • I did not use a production gateway, public endpoint, private token, or live model provider credential.
  • I did not run a real remote assistant/model turn; the assistant final event was emitted through the repository mock Gateway helper after the UI sent a real chat.send request for the child session.
  • I did not test iOS/shared ChatViewModel; that path already passes the parent unconditionally and is outside this Control UI-only patch.

De-duplication

Five independent open-PR searches (Fixes #90623, #90623, dashboard session reply, parentSessionKey dashboard, app-render createChatSession) returned no competing open PR. Two nearby but unrelated open PRs exist (#90489 visibility error wording, #89461 current-session alias visibility); neither targets dashboard session lineage.

Narrow-fix rationale

  1. Existing contract: dashboard child sessions are meant to be parent-linked; the Control UI could silently drop that link.
  2. Adjacent paths: iOS/shared ChatViewModel already passes the parent unconditionally — the Control UI was the odd path.
  3. Canonical owner: Control UI creation path plus the existing gateway parent-validation backstop.
  4. Supersession risk: low; no open PR targets this lineage gap.

Maintainer update

Maintainer follow-up fixed the added regression test to use explicit user intent and added coverage that the synthetic unknown session key is not sent as parentSessionKey; the gateway remains the validation backstop for genuinely unknown parents.

@openclaw-barnacle openclaw-barnacle Bot added app: web-ui App: web-ui size: XS triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 5, 2026
@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge. Reviewed June 13, 2026, 2:06 PM ET / 18:06 UTC.

Summary
The PR changes Control UI chat session creation to derive parentSessionKey from the selected session key instead of the cached session list, and adds stale-list regression coverage.

PR surface: Source -4, Tests +36. Total +32 across 2 files.

Reproducibility: yes. Source inspection of the current merge result shows the added stale-list test calls createChatSession(state) without { source: "user" }, while current main's helper returns false before createSessionAndRefresh without that intent.

Review metrics: 1 noteworthy metric.

  • Merge-result stale test invocation: 1 added test calls the no-intent path. Current main's helper returns before session creation unless explicit user intent is supplied, so this affects merge readiness.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

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

Rank-up moves:

  • Update the added stale-list regression to call createChatSession(state, { source: "user" }).
  • Rerun node scripts/run-vitest.mjs ui/src/ui/app-render.helpers.node.test.ts after the test update.

Risk before merge

  • [P1] The branch's current merge result would fail the focused helper regression because the new test takes the no-intent path introduced on current main.
  • [P1] The PR body says a maintainer follow-up fixed the test for explicit user intent, but the live merge-result content does not show that update.

Maintainer options:

  1. Refresh the added regression for current main (recommended)
    Pass explicit user intent in the new stale-list regression and rerun the focused helper test so the PR proves the production change against the current helper contract.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Update the added stale session-list regression in ui/src/ui/app-render.helpers.node.test.ts so it calls createChatSession(state, { source: "user" }) after the current-main intent guard, then run node scripts/run-vitest.mjs ui/src/ui/app-render.helpers.node.test.ts.

Next step before merge

  • [P2] The remaining blocker is a narrow mechanical test repair on the PR branch, not a product or ownership decision.

Security
Cleared: No security or supply-chain concern found; the diff only changes Control UI session-parent selection logic and a focused test.

Review findings

  • [P2] Pass user intent in the stale-list regression test — ui/src/ui/app-render.helpers.node.test.ts:839
Review details

Best possible solution:

Keep the production lineage change, update the added stale-list regression to pass { source: "user" }, then rerun the focused helper test before normal maintainer and CI review.

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

Yes. Source inspection of the current merge result shows the added stale-list test calls createChatSession(state) without { source: "user" }, while current main's helper returns false before createSessionAndRefresh without that intent.

Is this the best way to solve the issue?

No, not as submitted. The production fix is the narrow owner-boundary solution, but the regression test must be refreshed for the current-main intent contract before this PR is merge-ready.

Full review comments:

  • [P2] Pass user intent in the stale-list regression test — ui/src/ui/app-render.helpers.node.test.ts:839
    Current main's createChatSession now returns false unless passed { source: "user" } from the merged intent-guard work at fix(ui): require user intent for chat sessions #91480. This added regression still calls createChatSession(state), so createSessionAndRefreshMock is never called and the test fails before proving the stale-list parent behavior; pass explicit user intent here.
    Confidence: 0.96

Overall correctness: patch is incorrect
Overall confidence: 0.9

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add merge-risk: 🚨 automation: The PR's current merge result contains an added regression test that would fail before exercising the patched parent-lineage behavior.
  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix Chromium Control UI live output showing the stale-list create path sends parentSessionKey, refreshes the child row, and renders the assistant reply.
  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • add status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body includes after-fix Chromium Control UI live output showing the stale-list create path sends parentSessionKey, refreshes the child row, and renders the assistant reply.
  • remove rating: 🦞 diamond lobster: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.
  • remove status: 👀 ready for maintainer look: Current PR status label is status: ⏳ waiting on author.

Label justifications:

  • P2: This is a focused Control UI bugfix for a user-visible dashboard session lineage and reply-visibility issue with limited blast radius.
  • merge-risk: 🚨 automation: The PR's current merge result contains an added regression test that would fail before exercising the patched parent-lineage behavior.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body includes after-fix Chromium Control UI live output showing the stale-list create path sends parentSessionKey, refreshes the child row, and renders the assistant reply.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix Chromium Control UI live output showing the stale-list create path sends parentSessionKey, refreshes the child row, and renders the assistant reply.
Evidence reviewed

PR surface:

Source -4, Tests +36. Total +32 across 2 files.

View PR surface stats
Area Files Added Removed Net
Source 1 1 5 -4
Tests 1 36 0 +36
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 2 37 5 +32

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs ui/src/ui/app-render.helpers.node.test.ts.

What I checked:

  • Repository policy read: Root and UI-scoped AGENTS.md were read fully; the root review policy required caller/callee, sibling, proof, and best-fix checks, while the UI guide had no i18n-specific impact on these files. (AGENTS.md:1, ca2410ab072e)
  • Current main requires explicit user intent: Current main's createChatSession returns false unless callers pass { source: "user" }, before connection checks or createSessionAndRefresh. (ui/src/ui/app-render.helpers.ts:714, ca2410ab072e)
  • Current main still has the stale-list parent gate: Current main derives parentSessionKey from membership in state.sessionsResult.sessions, so a stale or unloaded list can still drop the selected parent. (ui/src/ui/app-render.helpers.ts:733, ca2410ab072e)
  • PR merge result keeps the production fix: The GitHub merge-result ref shows the production change would replace the cached-list membership gate with normalizeOptionalString(previousSessionKey). (ui/src/ui/app-render.helpers.ts:734, 4d88e23fda3e)
  • PR merge result has a failing added test path: The merge-result test still calls createChatSession(state) without the required { source: "user" }, so the helper returns before the expectation can observe createSessionAndRefreshMock. (ui/src/ui/app-render.helpers.node.test.ts:854, 4d88e23fda3e)
  • UI callers pass explicit intent on current main: Current UI New Session call sites pass { source: "user" }, matching the intent boundary added after this PR was opened. (ui/src/ui/app-render.ts:564, ca2410ab072e)

Likely related people:

  • TurboTheTurtle: Authored merged PR fix(ui): require user intent for chat sessions #91480, which added the explicit user-intent requirement that this PR's added test must now satisfy. (role: introduced current-main guard; confidence: high; commits: 9833f3ea9bf8; files: ui/src/ui/app-render.helpers.ts, ui/src/ui/app-render.helpers.node.test.ts, ui/src/ui/app-render.ts)
  • shakkernerd: Recent history for app-render.helpers.ts and adjacent helper tests includes Control UI session-switching work in this area. (role: recent area contributor; confidence: medium; commits: 8c919801237e, 03c730c48f21; files: ui/src/ui/app-render.helpers.ts, ui/src/ui/app-render.helpers.node.test.ts)
  • steipete: Recent path history shows Control UI source documentation and gateway session-method work adjacent to the parent-lineage boundary. (role: adjacent UI and gateway session contributor; confidence: medium; commits: 12a56d4d46dd, a6ecc4bd89f4; files: ui/src/ui/app-render.helpers.ts, src/gateway/server-methods/sessions.ts)
  • zhangguiping-xydt: Recent Control UI session-list scoping work touched the same session-result and selected-agent behavior that makes stale lists relevant here. (role: adjacent session-list contributor; confidence: low; commits: dbd3e10312f8; files: ui/src/ui/app-render.helpers.ts, ui/src/ui/app-render.helpers.node.test.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 rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. labels Jun 5, 2026
@luoyanglang

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Added real Control UI/browser proof on head 6286e0522b9c85d93faaabb0aa95f9b247b44bea.

What changed in the proof body:

  • Ran real Playwright Chromium against the repository Control UI E2E Vite server on macOS.
  • Installed the repository mock Gateway helper; no production endpoint, token, or live model credential used.
  • Started from selected parent agent:ops:main with the session list intentionally unloaded before creation (preCreateSessionsListRequestCount: 0).
  • Clicked the real UI New session control.
  • Captured sessions.create params showing parentSessionKey: "agent:ops:main" and emitCommandHooks: true.
  • Returned child agent:ops:dashboard:new-proof, refreshed sessions.list with the visible child row, sent a real UI chat turn in that child session, and emitted an assistant final event for the same child session.
  • Browser observation: child label visible, prompt visible, assistant reply visible.

Validation also kept the existing RED/GREEN unit proof: node scripts/run-vitest.mjs ui/src/ui/app-render.helpers.node.test.ts passed 68/68.

@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 5, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. proof: sufficient ClawSweeper judged the real behavior proof convincing. labels Jun 5, 2026
@luoyanglang

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Refreshed the PR body Real behavior proof section to use the exact field-line format accepted by scripts/github/real-behavior-proof-policy.mjs: Behavior or issue addressed, Real environment tested, Exact steps or command run after this patch, Evidence after fix, Observed result after fix, and What was not tested.

Local evaluator check on the current PR body returned status: passed for head 6286e0522b9c85d93faaabb0aa95f9b247b44bea.

@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

Re-review progress:

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 6, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 13, 2026
@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. merge-risk: 🚨 automation 🚨 May affect CI, automerge, proof capture, label sync, or maintainer automation. and removed rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 13, 2026
@vincentkoc
vincentkoc force-pushed the wolf/dashboard-session-parent-lineage branch from 6286e05 to 03d1c6f Compare June 13, 2026 18:10
@openclaw-barnacle openclaw-barnacle Bot added size: S and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. labels Jun 13, 2026

@vincentkoc vincentkoc left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No blocking findings.

Best-fix verdict: best with the maintainer fixup. createChatSession now derives the parent from the selected session key instead of the possibly stale/filtered sessionsResult, while the follow-up guard avoids sending the synthetic unknown session as parentSessionKey. Gateway sessions.create still canonicalizes and rejects genuinely unknown parents, so validation stays server-side.

Proof:

  • Local: oxfmt --check on touched files
  • Local: node scripts/run-oxlint.mjs ui/src/ui/app-render.helpers.ts ui/src/ui/app-render.helpers.node.test.ts
  • Local: node scripts/run-vitest.mjs ui/src/ui/app-render.helpers.node.test.ts --maxWorkers=1 -t 'keeps the selected session as parent when the session list is stale|does not use the synthetic unknown session as a parent|creates selected global sessions under the same agent used for refresh'
  • Local: node scripts/run-vitest.mjs ui/src/ui/app-render.helpers.node.test.ts --maxWorkers=1
  • Local: node scripts/run-vitest.mjs ui/src/ui/navigation.browser.test.ts --maxWorkers=1 -t 'creates a new chat session from the sidebar'
  • Autoreview: clean, no accepted/actionable findings.
  • Crabbox AWS run_a2bfdcd2315a: UI helper suite and sidebar new-session browser test passed.
  • Crabbox AWS run_ce60fdc546ff: OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 corepack pnpm check:changed passed; selected lanes core, coreTests.
  • GitHub exact-head CI on 03d1c6f646caeed2813e673446109751a50c610f: latest checks 125 success, 16 skipped.

Public-body hygiene: scrubbed the absolute local screenshot path from the PR body before push/merge.

@vincentkoc
vincentkoc merged commit a181458 into openclaw:main Jun 13, 2026
146 of 149 checks passed
@luoyanglang
luoyanglang deleted the wolf/dashboard-session-parent-lineage branch June 14, 2026 11:19
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: web-ui App: web-ui merge-risk: 🚨 automation 🚨 May affect CI, automerge, proof capture, label sync, or maintainer automation. P2 Normal backlog priority with limited blast radius. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: S status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: dashboard child sessions record assistant replies but do not display them

2 participants