Skip to content

cmux next: the model menu shows harness, model, effort and account at once - #32980

Merged
lucasr1b merged 16 commits into
feat-cmux-nextfrom
next-model-profile
Nov 3, 2026
Merged

lucasr1b merged 16 commits into
feat-cmux-nextfrom
next-model-profile

Conversation

@lucasr1b

@lucasr1b lucasr1b commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

The model button's menu asked for one thing at a time: a harness on the rail, a model, then effort in a side menu, Fast in a checkbox row and the account in a submenu. This PR replaces that menu, wherever it has a harness rail, with columns: the harness rail, the harness's models, then the shown model's effort and Fast. The account is an avatar in the search row's corner, as a browser's profile button.

  • Columns (QuickModelColumns.tsx, quickModelColumns.css): the rail (Starred always first), the models with their Legacy ones under a caption, and an Effort column (levels highest first, "None" when a model has none, provider rows for a model several providers serve, then Fast). Each column scrolls on its own and fades the edge that has more rows. The menu keeps its largest size while open, so its far edge never jumps.
  • Picks: a click lands at once and the menu stays open: a model, then its level, Fast or provider, each as it is clicked. A picked model carries the last level picked here, else the chat's, when it has it, else takes its recommended one (Opus 5.5 on Extra High to Sonnet 5.5 on Extra High). Ultracode carries as Extra High.
  • No shift: the menu stays where it opened while it is open, so a chip renamed by a pick never moves it. In the chat's quiet row (packed to its end) it lines up with the chip's end, so a reopen after a switch opens in the same place. The Effort column has a fixed width.
  • Account avatar: it shows the account of the shown model's harness, with the harness's mark at its corner. Its card lists the harness's other accounts and routes, Add account…, and for a signed-out harness "Sign in to {harness}…" and "Use an API key…". An empty Starred tab or a harness this Mac does not have shows a blank person ring.
  • Keys: Up and Down move the highlight only (never a switch, never a launch); Left and Right move between columns; Return lands and closes; 1-9 and ⌘1-9 pick a row; Escape closes the card, then clears the search, then closes. The card's rows and Add harness take Tab.
  • Wiring: ModelPicker renders QuickModelColumns; with no rail (a started chat with no fork target) or for the Chief, it falls back to QuickModelMenu, which is unchanged apart from exports and an optional accountFamily on QuickFamily.
  • Shared part (src/ui/DrivenList.tsx, new): DrivenList (a listbox or tablist), DrivenRow (option, tab, radio, switch, button) and InlineCard (a non-modal dialog inside a popup), for lists a search field drives (it keeps the keyboard and names the active row). Base UI 1.8 has no such list, as DrillList notes, so the columns set no popup role by hand (cmux NEXT webviews: fail hand-set popup roles and raw design values in new code outside ui/ #33701).
  • Strings: 9 new keys in Localizable.xcstrings, all 21 languages. 4 of them cut from existing translations.

Unchanged: the full picker, RetryModelMenu, and the list menu where there is no rail. The list menu's layout settings (harnessPlacement, effortLook, the effort slider, routeLayout, widthLook) do not apply to the columns.

Changelog

  • Changed: The model button's menu shows harnesses, models, effort and Fast side by side, with the account as an avatar that switches or adds accounts.

Tests

  • src/agent-session/acpmux/QuickModelColumns.test.tsx (new): Starred always first and its blank avatar; the session's levels with the current one checked; "None"; arrows highlight without landing; a click lands at once and keeps the menu open; model, then level, then Fast each land at once; the carried or recommended level, a level picked here carried to the next model, Ultracode carried as Extra High; Fast flips at once; the account card's rows and Add account; a missing harness's blank avatar; the Escape order; session levels when the running model has no row.
  • Rewritten for the columns menu, same behaviors: model-menu-compact, model-menu-started-chat-fork, new-tab-deferred-pickers, new-tab-ask-model, new-tab-harness-rail, model-menu-providers, model-menu-short-list, model-picker-all-harnesses, model-picker-idle, signed-out-rail, ultracode-rides-effort, auth-health-gallery.
  • Browser tests (Playwright on gallery pages) updated for the columns: picker-row-geometry, model-menu-bounded-height, model-search.browser, model-menu-density.browser, composer-search-row-geometry, model-menu-submenu-up, new-tab-menu-over-suggestions, new-tab-picker-clip, pane-menus-styled, retry-model-menu, reasoning-menu-check and composer-footer-harness passed locally with CMUX_BROWSER_TESTS=1 before the base stopped Playwright on Macs. composer-chip-press, composer-menu-dismiss, composer-type-scale, menu-pointer-close-focus, model-menu-update-footer, model-pick-prompt-focus and model-picker-round-rail run in CI only.
  • src/ui/DrivenList.test.tsx (new): roles and names, Tab only on tabbable rows, a press keeps the field's focus, Return and Space pick.
  • QuickModelColumns.test.tsx also: a re-render never takes the keyboard back from a control outside the menu (fails with the old inline ref).
  • Updated for the columns and the carried level: classic-new-tab-pickers, agent-pane-no-capsules (the avatar, its badge and the Fast track are round on purpose), and the browser tests agent-pane-harness-catalog, agent-pane-model-sticks, reasoning-own-control, model-search.browser.
  • Gallery health: invariant-baseline.json lists the "More models" row in the density states (they now open the list menu) and the menu width of auth-health#expired (now the columns), as its sibling states do. The New Tab composer-open play waits for either menu.
  • Removed by design: the effort slider case and the "no number keys while filtering" case in model-menu-compact.
  • Gallery: the plays of agent-pane.model-picker, agent-pane.new-tab, agent-pane.composer and agent-pane.auth-health open the columns menu; agent-pane.model-menu-density keeps the list menu (harnessFixed).

Observed / Not run

  • Ran: bun run typecheck, scripts/web-lint.sh, prepush-gate.py, every test file that touches the model menu (each on its own), and the browser tests above. The non-browser tests all pass except agent-pane-no-capsules (1 case), which fails the same way on the base. Two read-only reviews: no P0 or P1; the P2s are fixed.
  • Dogfooded in a tagged build on this Mac: New Tab and a chat, Claude, Codex and OpenCode tabs, the account card, Starred, a missing harness.
  • Not run: a What's New clip (it needs the capture fleet); the signed-out card in a real signed-out harness (covered by signed-out-rail only); QuickModelMenu's own layouts against the columns in the full gallery sweep.
  • Known: a click on each of two models of another harness starts one harness switch per click. A level or Fast clicked while a model switch is in flight waits for the model, then applies (the newest one wins). The account card sits 4 px in from the avatar, not 6 px: the spacing scale.
  • CI: the cmux-next checks red (a fleet host name in HarnessStatusCard.gallery.tsx) is on the base too.

Autofix with [code]smith
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

The model button's menu now shows harness, model, effort, and Fast mode side by side in columns, with the account as an avatar in the corner. Previously each was picked one at a time through submenus.

Behavior

  • Picking a model shows its check at once and lands once with its level and Fast when the menu closes: one harness switch, not one per click; a re-pick of a model still switching keeps the picked level.
  • The chip's predicted model counts as running until the session reports one, and the menu stays where it opened so a renamed chip never moves it.
  • The chat's auth readiness shows under the search: the auth note, sign in again and check again, for every verdict, on every tab and while filtering.
  • Up and Down move the highlight only; Left and Right move between columns; Return lands and closes; Escape closes the account card, then clears search, then closes.
  • Each column scrolls independently and fades the edge that has more rows.

Wiring

  • Menus with a harness rail use the new columns, built on new shared src/ui/DrivenList list parts; started chats with no rail and the Chief fall back to the unchanged list menu.
  • 9 new localized strings across all 21 languages; 4 cut from existing translations.

Written for commit 99fa239. Summary will update on new commits.

View guided diff Turn on auto-fix

@lucasr1b
lucasr1b temporarily deployed to ci-routing-agent November 3, 2026 03:59 — with GitHub Actions Inactive
@lucasr1b lucasr1b added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Nov 3, 2026
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 99fa239: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr32980 -f ref=next-model-profile -f platform=macos -f backend_mode=local

Gallery before/after for 99fa239: 16 states rendered, 8 images differ, 3394 more touched states not rendered. Images are in the run's artifact, not on this public PR; the independent review of this head reads them on its own, so the PR needs no hand-made screenshots of these states.

gh run download 41703743983 -R manaflow-ai/cmux -n gallery-advisory-32980-99fa239cd9f83348313f5c3d58eb167f2acc6233 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.auth-health/signed-in Apple System Colors Light changed 6.87% own AuthHealth.gallery.ts
agent-pane.auth-health/signed-in Apple System Colors changed 6.46% own AuthHealth.gallery.ts
agent-pane.auth-health/signed-out Apple System Colors Light changed 5.6% own AuthHealth.gallery.ts
agent-pane.auth-health/signed-out Apple System Colors changed 4.34% own AuthHealth.gallery.ts
agent-pane.auth-health/expired Apple System Colors Light changed 9.37% own AuthHealth.gallery.ts
agent-pane.auth-health/expired Apple System Colors changed 7.99% own AuthHealth.gallery.ts
agent-pane.auth-health/unknown Apple System Colors Light changed 6.87% own AuthHealth.gallery.ts
agent-pane.auth-health/unknown Apple System Colors changed 6.46% own AuthHealth.gallery.ts
agent-pane.composer/font-size-chat-14 Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-chat-14 Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-new-chat-14 Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-new-chat-14 Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-new-tab-14 Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-new-tab-14 Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-chat-21 Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-chat-21 Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-new-chat-21 Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-new-chat-21 Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-new-tab-21 Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-new-tab-21 Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-chat-28 Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-chat-28 Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-new-chat-28 Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer/font-size-new-chat-28 Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/closed Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/closed Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/pill-rail Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/pill-rail Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-menu Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-menu Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-more Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-more Apple System Colors unchanged 0% own ComposerPickers.tsx

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

Yours to fix: composer-menu-dismiss.test.ts (a file this PR changes), composer-menu-dismiss.test.ts (a file this PR changes), composer-menu-dismiss.test.ts (a file this PR changes) and 2 more. Also failing here, not on main: check-icon-scale.test.ts. Seen on other PRs too (likely flaky): accent-glass-invariants-3.test.ts, accent-glass-invariants-5.test.ts, render.test.tsx and 4 more. This PR merged before its CI finished: fix forward on main.

CI failed on 99fa239cd9 (run 41703684210 attempt 2): 4 code, 1 unknown.

Job Verdict Why
web / react-apps-base-check (2) code a web test failed
web / react-apps-base-check (4) code a web test failed
web / react-apps-base-check (5) code a web test failed
web / react-apps-base-check (7) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • seen on other PRs accent-glass-invariants-3.test.ts (unnamed): failed (job)
  • new in this PR check-icon-scale.test.ts the webviews draw no off-scale icon beyond the recorded baseline: failed (job)
  • seen on other PRs accent-glass-invariants-5.test.ts (unnamed): failed (job)
  • seen on other PRs render.test.tsx no rule declares a background other than transparent or the two interaction tokens: failed (job)
  • yours composer-menu-dismiss.test.ts webkit: agent-pane.new-tab reasoning-chip at 760 px: a press outside an open menu only closes it; no...: failed (job)
  • yours composer-menu-dismiss.test.ts webkit: agent-pane.new-tab reasoning-chip at 300 px: with a menu open, one press on another chip ope...: failed (job)
  • yours composer-menu-dismiss.test.ts webkit: agent-pane.new-tab reasoning-chip at 300 px: Escape closes a menu and puts the keyboard back...: failed (job)
  • seen on other PRs session-info-overlay-toggle.test.ts chromium: in a narrow pane, a busy Session Info pushes the chat and never covers the composer: failed (job)
  • seen on other PRs session-info-overlay-toggle.test.ts chromium: in a narrow pane, a busy Session Info pushes the chat and never covers the composer (dock ...: failed (job)
  • seen on other PRs session-info-overlay-toggle.test.ts webkit: in a narrow pane, a busy Session Info pushes the chat and never covers the composer: failed (job)
  • ... 3 more in the job logs
Matched log lines
web / react-apps-base-check (2): (fail) (unnamed) [100261.49ms]
web / react-apps-base-check (4): (fail) (unnamed) [100395.61ms]
web / react-apps-base-check (5): (fail) no rule declares a background other than transparent or the two interaction tokens [1.22ms]
web / react-apps-base-check (7): (fail) chromium: New Tab composer: a compact menu reopened before a pick's focus lands still closes to the model button [31625.04ms]

Not re-run automatically: web / react-apps-base-check (2), web / react-apps-base-check (4), web / react-apps-base-check (5), web / react-apps-base-check (7), web / react-apps-check are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: green on the base 4447d97; do not merge until green; see lane-rules
red: web / Web status; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules
red: web / react-apps-base-check (2); NEW webview test reds: test/check-icon-scale.test.ts > the webviews draw no off-scale icon beyond the recorded baseline; do not merge until green; see lane-rules
red: web / react-apps-base-check (4); NEW webview test reds: test/accent-glass-invariants-5.test.ts > (unnamed); test/turn-fork.test.ts; test/composer-location-away.test.ts > (unnamed) (+2 more); do not merge until green; see lane-rules
red: web / react-apps-base-check (5); NEW webview test reds: test/composer-menu-dismiss.test.ts > webkit: agent-pane.composer new-chat-reasoning at 760 px: with a menu open, one press on another chip opens that one; test/composer-menu-dismiss.test.ts > chromium: agent-pane.new-tab reasoning-chip at 760 px: with a menu open, one press on another chip opens that one; test/composer-menu-dismiss.test.ts > chromium: agent-pane.composer new-chat-reasoning at 760 px: with a menu open, one press on another chip opens that one; do not merge until green; see lane-rules
red: web / react-apps-base-check (7); NEW webview test reds: test/model-pick-prompt-focus.test.ts > webkit: New Tab composer: a compact menu reopened before a pick's focus lands still closes to the model button; test/model-pick-prompt-focus.test.ts > chromium: New Tab composer: a compact menu reopened before a pick's focus lands still closes to the model button; do not merge until green; see lane-rules
red: web / react-apps-check; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules

Shipped in:

@blacksmith-sh

blacksmith-sh Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Found 10 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp3mifjuoi/summary-missing.json (live):/summary-missing.json (live): View Logs
/tmp/tmpz42p0_0y/summary-fail.json (live):/summary-fail.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
test_skipped_steps_read_no_unkeyed_decide_output (main.Workflow.test_skipped_steps_
read_no_unkeyed_decide_output) (step='- name: Build nightly app (Release)', output='not
ary_probe')/
test_skipped_steps_read_no_unkeyed_decide_output (main.Workflow.test_skipped_steps_
read_no_unkeyed_decide_output) (step='- name: Build nightly app (Release)', output='not
ary_probe')
View Logs
test_skipped_steps_read_no_unkeyed_decide_output (main.Workflow.test_skipped_steps_
read_no_unkeyed_decide_output) (step='- name: Build nightly app (Release)', output='not
ary_probe')/
test_skipped_steps_read_no_unkeyed_decide_output (main.Workflow.test_skipped_steps_
read_no_unkeyed_decide_output) (step='- name: Build nightly app (Release)', output='not
ary_probe')
View Logs
test_skipped_steps_read_no_unkeyed_decide_output (main.Workflow.test_skipped_steps_
read_no_unkeyed_decide_output) (step='- name: Build nightly app (Release)', output='pro
file_channel')/
test_skipped_steps_read_no_unkeyed_decide_output (main.Workflow.test_skipped_steps_
read_no_unkeyed_decide_output) (step='- name: Build nightly app (Release)', output='pro
file_channel')
View Logs
test_skipped_steps_read_no_unkeyed_decide_output (main.Workflow.test_skipped_steps_
read_no_unkeyed_decide_output) (step='- name: Build nightly app (Release)', output='pro
file_channel')/
test_skipped_steps_read_no_unkeyed_decide_output (main.Workflow.test_skipped_steps_
read_no_unkeyed_decide_output) (step='- name: Build nightly app (Release)', output='pro
file_channel')
View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

ultracode carries as extra high; a level picked here carries to the next model. the chip focus waits a task where a page has no frames.
…profile

# Conflicts:
#	webviews/src/agent-session/acpmux/ComposerPickers.tsx
a quiet row packed to its end lines the menu up with the chip's end; the effort column has a fixed width. a reopen keeps the keyboard in the search field.
a second pick of a model still on its way keeps its level; fast turns off on a model just picked; end alignment looks past the chip's own wrapper.
@lucasr1b
lucasr1b temporarily deployed to ci-routing-agent November 3, 2026 08:14 — with GitHub Actions Inactive
@lucasr1b lucasr1b added the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Nov 3, 2026

Copy link
Copy Markdown
Collaborator

Independent review (HQ #6236 / brief 20) — P2: columns menu drops selected-target auth evidence

Scope: read-only source review of this PR at exact head 9fc43d2c331f80a2af95a65d9aa52217f7e21e32 against feat-cmux-next; I did not run a rendered test, Swift build, real provider login, or live Cloud/SSH session. Owner is already working here, so this is a review finding, not a competing branch.

Reproducer / observable contract break

The preceding compact menu preserved an always-visible selected-target auth note, recovery copy, and Check again action, including during model search (QuickModelMenu.tsx:1226–1243); this was deliberately fixed and red/green-tested in merged #31689.

The replacement QuickModelColumns receives the same menu.auth from ModelPicker.tsx:1289–1328, but it never renders authText or authLoginText. Its only targeted predicate is signedOut = ... canSessionLogin(auth.verdict) at :671–713. The account card offers a generic Sign in to {harness}, with Check again only inside that card and only when signedOut (:784–866). Its inline Sign In / Install rows are also hidden while searching (:1191–1232).

For a selected, installed harness whose global health is Unknown (so owner.note is absent), these deterministic source branches follow:

Selected-target verdict First-send behavior (authBlocksSend) Previous compact picker New columns picker
expired, local terminal login Blocked Expiry detail; Sign in again; Check again, even during search Generic Not signed in only via avatar card; Sign in to…; expiry detail gone
signedOut from failed turn, local login Blocked Failed/signed-out detail; Sign in again Generic Sign in to…, selected-turn evidence gone
routeAuthNeeded, login.kind=route Blocked Account · Sign in again; Check again Avatar appears neutral; no auth note, sign-in or recheck action
Remote signedOut, login host on a peer Blocked Remote/login information and Check again Avatar appears neutral; no auth note or recheck
peerUnreachable / routeUnreachable Send remains allowed to attempt (unchanged) Specific unreachable route/host and Check again No explanation in the menu; outer chip can still say “Unavailable”
unknown Allowed to attempt No invented refusal Correctly no invented refusal
Uninstalled harness Choice disabled Install Install row remains (separate from auth evidence)

Strongest false-ready case: set a selected route to {state:"routeAuthNeeded", source:"routeProbe", host:null, login:{kind:"route",routeId:"team-route"}} with a healthy/unknown global harness row. authBlocksSend is true, but canSessionLogin is false (it deliberately requires a local terminal login). The columns show the ordinary account avatar with no failure explanation, and the subsequent first-send is refused. Switching the preflight to expired with the already checked-in auth-health gallery fixture demonstrates the misleading generic copy. Search opus: unlike #31689, the menu has no auth notice to keep visible.

The full picker still uses authText / authLoginText (ModelPicker.tsx:1541–1555), and the closed chip still shows authChipText. This is a regression confined to the new railed compact menu, not a claim that every surface lost the verdict.

Small fix / proof requested on this PR

Render one selected-chat readiness row under the search field (outside the filtered model list and independently of the browsed harness tab), using the existing authText(auth.verdict), authLoginText, canSessionLogin, auth.onLogin and auth.onRefresh. Keep the account avatar for identity and account switching, instead of using that avatar's generic signed-out heuristic as the only readiness indicator. For route/peer failures without a locally actionable login, show the typed explanation and Check again; preserve the existing safety boundary for remote actions. Keep unknown nonblocking and avoid attributing the currently selected chat's auth to a different harness merely being browsed.

Please add mounted rendered regressions for expired (existing gallery fixture), signedOut from a turn, routeAuthNeeded with a route-only login, remote signedOut, peerUnreachable, unknown, and uninstalled harness; verify text and actions both before and after entering a model search. The current QuickModelColumns.test.tsx fixture sets no menu.auth. The auth-health gallery test constructs a stand-in HTML snippet for one signed-out play; it does not assert the mounted columns menu renders the expired/route-state explanation.

Evidence level: exact-head source inspection and executed transcription of the branch predicates (7 synthetic cases); no mounted UI green/red claim. #31689, #31703, #31736, and #31694 have already closed adjacent pre-send bugs. Please keep this repair in the current owner PR to avoid a parallel picker implementation.

the search field takes focus only as it mounts; a star's hover leaves its row as it was; tests follow the columns and the carried level.
…mns use it

listbox, tablist, their rows and an inline card in src/ui/, so the columns set no popup role by hand (#33701).
@lucasr1b
lucasr1b temporarily deployed to ci-routing-agent November 3, 2026 19:01 — with GitHub Actions Inactive
the old menu's auth note, sign in again and check again (#31689), for every verdict, on every tab and during a search; review by leo.
@lucasr1b
lucasr1b temporarily deployed to ci-routing-agent November 3, 2026 19:29 — with GitHub Actions Inactive
@lucasr1b
lucasr1b merged commit fabc4a1 into feat-cmux-next Nov 3, 2026
181 of 195 checks passed
@lucasr1b
lucasr1b deleted the next-model-profile branch November 3, 2026 20:25
teamleaderleo added a commit that referenced this pull request Nov 4, 2026
Carries #32829's consumer onto the current base: QuickModelMenu describes
itself over the native popup protocol wherever the page has a native host, in
the placement Settings chose. Since #32980 it draws only as the columns menu's
fallback (no rail, or a harness that picks its own model), so that fallback is
native too. Conflict with base: kept base's scroll-edge import and dropped the
reset of the removed `scrolled` state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-627034dbf10a04318c5c
teamleaderleo added a commit that referenced this pull request Nov 4, 2026
QuickModelColumns (#32980: harness rail, models, then the shown model's effort,
providers and Fast, with the account avatar in the search row) describes itself
over the native popup protocol's columns layout wherever the page has a native
host; the browser gallery keeps the web popover. Every pick goes through the
web columns' own paths: a click lands at once and keeps the menu open, Return
(submit) runs the highlighted row and closes, the keyboard's highlight on a
model shows its settings and on a rail tab shows that tab, and a digit on the
empty field picks its row. The account card opens beside the menu.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-627034dbf10a04318c5c
teamleaderleo added a commit that referenced this pull request Nov 4, 2026
…+ draws at 12px (#34494)

* base red: Settings' progress fill is not a surface; the model menu's + draws at 12px

render.test.tsx's 'no rule declares a background other than transparent or the two interaction
tokens' failed on .app-update-progress's value fill (var(--text)), added by #33176: a progress
bar's value is not a container, so the test now exempts only the progress-value pseudo-elements.

check-icon-scale failed on QuickModelColumns.tsx's PlusIcon at 11px (#32980, which landed an hour
after the check, #33595). 12 is on the scale, matches its viewBox and the CheckIcon beside it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-dfc0ecf416bf21757d6b

* render.test.tsx: formatter layout

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-dfc0ecf416bf21757d6b

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Nov 4, 2026
…ard at once

model-pick-prompt-focus's 'a compact menu reopened before a pick's focus lands still closes to the
model button' (New Tab) timed out since #32980: a pick closes the columns menu, Base UI keeps the
closed popup mounted until a frame, and a reopen then (⌘⌃M in the fade) reuses the same search
field, so its mount ref never runs again and focus waited on Base UI's frame-late initialFocus.
The field now also takes the keyboard in a layout effect as the menu opens.

composer-menu-dismiss's settle now reports the open chips, the focus and the popups when it does
not settle, instead of a bare timeout, for the columns-menu switch red in the same file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-dfc0ecf416bf21757d6b
teamleaderleo added a commit that referenced this pull request Nov 4, 2026
…ard at once (#34513)

* base red: the model columns menu reopened in its fade takes the keyboard at once

model-pick-prompt-focus's 'a compact menu reopened before a pick's focus lands still closes to the
model button' (New Tab) timed out since #32980: a pick closes the columns menu, Base UI keeps the
closed popup mounted until a frame, and a reopen then (⌘⌃M in the fade) reuses the same search
field, so its mount ref never runs again and focus waited on Base UI's frame-late initialFocus.
The field now also takes the keyboard in a layout effect as the menu opens.

composer-menu-dismiss's settle now reports the open chips, the focus and the popups when it does
not settle, instead of a bare timeout, for the columns-menu switch red in the same file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-dfc0ecf416bf21757d6b

* composer-menu-dismiss: settle still fails when unsettled, after saying what it saw

Review follow-up (router-review SHIP at 70b144e): swallowing the timeout let a stale or
input-intercepting popup pass the expect, which reads only aria-expanded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-dfc0ecf416bf21757d6b

* ci: re-run the webview verdict (new-tab-live-resize webkit passed then failed in the same job, run 41767390605)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-dfc0ecf416bf21757d6b

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator

Awareness note from an agent lane that does not own this PR; it is not a review or a request to take the PR over.


For awareness: #34749 fixes the composer Folder → Model chip switch regression seen after the columns picker landed here. At 760 px, a single Model press could leave both the Folder and Model popovers open. It preserves the columns design and closes both location-picker implementations within the same composer before Model opens. The existing composer-menu-dismiss.test.ts covers the interaction in Chromium and WebKit.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Awareness note from an agent lane that does not own this PR; it is not a review or a request to take the PR over.


Awareness: #34749 fixes the columns model trigger lifecycle regression so Folder-to-Model chip switches close the sibling popover at 760 px. PR: #34749

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 99fa239c Deployed Nov 3, 2026 by lucasr1b via cmux-tui tree preflight #107398
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants