Skip to content

fix(webchat): preserve sends through reconnect#87531

Merged
steipete merged 4 commits into
mainfrom
meow/webchat-send-ack-reconnect
May 28, 2026
Merged

fix(webchat): preserve sends through reconnect#87531
steipete merged 4 commits into
mainfrom
meow/webchat-send-ack-reconnect

Conversation

@BunsDev

@BunsDev BunsDev commented May 28, 2026

Copy link
Copy Markdown
Member

Summary

  • Preserve normal WebChat sends as explicit in-memory queued/pending items until chat.send ACK resolves.
  • Retry pre-ACK socket-close sends after reconnect with the same idempotency key, and surface Sending, Waiting for reconnect, and Failed queue states with retry/remove affordances.
  • Extend the mocked Control UI Gateway harness for delayed/rejected ACKs, socket close/reconnect, mutable history, and tool-window reconnect coverage.

Refs #86811.

Verification

  • pnpm install --no-frozen-lockfile
  • pnpm install --frozen-lockfile
  • node scripts/run-vitest.mjs ui/src/ui/app-chat.test.ts ui/src/ui/controllers/chat.test.ts ui/src/ui/app-gateway.node.test.ts ui/src/ui/gateway.node.test.ts (194 tests passed)
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.ui-e2e.config.ts --configLoader runner ui/src/ui/e2e/chat-flow.e2e.test.ts (5 tests passed)
  • node scripts/run-vitest.mjs ui/src/ui/views/chat.test.ts (59 tests passed)
  • git diff --check

Notes

  • No CHANGELOG.md update; release note context stays in the PR body for this normal fix slice.
  • Did not change Gateway protocol/auth semantics or add durable localStorage queueing.

Copilot AI review requested due to automatic review settings May 28, 2026 05:05
@BunsDev BunsDev requested a review from a team as a code owner May 28, 2026 05:05
@github-actions github-actions Bot added the dependencies-changed PR changes dependency-related files label May 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Dependency Changes Detected

This PR changes dependency-related files. Maintainers should confirm these changes are intentional.

Changed files:

  • pnpm-lock.yaml

Maintainer follow-up:

  • Review whether the dependency changes are intentional.
  • Inspect resolved package deltas when lockfile, shrinkwrap, or workspace dependency policy changes are present.
  • Treat package-lock.json and npm-shrinkwrap.json diffs as security-review surfaces.
  • Run pnpm deps:changes:report -- --base-ref origin/main --markdown /tmp/dependency-changes.md --json /tmp/dependency-changes.json locally for detailed release-style evidence.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR hardens the Control UI WebChat send path across WebSocket disconnects by keeping “normal” sends in an explicit in-memory queue until chat.send is ACKed, retrying pre-ACK sends after reconnect (same idempotency key), and exposing queue send states (Sending / Waiting for reconnect / Failed) with retry/remove actions. It also expands the mocked Gateway E2E harness to simulate deferred/rejected ACKs, socket close/reconnect, and mutable history for reconnect coverage.

Changes:

  • Introduce queued-send tracking (sendRunId, sendState, sendError, sendAttempts) and reconnect-driven retry for pre-ACK chat.send.
  • Add UI affordances for failed queued sends (error display + retry button) and wire it through app state.
  • Extend unit + E2E test infrastructure to simulate delayed/rejected ACKs and socket reconnect flows.

Reviewed changes

Copilot reviewed 17 out of 18 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
ui/src/ui/views/chat.ts Plumbs optional onQueueRetry into chat queue rendering.
ui/src/ui/views/chat.test.ts Adds coverage for failed send UI state and retry click behavior.
ui/src/ui/ui-types.ts Extends ChatQueueItem with send lifecycle fields and sessionKey.
ui/src/ui/e2e/chat-flow.e2e.test.ts Adds E2E scenarios for delayed/rejected ACKs, ACK-lost reconnect resend, and history refresh after reconnect.
ui/src/ui/controllers/chat.ts Adds ACK normalization/types and returns structured ACK from requestChatSend; updates send paths to consume ACK.
ui/src/ui/controllers/chat.test.ts Adds test asserting adoption of terminal ACK status/runId.
ui/src/ui/chat/chat-queue.ts Renders send-state badges, error text, and retry action for failed sends; disables steer for send-tracked items.
ui/src/ui/app.ts Exposes retryQueuedChatMessage() on the app instance.
ui/src/ui/app-view-state.ts Adds retryQueuedChatMessage to the view-state contract.
ui/src/ui/app-render.ts Wires queue retry handler into chat view props.
ui/src/ui/app-gateway.ts Marks “sending” queued items as waiting on disconnect; resumes queue after reconnect when reconnectable sends exist.
ui/src/ui/app-gateway.node.test.ts Adds reconnect-hello test ensuring queued sends are retried with same idempotency key.
ui/src/ui/app-chat.ts Implements queued-send lifecycle, reconnect retry, composer restore on failure, and retry entrypoint for failed sends.
ui/src/ui/app-chat.test.ts Adds/updates tests for pending visibility, recoverable socket-close, disconnected sends queueing, and validation failures.
ui/src/test-helpers/control-ui-e2e.ts Expands mock Gateway controls (defer/resolve/reject, closeLatest, history mutation, socket count) and adjusts chat.send response shape.
ui/src/styles/components.css Styles queued-send error text.
ui/src/styles/chat/layout.css Applies shared button styling to retry action.
pnpm-lock.yaml Updates patchedDependencies lock formatting for the ACP patch entry.
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

