cmux NEXT composer: model names, an inline box, one ↵ steer control, room at the bottom
Leo's nightly composer showed claude-opus-5-5 ⌄, Reasoning ⌄, a bolt and a ring with no explanation, a control row of its own under the prompt with a text "Steer" button, and a footer and transcript sitting on the window's bottom edge.
What changes
- Model and effort names. When a chat's profile lists its models by id alone (a second Claude account such as
claude-sr2), the footer now names the catalog's short name (Opus 5.5) instead of the raw id. When a profile id doesn't map to its family, the running model's catalog row is found from any harness, so the agent's own level resolves to its value (Medium) instead of the word "Reasoning". If the id matches no catalog row at all, the name is read off the id (claude-opus-5-5→ Opus 5.5). - Tooltips. The context ring now has a tooltip,
Context: 42% used (84K of 200K tokens), or "Context usage shows after the first reply" while it is inert. The bolt already had one ("Speed: Standard. Click for Fast."). The permission mode was already on the left of the footer ("Bypass permissions" / "Full access"). - Inline box (Claude desktop layout). The box no longer has a control row of its own: + sits left of the prompt, and the mic and Send/Stop sit right of it, on the prompt's last line. A one-line box is 48 px tall, the same height as the text plus insets, with no dead strip.
- One steer control. While a turn runs and text is typed, the text "Steer" button plus a separate Send are replaced by a single icon button, a return glyph (↵). Its tooltip is "Send now: steer the running turn (⌘Return)", or for an agent that can't steer, "Stop this turn and send now (⌘Return)". Stop stays for the whole turn at the row's end. Return still queues, which matches the working placeholder "↵ to queue, ⌘↵ to steer". ↵ comes in at the cluster's leading edge, so the mic and Stop don't move (hq#1957).
- Bottom room. The footer row has 10 px more space under it. The transcript's view now ends 8 px above the floating composer (
dockLift), so its last row and its scrollbar end above the composer instead of under it.
Not in this PR: the "Session limit reached" card and the "Get more usage" composer banner. Neither string exists in webviews/, Sources/, Packages/ or cmux-tui/ on feat-cmux-next, so I couldn't find which surface draws them. I need the screenshot or the build where they show up.
a2's "Fix chat composer buttons" turned out to be #22591 (Home emoji and + buttons, merged), so there's no overlap.
Tests
- Commit 1 is red: the gallery play
agent-pane.composer/footer-profile-ids(the footer names Opus 5.5 and Medium, never the id, and the ring has its tooltip). Commit 2 fixes it. working-steerplay: one icon-only ↵ control labelled "Steer now", with Stop last.- Updated for the new layout:
composer-row-rhythm(measures the box itself; ↵, mic and Stop draw one gap apart; Stop sits as far off the box's bottom as off its side),composer-turn-cycle(typing mid-turn moves neither the mic nor Stop),agent-pane-bottom-stack(the transcript ends 8 px above the stack). - Localization: three new keys in
acpmux/Localizable.xcstrings(composer.steerNowTooltip,context.ringTooltip,context.ringTooltipEmpty), translated for all 21 locales the catalog carries. No other user-facing strings changed. - Locally:
vp checktypecheck passes. Browser lanes run on CI; this Mac doesn't run them.
Visual proof: before and after images are below in a comment (gallery, 760 px, dark).
🤖 Generated with Claude Code
Agent session: cosmic-gray
Summary by cubic
Polishes the NEXT composer to match Claude desktop: model and effort names resolve from the catalog instead of raw ids, the box becomes inline with controls on the prompt's last line, a single ↵ button replaces "Steer" plus Send during a turn, and clicking outside the composer or pressing Escape now actually lets go of the keyboard.
Changes
- When a session lists models by id only, the footer shows the catalog's short name (Opus 5.5) and the resolved effort (Medium); the context ring redraws as a 14 px arc and gains a tooltip with its reading or why it's inert.
- The box loses its control row: + sits left of the prompt and the mic, Send, or Stop to its right, all on the prompt's last line. Dimensions match a 2x Claude desktop capture: a 44 px one-line box with an 11 px radius, + drawn 16 px in, Send's disc 8 px from the side and bottom; the strip and queue take the box's corners.
- In an idle chat with no draft there is no Send, only the mic; Send comes in with the first letter.
- While a turn runs, a typed prompt shows one icon-only ↵ control that sends now, steering or interrupting an agent that can't steer; Stop sits left of the mic and Return still queues. When ↵ can't take the draft (an agent that cannot steer, or attachments only), Send comes back after the mic as the queue button.
- The idle placeholder now reads "Type / for commands", and the model and effort draw as one muted label under the soft mode chip.
- The footer bolt shows whenever a speed tier is offered, since a model with one effort level has no other way to turn fast mode on.
- Footer gains 10 px bottom margin.
- A click outside the composer or Escape in an idle prompt now blurs it; the activation's focusContent used to re-focus it right after. Typed keys still reach the composer, and keyboard-based activation still claims it.
- Three new tooltips added and translated across all 21 locales.