Repository navigation
cmux NEXT composer: Return steers a running turn, ⌘Return queues - #22741
Conversation
…n queues Red on base: the composer queues on Return and steers on ⌘Return, and the placeholder says "↵ to queue, ⌘↵ to steer". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bc7-bd7c-70a2-b2fa-5da6fc16b908&host=cosmic-gray
Leo: steer on by default, as in Claude Code desktop. For an agent that steers
(every claude-stdio chat), Return mid-turn goes into the running turn: the agent
reads it when its current step ends, and nothing is cancelled. ⌘Return queues it
for after the turn. The Quick Composer and an attachments-only prompt steer on
Return too. The placeholder says "↵ steer · ⌘↵ queue" ("Steer this turn…" in
the Quick Composer), the Send button's tooltip names ⌘Return for queueing, and the
steer control's names Return. Agents that cannot steer keep Return queueing and
⌘Return interrupting. 21 locales.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bc7-bd7c-70a2-b2fa-5da6fc16b908&host=cosmic-gray
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Probably yours: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: web / Web status; base red: the same failure on the base ff8d849; does not block Tour of |
Leo: no Stop & send anywhere. Exactly Claude Code desktop's two keys: Return steers (read at the next step, no cancel), ⌘Return queues. Only Stop and Esc stop a turn. - A steer no longer carries _meta.acpmux.interrupt, so a chat whose steering reads false (an adopted session) queues it instead of cancelling the turn. - An agent that cannot steer queues on Return and ⌘Return, shows no Interrupt control, and its placeholder says "Queue a follow-up". - ⌘Return queues an attachments-only prompt too, so it gets the full hint. - The interrupt strings go from the catalog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bc7-bd7c-70a2-b2fa-5da6fc16b908&host=cosmic-gray
…nds, never adds a line Red: Leo's dictated prompt got a new line on Return (agent working, three queued). The 229 Return reaches no key handler and WebKit inserts the paragraph. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bc7-bd7c-70a2-b2fa-5da6fc16b908&host=cosmic-gray
…od passes it on Leo (d5829ff): a dictated prompt, the agent working, three queued; Return inserted a new line instead of sending. macOS Dictation and IMEs hand the Return that ends their text over as keyCode 229, which every key handler (the composer's, ProseMirror's) leaves to the input method, and WebKit then inserts the paragraph. MarkdownField now takes that paragraph input (onReturnInput) instead of inserting it, and the composer runs Return on it: send or steer, or pick the open menu's command. Shift-Return's line comes from the keymap and is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bc7-bd7c-70a2-b2fa-5da6fc16b908&host=cosmic-gray
|
Bead |
…e again (react-apps-check red) react-apps-check is red on every feat-cmux-next push since #22741 and #22667 landed together, and since #22636: - #22741 draws the ↵ steer control only for an agent that reports acpmux `steering`; the composer-row and turn-cycle gallery fixtures never set it, so composer-row-rhythm and composer-turn-cycle wait 30 s for .acpmux-steer-now and time the file out. Both fixtures are Claude Code chats, which steer. - With ↵ drawn in #22667's plain footer, Stop follows it and both add an inset: steer→Stop 16 px against Stop→mic 10 px. ↵ drops its trailing inset when Stop follows it, so the three draw one gap apart. - #22636 removed the Background task note's "Show output" tooltip (tooltip-rules); the test still read it. The click test stays. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c2c-330d-7e83-8d27-d0125af4e8a9&host=huge-blue
…e again (react-apps-check red) (#22833) react-apps-check is red on every feat-cmux-next push since #22741 and #22667 landed together, and since #22636: - #22741 draws the ↵ steer control only for an agent that reports acpmux `steering`; the composer-row and turn-cycle gallery fixtures never set it, so composer-row-rhythm and composer-turn-cycle wait 30 s for .acpmux-steer-now and time the file out. Both fixtures are Claude Code chats, which steer. - With ↵ drawn in #22667's plain footer, Stop follows it and both add an inset: steer→Stop 16 px against Stop→mic 10 px. ↵ drops its trailing inset when Stop follows it, so the three draw one gap apart. - #22636 removed the Background task note's "Show output" tooltip (tooltip-rules); the test still read it. The click test stays. Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c2c-330d-7e83-8d27-d0125af4e8a9&host=huge-blue Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
Shipped in:
|
|
Shipped in:
|
… never adds a line macOS Dictation, like an input method, passes Return on as keyCode 229 with key "Enter". The composer leaves every 229 key to the input method, so ProseMirror's keymap read it as Enter and split the paragraph; the keydown was prevented, so the paragraph input #22741 turns into Return never came. The field now keeps that key from the keymap: the Return that commits a composition stays the input method's, and any later one is Return. Leo-ask: ask-810c88dec0 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray
…24090) * test(composer): Return after Dictation sends, never adds a line (red) Leo-ask: ask-810c88dec0 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray * test(composer): each Return test is its own chat Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray * test(composer): a passed-on Return adds no line Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray * fix(composer): a Return Dictation or an input method passes on sends, never adds a line macOS Dictation, like an input method, passes Return on as keyCode 229 with key "Enter". The composer leaves every 229 key to the input method, so ProseMirror's keymap read it as Enter and split the paragraph; the keydown was prevented, so the paragraph input #22741 turns into Return never came. The field now keeps that key from the keymap: the Return that commits a composition stays the input method's, and any later one is Return. Leo-ask: ask-810c88dec0 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray * fix(composer): one passed-on Return sends once, keydown or paragraph Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray * test(composer): Shift-Return right after an IME commit Return sends nothing (red) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray * fix(composer): the IME commit Return goes to ProseMirror, which clears its Safari guard The 229 commit Return just after compositionend was kept from ProseMirror's keydown, which is what clears its after-composition guard; a quick Shift-Return then reached the browser and its paragraph input sent the draft. Let ProseMirror take that key, treat composing.current as composing, and only take a plain (unmodified) 229 Return. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Leo asked for steer by default, as in Claude Code desktop. The installed nightly still said "↵ to queue, ⌘↵ to steer", and Return queued behind the running turn.
What changes (agent pane composer, webviews only)
summary.steering, which is every claude-stdio chat), Return while a turn runs steers: the prompt goes into the running turn, and the agent reads it when its current step ends. Nothing is cancelled. This works in the chat composer, the Quick Composer, and with only attachments staged.composer.queueLaterTooltip). The steer control now names Return.composer.placeholderSteeris reworded, andcomposer.placeholderSteerQuickandcomposer.queueLaterTooltipare new. All are translated into the catalog's 21 locales (stateneeds_review, like the strings next to them).Coordinated: composer-polish (#22667) leaves the running-turn placeholder and keys to this PR. Its
agentPane.sendWhileRunningsetting will rebase onto thereturnSteersboolean here. prompt-queue-edit (#22736) is fixing the acpmux side, so every claude-stdio session reportssteering=trueafter a daemon restart. Until that lands, an adopted chat whosesteeringis false keeps the old keys. Follow-up from this lane: the pending-steer marker, plus a "Send now" button that interrupts.Tests
bun test test/composer-queued-placeholder.test.tsx. Commit 1 (f7c32b7) is red on base: Return sentsteer: false, ⌘Return sentsteer: true, and the placeholder read "↵ to queue, ⌘↵ to steer". Commit 2 makes it green: 9 pass. It also covers non-steering agents keeping Return to queue and ⌘Return to interrupt.Behavior changes to dogfood
insertParagraph/insertLineBreak, so they would send the half-dictated prompt. If dogfood shows that, narrow thebeforeinputcatch to a Return right after a keyCode 229 keydown.Observed / Not run
vp fmtandoxlinton the changed files.cmux-next guards / defaults-snapshot, which is red the same way on feat-cmux-next runs (39529089308, 39528884211).bun run check(type check, layer checks) and the browser lanes. Leo's Mac is at load ~30, and git in the shared checkout is wedged, so I committed from a fresh clone without the pre-push hook. CI's web lint and react-apps-check cover them.Changelog
🤖 Generated with Claude Code
Agent session: cosmic-gray
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Makes steering the default while an agent's turn runs, matching Claude Code desktop. Return sends the prompt into the running turn (the agent reads it when its current step ends, nothing is cancelled), and ⌘Return queues the prompt for after the turn.
Written for commit 3e60472. Summary will update on new commits.