cmux NEXT composer: queued rows show Steer, a trash can and ⋯, as ChatGPT and Codex do

Merged
TE
15d ago
+1339-94

Leo, 2026-10-21, on the queued rows above the composer: "IS THIS REALLY THE RIGHT ORDER? IS THIS LOGICAL? I THOUGHT WE HAD A TRASH CAN" (with ChatGPT's queued rows: "THIS IS WHAT CHATGPT HAS").

Before: each queued row ended in a pencil (Edit), an X (Remove) and an ↑ (Send now).
Now: each row ends the way ChatGPT and Codex draw it: ↪ Steer (a glyph plus the word), a trash can (Delete), and ⋯. All three are plain glyphs that show the soft hover pill only, with no discs or fills.

  • Steer takes the same path the ↑ used: _acpmux/queue_edit send_now. It steers the prompt into the running turn, and for an agent that cannot steer it runs next. It works only by click, so no key can send it.
  • Delete withdraws the prompt (chat.queue.remove). The row's Delete/Backspace key does the same, as before.
  • ⋯ opens a menu in the composer menus' glass look (acpmux-quick-menu). It has:
    • Edit message: the existing inline edit. Return on the row still opens it.
    • Open in side chat: the app already has a clean path for this (/btw: chat.btw then chat.sideChat), so the item takes the prompt out of the queue and asks it in a new side chat. It shows only where /btw works (behind the side-sessions gate, not in a side chat itself, not in the Quick Composer) and only for a prompt with no images, because /btw carries text only. If the side chat can't start, its text goes back into the prompt.
    • Turn off queueing: no such setting existed (the returnSteers flag is derived per turn, not a setting). I added queueing.ts, which stores the choice in the page's local storage for every chat. When it is off, ⌘Return and Send steer too, so nothing new waits; an agent that cannot steer still runs the prompt after the turn. The item then reads Turn on queueing, and while queueing is off the composer row's right-click offers it too. It is not a cmux.json key, because a new setting default needs a defaults call (defaults_guard).
  • The keyboard is unchanged: ↑/↓, Return to edit, ⌥↑/⌥↓, Delete, Esc; ⌘↩ on a row still does nothing. The row's right-click menu now names its items Steer, Edit message, Move up/down and Delete.
  • Icons: a new composer.steer (↪) in the icon pack at the composer's 1.5 stroke (design/icons/source plus regenerated pack outputs). The trash can is the pack's existing action.delete, and ⋯ is action.more.
  • The queued row's inline editor loses its own 1.5px ring and gets a hairline edge.
  • Strings: 7 new keys in the agent pane catalog (all 21 locales; non-English values needs_review, as the catalog does).

Changelog

  • Changed: Queued messages show Steer, a trash can and a ⋯ menu (Edit message, Open in side chat, Turn off queueing), as in ChatGPT and Codex.

Regression test

cd webviews && bun test src/agent-session/acpmux/ComposerQueue.test.tsx

  • Red on base: this head's test file run against the base component (1355c9ccbce, plus queueing.ts so it loads) on huge-blue: 10 pass, 5 fail (Steer/Delete/More order, Steer's steer path, the ⋯ menu's items, Turn off queueing, Open in side chat).
  • Green on head (f57fc44e292): bun test src/agent-session/acpmux/ComposerQueue.test.tsx test/queue-row-actions.test.tsx test/hideable-chrome.test.tsx test/new-tab-dictation.test.tsx gives 29 pass, 0 fail on huge-blue.

Observed / Not run

  • Observed: the icon pack rebuilt with scripts/icons/build_pack.py; the catalog parses and passes check-xcstrings-keys.py.
  • Observed: bun run check in webviews/ passes on huge-blue at f57fc44e292 (format, lint, types, catalog keys, text-focus rings). The only warning, importCards.css system blue, is not this PR's.
  • Observed: before and after stills of composer/queued from the gallery compare builds (dark): pencil, X, ↑ before; ↪ Steer, trash, ⋯ after, plus the open ⋯ menu.
  • Not run: the browser (Playwright) tests agent-pane-queue-steer and agent-pane-queue-collapse. They now click Steer by name and run in CI.
  • New gallery states: composer/queued-actions and composer/queued-actions-menu (the open ⋯ menu).

No capture: webview-only change; gallery compare https://cmux-lawrences-mac-mini.tail137216.ts.net:18796/compare/composer-look-queue-actions/?entry=agent-pane.composer The Swift diff is only the generated icon pack members (IconName+Members.swift, IconName+Catalog.swift).

Agent session: cosmic-gray

🤖 Generated with Claude Code