cmux NEXT agent pane: Send now under a steer the agent has not read yet

Merged
TE
16d ago
+597-2

A steer waits until the agent's current step ends. Until then, its bubble now shows a faint clock and a Send now button underneath. Send now stops that step so the agent reads the message right away. The turn goes on, and only Stop ends it. Composer keys still never interrupt; Send now is the only way.

  • conversation/PendingSteer.tsx (new) renders under the bubble only while row.steer === "waiting".
  • Send now calls _acpmux/queue_edit {sessionId, promptId: <the steer's own promptId>, op: "send_now"} through the existing chat.queue.edit host action, so no new method is needed. The reply {ok, sent} comes from #22805: sent is "now" when the step stopped and "steer" when the agent can't stop a step; ok is false once the steer was read.
  • direct.ts adds one line: waiting steer rows carry steerPromptId.
  • 3 new strings (steer.pending, steer.sendNow, steer.sendNowHelp) in 21 locales, plus the gallery "steer-marks" entry, which now shows the clock and Send now.

Depends on #22805 (the hub's send_now op), merged as 16c12ff. If #22773 (deletes SteerMark) lands after this, PendingSteer stays beside ReadReceipt in MessageRow; I'll follow up if it needs moving.

Changelog

Added: Send now under a steer the agent hasn't read yet, which stops the current step so the agent reads it at once.

Test

cd webviews && bun test test/agent-pane-pending-steer.test.tsx

  • Red when the <PendingSteer> line is removed from App.tsx: no Send now button.
  • Green with it: one Send now button. A click sends _acpmux/queue_edit with {sessionId, promptId: "p-steer", op: "send_now"} and no session/cancel, and the button is gone once a new user_message arrives.

Observed / Not run

  • Observed, on this content before the push: the test going red, then green, and bun run check passing except for 2 prefer-tag-over-role warnings in UserBubble.tsx (lines 99 and 222). Those come from the base or another lane, not this PR.
  • CI on 6a618a3b: the 7 reds (release-notary, Guard status, defaults-snapshot, and react-apps-check 1-4 at "Build the web bundles": stale optchat inspector page) are the same on unrelated #22854, so base reds. The base bundle red skips the webview test step, so CI did not re-run the tests on 6a618a3b. 9ef6efc6's run showed one own red, gallery coverage asking for PendingSteer and Clock entries; 6a618a3b adds them to the composer entry's covers. Its other webview reds (background-task terminal click, long-draft wheel) touch nothing this PR changes.
  • Not run: the head was not re-checked locally after the push, because cosmic-gray now blocks local bun runs; CI covers it. Not tried end to end against a live daemon, because the running daemon lacks #22805. No gallery capture yet.

Agent session: cosmic-gray

šŸ¤– Generated with Claude Code