Comment on lines +551 to +554
} else {
state.chatRunId = ack.runId;
}
return ack.status === "ok" ? ack.runId : runId;
@clawsweeper

clawsweeper Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge. Reviewed May 28, 2026, 12:04 PM ET / 16:04 UTC.

Summary
The PR adds an in-memory WebChat pending-send queue, reconnect retry with stable idempotency keys, queue retry/error UI, expanded mocked Gateway tests, and a patchedDependency metadata rewrite in the lockfile.

PR surface: Source +687, Tests +467, Other +2. Total +1156 across 19 files.

Reproducibility: no. live high-confidence reproduction was established in this read-only review. The source path and mocked E2E tests clearly exercise delayed ACK, rejected ACK, and reconnect retry behavior, but the PR body does not show a real Gateway reconnect run.

Review metrics: 1 noteworthy metric.

  • Patched dependency metadata: 1 entry changed, 0 package versions changed. The lockfile delta is small but dependency patch metadata is a supply-chain surface maintainers should intentionally accept.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🌊 off-meta tidepool
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

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

Rank-up moves:

  • [P2] Fix the sendChatMessage() acknowledged-run-id return mismatch or explicitly waive it.
  • [P2] Confirm whether mocked E2E is enough for this reconnect path or add live WebChat reconnect proof.
  • Confirm the pnpm-lock patchedDependency metadata rewrite is intentional.

Mantis proof suggestion
A real visible browser/Gateway reconnect proof would materially reduce message-delivery risk beyond the mocked tests. A maintainer can ask Mantis to capture proof by posting a new PR comment that starts with the OpenClaw Mantis account mention, followed by:

visual task: verify WebChat preserves a pending send through Gateway reconnect and retries with the same idempotency key.

Risk before merge

  • [P1] The PR changes the in-memory WebChat send/retry state machine; mocked unit and Playwright Gateway tests cover ACK loss and reconnect, but the PR body does not include live Gateway/browser reconnect proof.
  • [P1] The lockfile metadata rewrite appears package-version neutral, but patched dependency metadata is still a supply-chain review surface that maintainers should confirm is intentional.

Maintainer options:

  1. Add live WebChat reconnect proof
    Before merge, run a real Control UI/Gateway reconnect scenario and attach redacted proof showing the pending send retries once with the same idempotency key.
  2. Accept mocked reconnect coverage
    Maintainers can merge after CI if they decide the unit and Playwright-mocked Gateway coverage is enough for this maintainer PR.
  3. Take the run-id cleanup first (recommended)
    Apply the small sendChatMessage return-value cleanup and focused controller test before final review.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Return `ack.runId` from `sendChatMessage()` for non-terminal ACKs and add or adjust a focused `ui/src/ui/controllers/chat.test.ts` expectation where the Gateway returns a different started run id; do not alter WebChat queue/reconnect behavior or the lockfile.

Next step before merge

  • [P2] The remaining code repair is a one-line controller return-value cleanup plus a focused unit expectation; live proof and merge timing remain maintainer decisions.

Security
Cleared: No concrete security regression was found; the only dependency-surface delta rewrites an existing patched dependency entry to explicit hash/path metadata with the same hash.

Review findings

  • [P3] Return the acknowledged run id from sendChatMessageui/src/ui/controllers/chat.ts:554
Review details

Best possible solution:

Merge only after maintainers accept the mocked reconnect coverage or add live proof, confirm the lockfile rewrite, and take or explicitly waive the small acknowledged-run-id cleanup.

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

No live high-confidence reproduction was established in this read-only review. The source path and mocked E2E tests clearly exercise delayed ACK, rejected ACK, and reconnect retry behavior, but the PR body does not show a real Gateway reconnect run.

