Repository navigation
Conversation
Add epoch-bound native transcript search with scoped Gateway requests, human-readable results, lifecycle fences and faithful unit/socket/UI fixture coverage. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
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. |
|
Current-head native fixture proof at 95adf40: real accessible Search control, rendered matching message results, then navigation to the matching research conversation. Run 5013d7aefbe34817afe308605e3a7a2f passed 1/1 and observed sessions.search with outcome ok. These are owned app-window captures containing only synthetic fixture content, not live Gateway proof. |
|
Codex review: needs maintainer review before merge. What this changesThis PR adds message search to Sessions with matching snippets, conversation titles, and chat navigation. Example: Search for
Review scores
ProductKind: Feature · Worth it: Yes · Fix scope: Complete Merge readiness✅ Ready for maintainer review Keep this useful, collaborator-authored draft open: current main lacks transcript search, and review found no definite introduced correctness or security defect. Priority: P2 Before mergeNone. FindingsNone. Tests
Agent review detailsHow this fits togetherThe Sessions page sends an explicit query through the existing authenticated operator client to Gateway transcript search and renders returned matches as native text. flowchart LR
A[User query] --> B[Sessions page]
B --> C[Search lifecycle owner]
C --> D[Operator Gateway client]
D --> E[Gateway transcript search]
E --> F[Native results]
F --> B
Technical reviewBest possible solution: Retain the bounded search implementation and complete its supported Gateway validation before landing. Do we have a high-confidence way to reproduce the issue? This is a new capability rather than a reported defect; source inspection confirms its absence from current main. Is this the best way to solve the issue? The implementation appropriately delegates search and visibility to Gateway, retains native presentation, and binds asynchronous results to the originating view and connection. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against e5122db3c943. Provenance checked
TestingProof path: shipped entry point. SecurityNone. EvidenceWhat I checked:
Likely related people:
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 Reviewed October 23, 2026, 6:20 PM ET / 22:20 UTC. |
|
This pull request has been automatically marked as stale due to inactivity. |
PR cleanup reviewReviewed head: Shared navigation search has now landed in #2016 (4ea07e8), including Gateway message search, snippets and conversation navigation. This overlaps the main goal here, but I cannot call the full PR equivalent: this candidate permits background/unknown conversations and retains richer message provenance, while main deliberately uses a narrower shared-search scope. Please decide whether those residuals belong in the shared search owner. I recommend not introducing a second Sessions-page search implementation, and closing this lane only with that scope distinction recorded. 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. |


