cmux NEXT model picker: themed harness symbols on top, stars, ⌘N, Legacy models (on #27948)
PR 2 of 2. It sits on #27948 (PR 1, the P0: one row per model, effort as a vertical side dropdown); review only the two commits after it. It lands after #27948.
Leo's picker lines, 2026-10-30, verbatim:
- "honestly we had a pretty good thing going with teh symbols of the harneses at the top :("
- "we dont like horizontal text for effort. just make it vertical. hell, why not do a vertical slider?"
- "imagine instead of this, you had it vertical... so you have a top horizontal harnesses (like it was before... god darn it why did it get changed... we liked that...) then the slider can be... hm. actually you could fit a slider in the popover area for the effort, no? slider AND/OR the vertical text..."
- "you can merge it if you want, but we're going to go with the harness symbols at the top. like this, but symbols at the top, and themed, and combined with the effort side dropdown inside it"
- On two sessions building the same picker: "the desktop session coordintor captain also was doing... stuff. this is wack though." This PR and #27948 are now the one picker build.
Leo, 2026-10-28: "don't have nonsense end halfway on a f***ing icon when there's lots of harnesses, when there's lots of model families"
What changes (on top of #27948)
The target picker is Leo's reference with the symbols moved to the top (the reference: a rail of harness symbols, search, model rows with a ⌘N shortcut and a star, then Legacy models).
- Harness symbols as a row at the top, as before #26071. That PR made a left column of named rows the default; this is the change Leo means by "why did it get changed". A new placement,
symbols, is the default (webviewcomposerSettingsand the Swift tunableagent.harnessPlacement).- Each harness is its symbol, with its name as the tab's title and its accessible name.
- A harness with no symbol, or one whose symbol another tab shares, shows its name.
- Many harnesses wrap onto another row, never scroll sideways and never cut a symbol; past three rows the strip scrolls by whole rows.
- Themed symbols. Each harness's own mark is drawn in the theme's text colour (new AgentMark
tint), muted at rest. The selected one is lit, with the accent bar under it. - Effort side dropdown inside it. This comes from #27948: each model is one row, and its levels open as a vertical dropdown beside it.
- Stars and ⌘N.
- A star at each row's trailing edge shows and toggles Starred, which is the full picker's favourites and what the Starred tab lists.
- Rows name their keys ⌘1 to ⌘9.
- ⌘N picks a row, also while a search shows.
- Legacy models. A harness's other models sit under "Legacy models", with their count.
Kept: search with its harness groups (#27303), Starred, Add harness (#26503), launch entries, the keyboard along the strip, native density (#27320), the Effort submenu, Provider and Fast. The Left, Top with names and Compact placements stay as Debug Settings choices. New strings are translated in every locale.
Gallery (the gallery workflow captures before and after)
- Effort side dropdown (
agent-pane.inline-model-effort):list(picked: the levels one per line with the recommended one named, closest to Leo's vertical-list reference),plain,slider. - Harnesses:
harness-symbols(picked),harness-symbols-many,harness-left(the old default),harness-top,harness-compact.
Gallery: new-tab.quick-model-menu/claude, new-tab.quick-model-menu/harness-symbols-many, new-tab.quick-model-menu/chat-flipped, new-tab.quick-model-menu/harness-left, agent-pane.inline-model-effort/list, agent-pane.inline-model-effort/slider
Tests
quick-model-menu-layout:
- the target picker: the symbols draw in
currentColorwith the selected one lit, rows show ⌘N, a starred row shows its star, and Legacy models shows with its count; - one row of symbols above the models;
- many harnesses: no visible tab is cut;
- every placement leaves the model rows visible;
- the left-rail test opens
harness-left.
model-picker-round-rail: every tab shows its symbol or its whole name. The short-list and compact jsdom tests read ⌘N keys.
Overlap
- #27140 (native popup migration) draws a 44 pt left rail; whichever lands second carries this layout. Its owner has been told.
- #27692 (austinywang, one tab per harness) touches other lines and is being landed under the fix rule.
- #27926 (no Fork rows in the running harness's own tab) is separate and small.
Risk
Medium: the compact model menu's layout and default placement. Someone who chose another placement in Debug Settings keeps it.
Agent session: agent session
🤖 Generated with Claude Code