feat(ui): stable session order, palette-only search, and macOS titlebar brand for the sidebar#100648
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 93660f8d63
ℹ️ 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".
93660f8 to
4e83af4
Compare
…g, palette session search, titlebar brand in macOS app - Sessions split into Pinned and Chats groups; pins are exempt from the nine-row recency cap and the open session highlights in place instead of hoisting to the top, so clicking a row no longer reshuffles the list. - The command palette (Cmd+K) is the single search: it queries sessions across agents server-side and lists matching chats next to nav commands; the sidebar session-picker popover and its magnifier are removed, and the topbar search pill shrinks to an icon button. - The sidebar brand row is gone: web keeps the breadcrumb wordmark, and the macOS app shows a compact brand mark in the native titlebar strip next to the traffic lights (CSS-gated on the injected openclaw-native-macos class). - The agent filter dropdown becomes a compact scope chip in the Chats group header; the welcome badge drops its duplicate claw logo. - Footer collapses to one icon row (status dot, settings, docs, pairing, mobile theme switch); default pinned nav routes are now Overview-only and the Recent-collapse preference is retired.
… refresh locale metadata Clicking the row leaves :focus-within on it, which keeps the management actions visible; the hidden-actions assertion must run first.
…rows stay archive-disabled
Invalidate the in-flight search and clear results on every query change so a late-resolving previous-query request cannot leave stale rows selectable, and run results through getVisibleSessionRows so archived/global/unknown/cron/ subagent rows stay hidden like the sidebar list. Codex review findings.
…ve visible matches Exclude global/unknown rows server-side and fetch a full 50-row page before applying the sidebar's hidden-row filter, keeping the 10-row display cap. Codex review finding.
4e83af4 to
eda0a48
Compare
|
Codex review: needs changes before merge. Reviewed July 6, 2026, 2:29 AM ET / 06:29 UTC. Summary PR surface: Source -765, Tests -293, Docs +2. Total -1056 across 60 files. Reproducibility: yes. source-level: the PR head renders sidebar chat rows through hover/focus-only Review metrics: 1 noteworthy metric.
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:
Risk before merge
Maintainer options:
Copy recommended automerge instructionNext step before merge
Security Review findings
Review detailsBest possible solution: Keep the palette-only search and stable-order direction, but add a touch/coarse-pointer-visible sidebar pin/archive path or equivalent before removing the picker. Do we have a high-confidence way to reproduce the issue? Yes, source-level: the PR head renders sidebar chat rows through hover/focus-only Is this the best way to solve the issue? No, not yet: moving search to the command palette and stabilizing ordering is a reasonable owner-boundary direction, but the picker removal needs a touch-safe replacement for sidebar pin/archive actions. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against d6dad9d9d595. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source -765, Tests -293, Docs +2. Total -1056 across 60 files. View PR surface stats
Acceptance criteria:
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
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: eda0a4823d
ℹ️ 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".
|
Land-ready after maintainer integration against current What changed:
Proof on head
Known proof gap: the macOS-native titlebar placement retains the PR's existing visual evidence; this repair pass did not launch a new signed macOS app build. |
|
Merged via squash.
|
…ar brand for the sidebar (openclaw#100648) * feat(ui): declutter the sidebar — pinned/chats groups, stable ordering, palette session search, titlebar brand in macOS app - Sessions split into Pinned and Chats groups; pins are exempt from the nine-row recency cap and the open session highlights in place instead of hoisting to the top, so clicking a row no longer reshuffles the list. - The command palette (Cmd+K) is the single search: it queries sessions across agents server-side and lists matching chats next to nav commands; the sidebar session-picker popover and its magnifier are removed, and the topbar search pill shrinks to an icon button. - The sidebar brand row is gone: web keeps the breadcrumb wordmark, and the macOS app shows a compact brand mark in the native titlebar strip next to the traffic lights (CSS-gated on the injected openclaw-native-macos class). - The agent filter dropdown becomes a compact scope chip in the Chats group header; the welcome badge drops its duplicate claw logo. - Footer collapses to one icon row (status dot, settings, docs, pairing, mobile theme switch); default pinned nav routes are now Overview-only and the Recent-collapse preference is retired. * test(ui): keep sidebar hover-reveal proof before the stability click; refresh locale metadata Clicking the row leaves :focus-within on it, which keeps the management actions visible; the hidden-actions assertion must run first. * test(ui): archive an idle session in the sidebar e2e; assert running rows stay archive-disabled * fix(ui): drop stale and hidden rows from palette session search Invalidate the in-flight search and clear results on every query change so a late-resolving previous-query request cannot leave stale rows selectable, and run results through getVisibleSessionRows so archived/global/unknown/cron/ subagent rows stay hidden like the sidebar list. Codex review findings. * fix(ui): over-fetch palette session search so hidden rows cannot starve visible matches Exclude global/unknown rows server-side and fetch a full 50-row page before applying the sidebar's hidden-row filter, keeping the 10-row display cap. Codex review finding. * chore(i18n): refresh sidebar locale metadata after rebase * fix(ui): bound command palette session search * docs: defer release notes to release generation
…ar brand for the sidebar (openclaw#100648) * feat(ui): declutter the sidebar — pinned/chats groups, stable ordering, palette session search, titlebar brand in macOS app - Sessions split into Pinned and Chats groups; pins are exempt from the nine-row recency cap and the open session highlights in place instead of hoisting to the top, so clicking a row no longer reshuffles the list. - The command palette (Cmd+K) is the single search: it queries sessions across agents server-side and lists matching chats next to nav commands; the sidebar session-picker popover and its magnifier are removed, and the topbar search pill shrinks to an icon button. - The sidebar brand row is gone: web keeps the breadcrumb wordmark, and the macOS app shows a compact brand mark in the native titlebar strip next to the traffic lights (CSS-gated on the injected openclaw-native-macos class). - The agent filter dropdown becomes a compact scope chip in the Chats group header; the welcome badge drops its duplicate claw logo. - Footer collapses to one icon row (status dot, settings, docs, pairing, mobile theme switch); default pinned nav routes are now Overview-only and the Recent-collapse preference is retired. * test(ui): keep sidebar hover-reveal proof before the stability click; refresh locale metadata Clicking the row leaves :focus-within on it, which keeps the management actions visible; the hidden-actions assertion must run first. * test(ui): archive an idle session in the sidebar e2e; assert running rows stay archive-disabled * fix(ui): drop stale and hidden rows from palette session search Invalidate the in-flight search and clear results on every query change so a late-resolving previous-query request cannot leave stale rows selectable, and run results through getVisibleSessionRows so archived/global/unknown/cron/ subagent rows stay hidden like the sidebar list. Codex review findings. * fix(ui): over-fetch palette session search so hidden rows cannot starve visible matches Exclude global/unknown rows server-side and fetch a full 50-row page before applying the sidebar's hidden-row filter, keeping the 10-row display cap. Codex review finding. * chore(i18n): refresh sidebar locale metadata after rebase * fix(ui): bound command palette session search * docs: defer release notes to release generation
…ebar (#102497) The sidebar brand row (logo + wordmark) returned in 8295a12 but the macOS-only titlebar mark from #100648 stayed, so the Mac app showed the claw icon twice. Delete the sidebar-native-brand element and its CSS gate; the sidebar brand row is the single brand surface and the native titlebar strip holds only the traffic lights.
…ebar (openclaw#102497) The sidebar brand row (logo + wordmark) returned in d04137f but the macOS-only titlebar mark from openclaw#100648 stayed, so the Mac app showed the claw icon twice. Delete the sidebar-native-brand element and its CSS gate; the sidebar brand row is the single brand surface and the native titlebar strip holds only the traffic lights.
Related: #100386
What Problem This Solves
After #100386 the Control UI sidebar is grouped, but three sources of clutter and confusion remain:
Why This Change Was Made
One search, one stable list, and chrome only where there is dead space. Session search moves into the ⌘K command palette (server-side, across agents), which replaces the sidebar session-picker popover entirely; the topbar search pill shrinks to an icon button. Session ordering becomes presentation-stable: rows keep their recency slot, the open session highlights in place, and only an off-list session (deep link or beyond the recency cap) is surfaced at the top. The agent filter becomes a compact scope chip in the Chats group header, the "Ready to chat" badge drops its duplicate logo, and the macOS app shows a small brand mark in the native titlebar strip (CSS-gated on the
openclaw-native-macosclass the app already injects; web builds keep the wordmark in the breadcrumb only).Non-goals: session rename and bulk management stay on the All Sessions page (which keeps full search with filters and limits); the Swift-side injected CSS is untouched so older gateway-served UIs keep working with current app binaries.
User Impact
Evidence
Mocked-Gateway browser harness, light mode, 1440×900, same session fixture throughout.
Validation (Blacksmith Testbox through Crabbox unless noted):
pnpm test ui/src/lib/sessions/navigation.test.ts ui/src/app/settings.node.test.ts ui/src/app-navigation-groups.test.ts ui/src/lib/agents/display.test.ts— 50 tests green (tbx_01kwtw4wn650pkfkz2665gg015); includes new regressions: stable order on click, off-list session surfacing, pinned-cap exemption withactiveRowKey.pnpm test:ui:e2e -- ui/src/e2e/session-management.e2e.test.ts ui/src/e2e/sidebar-customization.e2e.test.ts— 4 tests green (tbx_01kwty4r30x8n36m6tap5aq6bs); session management rewritten for the palette flow (asserts the gateway receivessessions.listwith the typed query, that a running row keeps archive disabled, and that clicking a visible row does not reshuffle the list) and keeps the pinned-duplicate regression from feat(ui): make the sidebar session-first and minimal #100386.pnpm tsgo:test:ui,pnpm ui:i18n:check(20 locales clean, zero fallbacks).Net diff is −1,103 lines across 60 files: deleting
session-picker.ts(553 LOC) plus its pagination e2e outweighs the palette search addition.