fix(picker): one row per model; effort only on the running and hovered rows

Closed
TE
6d ago
+145-27

HOLD: parked for @lucasr1b's picker polish; not to land as it stands (horizontal effort words per row, model names cut to "GPT-6.1…").

Direction for the model picker (Leo, 2026-10-29)

  • The ask: "and help get this fixed and spruced up if lucas doesn't already have a fix"
  • On the slider and top-tab variants built for it: "those were pretty shit ... anyways we dont have to be TOO concerned about the situation... we prev had a t3 code (but with effort as the thing you can select into)/claude code hybrid that was alright ... i think that + allowing the thing to go on the left as a toglge is basically fine for the model picker specifically"
  • "Yes, tabs on top"
  • "anyways we dont have to worry THAT much about it yet per se, lucas can handle the polish and whatnot"
  • "like MAYBE don't hold if it's excellent... if it's not guaranteed excellent then whatever we have lots of other work to focus on"

What that means for the build:

  • Base: the T3 Code / Claude Code hybrid we had (T3 rail picker: #18342, #18346; Claude Code's compact menu since #22005). Leo's T3 Code reference shows: in the composer, a model button ("GPT-6.1-Sol ▾"), then a separate effort button ("Low ▾"), then the permission button. The menu has a "Search models..." field on top and a narrow icon rail (a star for favourites, then one icon per harness). Each model is one row: its name, the harness as a muted subtitle, a ⌘1–⌘4 shortcut and a star toggle. A "Legacy models · 4 models ›" row drills into older models.
  • Effort is something you select into, never a row of effort words or a slider on every model: drill in from the model row (› or Right arrow) to pick that model's level, and/or the separate effort control. Today's base has #26521's inline effort on every row (inlineEffort in ModelPicker.tsx); this PR only trims it to the running and hovered rows.
  • Harness placement: top by default, left as a toggle: the existing agent.harnessPlacement setting (Left rail / Top strip / Compact), exposed as a normal setting instead of Debug only.

Related: #27889 (harness symbols on top, effort in the menu; open), #27265 (Prototype look with a Model panel), #27578 (New Tab effort lands with its model), #27692 (every harness its own tab), #27140 (native popup menus; rewrites QuickModelMenu.tsx). Spec: leo-workspace design/model-picker.md (teamleaderleo/leo-workspace#1591).

Reference, not for landing: branch lane/picker-slider-reference has the rejected slider R&D on top of this PR, with two reusable pieces: a pixel-exact compact EffortTrack (a layout test asserts the thumb centre equals the stop centre within 0.5px at every level) and webviews/test/support/effortSlider.ts; plus the one-line flip of agent.harnessPlacement to top.

What this PR does (as it stands)

  • QuickModelMenu.tsx / modelPicker.css: each model is one row; the inline effort levels render only for the running and hovered rows, at the row's trailing edge.
  • InlineModelEffort.gallery.tsx: Codex gallery variants (nine models, up to six levels).
  • test/quick-model-menu-layout.test.ts: one line per model.

Agent session: agent session

🤖 Generated with Claude Code