Repository navigation
feat(native-chat): one queue header that becomes the pause row; drop the composer Resume and the send dialog - #28654
Conversation
…mposer Resume or send dialog The queued cards now sit under one header row on desktop and phone: "Queued" and the count normally, and "Paused" with the count, Clear all and Resume while the host holds the queue after a Stop. A chevron folds only the cards; the choice is local to the view and resets when the queue empties. The composer's Send no longer turns into a second Resume, and a message sent into a paused queue no longer asks "Send message?": it sends, its accepted turn lifts the pause, and the cards follow it. Clear all deletes every card through the existing per-card delete. No wire or host change.
…ip, not the queue header's
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Priority: ⬇️ Low Merge Risk: ⚪ Minimal · up to
|
| Check name | Status | Explanation | Resolution |
|---|---|---|---|
| Docstring Coverage | Docstring coverage is 41.94% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 31 functions across 26 files. (7 skipped:… | Write docstrings for the functions missing them to satisfy the coverage threshold. |

Passed checks: 4 passed
-
Check name Status Explanation Title check The title clearly and concisely describes the primary UI change: a unified queue header and removal of composer Resume and send-confirmation behavior. Description check The description follows the repository template and provides a clear user-facing summary, mechanism, rationale, linked-issue exception, visual proof, testing details, known failures, compatibility not… Linked Issues check Check skipped because no linked issues were found for this pull request. Out of Scope Changes check Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage
-
Explanation
Docstring coverage is 41.94% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 31 functions across 26 files. (7 skipped: 7 unsupported.)
- Fix all pre-merge checks with AI
✨ Finishing Touches: 💡 1
-
📝 Generate docstrings: 💡
-
- Commit to this branch
- Create a new PR
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
Comment @coderabbitai help to get the list of available commands.
…used-header # Conflicts: # src/renderer/src/components/native-chat/NativeChatComposerActions.test.tsx # src/renderer/src/i18n/en-runtime-required.json








ELI5
Messages you send while the agent works wait as cards above the chat box. When you press Stop, those cards pause. Today a paused queue shows its controls in three places at once: a row reading "Queue paused because you interrupted" with Resume, the chat box's round Send button turning into a second Resume, and a "Send message?" pop-up if you type a new message. With nothing paused, the cards have no heading at all.
Now there is one heading row above the cards. It reads Queued and the number of cards. After a Stop it reads Paused and the number, with Clear all and Resume beside it. A small arrow folds the cards away. The Send button always stays Send, and a message you type into a paused queue just sends; the paused cards follow it.
What Changed
Before (desktop and phone):
After:
Mechanism:
NativeChatQueuedMessageListrenders aNativeChatQueueHeaderrow in place of the old pause row. The queue controller dropsqueueResumeandqueueHold(the composer's copies of Resume and the dialog's clear) and exposesclear, the same sequential delete the dialog used.native-chat-composer-primary-action.ts(the Send→Resume swap),use-native-chat-held-queue-composer-send.tsandNativeChatQueueSendConfirmDialog.tsx(the dialog), their transport and composer wiring, thesentFromparameter that only the dialog's deferred send used, their tests and their strings in every locale.MobileNativeChatQueuedMessagesgets the same header row (each control keeps a 44 pt touch target), with Clear all over the existing Delete. The phone never had the composer Resume or the dialog.Why
agentSession.queuedMessagesResume, and Clear all reuses the per-card delete. The change removes far more code than it adds.Mixed versions, remote hosts, folder workspaces, phone. Client presentation only: no wire, host or capability change.
agent-session.queued-messages.v1stays dark), so today the header shows over cards that already reach the queue (other agents' messages, cards kept across a restart). It is ready for the switch-on.Differences from the common pattern.
/clear, the header reads "Queued", not "Paused". The host only publishes a pause for a person's Stop; the cards' own Send and any new message release the others, as before.Linked Issue
N/A (maintainer PR)
Visual Proof
Hidden, isolated dev build on macOS, a stand-in Codex agent, queueing switched on locally for the run only (not committed). Before = the base commit, after = this branch.
While the agent works, two messages waiting
Folded with the arrow (after):
After Stop, settled. Before: the pause sentence with Resume, and the chat box's button is a second Resume (play triangle). After: "Paused 2" with Clear all and Resume; the chat box's button stays Send.
Typing "C" + Enter into the paused queue. Before: the "Send message?" dialog. After: C goes straight to the agent; A and B wait under "Queued 2" and follow it.
Clear all (after): paused D and E, then Clear all; the box is gone and focus returns to the chat box.
Testing
Electron QA (macOS), driven by Codex gpt-5.6-terra (medium) over Playwright CDP on a hidden isolated rig (
ORCA_BACKGROUND_LAUNCH=1, isolated HOME / CODEX_HOME / CLAUDE_CONFIG_DIR / user data, checked withps eww), stand-in Codex agent, queueing capability added locally for the run only:aria-expandedtrue → false → true); after Stop "Paused 2" + Clear all + Resume, chat box buttonSend(disabled while empty, arrow icon); sending C opened no dialog, and the agent log shows C, then A, then B. Clear all over paused D and E removed both, D and E never reached the agent, focus returned to the chat box.Phone UI QA: BLOCKED. No Orca Mobile development client built from this branch is installed in a simulator on this machine, and a sibling phone PR's emulator run was blocked by the emulator typing the dev-client URL wrongly. The phone header is covered by component tests (Paused / Queued text and count, Clear all one card at a time stopping at the first failure, fold, 44 pt targets, no row with no cards).
Targeted vitest:
NativeChatQueuedMessageList(+ inline-edit), the queue controller (+ resume),NativeChatComposerActions,NativeChatStructuredSession, submission navigation, submit reveal, composer transport, queue gating, queued turn order, the cross-processstructured-agent-session-queued-card-holdscontract (Node runner), and the phoneMobileNativeChatQueuedMessages, composer tray, queued-card and feed tests — all pass. (The tray test's background-tasks toggle lookup is now scoped to that strip, since the queue header also has a fold toggle.)pnpm tc:weband the phone typecheck pass.pnpm tc:nodefails only atstructured-agent-session-message-options.ts:30(missingnow), untouched here and on main (fix in fix(i18n): translate 21 new strings to es/fr/ja/ko/zh #28629).Remote CI: static analysis and typecheck, Mobile verify, the mobile bundle and Node test shards 2 and 4 pass; shards 1 and 3 were still queued when this was written. Shard 5 fails only
src/main/runtime/orca-runtime-files-artifact-facade.test.ts(openMobileFilearity 4 vs 3): that file is not on this branch's base and this PR touches nothing undersrc/main/runtime; it comes from two crossing main changes (Typecheck file access and watchers #27582's facade test, feat(cli): open files at a requested line and column #28240's newopenMobileFileargument) in CI's merge with current main.orca-ci-checks(local): everything this PR touches passes (lint, changed-code quality, React doctor, ratchets, catalogs). Remaining failures are untouched main issues: thenowerror above, the Bun typecheck runner's missing script, three stalees.jsonkeys (AgentsPane.setupOnly,setupOnlyHint,AgentCombobox.setupOnly), and the native no-cycle audit inmobile/src/transport/*andmobile/src/terminal/document/*, which this PR does not import or change.I manually tested these changes locally
Automated tests added/updated, or explained why not below
Tests that pinned the removed composer Resume and dialog were deleted; the list, controller and phone tests were rewritten for the header, and the cross-process card-holds contract no longer projects a composer Resume or dialog.
Review
Agent skill upstream boundary
Notes
Ensure no issues in: Security, Cross-platoform support (Linux, Windows, Mac), Remote SSH, Mobile, general backwards compatibility, performance
No new I/O, timers, polling or stored state. The fold state is one local boolean per view.
Checklist
N/Awith reasonpnpm lint,pnpm typecheck,pnpm test, andpnpm buildpass (or CI will cover; local preferred)