Picker: choose Cmux as a provider, not an agent harness

Merged
TE
8d ago
+215-81

Cmux routes no longer appear as selectable agent harnesses. The existing Account / CLI login row is now Provider and offers compatible Cmux routes alongside direct accounts. Choosing a provider changes the session route through the existing callback; real launchers such as cmux-codex remain available.

Leo’s words: “cmux should not show up in this list”; “is cmux supposed to be our model router? should not work like that ... user should pick harness, and change provider to cmux, something like that”.

Only the reported cmux-router and local-coderouter kinds are excluded as harness choices. Family eligibility, inherited route restrictions, current legacy bindings, and refused-switch feedback remain intact. This is separate from native popup migration #27140 and canonical launch-variant grouping #26969; it does not implement either change.

Integration requirement: #27140 must carry these provider/harness semantics into its native declarative rows: exclude only router kinds from the harness rail, retain real cmux-prefixed launchers, and expose compatible Cmux routes in Provider with the same session-bound route callback and refusal handling. Merge/rebase ordering must preserve this fix; replacing the web menu with native rows must not restore the old Account-only filter.

The gallery contains three treatments at new-tab.quick-model-menu: provider-submenu, provider-inline, and provider-grouped. The compact submenu is selected because it keeps the existing footer position and height. The reference is Claude desktop’s compact model picker (model-picker-open.png); existing colors and materials are retained.

Verification

  • Red: run 40795927087, snapshot 877d3f951bb0edad4697fae27aa6742c8a404394: 44 passed, 2 expected failures (router selectable; Provider row absent).

  • Green: run 40796285392, snapshot d47fbddc0e07204d7869b42f85e0164c242b0234: full bun run check passed; 67 tests passed across the catalog, compact menu, and failed-turn route tests. That original snapshot and original head 389c2bf5af4428e41c8a7547529a2f9fd8e99744 share tree 106f58e9df3feb1a53bffe9ea0cd4b5bfbf99d3f.

  • Focused command: cd webviews && bun test src/agent-session/acpmux/modelCatalog.local.test.ts test/model-menu-compact.test.tsx (green run additionally covers test/turn-error-card.test.tsx).

  • Localization reuses picker.provider, translated in all 21 shipped locales. localize-changes reports existing unrelated catalog parity debt; no catalog files change.

  • Follow-up red: run 40797028972, snapshot baeb997d1bfcbd3501d9882b92149f9b2c60ba03: 4 passed, 1 expected failure when a router and real launcher share a family.

  • Final full webview checks passed in run 40797054598; all provider/catalog regressions passed. The 67-test sweep had one failure in the existing optional reasoning-slider focus assertion (66 passed). The exact failure was the active element not yet having class acpmux-effort-range after the test’s zero-delay yield. The slider’s existing focus effect waits for an animation frame. A final-head rerun passed all 67 tests in run 40797336225, snapshot 1014ff419a8635355ba278739dcbdb5327d21287 with the same final tree. The first baseline comparison, run 40797496184, had an invalid setup because its shallow checkout lacked the base commit; its failures are discarded. The corrected bounded baseline comparison in run 40797904300 explicitly fetched and checked out feat-cmux-next commit 7bf46b579c0435d6cd103fca79190bfdad9f799f. Running that exact optional-slider test 10 times produced 2 passes and 8 failures at base line 310 with the identical activeElement assertion, expected true, received false. This confirms the prior focus failure is an existing base flake; the final-head focused sweep remains 67/67 passing. Snapshot dce0dd6d90cefb2c80e954073331d7aede0abdc7 and final head 7c12da130b23b8c1db8e3e3d979a517598fd4b91 share tree 7dcc53adbff36310ec0a075190d6ea228433178a.

  • Independent gpt-6-astra/high review: SHIP at 7c12da130b23b8c1db8e3e3d979a517598fd4b91, after fixing the shared-family representative bug found on the original head.

Observed / Not run

Behavioral red/green and complete webview checks are observed. All six light/dark gallery states rendered ready and their PNG archive transferred successfully in run 40797255970. The captured snapshot 80f5cc06a5429bf215c073edf2626d23b272e2ca has the final head’s exact tree; each PNG’s results.json names that SHA and QuickModelMenu.gallery.tsx. The compact submenu and grouped alternative fit; the inline variant consumes more height and is not the default. Exact-head independent review passed. The Gallery line below requests the standard before/after artifact, including the existing combined state. Native app capture is not claimed for this web consumer change. Risk: the row is renamed in every composer using this menu; existing gallery and browser selectors are updated with it.

Capture files

The successful capture run log contains the PNG archive between PROVIDER_CAPTURE_BEGIN and PROVIDER_CAPTURE_END; these are synthetic gallery fixtures. Relative paths inside that archive:

  • new-tab.quick-model-menu--provider-submenu--en--Apple_System_Colors--w520-chromium.png
  • new-tab.quick-model-menu--provider-submenu--en--Apple_System_Colors_Light--w520-chromium.png
  • new-tab.quick-model-menu--provider-inline--en--Apple_System_Colors--w520-chromium.png
  • new-tab.quick-model-menu--provider-inline--en--Apple_System_Colors_Light--w520-chromium.png
  • new-tab.quick-model-menu--provider-grouped--en--Apple_System_Colors--w520-chromium.png
  • new-tab.quick-model-menu--provider-grouped--en--Apple_System_Colors_Light--w520-chromium.png

Gallery: new-tab.quick-model-menu/combined, new-tab.quick-model-menu/provider-submenu, new-tab.quick-model-menu/provider-inline, new-tab.quick-model-menu/provider-grouped

Changelog

Fixed: choose Cmux as a model provider while keeping agent harness choices separate.

Agent session: agent session