Brennan Benson be575800c2 fix(codex): steer a mid-turn send into the running turn by name (#21062)
* fix(native-chat): settle in-flight sends when their turn ends

A send the provider admits gets no dispatch row, by design: the provider's
later acknowledgement is what settles it. If the turn carrying that send ends
first, the acknowledgement can never arrive and the submission stays pending
for the life of the session, so the chat reports work forever with no running
turn. It also blocks /clear and /compact and holds the session open.

Turn settlement now settles the sends that were in flight inside it. One
routine owns the behaviour and both journal write paths use it, because the
turn record reaches its terminal state through a plain item append on one
provider and through a lifecycle batch on the other.

Ownership is derived from journal order rather than stored: the pending set is
captured inside the serialized row build, so exactly the sends preceding the
terminal row are settled and later ones are untouched. Settlement records
doubt rather than a rejection, since an unacknowledged send is never proof of
non-delivery. A failed settlement is reported and never blocks the turn from
settling or the next send.

No schema or wire change: settlement writes ordinary dispatch rows that every
client already decodes.

* fix(native-chat): retire settled dispatch ownership

* fix(native-chat): correlate terminal dispatch ownership

* fix(native-chat): make dispatch ownership provider-authoritative

* fix(native-chat): complete durable late settlement recovery

* Resolve mainline conflicts in settlement plumbing

* fix(codex): steer a mid-turn send into the running turn by name

A message sent while a Codex turn runs, a queued card's Send-now included,
went out as turn/start. Codex 0.148 and later steer that into the running
turn and answer with its id, so the turn's end settles the send. Before
0.148, turn/start answers with its own submission id, which never opens or
ends as a turn: the send was bound to a turn that never exists, and a Stop
left it pending, so the chat read as working and /clear stayed blocked
until the app exited.

The send now goes in as turn/steer with expectedTurnId set to the turn
Codex last reported started, and is bound to the turn the answer names.
A steer Codex refuses took no input (the turn ended or changed, it cannot
be steered, or this Codex has no turn/steer), so the send falls back to
turn/start. A steer that times out is never re-sent and stays armed for
its echo. Per-turn options ride on the next turn/start.

* fix(codex): steer a send made before Codex opens the previous send's turn

On a Codex before 0.148, a second send made after Codex answered the first
but before it reported that turn started went out as turn/start. Codex folded
it into the first turn but answered with an id that never opens or ends, so a
Stop left it pending: the chat kept reading Working.

A send now resolves its target the way Stop already does: the running turn,
or else the turn Codex answered an earlier send into, once it opens (same
bounded wait). The resolver moves into the turn-open-wait module and Stop and
send share it. When Codex refuses a steer and a different turn is now
running, the send steers that turn once before falling back to turn/start.

The lifecycle fake's legacy mode now mints a false id for a start made while
a turn is picked but unopened, and refuses a steer until that turn starts.

* fix(codex): wait at most once for an answered turn Codex never opens

A Codex before 0.148 can answer a send with a turn it then fails before
starting, reporting only an `error` and no turn end. That turn stayed the
answered-but-unopened turn for the rest of the session, so every later send
made while the chat was idle, and every Stop naming no turn, waited the full
open-wait first. When a wait ends without the turn opening, the dispatch
correlation now records it, and later lookups skip it. A turn that opens
later is still found through turn/started.

The runtime test for a send made before the first turn opens now waits on
a signal that the send is inside the open-wait instead of a fixed sleep, and
pins that the send was steered.

* test(codex): prove a legacy mid-turn send settles on Stop, and stop faking a steer

Adds the user-visible outcome on a Codex before 0.148: a send made while a
turn runs is withdrawn when a Stop ends that turn, the chat no longer owes
work, and /compact is admitted after.

The shared fake Codex servers no longer answer an unrouted turn/steer as a
success; they refuse it as a Codex without that method would. Adds the case
where Codex refuses both the steer and the fallback start, so the send is
rejected in Codex's words and disarmed.

* test(codex): type the fake Codex connection and wait recorder instead of casting
2026-09-30 22:48:21 -07:00
2026-09-26 20:50:46 +00:00
2026-05-04 20:42:03 -07:00
2026-03-16 22:27:51 -07:00
2026-03-28 10:19:14 -07:00

Orca Orca

GitHub stars Total downloads across all releases License: MIT Join the Orca Discord Follow Orca on X Supported platforms: macOS, Windows, and Linux

中文 · 日本語 · 한국어 · Español · Français · Português

The AI Orchestrator for 100x builders.
Run Codex, ClaudeCode, OpenCode or Pi side-by-side — each in its own worktree, tracked in one place.

Download Orca

Orca desktop app running agents in parallel worktrees, with the Orca mobile companion app in the corner

Features

Mobile Companion

Monitor and steer your agents from your phone — get notified when an agent finishes and send follow-ups from anywhere.

iOS App Store · Android APK 0.0.50 · Docs →

Orca desktop with the mobile companion app

Parallel Worktrees

Fan one prompt across five agents, each in its own isolated git worktree — compare the results and merge the winner.

Docs →

Parallel worktree orchestration

Terminal Splits

Ghostty-class terminals with WebGL rendering, infinite splits, and scrollback that survives restarts.

Docs →

Terminal splits

Design Mode

Click any UI element in a real Chromium window to send its HTML, CSS, and a cropped screenshot straight into your agent's prompt.

Docs →

Embedded browser and Design Mode

GitHub & Linear, Native

Browse PRs, issues, and project boards in-app — open a worktree from any task and review without a context switch.

Docs →

GitHub and Linear task workflows in Orca

SSH Worktrees

Run agents on a beefy remote box with full file editing, git, and terminals — auto-reconnect and port forwarding included.

Docs →

Remote worktrees over SSH

Annotate AI Diffs

Drop comments on any diff line and ship them back to the agent — review, edit, and commit without leaving Orca.

Docs →

Annotate AI-generated diffs

Drag Files to Agents

VS Code's editor with autosave everywhere — drag files or images straight into an agent prompt.

Docs →

Drag files and images into an agent prompt

Orca CLI

Agents drive Orca too — script every workflow with orca worktree create, snapshot, click, and fill.

Docs →

Script Orca from the CLI

Also in the box:

  • Quick open — Search across worktrees, files, agents, commands, and repo context without leaving your flow.
  • Account switcher & usage tracking — See Claude and Codex usage and rate-limit resets, and hot-swap accounts without re-logging in.
  • Rich repo previews — Preview Markdown, images, PDFs, and repo docs in the workspace.
  • Computer Use — Let agents operate desktop apps and visible UI when a workflow needs real interaction.
  • Notifications and unread state — Know when an agent finishes or needs attention, then mark threads unread to come back later.
  • And many, many more — we ship daily, so this list is perpetually behind. The changelog is the real feature list.

Supported Agents

Works with any CLI agent — if it runs in a terminal, it runs in Orca.

Claude Code logo Claude Code   Codex logo Codex   Grok logo Grok   Cursor logo Cursor   GitHub Copilot logo GitHub Copilot   Muse logo Muse   DeepSeek Harness logo DeepSeek Harness   ZCode logo ZCode   OpenCode logo OpenCode   MiMo Code logo MiMo Code   Amp logo Amp   OpenClaude logo OpenClaude   Antigravity logo Antigravity   Pi logo Pi   oh-my-pi logo oh-my-pi   Hermes Agent logo Hermes Agent   Devin logo Devin   Goose logo Goose   Auggie logo Auggie   Autohand Code logo Autohand Code   Charm logo Charm   Cline logo Cline   CodeBuddy logo CodeBuddy   Codebuff logo Codebuff   Freebuff logo Freebuff   Command Code logo Command Code   Continue logo Continue   Droid logo Droid   Kilocode logo Kilocode   Kimi logo Kimi   Kiro logo Kiro   Mistral Vibe logo Mistral Vibe   Qwen Code logo Qwen Code   Rovo Dev logo Rovo Dev   + any CLI agent


Install

Desktop — macOS, Windows, Linux

Or via a package manager:

# macOS (Homebrew)
brew install --cask stablyai/orca/orca

# Arch Linux (AUR) — or stably-orca-git to build from source
yay -S stably-orca-bin

Mobile Companion — iOS, Android

Pair with your desktop app to monitor and steer your agents from your phone.


Community & Support

  • Discord: Join the community on Discord.

  • Twitter / X: Follow @orca_build for updates and announcements.

  • WeChat: Scan to join the Orca community WeChat group 11.

    WeChat group 11 QR code for the Orca community
  • Feedback & Ideas: We ship fast. Missing something? Request a new feature.

  • Privacy: See the privacy & telemetry docs for what anonymous usage data Orca collects and how to opt out.

  • Show Support: Star this repo to follow along with our daily ships.


Developing

Want to contribute or run locally? See our CONTRIBUTING.md guide.

The relay that pairs the mobile app with a desktop host is also in this repository under cloud/, with a separate pnpm workspace and setup guide.

Orca contributors

GitHub star history chart for stablyai/orca

Signed Builds

Windows code signing sponored/provided by SignPath.io, certificate by SignPath Foundation.

License

Orca is free and open source under the MIT License.

S
Description
Orca is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop, mobile and remote runtime.
Readme MIT
1.7 GiB
Languages
TypeScript 95.1%
JavaScript 4.2%
Swift 0.2%
HCL 0.1%
CSS 0.1%