feat(desktop): add steer/queue follow-up messages while agent is busy#2004
Conversation
Replace the single Stop button with Steer, Queue, and an outline Stop when the agent is running. Steer sends immediately (opencode injects it mid-turn); Queue holds messages client-side and auto-sends them merged into one message once the session goes idle. Enter while busy shakes the buttons to prompt an explicit choice, and Escape arms a "hit Escape again to stop" confirmation. Queued messages show in a panel above the composer (mirroring the question panel) where each can be removed; the panel hides when empty.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
1 issue found across 5 files
Reply with feedback, questions, or to request a fix.
Fix all with cubic | Re-trigger cubic
The panel labels filtered out empty (attachment-only) drafts, so the remove action could target the wrong queued draft. Map one label per draft instead, falling back to an attachment count when there's no text. Also drop an unused i18n key.
CI test failures: pre-existing / infra, not from this PRThe
Local verification on this branch:
Fixed cubic's finding (index alignment)cubic correctly flagged that |
* feat(app): add new message list * feat(desktop): add steer/queue follow-up messages while agent is busy (#2004) * feat(desktop): add steer/queue follow-up messages while agent is busy Replace the single Stop button with Steer, Queue, and an outline Stop when the agent is running. Steer sends immediately (opencode injects it mid-turn); Queue holds messages client-side and auto-sends them merged into one message once the session goes idle. Enter while busy shakes the buttons to prompt an explicit choice, and Escape arms a "hit Escape again to stop" confirmation. Queued messages show in a panel above the composer (mirroring the question panel) where each can be removed; the panel hides when empty. * fix(desktop): keep queued-message labels index-aligned with drafts The panel labels filtered out empty (attachment-only) drafts, so the remove action could target the wrong queued draft. Map one label per draft instead, falling back to an attachment count when there's no text. Also drop an unused i18n key. --------- Co-authored-by: Source Open <gh2@mcadam.io>
Summary
While the agent is running, the composer now offers Steer, Queue, and an outline Stop instead of a single Stop button:
<system-reminder>), so the agent adjusts mid-task.session.abort), styled as an outline button.Queued messages appear in a panel above the composer (mirroring the question panel). Each entry has an X to remove it, and the panel hides when the queue is empty.
Keyboard behavior (only while busy)
Implementation notes
mergeDraftsconcatenates queued drafts (text + parts + attachments) into one send; on failure the queue is restored.Files
composer.tsx— Steer/Queue/Stop UI, shake + Escape-to-stop logic.session-surface.tsx—handleSteer/handleQueue, local queue state, idle-drain effect,mergeDrafts.queued-messages-panel.tsx— new panel listing queued messages with per-item remove.index.css—animate-shakekeyframe/utility.en.ts— new i18n keys (English is the fallback for all locales).Testing
Commands run from
apps/app:pnpm typecheck— passes.pnpm build— succeeds.I have not captured an end-to-end video/screenshots yet. To reproduce manually: start a session, send a prompt, and while the agent is streaming, type a follow-up and try Steer / Queue / Stop, plus Enter (shake) and Escape-Escape (stop).