Is this the best way to solve the issue?

Mostly yes: an in-memory ACK-pending queue with idempotency-key retry is a narrow fix that avoids protocol or durable-storage changes. The safer final shape is to also return the acknowledged run id from the exported controller helper and let maintainers decide whether live reconnect proof is required.

Full review comments:

  • [P3] Return the acknowledged run id from sendChatMessageui/src/ui/controllers/chat.ts:554
    When chat.send ACKs with a non-terminal status and a Gateway-owned run id, this path assigns state.chatRunId = ack.runId but returns the local idempotency key. That leaves the exported controller helper reporting a different active run id than the state it just set; return ack.runId and cover the non-terminal ACK case.
    Confidence: 0.86

Overall correctness: patch is correct
Overall confidence: 0.82

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 7a36bb37afaf.

Label changes

Label justifications:

  • P1: The PR addresses a broken WebChat reconnect/send path that can drop or stall user messages during active agent work.
  • merge-risk: 🚨 message-delivery: Merging changes the send queue and reconnect retry path, where a defect could duplicate, lose, or mis-associate WebChat messages.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🌊 off-meta tidepool and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Not applicable: The external-contributor proof gate does not apply to this member/maintainer-labeled PR; the PR body provides mocked test output but no live reconnect artifact.
Evidence reviewed

PR surface:

Source +687, Tests +467, Other +2. Total +1156 across 19 files.

View PR surface stats
Area Files Added Removed Net
Source 12 793 106 +687
Tests 6 470 3 +467
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 1 3 1 +2
Total 19 1266 110 +1156

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs ui/src/ui/controllers/chat.test.ts.
  • [P1] git diff --check.

What I checked:

  • Root repository policy read: Read the full root AGENTS.md and applied its PR review guidance for UI changes, message-delivery risk, lockfile security review, protected maintainer labels, and scoped policy checks. (AGENTS.md:1, 7a36bb37afaf)
  • Scoped UI policy read: Read the full UI-scoped AGENTS.md; it did not add special requirements for these touched files beyond normal Control UI ownership. (ui/AGENTS.md:1, 7a36bb37afaf)
  • Queued send implementation: The PR prepares queued send items with sendRunId/sendState, retries through requestChatSend, removes the pending item only after ACK, and appends the user message after the send ACK resolves. (ui/src/ui/app-chat.ts:405, e8958484f090)
  • Reconnect hook implementation: On Gateway hello, the PR detects waiting reconnect sends and calls retryReconnectableQueuedChatSends; on close, it marks in-flight queued sends as waiting for reconnect. (ui/src/ui/app-gateway.ts:587, e8958484f090)
  • Mocked browser behavior coverage: The new mocked Control UI E2E cases cover delayed ACK visibility, rejected ACK recovery, retry after socket close with the same idempotency key, and history refresh after reconnect. (ui/src/ui/e2e/chat-flow.e2e.test.ts:105, e8958484f090)
  • Remaining controller return inconsistency: sendChatMessage assigns state.chatRunId from ack.runId for non-terminal ACKs but still returns the local idempotency key, leaving the exported helper internally inconsistent if a Gateway ACK chooses a different run id. (ui/src/ui/controllers/chat.ts:554, e8958484f090)