What Problem This Solves
Finding a conversation from remembered message content currently requires opening its transcript instead of searching across the Gateway's visible conversations.
User Impact
User impact: Sessions gains native message search with conversation titles, text snippets and direct chat navigation. Search covers active conversations across channels, excludes cron/system sessions unless Show background is enabled, and reports indexing, partial results, unsupported Gateways and failures separately.
This is deliberately a draft. Required full-suite validation has unrelated host/baseline failures, and actual published/live Gateway compatibility is not established.
Why This Change Was Made
Mirror the Mac companion's transcript-search behavior using native WinUI rather than copying Mac styling. The pinned Mac request owner sends a roster scope, not a truncated set of loaded keys or title-search filters. The pinned schema limits queries to 4096 characters and results to 25 messages.
SessionTranscriptSearchowns query/view/connection invalidation; the page only applies state. Requests retain the originating connection epoch. Labels come from matching Gateway session rows; keys remain navigation identifiers. Snippets render as text, never executable markup.This is the first bounded
sessions.*sub-seam, not completion of the category. All 69 saved method names were dispositioned: 9 recognized existing paths, 3 existing paths missed by the historic scanner (create,describe,dispatch), this new search path, 50 implementation gaps, and 6 explicitly unadvertised contracts (get,resolve,steer,usage,usage.logs,usage.timeseries). Two current-source additions (files.download,github.action) are kept outside the historic denominator. No scanner/policy changes or automatic verification promotion are included.Complete historical 69-method disposition
R: existing reachable path recognized historically.M: existing reachable path missed historically.N: new implementation in this seam.G: remaining implementation gap.U: explicitly unadvertised at pinned source, not presumed retired. These are dispositions, not verified-admission claims; every method remainsverified=falsein the evidence inventory.sessions.abortsessions.activitySummary.ensuresessions.assignOwnersessions.branches.listsessions.branches.switchsessions.catalog.archivesessions.catalog.continuesessions.catalog.importsessions.catalog.listsessions.catalog.readsessions.catalog.startTerminalsessions.cleanupsessions.compactsessions.companion.asksessions.companion.resetsessions.companion.statesessions.createsessions.deletesessions.describesessions.diffsessions.dispatchsessions.files.assetssessions.files.getsessions.files.listsessions.files.revealsessions.files.setsessions.forksessions.getsessions.github.confirmsessions.github.optionssessions.github.publishsessions.github.statussessions.goal.clearsessions.goal.updatesessions.groups.defaultssessions.groups.deletesessions.groups.listsessions.groups.putsessions.groups.renamesessions.groups.updatesessions.listsessions.messages.subscribesessions.messages.unsubscribesessions.movesessions.observer.visibilitysessions.patchsessions.patchManysessions.pluginPatchsessions.previewsessions.processes.listsessions.processes.stopsessions.providerReview.continuesessions.reclaimsessions.recoversessions.resetsessions.resolvesessions.rewindsessions.searchsessions.sendsessions.setInvolvementsessions.steersessions.storage.runsessions.storage.statussessions.subscribesessions.title.preparesessions.usagesessions.usage.logssessions.usage.timeseriessessions.viewers.setCurrent-only
sessions.files.downloadandsessions.github.actionremain implementation gaps outside this table's historic denominator. Existing Files/recovery/history work remains with its contributor PRs rather than being taken over here.Evidence
31 focused Shared cases and 31 focused Tray/localization/handler cases pass. Real loopback WebSocket tests exercise the production client, exact strict scope/limit contract, distinct message provenance, human title enrichment, membership-before-limit, archival, permission denial, unsupported methods and index readiness. The fixture uses independently authored substring search over synthetic transcripts, not the production full-text implementation.
Current-head native proof also passes 1/1: set the real search control, invoke the accessible native Search button, observe completed
sessions.search, inspect the rendered matching titles/snippets, and invoke a result to display the matching conversation. Owned-window captures show the actual changed Sessions and chat states. No debug state setters, foreign process cleanup or physical-input guard bypass was used.Independent
rubber-ducktask-role review covered the implementation/proof plan and P0-P3 source correctness. Its title-enrichment and localization-helper findings were addressed and re-reviewed, with no remaining findings. Model identity was not independently verified. The shared autoreview installation is absent; no helperscoped-cleanresult or isolation guarantee is claimed.Change Type
Scope
winnodeRequired proof pools
windows-winui-interactive: current-build visible transcript matches and navigation through the accessible native Search button.Validation
All commands ran from the task worktree with
OPENCLAW_REPO_ROOTset to its path. TRX logging/results-directory flags were added to retain invocation-specific reports. The final build, Shared and Tray closeout ran sequentially under the task group's exclusive validation lease at frozen head95adf40e, with isolated roaming/local data roots. The lease was released immediately after closeout; no unrelated app or privilege was changed..\build.ps1: passed, full native ARM64 build (Shared, CLI, WinNode CLI, SetupEngine and WinUI).dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore: final head 4673 passed, 1 failed, 26 skipped (4700 total). Only the required-privilege symlink failure persists (MxcFolderAdmissionTests.OwnedJunctionAndSymbolicLinkAreRejectedWithoutFollowingTheirChildren(symbolic: True)). No timing failure occurred in this serialized run, 17:49:04 to 17:51:10 EDT.dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore: final head 4504 passed, 4 failed, 0 skipped (4508 total). All four failures are existing ARM64BuildPrerequisiteTests.CheckOnly_UsesTheAppLocalRuntimeResolvercases. Tests and machine privileges were not weakened/changed. Serialized run: 17:51:36 to 17:53:07 EDT.dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore --filter 'FullyQualifiedName~SessionSearchTests|FullyQualifiedName~GatewayFixtureProtocolTests.TranscriptSearch': 31 passed, 0 failed/skipped.dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-build --filter 'FullyQualifiedName~SessionTranscriptSearchTests|FullyQualifiedName~LocalizationValidationTests|FullyQualifiedName~TrayMenuWindowMarkupTests.Source_DoesNotDeclareAsyncVoidHandlers': 31 passed, 0 failed/skipped.dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-build --filter 'FullyQualifiedName~ConnectAsync_TimedOutRetry_DoesNotDisposeNewerConnectionDuringBackoff': isolated follow-up 1 passed, 0 failed/skipped; does not erase full-run failure..\scripts\validate-docs.ps1: passed, 66 Markdown files.git diff --check: passed.dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore --filter 'FullyQualifiedName~SessionTranscriptSearchTests|FullyQualifiedName~LocalizationValidationTests|FullyQualifiedName~TrayMenuWindowMarkupTests.Source_DoesNotDeclareAsyncVoidHandlers': final accessible-button source, 31 passed, 0 failed/skipped.dotnet build .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj --no-restore -r win-arm64 -p:Platform=ARM64 -p:DevBuild=false -p:BuildProjectReferences=false -v quiet: passed, compiles corrected UI proof without rebuilding or launching the product.dotnet test .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj --no-build -r win-arm64 -p:Platform=ARM64 -p:DevBuild=false --filter 'FullyQualifiedName~GatewayFixtureUiTests.TranscriptSearch_ShowsVisibleMatchesAndOpensTheMatchingConversation': 1 passed, 0 failed/skipped, 14.37 seconds.OPENCLAW_RUN_GATEWAY_FIXTURE_UI=1,OPENCLAW_GATEWAY_FIXTURE_SCREENSHOTS=1, and the current isolated app/artifact paths were supplied. Run5013d7aefbe34817afe308605e3a7a2f; owned app PID 46128 confirmed absent afterward, desktop lease explicitly released.Real Behavior Proof
95adf40e9ac1e5719bd1dd54a899760d6ff98d3d; current-head full build and suites completed above. Native executable SHA-2567d91d73f1bcb68ad28085545189ad9cdd53eacc3aad8b094121399ce14b473bd; app assembly SHA-25667aeb1fad94555fb95fc12e6cef45ceaec66ef690f4d03cdc6abb7040af440ac. These are manually associated local build identities, not a signed source-to-binary attestation. The complete 69-method local disposition inventory records current-head production/test source SHA-256 identities; its SHA-256 is7f695db3b3c0d52f96437951b253d8e7f323ce3c759c25063ef3ecbaf5dd3b9e.{"Method":"sessions.search","Outcome":"ok"}in run5013d7aefbe34817afe308605e3a7a2f. The fixture ledger intentionally does not record raw search parameters. Independent socket tests assert the exact query/scope/limit contract. Native capture shows queryFIXTURE RESEARCH:, count 2, matching human titles/snippets, then the matching research transcript after invoking the result.FIXTURE RESEARCH:with human titleFixture: research conversation; defaultlighthousesearch excludes 60 synthetic background matches before limiting, and Show background returns 25 matches withtruncated=true.Yes/No/N/A): Yes. Owned-window proof screenshots. Both hosted images were downloaded and verified byte-for-byte against the captured originals. Results image SHA-256f0696bce03858500644b66fb9acecd41b5c81abed48dd350a436d89277e80404; matching conversation image SHA-2566f889430dd917289e1dda694877ae6ca799482915c08ade64a59a1939731b95d.098e991is not a verified source binding for the saved published package merely because both declare version 2026.10.6.Security Impact
Yes/No): NoYes/No): NoYes/No): YesYes/No): NoYes/No): YesYes, explain the risk and mitigation: explicit user-submittedsessions.searchreads active transcript matches from the already authenticated Gateway's authorized visible roster usingoperator.read. No host filesystem access, transcript export, arbitrary RPC endpoint or automatic retry is added. Snippets remain text and failure logs contain only exception types.Compatibility and Migration
Yes/No): YesYes/No): NoYes/No): NoReview Conversations