fix(ui): catalog sessions select in place and continue from desktop-app sources#106074
Conversation
eec90a1 to
8d88b9a
Compare
|
Codex review: needs real behavior proof before merge. Reviewed July 13, 2026, 2:51 AM ET / 06:51 UTC. Summary PR surface: Source +228, Tests +273. Total +501 across 11 files. Reproducibility: yes. at source level: current main synthesizes unmatched catalog keys into normal sidebar rows, while the Anthropic source gate excludes desktop records despite using the same project transcript store; focused regression tests cover both paths. Review metrics: none identified. Stored data model Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Mantis proof suggestion Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Keep the provider-owned Claude eligibility change and generic catalog-row selection and deduplication design, then merge only after the refreshed head proves a successful Claude desktop continuation and an unchanged Codex catalog flow. Do we have a high-confidence way to reproduce the issue? Yes at source level: current main synthesizes unmatched catalog keys into normal sidebar rows, while the Anthropic source gate excludes desktop records despite using the same project transcript store; focused regression tests cover both paths. Is this the best way to solve the issue? Likely yes, but not fully proven: excluding catalog identities from normal-session synthesis and keeping Claude-specific eligibility in the Anthropic plugin is the narrow owner-aligned design, while complete real behavior and exact sibling-contract verification remain outstanding. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 4cbbb86d5e71. Label changesLabel justifications:
Evidence reviewedPR surface: Source +228, Tests +273. Total +501 across 11 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
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
|
11a44a1 to
f4859e2
Compare
…om desktop-app sources - sidebar: no phantom chat row for catalog keys, active highlight on catalog rows, adopted sessions render as their live row inside the catalog group (deduped from the regular list), host subtitle only for paired-node rows - chat: view-only banner only after catalog metadata proves canContinue=false - chat->sidebar continued event binds the adopted row before the next catalog poll - anthropic: local claude-desktop sessions share the ~/.claude/projects store, so list them as continuable and allow catalog continue to fork-resume them
…dules Keeps app-sidebar/chat-pane/anthropic session-catalog under the LOC ratchet by moving cohesive blocks: sidebar catalog groups + adopted-row binding into app-sidebar-session-catalogs.ts, the catalog metadata lookup into catalog-key.ts, and the Claude node-host commands into session-catalog-node-commands.ts; ratchet baselines down for all three.
…pin SDK surface The node-command module now owns its capability constant, projects-store probe, and params parsing, so the catalog engine exports nothing new. Repin the SDK surface budgets (+1 export/+1 callable landed on main without a pin bump); unexport the UI helper types knip flagged.
6ac8221 to
32f3b6e
Compare
…pp sources (openclaw#106074) * fix(ui): make catalog sessions selectable in place and continuable from desktop-app sources - sidebar: no phantom chat row for catalog keys, active highlight on catalog rows, adopted sessions render as their live row inside the catalog group (deduped from the regular list), host subtitle only for paired-node rows - chat: view-only banner only after catalog metadata proves canContinue=false - chat->sidebar continued event binds the adopted row before the next catalog poll - anthropic: local claude-desktop sessions share the ~/.claude/projects store, so list them as continuable and allow catalog continue to fork-resume them * refactor(ui): extract catalog row rendering and lookup into shared modules Keeps app-sidebar/chat-pane/anthropic session-catalog under the LOC ratchet by moving cohesive blocks: sidebar catalog groups + adopted-row binding into app-sidebar-session-catalogs.ts, the catalog metadata lookup into catalog-key.ts, and the Claude node-host commands into session-catalog-node-commands.ts; ratchet baselines down for all three. * fix(ui): explain the disabled composer when catalog metadata cannot resolve a session * style(ui): keep chat-pane within the LOC ratchet * fix(anthropic): keep catalog node-command helpers module-local and repin SDK surface The node-command module now owns its capability constant, projects-store probe, and params parsing, so the catalog engine exports nothing new. Repin the SDK surface budgets (+1 export/+1 callable landed on main without a pin bump); unexport the UI helper types knip flagged.
…pp sources (openclaw#106074) * fix(ui): make catalog sessions selectable in place and continuable from desktop-app sources - sidebar: no phantom chat row for catalog keys, active highlight on catalog rows, adopted sessions render as their live row inside the catalog group (deduped from the regular list), host subtitle only for paired-node rows - chat: view-only banner only after catalog metadata proves canContinue=false - chat->sidebar continued event binds the adopted row before the next catalog poll - anthropic: local claude-desktop sessions share the ~/.claude/projects store, so list them as continuable and allow catalog continue to fork-resume them * refactor(ui): extract catalog row rendering and lookup into shared modules Keeps app-sidebar/chat-pane/anthropic session-catalog under the LOC ratchet by moving cohesive blocks: sidebar catalog groups + adopted-row binding into app-sidebar-session-catalogs.ts, the catalog metadata lookup into catalog-key.ts, and the Claude node-host commands into session-catalog-node-commands.ts; ratchet baselines down for all three. * fix(ui): explain the disabled composer when catalog metadata cannot resolve a session * style(ui): keep chat-pane within the LOC ratchet * fix(anthropic): keep catalog node-command helpers module-local and repin SDK surface The node-command module now owns its capability constant, projects-store probe, and params parsing, so the catalog engine exports nothing new. Repin the SDK surface budgets (+1 export/+1 callable landed on main without a pin bump); unexport the UI helper types knip flagged.
What Problem This Solves
External Codex/Claude Code sessions surfaced in the Control UI sidebar ("session catalog") were effectively unusable:
source: "claude-desktop"during catalog discovery, and the anthropic plugin hard-requiredsource === "claude-cli"forcanContinue/continue — even though desktop sessions live in the same~/.claude/projectsJSONL store (discovery drops desktop records without one) andclaude --resume --fork-sessioncontinues them identically.catalog:claude:gateway%3Alocal:…key (deep-link fallback inresolveSessionNavigation), and previously adopted sessions rendered twice — once in the catalog group and once in the regular list, jumping to the top on activity. Catalog rows also never showed a selected state.Why This Change Was Made
Catalog sessions should feel like regular sessions that happen to run through Codex/Claude Code: click → selected in place, transcript shown, type → continue with streaming. All gating keys off the provider-reported per-session
canContinue, so paired-node continuation (PR #105833) lights up in this UI automatically once it lands.User Impact
catalog:…row, no duplicate entry jumping to the top of the chats list. Adopted sessions render as full live session rows (run spinner, unread dot, pin/menu actions) inside their catalog group, bound immediately on adoption via a document-levelopenclaw-session-catalog-continuedevent instead of waiting for the next 30s catalog poll.app-sidebar-session-catalogs.ts, the catalog metadata lookup tocatalog-key.ts, and the Claude node-host commands tosession-catalog-node-commands.ts(mirrors the codex plugin layout).Evidence
sessions.catalog.listreportscanContinue: truefor desktop-source sessions, rows select in place with the active highlight, the composer is enabled, and sending ran the full flow —sessions.catalog.continuesucceeded (adoption + history import),chat.sendstarted a run through the claude-cli backend withuseResume=true(gateway log), and the adopted row stayed inside the catalog group with the live run spinner and no duplicate in the chats block. (The CLI turn itself returned empty on that box because ~20 concurrent agent sessions were contending the localclaudeOAuth — standaloneclaude -preproduced "Not logged in" in isolation; the resume path is the same shipped one used forclaude-cli-source adoption.)node scripts/run-vitest.mjs):extensions/anthropic/session-catalog.test.ts(8) — incl. new: desktop-source rows list as continuable and adopt with the same one-shot fork binding.ui/src/lib/sessions/navigation.test.ts(12) — incl. new: no synthesized row for catalog session keys.ui/src/components/app-sidebar.test.ts(54 with navigation shard) — incl. new: node-only host subtitles; in-place active highlight without a phantom chat row; adopted rows render once (as live rows) inside the catalog group; catalog-continued event binds the adopted key immediately.ui/src/e2e/codex-sessions.e2e.test.ts+ui/src/e2e/claude-sessions.e2e.test.ts(3) — existing catalog flows still pass.pnpm tsgo:uiandpnpm tsgo:extensionspass locally.gpt-5.6-sol, thinking xhigh, branch vs origin/main): one P2 finding (silent disabled composer after failed lookup) — fixed in 47591df; rerun clean: "patch is correct", no actionable findings.