Repository navigation
Orca v0.5.9
Orca v0.5.9
Changes since v0.5.8:
- The ACP daemon and
orca attachmove to the ACP SDK 3.2
(agent-client-protocol3.2.0, schema 1.10). The ACP v1 wire is unchanged. orca --mode=acpsends a streamed answer once, and its reasoning as
thoughts (#124).- An attached TUI survives a failed turn, a session reloaded over ACP shows
each answer's reasoning before it, andsession/listfinds a workspace's
sessions even when they are not among the most recent. Escno longer leaves errors drawn over the screen, a cancelled sync agent
ends as cancelled, and Orca no longer continues a turn on its own after an
interrupt.- A
SIGTSTPfrom a job-control shell stops Orca, andfgbrings it back. - A message sent in the moment before a new turn starts now queues behind it,
in order. - On a Linux host where only Landlock works,
orca doctorand the shell agree
about which commands can run (#118).
Changes
Agent Client Protocol
- The daemon, the stdio bridge and
orca attachuseagent-client-protocol
3.2.0 (schema 1.10) instead of 0.10.4. What the daemon writes is unchanged:
a recorded wire baseline of eleven scenarios passes as it was before the
move. - The daemon still reports
modelsfromsession/newandsession/loadand
still acceptssession/set_model. Schema 1.x removed that session model
API; clients built on it keep working. - Requests are decoded as schema 1.x specifies. An optional field of the wrong
type reads as absent and an invalid entry in a list such asmcpServersis
skipped, where 0.10 refused the whole request. A required field of the wrong
type is still-32602 Invalid params. orca --mode=acpforwarded every streamed delta of an answer and then the
whole answer again, so a client that appends chunks showed it twice. It now
sends the answer once, and sends reasoning asagent_thought_chunkinstead
of message text (#124).session/listfiltered by working directory only after paging, so a
workspace whose sessions were not among the 100 most recent got an empty
first page with anextCursor. A shared daemon, which always filters by
its workspace, listed no sessions for it. Pages now count only the
workspace's sessions.- A session reloaded with
session/load, or reattached, showed each answer
above the reasoning that led to it. The replay now sends reasoning first,
as the answer streamed. - A dropped request from
orca attachnow sends$/cancel_request, which the
daemon ignores.
Attached TUI (orca attach)
- A turn that failed (a provider error, a daemon restart in the middle of the
turn, a budget, a prompt the daemon did not admit) sent the attached TUI
through its five reconnects and out with "ACP snapshot delivery was
interrupted", and the session could not be attached in the TUI again. The
daemon now sends the failure in the projection as the standard JSON-RPC
error object, and the TUI also reads the plain text older daemons send. - When the daemon hangs up before a prompt's answer, the TUI restores the
prompt as before, now under a "Connection lost" warning that says to check
the restored session before sending it again. It used to say to check the
network and proxy and retry, which could run the turn twice. - A client handler that fails no longer leaves the connection looking open:
a permission request it can no longer answer gets an error reply instead of
leaving the daemon waiting, and a daemon that hung up is seen as gone before
the request it failed returns.
Terminal UI
Escafter a background agent had finished could print "orca: failed to
stop foreground task tree: ... cannot request_stop task in Completed state"
over the screen, and cancelling the turn stopped no task after the first
that had just ended. A stop that finds its task already ended now succeeds,
and the rest are stopped.- On macOS and Linux, a line the runtime writes to stderr while the screen is
up now shows once as a notice in the conversation, instead of being drawn
over the screen and staying there. Escwhile a sync agent was answering ended the turn with "Runtime
consistency check failed (foreground operation failed)", and the agents
panel kept the agent running. The turn now ends cancelled, and so do the
agent and its task.- After
Esc, Orca could start a turn on its own ("Background agents
finished; continuing with their results.") when a queue restart sent with an
earlier message arrived after the interrupt. An interrupt keeps the queue
paused. - A message sent between turns starts a turn that takes a moment to start. A
message sent in that moment waited behind the whole turn, out of sight, and
one sent just after it ran first. Messages sent in that moment are now held
above the input and join the queue in order once the turn has started. If
the turn does not start, the first of them is sent instead. - A skill run through its
/skill-idalias before a conversation resumed at
launch has loaded is now held like a typed message, and sent after the
command-line prompt in order. - A
SIGTSTPsent to Orca under a job-control shell (kill -TSTP, or a
shell's own suspend) now stops it: the shell gets the terminal back and
fgbrings the conversation back. Before, Orca left the screen without
stopping and used CPU until it was killed. Run as a session leader, with no
shell to return to, Orca stays on screen. - The update prompt shown before the TUI starts now quits on
SIGTERM,
SIGHUPandSIGINTwith 128 plus the signal's number, leaving raw mode
first. Before, the terminal was left in raw mode.
Shell, sandbox and tasks
- On a Linux host where bubblewrap cannot create its namespaces but Landlock
and seccomp work,orca doctorpassed the sandbox and the shell counted as
available, yet every restricted command exited 126. Landlock cannot hide a
path from a global read or keep.gitread-only inside a writable
workspace. The launch, the shell's readiness andorca doctornow ask the
same question: a policy that needs bubblewrap where it cannot run blocks the
shell with the reason and a remedy (#118). - A command that exited on its own and was read after its deadline read as
timed out, with its real exit code beside it. It now reads as the exit it
was. - When Orca gives up recording how a backgrounded command ended, its message
now says why. - A command under a domain-restricted network policy no longer waits, on
macOS, for the system's DNS configuration before it starts: the network
proxy reads it when a request first names a host to look up. Since v0.5.8
that read could take a second or more and, under load, fail the command. A
DNS configuration that cannot be read now fails only those lookups.
MCP
- An HTTP MCP call whose
application/jsonbody kept arriving, however
slowly, could not be cancelled until the body ended. A cancel now stops it. - Each server keeps how its own first connection ended. A server reconnected
after startup that failed while another server was still starting no longer
came back as a startup warning, and no longer held the startup warnings up
until it ended.
Sessions and orca exec
orca execstopped by a signal before its turn numbered its events from 0
again in a resumed session, and they reached no history. They now continue
the session's sequence and are recorded, and text output ends with the
To continue this sessionhint.- Session files deleted outside Orca could cut the session list short: a page
whose rows all named deleted files came back empty and said nothing more
followed, in the session picker,--resumeand ACPsession/list. A page
now reads on past them.
Development
- The
runtime_surface_hosttests share no Orca home undercargo test's
threaded harness, so they no longer fail at random or write sessions into
the real~/.orca. - Tests that run restricted shells skip, saying why, on a host that refuses
every restricted shell, such as a default Docker container. - Test fixtures and timing fixes for the server, MCP login and stdio, file
search and verifier tests, and bounded pruning of old temporary test homes. - The shell edge probe's streaming verdict no longer depends on timing (#120),
and a workflow launch replay test waits for a crashed owner's lease before
it takes over (#119). - The HTTP client boundary validator catches a
reqwestclient built with
Default, and the release workflow waits for the Windows platform package
before it checks the published install.
Compatibility
- The ACP v1 wire is unchanged, apart from the projection's failure
error,
which is now the JSON-RPC error object; the TUI of v0.5.9 also reads the
text that v0.5.8 and older daemons send. - The ACP schema turns on ordered JSON objects for the whole build. Where key
order is part of a contract it is sorted as before: the JSONL server
envelope, the DeepSeek tool schemas, the MCP resource lists the model reads,
and the workflow input and output digests. Other JSON Orca writes keeps the
order its keys were added in.
Configurations and sessions from v0.5.8 remain readable.
Verification
cargo fmt --all -- --check
node --test scripts/test-validate-runtime-surface-contract.mjs
node scripts/validate-runtime-surface-contract.mjs
node --test scripts/test-validate-windows-platform-boundaries.mjs
node scripts/validate-windows-platform-boundaries.mjs
node --test scripts/test-validate-execution-broker-boundary.mjs
node scripts/validate-execution-broker-boundary.mjs
node --test scripts/test-validate-http-client-boundary.mjs
node scripts/validate-http-client-boundary.mjs
node scripts/release/verify-version-sync.mjs
node scripts/release/test-verify-version-sync.mjs
node scripts/release/test-stage-npm.mjs
node scripts/release/test-verify-published.mjs
node scripts/test-repository-hygiene.mjs
node --test tests/npm_launcher_contract.test.mjs tests/release_workflow_contract.test.mjs
python3 -m unittest discover -s terminal_bench -p 'test_*.py'
cargo nextest run --workspace --all-targets --locked --profile ci --no-fail-fast --retries 0
cargo nextest run -p orca-tui --lib --locked --profile ci-serial --retries 0
cargo nextest run --test tui_pty_contract --locked --profile ci-serial --retries 0
python3 scripts/eval/acp_param_probe.py --binary target/debug/orca
python3 scripts/eval/daemon_probe.py --binary target/debug/orca
npm --prefix site run build
npm --prefix site run check:seoUpgrade
npm install -g @blade-ai/orca@0.5.9
orca --version