feat(ui): declutter the Control UI sidebar with customizable pinned nav and a More section#100296
Conversation
|
Codex review: needs changes before merge. Reviewed July 5, 2026, 4:52 PM ET / 20:52 UTC. Summary PR surface: Source +104, Tests +208, Docs +8. Total +320 across 62 files. Reproducibility: yes. A high-confidence source path exists for the review finding: open the drawer at the tablet breakpoint, resize back to desktop, then press the desktop collapse button; navDrawerOpen still masks navCollapsed, so the visible sidebar remains expanded. Review metrics: 1 noteworthy metric.
Stored data model Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. 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
Maintainer decision needed
Security Review findings
Review detailsBest possible solution: Merge this direction only after clearing the stale drawer state, removing the direct changelog edit, and explicitly accepting the new browser-local pinned-nav preference model. Do we have a high-confidence way to reproduce the issue? Yes. A high-confidence source path exists for the review finding: open the drawer at the tablet breakpoint, resize back to desktop, then press the desktop collapse button; navDrawerOpen still masks navCollapsed, so the visible sidebar remains expanded. Is this the best way to solve the issue? No, not yet. The sidebar design is coherent, but the best merge path needs a stale-drawer-state fix, the changelog entry removed, and maintainer acceptance of the browser-local preference change. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 77575d74f68c. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source +104, Tests +208, Docs +8. Total +320 across 62 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
Review history (11 earlier review cycles; latest 8 shown)
|
4dfdac2 to
3c02314
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3c0231491e
ℹ️ 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".
There was a problem hiding this comment.
💡 Codex Review
When an opted-in ClickClack account handles a direct message, handleClickClackInbound passes provenance: turnProvenance into sendClickClackText, and the docs promise the final reply carries author_model/author_thinking; however this DM branch still calls createDirectMessage with only the body, so DM final replies lose the new attribution metadata while channel and thread replies keep it. Please extend the direct-message client path to accept and serialize the same provenance fields.
ℹ️ 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".
fe1e461 to
f5f5df9
Compare
69452f4 to
371f07e
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 371f07e527
ℹ️ 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".
| .onToggleSidebar=${() => | ||
| context.navigation.update({ | ||
| navCollapsed: !navCollapsed, | ||
| })} |
There was a problem hiding this comment.
Clear stale drawer state before desktop collapse
When the drawer is open at the ≤1100px breakpoint and the window is resized back to desktop, CSS hides the hamburger/backdrop but navDrawerOpen remains true. This topbar handler then only writes navCollapsed: !navCollapsed; because navCollapsed is derived as this.navCollapsed && !navDrawerOpen, the visible desktop collapse button keeps rendering as expanded and cannot collapse the sidebar until the user happens to press Escape or navigate. Close/reset the drawer state before toggling the desktop collapse preference.
Useful? React with 👍 / 👎.
ede7f55 to
c3eeb10
Compare




Closes #100287
What Problem This Solves
The Control UI sidebar had become the busiest surface in the app: three always-expanded nav groups (Control, Agent, Settings) with 13 entries, the session list, a brand header with its own collapse button, and footer utilities all competing with the chat. There was no way to choose which destinations stay visible, so every page carried the full nav tree.
Why This Change Was Made
The sidebar is restructured around a small user-customizable pinned set, modeled on how the Codex desktop app keeps a few important sections on top and hides the rest behind "More". Sessions stay first (New session, Recent, All sessions), a pinned trio follows (default: Overview, Workboard, Agents), and every other destination lives in a collapsed More section. Right-clicking the nav — or the "Customize sidebar" entry under More — opens a menu with per-destination pin checkmarks and a reset action; the selection persists per browser in the existing Control UI settings store (
sidebarPinnedRoutes,sidebarMoreExpanded), replacing the retired per-group collapse map. Settings moved to the sidebar footer next to Docs, and the sidebar collapse toggle moved out of the brand header into the topbar as a small icon button next to the terminal toggle (hidden at drawer breakpoints where the hamburger takes over).User Impact
The default sidebar shows 3 nav items instead of 13, so the chat gets the visual focus. Users can pin exactly the destinations they use (right-click → check/uncheck, or More → Customize sidebar), collapse the sidebar from the topbar, and their choices survive reloads. Nothing is removed: every page stays reachable through More, Settings sits in the footer, and mobile drawer behavior is unchanged.
Evidence
Validated against the mocked-gateway Control UI in a source-blind browser run: default pins, More expansion, per-route unpinning, reset, Escape focus restoration, and pin/More/collapse persistence all passed with screenshots.
tbx_01kwsjx5adsezw46cp6dn4e5k9:pnpm check:changed, 152 focused unit tests, i18n consistency, and the UI test TypeScript project passed.ui/src/e2e/sidebar-customization.e2e.test.tscovers customization, reset, and reload persistence.