Repository navigation
refactor(chat): remove the standalone tray chat popup - #1688
Conversation
Remove compact tray chat and obsolete multi-host/picker plumbing. Preserve tray launchers, native/WebView behavior and background services. Synchronize composer-created sessions with Workspace navigation and protect retired paths with regression guards. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: needs maintainer review before merge. What this changesThe PR removes the compact chat popup, routes chat actions to Workspace, and synchronizes composer-created conversations with Workspace navigation. Example: The user selects Local AI's Open chat action.
Review scores
ProductKind: Refactor · Worth it: Yes Merge readiness✅ Ready for maintainer review Keep open: this collaborator-authored PR contains useful, owner-backed consolidation absent from main. No actionable introduced defect was found. Priority: P3 Before mergeNone. FindingsNone. Tests
Agent review detailsHow this fits togetherWindows Companion displays Gateway conversations and accepts chat actions from the tray, Settings, and local automation. Workspace owns conversation navigation while the Gateway connection and shared chat provider run independently of its window. flowchart TD
A[Tray and Local AI chat actions] --> B[Window routing]
B --> C[Workspace conversation navigation]
C --> D[Saved renderer preference]
D --> E[Native chat]
D --> F[Embedded Gateway web chat]
E <--> G[Existing Gateway connection]
F <--> G
Technical reviewBest possible solution: Keep Workspace as the single conversation owner while preserving renderer preferences, mount-local drafts, verified setup binding, and independent background services. Do we have a high-confidence way to reproduce the issue? Not applicable: this PR consolidates working chat surfaces rather than fixing a reported behavioral failure. Is this the best way to solve the issue? Yes: removing the duplicate host and using the established Workspace, provider, and composer owners provides a maintainable cutover without another configuration option. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against 037c17dcb581. Provenance checked
TestingProof path: shipped entry point. SecurityNone. EvidenceWhat I checked:
Likely related people:
Review metrics
LabelsLabel changes:
Label justifications:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior. WorkflowClawSweeper edits this one comment on every review. Comment HistoryReviewed October 9, 2026, 1:38 PM ET / 17:38 UTC (Revision 3). |
|
Current-head proof publication is complete: the tray Chat control was invoked through UIA, Workspace retained the synthetic draft, the composer session picker and obsolete tray diagnostic override were absent, and MCP advertised one Chat command. The three owned-window screenshots are embedded in the PR body and were fetched anonymously with HTTP 200 and exact PNG SHA256 verification. Disposition of the advisory test notes: the /new shipped-app sidebar/Back-Forward/Notifications proof gap remains explicitly unverified. The pure policy and controller tests are not claimed as that proof. The renamed-identifier spelling-guard suggestion is acknowledged and left for maintainer judgment; the substantive retired-host ownership/authority guards remain. No publication-time production or test rewrite was made to improve a review score. The PR remains draft. The exact-head build and Shared suite pass; the recorded Tray recheck passes, with the initial unchanged queued-send synchronization failure retained. Latest accessibility has two marker timeouts, extended baseline UI failures remain disclosed, and the final shared autoreview helper is blocked by Codex authentication. ClawSweeper's source review and ready-for-maintainer label do not waive those proof gates. No merge or automatic-fix command is requested. |
|
CI publication closeout: the exact-head workflow completed successfully for f71dd65. Current checks: 17 successful, 7 skipped, none failed or pending. Run: https://github.com/openclaw/openclaw-windows-node/actions/runs/37894256075 . This hosted result does not waive the explicitly documented local UI/proof and autoreview-authentication blockers; the PR remains draft. |
|
Global triage: HOLD_FOR_AUTHOR. Take confidence 20%; recommendation confidence 98%; effort large; risk high. Reviewed exact head Author: investigate the 1 failing check(s), establish whether each failure is branch-owned, and publish a green exact-head CI Gate before reconsideration. This is a triage classification, not a merge action. No branch changes were made. |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
Carry the effective previous thread through the composer handoff, bind unresolved Home before adding the new conversation, and preserve delayed Notifications behavior. Add regression tests and opt-in fixture-backed composer proof. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
The bell opens a flyout; activate its Open notifications action before asserting delayed composer completion preserves the full page. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
A history acknowledgement can precede the welcome-state settling timer. Require the rendered welcome text so new/forward screenshots do not capture the loading placeholder. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
Wait for the created thread's actual history request before asserting Notifications remains visible. Returning Home must still render that new thread. The MCP provider default is not the mounted Workspace selection contract. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
|
Merge conflicts resolved and pushed; required local validation and hosted CI passed. Current head: The standalone popup remains removed. The composer still captures the previous effective thread before handing off the new selection, and the existing Workspace navigation owner binds unresolved initial Home to that predecessor before adding the new conversation. The conflict resolution also preserves main's newer placement and navigation-revision fencing. A pending The older screenshots below are historical Required proof pools
ValidationAll results in this table are from clean
The batch ran An earlier merge-candidate run at Hosted CI
Real behavior proofCurrent-head focused local cases: not verified yet. A replacement process-bounded two-case runner is under source review, with no new desktop admission. It must run Delayed alone first. History may start in a separate process only after a fresh TRX proves one executed pass with zero skips, independent owned-resource cleanup succeeds, and at least 180 seconds of execution budget remain. No automatic retry or second case after failure is authorized. Passing hosted UI/accessibility jobs do not establish that these opt-in local fixture cases ran. The new Delayed case requires Notifications to remain visible, Home itself to remain selected while rendering original conversation A, explicit selection of created B to render its current welcome, exactly one Current frozen binaries, whose ProductVersion includes exact source SHA
Historical passing proof at
|
Keep the rendered created-thread assertion after delayed completion, but require Home itself to be selected after invoking Home, as documented in CONNECTION_ARCHITECTURE. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
Preserve Workspace-only chat and predecessor history while integrating current welcome, placement, and delayed-navigation fences. Adapt regression fixtures to the current Home and welcome contracts. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
Remove the retired channel-list argument from placement tests introduced by main. Preserve all placement assertions. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
|
ELI5 with 2 screenshots what is removed. I still don't get it. |
karkarl
left a comment
There was a problem hiding this comment.
Approved.
I accept Barbara's testing and supplied proof as satisfying the human-testing requirement for this review. An additional agent-run native replay is not a prerequisite for this approval.
The standalone tray chat popup is removed while Workspace remains the chat/navigation owner. The repair preserves the initial /new predecessor history, Back/Forward behavior, and main's newer-navigation fence. Merge conflicts are resolved without rewriting contributor history.
Validation at b8057177aa7fb2bf9d56a28b9a1facda261ffe3e:
- Full local build passed.
- Shared tests: 4,488 passed, 35 ordinary skips, 0 failures.
- Tray tests: 4,320 passed, 0 skips or failures.
- ARM64 UI compilation passed.
- Build and Test, including CI Gate and CodeQL passed. No checks remain pending or failed, and GitHub reports clean mergeability.
Evidence provenance: Barbara's published tray/Workspace screenshots cover the earlier contributor head. The later 73e879ba two-case captures also remain historical after main's navigation changes. This approval records my explicit acceptance of the supplied human testing and proof; it does not claim that an additional agent-run /new/Back/Forward/Notifications replay occurred at b8057177, or that every native proof pool was executed.
Verdict: approve on the reviewed implementation, green exact-head validation, and maintainer-accepted human proof.
main openclaw#1688 removed compact chat (IsCompact, ChatVisuals.CompactSessionBreakpoint, ChannelGroup.cs). Drop the strip's IsCompact prop, keep its narrow context-bar breakpoint local, and remove the stale ChannelGroup.cs test include.
main openclaw#1688 removed compact chat (IsCompact, ChatVisuals.CompactSessionBreakpoint, ChannelGroup.cs). Drop the strip's IsCompact prop, keep its narrow context-bar breakpoint local, and remove the stale ChannelGroup.cs test include.
…er (#1748) * feat(chat): show tokens/sec and context usage below the composer Add a slim strip under the native Reactor chat composer (tray ChatWindow and Hub ChatPage) showing current tokens/sec with mean (μ) and p95 over the last 50 measured replies per session, plus a context-window bar with used/total. - ChatThroughputTracker: per-thread, in-memory. Live value is a chars/4 estimate over streamed thinking/assistant text. Exact samples are one model call's output tokens over its streaming window, closed by the gateway `usage` agent event (run-cumulative outputTokens, diffed per call); the final assistant message's OutputTokens is the fallback when no usage stream exists. - ChatEventMapper reads `thinking` deltas and `usage` totals, which are not timeline events. - The strip subscribes to provider ThroughputChanged so thinking/usage updates re-render only the strip, not the timeline. - ChatUsageFormatter resolves context usage once for both the existing pill and the bar; existing Format outputs are unchanged. * fix(chat): keep throughput samples honest across missed or buffered run starts Address rubber-duck review of the throughput strip: - Start a run for lifecycle starts opened from the reset buffer (HandleOpenedLifecycle), not only for directly processed start events. - Track whether the run's cumulative token baseline is known. A usage total for a run whose start was missed (provider created mid-run, ended run) only becomes the baseline, instead of being recorded as one call's tokens. - End runs on lifecycle end/error: close usage-run segments so aborted runs cannot leave a stale window open; keep the fallback segment for the final message that arrives after lifecycle end. - Strip reads stats from the provider in Render with a render-token subscription, so a session switch never shows the previous session's tps. - Tooltip: samples are per model call, not per reply. - Tests for thinking receipts, usage parsing, missed starts, and EndRun. * test(chat): cover buffered post-reset throughput baseline reset ClawSweeper's review of d9d8692 asked for a provider test of the start-before-send-result ordering with a prior measurement. After sessions.reset, a lifecycle start buffered until chat.send is accepted must record the new run's tokens, not the delta from the previous run. * fix(chat): align throughput strip with retired compact chat after rebase main #1688 removed compact chat (IsCompact, ChatVisuals.CompactSessionBreakpoint, ChannelGroup.cs). Drop the strip's IsCompact prop, keep its narrow context-bar breakpoint local, and remove the stale ChannelGroup.cs test include. * fix(chat): invalidate throughput baselines across reconnects A connection transition can drop lifecycle start/end events, so a pre-disconnect run baseline was subtracted from a post-reconnect run total ((5000 - 100) / 2 = 2450 tps). OnStatusChanged now calls ChatThroughputTracker.InvalidateRuns on disconnect/reconnect: open windows close and baselines become unknown; completed samples are kept.
…er (openclaw#1748) * feat(chat): show tokens/sec and context usage below the composer Add a slim strip under the native Reactor chat composer (tray ChatWindow and Hub ChatPage) showing current tokens/sec with mean (μ) and p95 over the last 50 measured replies per session, plus a context-window bar with used/total. - ChatThroughputTracker: per-thread, in-memory. Live value is a chars/4 estimate over streamed thinking/assistant text. Exact samples are one model call's output tokens over its streaming window, closed by the gateway `usage` agent event (run-cumulative outputTokens, diffed per call); the final assistant message's OutputTokens is the fallback when no usage stream exists. - ChatEventMapper reads `thinking` deltas and `usage` totals, which are not timeline events. - The strip subscribes to provider ThroughputChanged so thinking/usage updates re-render only the strip, not the timeline. - ChatUsageFormatter resolves context usage once for both the existing pill and the bar; existing Format outputs are unchanged. * fix(chat): keep throughput samples honest across missed or buffered run starts Address rubber-duck review of the throughput strip: - Start a run for lifecycle starts opened from the reset buffer (HandleOpenedLifecycle), not only for directly processed start events. - Track whether the run's cumulative token baseline is known. A usage total for a run whose start was missed (provider created mid-run, ended run) only becomes the baseline, instead of being recorded as one call's tokens. - End runs on lifecycle end/error: close usage-run segments so aborted runs cannot leave a stale window open; keep the fallback segment for the final message that arrives after lifecycle end. - Strip reads stats from the provider in Render with a render-token subscription, so a session switch never shows the previous session's tps. - Tooltip: samples are per model call, not per reply. - Tests for thinking receipts, usage parsing, missed starts, and EndRun. * test(chat): cover buffered post-reset throughput baseline reset ClawSweeper's review of d9d8692 asked for a provider test of the start-before-send-result ordering with a prior measurement. After sessions.reset, a lifecycle start buffered until chat.send is accepted must record the new run's tokens, not the delta from the previous run. * fix(chat): align throughput strip with retired compact chat after rebase main openclaw#1688 removed compact chat (IsCompact, ChatVisuals.CompactSessionBreakpoint, ChannelGroup.cs). Drop the strip's IsCompact prop, keep its narrow context-bar breakpoint local, and remove the stale ChannelGroup.cs test include. * fix(chat): invalidate throughput baselines across reconnects A connection transition can drop lifecycle start/end events, so a pre-disconnect run baseline was subtracted from a post-reconnect run total ((5000 - 100) / 2 = 2450 tps). OnStatusChanged now calls ChatThroughputTracker.InvalidateRuns on disconnect/reconnect: open windows close and baselines become unknown; completed samples are kept.




What Problem This Solves
OpenClaw retains a separate compact chat popup and obsolete dual-host plumbing even though Workspace is the main chat experience.
User Impact
Chat opens in Workspace, including Local AI's Open chat action. The tray icon and its Chat shortcut remain. The compact popup is intentionally removed; native/WebView chat, URI aliases, saved configuration and background Gateway/MCP services remain.
Draft, not merge-ready: required local checks pass on the recorded recheck, but extended UI failures, two latest accessibility page-marker timeouts, missing shipped-app
/newproof and unavailable final shared autoreview remain disclosed blockers.Why This Change Was Made
One host removes duplicate prewarm, credential-refresh, disposal, voice/attachment, diagnostic and session-picker paths. Composer
/newsynchronizes Workspace sidebar/agent/history state without remounting; late completion on Notifications does not navigate away.WindowManager remains the window owner, Workspace the navigation owner and ChatPage the UI/explicit setup-binding applicator. The app-owned provider and per-mount composer retain their lifetimes. No closed responsibility returns to App.
Evidence
TrayMenuItemopenchat. Workspace focused with the draft retained. Composer session picker and old tray diagnostic override were absent.Go to Chatcommand inapp.search {"query":"chat"}./newshipped-app sidebar/history proof remain dispositioned below. This is not merge approval.All three URLs were fetched anonymously after embedding, returned HTTP 200/image PNG, and matched the source SHA256 values below.
Change Type
Scope
winnodeRequired proof pools
windows-winui-interactive: removed WinUI surface, navigation/composer consolidation, diagnostic/localized UI cleanup and native setup presentation. Current-head native UIA/capture is supplied; the entire pool is not claimed green.No installer/signing, native dependency/RID, WSL setup/protocol, node command, GPU inference or MXC execution change. ARM64 is the actual host, not x64 emulation or release-candidate ARM64 acceptance.
Validation
Head:
f71dd657ade5031e05162a094397f4b87839aeb8. Base:037c17dcb581cbe427ab1939576515643b9e0707. Worktree root and isolated tray data are set explicitly; all reported runs have nonzero counts..\build.ps1dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restoredotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restoredotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore --filter FullyQualifiedName~QueuedSend_InFlightAckWithoutLifecycle_RequeuesAndRetriesSameIdempotencyKey.\scripts\validate-docs.ps1(included in build)dotnet test .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj -r win-arm64 -p:Platform=ARM64 --filter FullyQualifiedName~AccessibilityScanTestsRetained failed/blocked results, not replaced by earlier passes:
43.999996, 3 minimum 32-DIP comparisons against31.999998, 2 reasoning-popup contrast checks..\scripts\test-gateway-fixture.ps1 -AppPath <explicit Debug app> -Configuration Debug -Screenshotsand pre-commit Release equivalent: each 31 profile/MCP passed; 13 UI passed/1 wide-width message-240 visibility failure. Full unchanged-base UI class reproduced that failure (13/1). An isolated base case passed; fixed-three changed-source diagnostics had 1 pass/2 failures, all retained, not retry-to-green. Separate investigation: #1437..\build.ps1 -Project WinUI -Configuration Releasepassed; not exact-commit Release proof.scripts/autoreviewpreflight passed with--mode local --base 037c17dcb581cbe427ab1939576515643b9e0707 --engine codex --max-priority P3 --no-web-search. Actual review: reviewer_unavailable, exit 1, HTTP 401; Codex not logged in, no report. Hanselman/ClawSweeper are independent evidence, not a fabricated helper success.Real Behavior Proof
f71dd657ade5031e05162a094397f4b87839aeb8.dotnet <built OpenClaw.GatewayFixtureHost.dll> --app <current Debug OpenClaw.Tray.WinUI.exe> --duration-seconds 300 --artifacts <owned directory>. Authenticated local MCPinitialize,tools/list,app.navigate {"page":"chat"}. Enter fixed synthetic draft via UIA. Forwardopenclaw://tray-menuin the same profile and invokeTrayMenuItemopenchat.app.navigate {"page":"debug"}; expand Chat surface overrides and inspectDebugPageChatOverride; invokeapp.search {"query":"chat"}andapp.status./new.Yes/No/N/A): Yes, three anonymous HTTP 200/image PNG fetches with exact SHA256./newsidebar/agent/Back-Forward synchronization and late completion on Notifications; real Gateway/new/streaming; speech devices/voice-hotkey cold start; runtime WebView pending key; gateway switch on Notifications; real high contrast; specialized keyboard/pointer; full green UI pool; final shared autoreview authentication. Browse fixture rejectssessions.create; policy/controller tests are not a substitute.Copied safe live MCP/owned-window proof
{ "head": "f71dd657ade5031e05162a094397f4b87839aeb8", "operatorState": "Connected", "nodeConnected": false, "sessionCount": 5, "chatSearch": { "Title": "Go to Chat", "Subtitle": "Open chat" }, "discoveredTools": ["app.navigate", "app.status", "app.search", "app.chat.snapshot", "app.chat.send", "app.chat.reset", "app.chat.queue.list", "app.chat.queue.cancel"], "assertions": ["TrayMenuItemopenchat focused Workspace", "Synthetic draft retained", "ChatComposerSessionPicker absent", "DebugPageTrayChatOverride absent", "DebugPageChatOverride present"], "captureMethod": "PrintWindow owned HWND only; focused crops exclude unrelated UI", "imageSha256": { "workspace-after-tray-chat.png": "e1b9667c33ebb9a9321da54aebaab22aa37caa68ff24d80652872a4f76ee88b0", "tray-chat-action.png": "108159f6ca6d0bb8a5e43e720d2db634ce474396e1a89ded8bef8c5bb17ccc43", "workspace-diagnostic-override.png": "3f4573d5dccf8ff03b916e4dc6d1cf07d0635a523ba94e0042bb25ae74536df7" } }No token, identity, registry, settings file, user-profile path, real conversation or unrelated desktop content is published.
Security Impact
Yes/No): No.Yes/No): No new handling; obsolete popup cache/prewarm removed, credential precedence/setup authority retained.Yes/No): No new calls/protocols; hidden surface no longer starts.Yes/No): No new/renamed node/MCP command/schema; duplicate standalone-chat catalog entry removed.Yes/No): No.Yes, explain the risk and mitigation: N/A; public proof excludes real user data/credentials.Compatibility and Migration
Yes/No): Yes for settings/aliases; intentional popup removal opens Workspace instead.Yes/No): No; persistedUseLegacyWebChatand optional WebView remain.Yes/No): No.Review Conversations
ClawSweeper found no actionable introduced defect. Its spelling-guard suggestion is not applied as an unrelated publication-time rewrite; its
/newruntime-proof gap remains blocked. CI is running, not claimed green.Maintainer access: same-repository head branch is directly editable by maintainers. GitHub rejects the fork-only collaboration toggle for same-repository PRs; branch access is not denied.