Likely related people:

  • steipete: Authored the current PR's session-scoping follow-up commit and appears heavily in recent Control UI/WebChat history for the touched files. (role: recent area contributor and PR follow-up owner; confidence: high; commits: e8958484f090, 27ae826f6525, 94c61aa19d2d; files: ui/src/ui/app-chat.ts, ui/src/ui/app-gateway.ts, ui/src/ui/controllers/chat.ts)
  • BunsDev: Authored the first PR commit and has prior merged Control UI history in the same dashboard/WebChat area, so this is not only opener attribution. (role: feature contributor; confidence: high; commits: 3d7161c4360b, f76a3c5225bb, d0c83777fb58; files: ui/src/ui/app-chat.ts, ui/src/ui/controllers/chat.ts, ui/src/ui/app-gateway.ts)
  • vincentkoc: Current-main shallow blame and recent log entries point to Vincent Koc as a recent toucher of the current Control UI chat/Gateway files, though the shallow boundary limits exact line provenance. (role: recent adjacent contributor; confidence: medium; commits: 76ebc149567b, 39377b7a204c; files: ui/src/ui/app-chat.ts, ui/src/ui/controllers/chat.ts, ui/src/ui/app-gateway.ts)
  • gumadeiras: Prior Control UI reconnect and seq-gap commits are directly adjacent to the reconnect queue behavior changed here. (role: adjacent reconnect behavior owner; confidence: medium; commits: c191dc992884, 1600c1726e6b; files: ui/src/ui/app-gateway.ts, ui/src/ui/app-chat.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: 🐚 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. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. labels May 28, 2026
@clawsweeper

clawsweeper Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg: ✨ hatched 🌱 uncommon Frosted Patch Peep. Rarity: 🌱 uncommon. Trait: keeps receipts.

Details

Share on X: post this hatch
Copy: My PR egg hatched a 🌱 uncommon Frosted Patch Peep in ClawSweeper.
Hatchability:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.

About:

  • Eggs appear after real-behavior proof passes. They are collectible flavor only.
  • Review momentum changes the shell state: follow-up work warms it, re-review makes it wobble, and a clean final review lets it hatch.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

@BingqingLyu

This comment was marked as spam.

@steipete steipete self-assigned this May 28, 2026
@steipete steipete force-pushed the meow/webchat-send-ack-reconnect branch from 6a18e13 to 67aa07c Compare May 28, 2026 16:10
@steipete steipete force-pushed the meow/webchat-send-ack-reconnect branch from 67aa07c to 18c0959 Compare May 28, 2026 16:13
@steipete steipete merged commit 96635c7 into main May 28, 2026
101 checks passed
@steipete steipete deleted the meow/webchat-send-ack-reconnect branch May 28, 2026 16:18
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 29, 2026
* fix(webchat): preserve sends through reconnect

* fix(webchat): scope queued sends by session

* fix(webchat): localize queue retry labels

* fix(secrets): remove unused path helper

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
steipete added a commit that referenced this pull request May 29, 2026
* fix(webchat): preserve sends through reconnect

* fix(webchat): scope queued sends by session

* fix(webchat): localize queue retry labels

* fix(secrets): remove unused path helper

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request May 31, 2026
…026.5.28) (#759)

This PR contains the following updates:

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

---

### Release Notes

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

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

[Compare Source](openclaw/openclaw@v2026.5.27...v2026.5.28)

##### Highlights

- Agent and Codex runtime recovery is steadier: subagents keep cwd/workspace separation, hook context stays prompt-local, session locks release on timeout abort while live OpenClaw locks survive cleanup, stale restart continuations are avoided, and Codex app-server/helper failures no longer tear down shared runtime state. ([#&#8203;87218](openclaw/openclaw#87218), [#&#8203;86875](openclaw/openclaw#86875), [#&#8203;87409](openclaw/openclaw#87409), [#&#8203;87399](openclaw/openclaw#87399), [#&#8203;87375](openclaw/openclaw#87375), [#&#8203;88129](openclaw/openclaw#88129))
- Channel delivery and session identity got safer across outbound plugin hooks, Matrix room ids, iMessage reactions/approvals, Slack final replies, Discord recovered tool warnings, runtime-config message actions, WhatsApp profile auth roots, Telegram polling, and Microsoft Teams service URL trust checks. ([#&#8203;73706](openclaw/openclaw#73706), [#&#8203;75670](openclaw/openclaw#75670), [#&#8203;87366](openclaw/openclaw#87366), [#&#8203;87451](openclaw/openclaw#87451), [#&#8203;87334](openclaw/openclaw#87334), [#&#8203;84535](openclaw/openclaw#84535), [#&#8203;82492](openclaw/openclaw#82492), [#&#8203;83304](openclaw/openclaw#83304), [#&#8203;87160](openclaw/openclaw#87160))
- Mobile and chat surfaces got a broader refresh: the iOS Pro UI, hosted push relay default, realtime Talk tab playback, Gateway chat transport, onboarding, Talk permissions, WebChat reconnect delivery, and session picker behavior now preserve more state across reconnects and empty searches. ([#&#8203;87367](openclaw/openclaw#87367), [#&#8203;87531](openclaw/openclaw#87531), [#&#8203;87682](openclaw/openclaw#87682), [#&#8203;88096](openclaw/openclaw#88096), [#&#8203;88105](openclaw/openclaw#88105)) Thanks [@&#8203;ngutman](https://github.com/ngutman) and [@&#8203;BunsDev](https://github.com/BunsDev).
- Browser, channel, and automation inputs are stricter: Browser tool timeouts, viewport/tab indices, Gateway ports, cron retry handling, Discord component ids, schema array refs, Telegram callback pages, and channel progress callbacks now reject malformed values earlier and preserve the intended delivery context. ([#&#8203;82887](openclaw/openclaw#82887))
- Provider, media, and document coverage expands with Claude Opus 4.8, Fal Krea image schemas, NVIDIA featured models, MiniMax streaming music responses, encrypted PDF extraction, voice model catalogs, GitHub Copilot agent runtime support, and a Codex Supervisor plugin path for delegated Codex workflows. ([#&#8203;87845](openclaw/openclaw#87845), [#&#8203;87890](openclaw/openclaw#87890), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764), [#&#8203;87751](openclaw/openclaw#87751), [#&#8203;87794](openclaw/openclaw#87794))
- CLI, auth, doctor, and provider paths fail faster and recover more clearly: malformed numeric/version options are rejected, workspace dotenv provider credentials are ignored, heartbeat defaults, OAuth/token lifetimes, and local service startup requests are bounded, agent auth health labels are clearer, legacy `api_key` auth profiles migrate to canonical form, and restart guidance is actionable. ([#&#8203;87398](openclaw/openclaw#87398), [#&#8203;86281](openclaw/openclaw#86281), [#&#8203;87361](openclaw/openclaw#87361), [#&#8203;88133](openclaw/openclaw#88133), [#&#8203;83655](openclaw/openclaw#83655), [#&#8203;87559](openclaw/openclaw#87559), [#&#8203;88088](openclaw/openclaw#88088), [#&#8203;85924](openclaw/openclaw#85924)) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc) and [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- Plugin and Gateway hot paths do less repeated work while preserving cache correctness for install records, config JSON parsing, tool search catalogs, session stores, manifest model rows, auto-enabled plugin config, browser tokens, viewer assets, and release-split external plugin packages. ([#&#8203;86699](openclaw/openclaw#86699))
- Release, QA, and E2E validation now bound more log, artifact, harness, and cross-OS waits so failing lanes produce proof instead of hanging or false-greening.

##### Changes

- Status: show active subagent details in status output.
- Diffs: split the default language pack and expand default Diffs language coverage while keeping the host floor aligned. ([#&#8203;87370](openclaw/openclaw#87370), [#&#8203;87372](openclaw/openclaw#87372)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa).
- ClawHub: add plugin display names plus skill verification and trust surfaces. ([#&#8203;87354](openclaw/openclaw#87354), [#&#8203;86699](openclaw/openclaw#86699)) Thanks [@&#8203;thewilloftheshadow](https://github.com/thewilloftheshadow) and [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen).
- iOS: refresh the dev app with Pro Command, Chat, Agents, Settings, hosted push relay defaults, and realtime Talk playback wired to gateway sessions, diagnostics, chat, and realtime Talk. ([#&#8203;87367](openclaw/openclaw#87367), [#&#8203;88096](openclaw/openclaw#88096), [#&#8203;88105](openclaw/openclaw#88105)) Thanks [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin) and [@&#8203;ngutman](https://github.com/ngutman).
- Docs: clarify Codex computer-use setup, paste-token stdin auth setup, macOS gateway sleep troubleshooting, native Codex hook relay recovery, container model auth, install deployment cards, device-token admin gating, CLI setup flow compatibility, Notte cloud browser CDP setup, and backport targets. ([#&#8203;87313](openclaw/openclaw#87313), [#&#8203;63050](openclaw/openclaw#63050), [#&#8203;87685](openclaw/openclaw#87685)) Thanks [@&#8203;bdjben](https://github.com/bdjben), [@&#8203;liaoandi](https://github.com/liaoandi), and [@&#8203;thewilloftheshadow](https://github.com/thewilloftheshadow).
- PDF/tools: use ClawPDF for PDF extraction, support encrypted PDF extraction, and surface MCP structured content in agent tool results. ([#&#8203;87670](openclaw/openclaw#87670), [#&#8203;87751](openclaw/openclaw#87751))
- Providers: add Claude Opus 4.8 support, Fal Krea image model schemas, NVIDIA featured model catalogs, MiniMax streaming music responses, and provider-backed voice model catalogs. ([#&#8203;87845](openclaw/openclaw#87845), [#&#8203;87890](openclaw/openclaw#87890), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764), [#&#8203;87794](openclaw/openclaw#87794)) Thanks [@&#8203;eleqtrizit](https://github.com/eleqtrizit) and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Codex/GitHub: add the GitHub Copilot agent runtime and the Codex Supervisor plugin package.
- Plugins: externalize GitHub Copilot and Tokenjuice as official install-on-demand plugins with npm and ClawHub publish metadata.
- Workboard: add agent coordination tools for tracking and handing off active agent work.
- Discord: show commentary in progress drafts so live Discord runs expose useful in-progress context. ([#&#8203;85200](openclaw/openclaw#85200))
- Plugin SDK: add a reply payload sending hook for plugins that need to deliver channel-owned replies and flatten package types for SDK declarations. ([#&#8203;82823](openclaw/openclaw#82823), [#&#8203;87165](openclaw/openclaw#87165)) Thanks [@&#8203;piersonr](https://github.com/piersonr) and [@&#8203;RomneyDa](https://github.com/RomneyDa).
- Policy: add policy comparison, ingress-channel conformance, and sandbox-posture conformance checks. ([#&#8203;85572](openclaw/openclaw#85572), [#&#8203;85744](openclaw/openclaw#85744), [#&#8203;86768](openclaw/openclaw#86768))

##### Fixes

- Agents: fall back to local config pruning when the optional `agents delete` Gateway probe cannot authenticate, so offline installs can still delete agents without removing shared workspaces.
- Tighten phone-control mutation authorization \[AI]. ([#&#8203;87150](openclaw/openclaw#87150)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Clarify directive persistence authorization policy \[AI]. ([#&#8203;86369](openclaw/openclaw#86369)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Agents/Codex: keep spawned agent cwd/workspace state separated, forward ACP spawn attachments, keep hook context prompt-local, release session locks on timeout abort and runtime teardown without deleting live OpenClaw-owned locks during cleanup, avoid session event queue self-wait, clean up exec abort listeners, stream assistant deltas incrementally, recover raw missing-thread compaction failures, preserve rotated compaction session identity, keep compaction-timeout snapshots continuable, preserve shared app-server state across startup or helper failures, keep native hook relay alive across restarts and prune stale bridge files, close native hook relay replacement races, keep Claude live tool progress visible for watchdog recovery, suppress abandoned requester completion handoff, route workspace memory through tools, resolve Codex runtime models first, report quarantined dynamic tools, format `skills` command output, bind node auto-review to prepared plans, retry Claude CLI transcript probes, and bound compaction/steering retries. ([#&#8203;87218](openclaw/openclaw#87218), [#&#8203;86875](openclaw/openclaw#86875), [#&#8203;86123](openclaw/openclaw#86123), [#&#8203;88129](openclaw/openclaw#88129), [#&#8203;87399](openclaw/openclaw#87399), [#&#8203;87375](openclaw/openclaw#87375), [#&#8203;72574](openclaw/openclaw#72574), [#&#8203;87383](openclaw/openclaw#87383), [#&#8203;87400](openclaw/openclaw#87400), [#&#8203;83022](openclaw/openclaw#83022), [#&#8203;87671](openclaw/openclaw#87671), [#&#8203;87738](openclaw/openclaw#87738), [#&#8203;87747](openclaw/openclaw#87747), [#&#8203;87706](openclaw/openclaw#87706), [#&#8203;87546](openclaw/openclaw#87546), [#&#8203;87541](openclaw/openclaw#87541), [#&#8203;81048](openclaw/openclaw#81048)) Thanks [@&#8203;mbelinky](https://github.com/mbelinky), [@&#8203;Alix-007](https://github.com/Alix-007), [@&#8203;luoyanglang](https://github.com/luoyanglang), [@&#8203;yetval](https://github.com/yetval), [@&#8203;sjf](https://github.com/sjf), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;benjamin1492](https://github.com/benjamin1492), [@&#8203;c19354837](https://github.com/c19354837), [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), [@&#8203;pfrederiksen](https://github.com/pfrederiksen), and [@&#8203;dodge1218](https://github.com/dodge1218).
- Codex Supervisor: keep real-home app-server MCP session listing on the loaded state path, bound stored history scans, and close WebSocket probes cleanly.
- Channels: thread canonical session keys into outbound hooks, preserve Matrix room-id case, keep fallback tool warnings mention-inert, retain delivered Slack final replies during late cleanup, continue iMessage polling after denied reactions, suppress duplicate native exec approvals, resolve Gateway message actions against the active runtime config, preserve Telegram SecretRef prompt config and polling keepalives, preserve WhatsApp profile auth roots, QR display, document filenames, and plugin hook config, suppress Discord recovered tool warnings, preserve the Discord voice outbound helper, cap Discord/Signal/Zalo channel request and container timeouts, and block untrusted Teams service URLs while keeping TeamsSDK patterns aligned. ([#&#8203;73706](openclaw/openclaw#73706), [#&#8203;75670](openclaw/openclaw#75670), [#&#8203;87366](openclaw/openclaw#87366), [#&#8203;87451](openclaw/openclaw#87451), [#&#8203;87465](openclaw/openclaw#87465), [#&#8203;87334](openclaw/openclaw#87334), [#&#8203;84535](openclaw/openclaw#84535), [#&#8203;76262](openclaw/openclaw#76262), [#&#8203;83304](openclaw/openclaw#83304), [#&#8203;82492](openclaw/openclaw#82492), [#&#8203;87581](openclaw/openclaw#87581), [#&#8203;77114](openclaw/openclaw#77114), [#&#8203;86426](openclaw/openclaw#86426), [#&#8203;85529](openclaw/openclaw#85529), [#&#8203;87160](openclaw/openclaw#87160)) Thanks [@&#8203;zeroaltitude](https://github.com/zeroaltitude), [@&#8203;lukeboyett](https://github.com/lukeboyett), [@&#8203;jarvis-mns1](https://github.com/jarvis-mns1), [@&#8203;xiaotian](https://github.com/xiaotian), [@&#8203;funmerlin](https://github.com/funmerlin), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;heyitsaamir](https://github.com/heyitsaamir), [@&#8203;amittell](https://github.com/amittell), [@&#8203;lidge-jun](https://github.com/lidge-jun), [@&#8203;liorb-mountapps](https://github.com/liorb-mountapps), [@&#8203;masatohoshino](https://github.com/masatohoshino), [@&#8203;bladin](https://github.com/bladin), and [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- CLI/auth/doctor/providers: reject malformed numeric/timeout/subcommand-version inputs, ignore workspace dotenv provider credentials, wait for respawn child shutdown, bound heartbeat defaults plus Codex, GitHub Copilot, OpenAI, Anthropic, Google, Feishu, LM Studio, MiniMax, Xiaomi TTS, and local-provider OAuth/token/model requests, harden Codex auth probes, label auth health by agent, preserve explicit agentRuntime pins during Codex model migration, warm provider auth off the main thread, honor Codex response timeouts, stop migrating current Claude Haiku 4.5 profiles to Sonnet, bound local service startup, resolve GPT-5.5 without cached catalog, migrate legacy memory auto-provider config, rewrite non-canonical `api_key` auth profiles, and make doctor restart follow-ups actionable. ([#&#8203;87398](openclaw/openclaw#87398), [#&#8203;86281](openclaw/openclaw#86281), [#&#8203;87361](openclaw/openclaw#87361), [#&#8203;88133](openclaw/openclaw#88133), [#&#8203;83655](openclaw/openclaw#83655), [#&#8203;87559](openclaw/openclaw#87559), [#&#8203;87719](openclaw/openclaw#87719), [#&#8203;88088](openclaw/openclaw#88088), [#&#8203;85924](openclaw/openclaw#85924), [#&#8203;84362](openclaw/openclaw#84362)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen), [@&#8203;samzong](https://github.com/samzong), [@&#8203;giodl73-repo](https://github.com/giodl73-repo), [@&#8203;alkor2000](https://github.com/alkor2000), [@&#8203;mmaps](https://github.com/mmaps), [@&#8203;nxmxbbd](https://github.com/nxmxbbd), and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Gateway/security/session state: expire browser tokens after auth rotation, scope assistant idempotency dedupe, drain probe client closes, avoid stale restart continuation reuse, preserve retry-after fallbacks and stale rate-limit cooldown probes, bound webchat image and artifact transcript scans, include seconds in inbound metadata timestamps, clear completed session active runs, clear stale chat stream buffers, and evict current plugin-state namespaces at row caps. ([#&#8203;87810](openclaw/openclaw#87810), [#&#8203;87833](openclaw/openclaw#87833), [#&#8203;75089](openclaw/openclaw#75089)) Thanks [@&#8203;joshavant](https://github.com/joshavant) and [@&#8203;litang9](https://github.com/litang9).
- Config/parsing/network: reject partial numeric parsing, parse provider/Discord retry headers and dates strictly, honor IPv6 and bare IPv6 `no_proxy` entries, preserve empty plugin allowlists, canonicalize secret target array indexes, and reject malformed media content lengths, inspected TCP ports, marketplace content lengths, cron epochs, sandbox stat fields, unsafe duration values, empty config path segments, noncanonical schema array refs, unsafe Telegram callback pages, and invalid Teams attachment-fetch DNS targets. ([#&#8203;87883](openclaw/openclaw#87883)) Thanks [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- Browser/input hardening: reject invalid tab indexes, excessive viewport resizes, explicit zero CDP ports, malformed geolocation options, unsafe screenshot or permission-grant timeouts, loose response-body limits, invalid cookie expiries, and non-finite Browser tool delays/timeouts.
- Cron/automation: retry recurring jobs after transient model rate limits before waiting for the next scheduled slot, and preflight model fallbacks before skipping scheduled work. ([#&#8203;82887](openclaw/openclaw#82887)) Thanks [@&#8203;chen-zhang-cs-code](https://github.com/chen-zhang-cs-code).
- Auto-reply/directives: respect provider and relayed channel metadata during directive persistence so channel-originated decisions keep their intended context. ([#&#8203;87683](openclaw/openclaw#87683))
- WhatsApp: resolve the auth directory from the active profile so profile-scoped WhatsApp installs do not drift to the wrong credential root. ([#&#8203;82492](openclaw/openclaw#82492)) Thanks [@&#8203;lidge-jun](https://github.com/lidge-jun).
- Gateway/session state: clear completed session active runs, avoid cold-loading providers for MCP inventory, cache single-session child indexes, cap handshake timers, and bound preauth, auth-guard, media, transcript, readiness, and port options.
- Channels/replies: preserve channel-owned progress callbacks when verbose output is off, keep group-room progress suppression intact, prefer external session delivery context, escape Discord component id delimiters, force final TUI chat repaints, show Slack reasoning previews, and normalize Discord/Matrix/Mattermost channel numeric options. ([#&#8203;87476](openclaw/openclaw#87476), [#&#8203;87423](openclaw/openclaw#87423))
- Agents/tool args: harden smart-quoted argument repair for edit arrays and exact escaped arguments so model-produced tool calls recover without corrupting valid input. ([#&#8203;86611](openclaw/openclaw#86611)) Thanks [@&#8203;ferminquant](https://github.com/ferminquant).
- Providers/agents: preserve seeded Anthropic signatures, preserve signed thinking payloads, concatenate signature-delta chunks, preserve DeepSeek `reasoning_content` replay across tier suffixes, apply OpenRouter strict9 ids to Mistral routes, promote Ollama plain-text tool calls, load NVIDIA featured model catalogs, stream MiniMax music generation responses, and recover empty preflight compaction. ([#&#8203;87593](openclaw/openclaw#87593), [#&#8203;87493](openclaw/openclaw#87493), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764)) Thanks [@&#8203;Pluviobyte](https://github.com/Pluviobyte) and [@&#8203;eleqtrizit](https://github.com/eleqtrizit).
- Media/images: skip CLI image cache refs when resolving generated images, allow trusted generated HTML attachments, and bound generated video downloads so stale refs and slow providers fail cleanly. ([#&#8203;87523](openclaw/openclaw#87523), [#&#8203;87982](openclaw/openclaw#87982))
- File transfer: handle late tar stdin pipe errors after archive validation or unpacking has already settled.
- Performance: trust install-record caches between reloads, prefer native JSON parsing, reuse unchanged tool-search catalogs, reuse gateway session and plugin metadata paths, skip unchanged store serialization, patch single-entry session writes, add precomputed session patch writers, reduce store clone allocations, cache manifest model catalog rows and auto-enabled plugin config, avoid full session snapshots for entry reads, defer configured Slack full startup, prefer bundled plugin dist entries, and slim current metadata identity caches. ([#&#8203;87760](openclaw/openclaw#87760))
- Docker/release/QA: package runtime workspace templates, stream cross-OS served artifacts, preserve sparse Crabbox run artifacts, isolate npm plugin installs per package, reject incompatible package plugin API installs, drop the leftover root Sharp dependency from package manifests after the Rastermill migration, bound OpenClaw instance logs, plugin gauntlet relay logs, MCP channel buffers, kitchen-sink scans, agent-turn assertions, QA-Lab credential broker calls, QA Matrix substrate requests, and release scenario logs, and keep release/google live guards current. ([#&#8203;87647](openclaw/openclaw#87647), [#&#8203;87477](openclaw/openclaw#87477)) Thanks [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi) and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Release/CI: bound manual git fetches, ClawHub verifier responses, ClawHub owner metadata, dependency-guard error bodies, Parallels limits, startup/test/memory budget parsing, and diffs viewer build warnings so release lanes fail with useful proof instead of hanging. ([#&#8203;87839](openclaw/openclaw#87839))

</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/759
SYU8384 pushed a commit to SYU8384/openclaw that referenced this pull request Jun 3, 2026
* fix(webchat): preserve sends through reconnect

* fix(webchat): scope queued sends by session

* fix(webchat): localize queue retry labels

* fix(secrets): remove unused path helper

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
* fix(webchat): preserve sends through reconnect

* fix(webchat): scope queued sends by session

* fix(webchat): localize queue retry labels

* fix(secrets): remove unused path helper

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
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 dependencies-changed PR changes dependency-related files maintainer Maintainer-authored PR merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P1 High-priority user-facing bug, regression, or broken workflow. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: XL 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.

4 participants