feat(macos): session detail parity β row actions, unread auto-clear, and subagent tree in native chat#110019
Conversation
β¦, and subagent tree in the native chat sidebar
β¦e/Android catalogs
There was a problem hiding this comment.
π‘ Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7dba609a79
βΉοΈ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with π.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| let request = OpenClawChatGatewayRequests.forkSession( | ||
| parentSessionKey: target.sessionKey, | ||
| agentID: target.agentID) |
There was a problem hiding this comment.
Preserve parent agent when forking sessions
When the user forks an agent-qualified row such as agent:ops:dashboard:abc, sessionTarget(for:) preserves the full key but leaves target.agentID nil, so this sessions.create request omits agentId. The gateway does not infer the child owner from parentSessionKey (see src/gateway/server.sessions.create.test.ts:1747-1754), so macOS can create/open the fork under the current default agent instead of the parentβs agent; the Android sibling explicitly sends the captured owner for this case in apps/android/app/src/main/java/ai/openclaw/app/chat/ChatController.kt:925-936.
Useful? React with πΒ / π.
| guard self.isCurrentSession(session), self.hasAppliedLiveHistory, | ||
| let entry = self.currentSessionEntry() ?? fallbackEntry, | ||
| let revision = self.unreadPatchGuard.shouldPatch( | ||
| key: self.sessionMutationIdentity(for: entry.key, listedKey: entry.key), | ||
| unread: entry.unread) |
There was a problem hiding this comment.
Clear unread for searched sessions outside the cached list
If a user opens an old unread session from the Sessions sheet search, that row lives only in the sheetβs one-shot scopedSessions and is not merged into viewModel.sessions (ChatSheets.swift:31-43, 302-307). When the subsequent 50-row bootstrap refresh still omits the old row, both currentSessionEntry() and fallbackEntry are nil here, so no sessions.patch(unread=false) is sent and the opened session stays unread; carry the selected row into the view model or fetch the activated key explicitly before this guard.
Useful? React with πΒ / π.
|
Codex review: needs real behavior proof before merge. Reviewed July 17, 2026, 10:22 AM ET / 14:22 UTC. Summary PR surface: Docs +1, Other +6329. Total +6330 across 52 files. Reproducibility: yes. from source with high confidence: fork an agent-qualified session to exercise the missing owner, or open an old unread session returned only by Sessions-sheet search to exercise the absent activation entry. Review metrics: 1 noteworthy metric.
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:
Risk before merge
Maintainer options:
Next step before merge
Security Review findings
Review detailsBest possible solution: Preserve the parent agent explicitly in fork requests, carry the selected searched session into unread activation, add focused regressions for both paths, and then demonstrate the corrected workflows in a signed macOS app run. Do we have a high-confidence way to reproduce the issue? Yes, from source with high confidence: fork an agent-qualified session to exercise the missing owner, or open an old unread session returned only by Sessions-sheet search to exercise the absent activation entry. Is this the best way to solve the issue? No, not yet. The parity direction and existing contracts are appropriate, but the implementation must preserve parent ownership and pass selected-session metadata through the activation boundary. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against b319493a529c. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Docs +1, Other +6329. Total +6330 across 52 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
|
|
Merged via squash.
|
β¦and subagent tree in native chat (openclaw#110019) * feat(clients): session detail parity β row actions, unread auto-clear, and subagent tree in the native chat sidebar * fix(clients): overlay pending explicit unread values over stale session snapshots * chore(i18n): translate new session action strings and regenerate Apple/Android catalogs * chore(clients): delete dead pin helper and worktree memberwise init
What Problem This Solves
The native macOS chat sidebar covers a fraction of the web chat's session management: rows only offer pin/copy/delete, opening a session never clears its unread marker, there is no rename or fork or archive outside the manager sheet, and subagent/child sessions render as a flat list with no run-state visibility.
Why This Change Was Made
Round 2 of native/web chat alignment (follow-up to #109712), scoped to session details:
label: null).sessions.listhierarchy metadata (childSessionsauthoritative;parentSessionKey/spawnedByas metadata β field contract verified againstsrc/gateway/session-utils.types.ts): children nest under parents with disclosure, and collapsed parents aggregate running/failed/unread descendant badges. Flat fallback when no hierarchy data is present.sessions.createcontract withparentSessionKey+fork. No new RPCs, settings, or protocol changes.User Impact
Everyday session management no longer requires the manager sheet or the web UI: rename, fork, archive, and read-state control live on the row; unread dots behave like the web; and subagent activity is visible at a glance with nesting and status badges.
Evidence
swift build --package-path apps/shared/OpenClawKit --target OpenClawChatUIandswift build --package-path apps/macos --configuration releaseβ pass (re-verified after rebase onto landed main).swift test --package-path apps/shared/OpenClawKit --parallelβ 885 tests pass;swift test --package-path apps/macos --parallelβ 1304 pass.pnpm lint:swift,pnpm format:swift,pnpm native:i18n:check, Apple/Android catalog tests β clean; new strings translated across all 21 locales.