Repository navigation
Phone: hold Send to choose Queue or Steer - #28653
brennanb2025 wants to merge 6 commits into
Conversation
|
When queueing is enabled, the phone's ordinary Send action queues a follow-up, leaving no choice to send a correction straight into the running turn. This PR adds Queue / Steer when holding Send; a plain tap keeps the existing default, and opening or dismissing the menu sends nothing. Queue advertisement remains off for the separate rollout. Two review rounds, an independent architecture challenge, readiness review and dedicated performance scan are complete on
No new product decision is outstanding. The PR remains draft, with no main sync or merge performed; Brennan owns the one final main sync and its narrow recheck. Android, live paired/SSH delivery, native image admission and a true native main-versus-branch comparison remain unverified. Final branch with a simulated host: ordinary text offers the two choices; a supported host command keeps its normal delivery and shows no choice. These are two inputs on the final branch, not an actual main/branch comparison.
|
…d choice The phone's Queue/Steer choice uses the desktop's 'queue' | 'steer' type and its shared default, and passes send arguments uniformly instead of branching on which ones are present.
5cfadbb to
b85b068
Compare
|
Superseded by #36588, which ships hold Send on the phone to choose Queue or Steer. Per the shared behavior across agents, it offers the menu for every agent. |


ELI5
When message queueing is enabled, the phone only offers the default queue action, so a correction cannot go straight into the agent's running turn. Holding Send now opens Queue / Steer; a plain tap keeps the phone's existing queue default.
Queueing remains unadvertised in this PR. The menu appears only while an agent is working on a connected host that supports queueing and confirms that this agent can steer. It stays hidden during Stopping, when idle, for host-owned commands such as
/compact, or when queueing would be bypassed for a prompt this phone cannot answer.What Changed
queue/steervalue the desktop uses (src/shared/native-chat-follow-up-delivery.ts, from Separate native chat draft and queued-card shortcuts #28634, which this PR is stacked on). A plain tap carries no choice and gets the shared default, Queue. Queue requests the existing queue delivery for ordinary text; Steer omits it and uses the current direct-send path.Why
This follows the common pattern: holding Send reveals delivery choices, and selecting a choice uses the normal sender. Reusing the action sheet and sender keeps one owner for sends, draft cleanup, attachments, and failures. It avoids a second send path or a new phone preference.
Linked Issue
N/A (maintainer PR).
Visual Proof
Native iOS 26.5, disposable iPhone 17 Pro simulator. Inputs used
orca emulator; screenshots usedsimctl. The screenshots show the real chat view/composer with a simulated host, before and after opening the menu. No live pairing, real agent, or SSH host was used.Selecting Steer reached direct delivery and selecting Queue reached queue delivery through the real phone send wrappers. Dismissal retained the draft without a send; a plain tap requested queueing. The menu stayed hidden while idle, Stopping, and on an older host. QA-only fixture code was removed before committing. Android and live paired-host QA remain untested. Desktop Electron QA is not applicable (phone-only UI).
Testing
/compactkeeps plain Send while Codex's pass-through/goalcan still choose Steer.tc-gate.tc-gate.orca-ci-checksafter the fix: 20/22 checks passed. The two failures are already on main: five import-cycle warnings in untouched mobile transport/terminal files, and local Bun 1.3.14 lacking thecheckscript used bytypecheck:ci. Changed-code quality, React, localization, file-length, and the regular repository typecheck produced no failures.5cfadbb2d24: the single blockinggh pr checks 28653 --watch --fail-fast --interval 60passed. Mobile verify, static analysis/typecheck, mobile web bundle, repository guards, test line-count check, and final PR checks passed; 15 other jobs were skipped.Review
Self-reviewed the send path, disabled and stopping states, draft recovery, attachment forwarding, host support, and connection invalidation. Screenshots were inspected and contain only fixture data.
Agent skill upstream boundary
Notes
Mixed versions: host methods, published content, and capability advertisement are unchanged, so old clients keep their existing behavior with a new host. A new phone on a host without queue support sends directly and offers no menu; a queue-capable host without a readable agent list also offers no menu. Queue delivery is sent only with confirmed host support.
SSH and folder workspaces: the choice follows the existing paired client's session and transport. The execution host still decides how to deliver it; no local fallback or Git-specific behavior was added. Live SSH and folder-workspace flows were not exercised.
Differences from the common pattern: Intended — one shared resolver, as the common pattern does: the phone and desktop read Queue/Steer through the same type and default. Intended — use the existing phone action sheet. Intended — retain the phone's queue default without adding or syncing a preference, as approved for PR6. Intended — if the turn ends before direct delivery arrives, the existing host sender can start a new turn. Temporary — the current host sends image attachments directly even when Queue is selected; #28655 resolves this before queue switch-on. Temporary — queue advertisement stays off until the separate queue switch-on PR.
Checklist