Repository navigation
feat(chat): open tool details beside native chat - #2048
Conversation
|
🦞👀 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 real behavior proof before merge. What this changesThis PR adds a reusable Tool details panel beside native chat while preserving the conversation and composer. Example: Inspect read_file output in a 1100-pixel chat window.
Review scores
ProductKind: Feature · Worth it: Yes · Fix scope: Complete Merge readiness⛔ Blocked before merge - 4 items remain Keep this maintainer-authored draft open. The initial-profile race is repaired in source, no definite introduced bug was found, and the feature remains absent from main. Priority: P2 Before merge
FindingsNone. Tests
Agent review detailsHow this fits togetherThe native chat root binds Gateway-backed timeline snapshots to an identity-only panel selection; authenticated profile, connection and history checks gate the tool content rendered by the existing renderer. flowchart LR
Gateway[Gateway client] --> Profile[Profile admission]
Gateway --> Provider[Chat provider]
Provider --> Root[Native chat root]
Profile --> Root
Root --> Selection[Details selection]
Selection --> Renderer[Tool details renderer]
Root --> Composer[Mounted composer]
Technical reviewBest possible solution: Keep one identity-only Details slot, reuse ToolCallCardRenderer, and preserve the mounted composer with live profile and history admission. Do we have a high-confidence way to reproduce the issue? Main source confirms the missing side-panel capability; this review ran no target code or tests. Is this the best way to solve the issue? The scoped panel is a reasonable implementation: it preserves inline inspection, reuses the existing renderer and composer owners, and separates UI lifetime from authenticated reader admission. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against b6f158ab257a. Merge-risk optionsMaintainer options:
Provenance checked
TestingProof path: shipped entry point. SecurityNeeds attention: No concrete leak or supply-chain regression was found; profile-qualified final-render timing still requires validation. EvidenceWhat I checked:
Likely related people:
Preflight sourceSource unknown. Source comparison at the observed PR snapshot only. Completion is self-reported; body, policy, tests, execution, and report bytes are not verified. Review metrics
LabelsLabel changes: No label 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 November 7, 2026, 1:01 AM ET / 06:01 UTC (Revision 3). |
|
@clawsweeper re-review Proof update for head Native CI repair: the new head changes only native-test traversal to find the stable On native Windows ARM64, Debug:
The affected-class run includes all seven Mounted production-provider proof: before this test-only commit, Observed assertions and inspected captures:
The final synthetic request log contained 95 requests with no errors or unexpected entries. An independent rubber-duck review inspected the harness, TRX, request log and three captures and accepted this as faithful application-boundary proof. Its model identity was not verified. Provenance: the new commit is exactly the tested uncommitted two-location traversal repair; manually recorded source SHA256 Remaining limits, still draft: a stale UIA opener does not prove controlled delayed socket replies or queued callbacks. Synthetic Gateway proof is not live account/WSL pairing proof. Actual divider pointer/keyboard, full contrast/accessibility and production-shaped Release Details proof remain open. Shared autoreview tooling was unavailable. The CI-equivalent native selection was also executed locally: 637 passed, 13 failed, 7 skipped. All four original CI failures passed there. Twelve failures involved workspace private-desktop foreground/input/capture or control discovery; one was a separate animation teardown assertion that passed in isolation. The unsuccessful broad run remains recorded and is not presented as a green full-suite result. Hosted CI on the newly pushed head must still pass. |
|
🦞👀 Re-review progress:
|
|
@clawsweeper re-review Pushed An explicit profile event before a verified baseline now retires Details until reconnect. Ordinary bootstrap retries and verified same-profile refreshes retain recovery. Added delayed-initial-read and failed-initial-read regressions (both failed before the guard, then passed), plus a bootstrap positive control. Updated the contract/ledger. A new independent rubber-duck review accepted the source fix with no blocking findings. Validated exact precommit source, committed unchanged: full ARM64 build passed; Shared 4,951 passed/24 skipped; Tray 5,275 passed/0 skipped; focused admission/state 34/34; native Details plus actual-app synthetic-Gateway profile replacement/reconnect 8/8, no skips. No new run is claimed merely from committing. Reports and captures are local; exact commands and retained failures are in the updated description. Limits remain explicit: initial unknown-baseline ordering is owner-tested, not yet a delayed-socket mounted-reader test. Existing actual-app proof uses the production bridge/provider against a synthetic Gateway, not live accounts/WSL. Full input/accessibility/contrast/Release proof and required CI on the new head are not claimed complete. Keep draft while those gates remain open. |
|
🦞👀 Re-review progress:
|
PR cleanup reviewReviewed head: This still looks worth keeping open. I checked all 27 changed files against main at #2093 has since landed most of the shared profile verifier and substantially updated tool rendering/full-output recovery. Please reconcile this branch with those owners rather than restoring the older renderer. One important remaining delta is the explicit profile-invalidation-before-baseline guard in Keeping this draft is appropriate. The collected head checks do not include completed required build/native CI, and delayed-socket/queued-open final-render proof, real divider/keyboard and compact-focus interaction, accessibility and Release acceptance remain open. The existing proof report is useful and candid about those limits. Once the integrated head and that evidence are ready, it should receive a fresh independent review. Action in this cleanup pass: leaving this PR open. No branch changes or runtime-proof waiver. The findings above come from source, discussion and recorded-CI review; Windows validation was not rerun in this pass. |
9171a98 to
72b7d02
Compare
The Settings chrome proof invoked SettingsSearch with an immediate UIA lookup and failed intermittently in Dark theme. Use the existing InvokeWhenEnabledAsync readiness helper, matching the pending openclaw#2048 change. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
a393312 to
e984b3f
Compare
* fix: Dashboard loses the selected chat on newer Gateways Use the released full-session-key query contract for chat handoff and remove web-routing release allowlists. Preserve search admission and credential safeguards, and route Systems to its matching web page. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix: drop orphaned search compatibility copy and clarify Systems route doc Remove Search_Compatibility from all locales now that its last reader is gone, and state that /systems matches the native Open in web action only when the Gateway reports environments; older Gateways open their default view for routes they lack. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * fix(tests): wait for SettingsSearch before invoking it The Settings chrome proof invoked SettingsSearch with an immediate UIA lookup and failed intermittently in Dark theme. Use the existing InvokeWhenEnabledAsync readiness helper, matching the pending #2048 change. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Locate the mounted conversation by its stable automation ID instead of assuming the former root shape. Preserve queued-message and composer color checks and assert the conversation wrapper remains transparent. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Distinguish explicit identity events from bootstrap refreshes. Retire Details until reconnect when identity changes before the first verified baseline. Cover delayed and failed initial reads, bootstrap recovery and same-profile revalidation; document the fail-closed tradeoff. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Keep the open-details action inside tool cards and match the Copy glyph size. Align pane backgrounds with a full-height separator and theme-aware output. Preserve reader state through availability changes, avoid empty details, and include compact navigation and localized resize instructions. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Keep reading-column, scrolling, divider, and nested-tool assertions while discovering sections through the action layout. Assert the reserved command-input inset independently. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Use semantic theme-aware picker text, reject tail overshoot, and preserve native test readiness and capture identity. Usage pagination is already supplied by main through openclaw#2124. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
e984b3f to
919e32c
Compare
Related: #2093 (improve(chat): align native conversation and tool activity with web), now merged.
What Problem This Solves
Native chat needs a way to read tool input and output without losing the conversation.
User Impact
Users can open a reusable, closable Tool details tab beside chat, resize the split, and keep their draft and inline tool expansion intact. Narrow windows switch between Details and the conversation.
The open-panel action now sits inside the tool card, matches Copy's 14px glyph, and preserves a usable hit target. Both panes share the existing chat background and have a full-height separator. Generic output uses normal text; command output is slightly muted using native theme resources.
Ready for review, not yet merge-ready: required CI, complete native input/accessibility and real-Gateway profile-race proof remain incomplete. Current
main(3f47e838) is now incorporated in merge commit219d59de. The six resource conflicts are resolved, preserving all 4,280 incoming strings plus the seven Tool details strings in every locale, with no duplicate keys. Files, Canvas and MCP Apps are not included. Details fails closed when the authenticated profile cannot be verified.Why This Change Was Made
The split host reuses the existing tool renderer and saved-output recovery operation instead of introducing a second renderer, payload cache or RPC. Requests are bound to provider, connection, conversation, history, tool and profile identity. Profile replacement, or an explicit profile invalidation before the first verified baseline, retires Details until reconnect.
Compact navigation keeps Back in the keyboard cycle. Reader selection and scrolling survive temporary action unavailability; empty tools do not expose blank own-details controls. Resize instructions are localized in all six languages. Existing conversation/window backdrops, resize ownership and composer/voice lifecycle remain unchanged.
Evidence
After the November 11 main merge, the x64 Debug candidate passed the full build, 5,843 Shared tests and 6,325 selected Tray tests. Mounted UI proof passed 36 Light, 36 Dark and 35 applicable high-contrast-resource executions on that merged tree. The regressions cover empty wrappers, reader identity/selection/scroll preservation, compact focus traversal, resize HelpText, matching pane backgrounds, geometry and the existing composer/profile boundaries. The earlier pre-merge focused managed selection passed 900 tests.
The earlier pre-merge expanded high-contrast selection retained 35 passed / 1 failed: the pre-existing
ProductionRoot_RevealsHostLayerAndUsesCardComposerFilltest requires transparent canvas even though HC intentionally uses opaque system window fill. It passes in Light/Dark; the applicable HC selection excludes only that inapplicable case. No product or test assertion was weakened.The conflict resolution changed no feature additions/deletions: all 33 feature-file deltas are preserved relative to the newly merged main. Initial validation encountered invalid generated FunctionalUI and TestSupport reference assemblies (CS0009); targeted
-t:Rebuildregenerated them without source changes, then all required commands were rerun successfully.Hanselman review of the preceding candidate used Claude Opus 5.5 and GPT-6 Astra, both at high reasoning. Neither found P0-P2 defects. Four Opus-only P3 behavior/accessibility findings and two documentation/naming notes were subsequently addressed. This is not a new dual-model verdict for the fixed candidate.
Pre-merge independent implementation/proof-plan review: an app-native read-only
code-reviewagent examined all six fix dispositions, affected callers, regressions, actual TRX results and retained build/proof logs. It found no actionable P0-P3 defect or necessary simplification in that delta. Its runtime model identity was not exposed. This was not merge approval. The subsequent merge resolution was checked for an exact resource union and unchanged feature additions/deletions, with fresh validation; the independent review was not rerun or relabeled as a review of newer main.Earlier ARM64 and historical CI results in this PR's previous description are not current-head proof. Historical CI run 42322561958 remains evidence of the original failures, not a result for this update.
Change Type
Scope
winnodeRequired proof pools
windows-winui-interactive: native split layout, keyboard/focus, accessibility, theme and reader lifetime. Focused mounted tests and isolated synthetic-app observations pass; complete pool coverage is not claimed.windows-wsl-gateway-e2e: retain the profile-qualified Details lifecycle obligation. Real Gateway/account replacement and delayed-response scenarios remain unverified; fixture proof is not a substitute.Validation
The latest build, Shared/Tray and mounted UI runs used merged index tree
3d2bf047aede1a9024e9ad4512b2c33150d332d6, subsequently committed unchanged as219d59de36b8c8698a4ced4ea81654ec77628eca. Its parents are72b7d02dand3f47e838. The committed tree was checked against the recorded validation tree; these are source-corresponding precommit runs, not newly executed post-commit tests.$resultsbelow denotes each invocation's retained isolated result directory. Runs usedOPENCLAW_REPO_ROOT, all three isolated app-data roots, task-owned TEMP/TMP and a process-local tool PATH. Real profiles and shared runtimes were not used..\build.ps1dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore --logger 'trx;LogFileName=shared-20261111-143415.trx' --results-directory "$results"dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore --filter 'FullyQualifiedName!~SettingsManagerIsolationTests.OpenClawTrayDataDirRedirectsSettingsAwayFromRealAppData' --logger 'trx;LogFileName=tray-20261111-143836.trx' --results-directory "$results"dotnet build .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj -c Debug -r win-x64.\scripts\validate-docs.ps1;git diff --checkExact focused and mounted UI selections
Historical pre-merge focused managed command at the source subsequently committed as
72b7d02d, 900 passed / 0 failed / 0 skipped:Native command executed on a task-owned private desktop, once with each theme resource selection:
On the merged tree, Light and Dark: 36/36 passed each. The applicable HC run used the same filter with
|FullyQualifiedName~ProductionRoot_RevealsHostLayerAndUsesCardComposerFillremoved: 35/35 passed. The earlier pre-merge HC failure remains recorded as explained above. These are per-run execution totals, not 107 distinct cases or blanket three-theme coverage: some cases choose their own theme internally. HighContrast here means substituted resources, not changed OS settings.Real Behavior Proof
Environment tested: Windows x64, Debug/unpackaged WinUI, isolated profiles and synthetic loopback Gateway. No real credentials imported.
PR head or commit tested:
219d59de36b8c8698a4ced4ea81654ec77628eca, through the exact merged-tree correspondence above; comparison base3f47e83888db83740660d03c3ecd403550235187.Exact steps or command run: mounted UI command above, exercising wide/compact panel opening, switching tools, focus traversal, reader continuity, geometry, colors and closing. The earlier manual fixture sequence discovered tools with
winnode --mcp-url "$fixtureMcpUrl" --list-tools, sent two synthetic exchanges, opened Tool details and used Left/Right/Home/End.Evidence after fix: current merged-tree native results are 36 Light / 36 Dark / 35 HC passed, zero selected failures or skips. Copied manual UI diagnostics below are explicitly from the pre-merge
72b7d02dsource, not a new post-merge input replay:Observed result: the merged-tree mounted tests retain the reusable panel, full-height separator, matching pane backgrounds, reader continuity and compact focus traversal. Earlier manual keyboard resize changed actual mounted width as shown above. Real-profile metadata was unchanged during the native runs.
Screenshot or artifact links verified? (
Yes/No/N/A): N/A. Current local captures/TRX are retained but not uploaded; copied diagnostics above are the public proof item. Historical CI link is separate.Not verified or blocked: new-head CI; full unfiltered Tray suite (one unsafe real-profile reader excluded); complete UI/accessibility suite; real compact keyboard input after the user interrupted that optional live check (mounted focus traversal passes); OS High Contrast; ARM64 and production-shaped Release; real Gateway/profile replacement and delayed-socket races. No complete proof-pool acceptance is claimed.
Security Impact
Yes/No): No.Yes/No): No.Yes/No): Yes, an additional UI entry point reuses existing authenticated read-only saved-output recovery.Yes/No): No.Yes/No): No.Yes, explain the risk and mitigation: no new RPC method, credential storage, file access or execution permission. Existing profile verification and canonical result recovery are reused. Connection/profile/history revisions reject stale opens and completions; explicit identity invalidation without a verified baseline fails closed until reconnect.Compatibility and Migration
Yes/No): Yes for existing chat behavior; unavailable profile or saved-output capabilities remain explicitly unavailable.Yes/No): No product configuration changes. Test-only isolation variables were scoped to their child processes.Yes/No): No.Review Conversations
No inline review comments were returned by the prepublication read. No review thread was resolved or bot review requested by this update. The user marked this PR ready for review; the CI and proof gaps above remain open and it has not been merged.