Skip to content

Orca v0.5.9

Choose a tag to compare

@github-actions github-actions released this 10 Oct 06:46
· 218 commits to main since this release

Orca v0.5.9

Changes since v0.5.8:

  • The ACP daemon and orca attach move to the ACP SDK 3.2
    (agent-client-protocol 3.2.0, schema 1.10). The ACP v1 wire is unchanged.
  • orca --mode=acp sends 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, and session/list finds a workspace's
    sessions even when they are not among the most recent.
  • Esc no 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 SIGTSTP from a job-control shell stops Orca, and fg brings 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 doctor and the shell agree
    about which commands can run (#118).

Changes

Agent Client Protocol

  • The daemon, the stdio bridge and orca attach use agent-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 models from session/new and session/load and
    still accepts session/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 as mcpServers is
    skipped, where 0.10 refused the whole request. A required field of the wrong
    type is still -32602 Invalid params.
  • orca --mode=acp forwarded 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 as agent_thought_chunk instead
    of message text (#124).
  • session/list filtered by working directory only after paging, so a
    workspace whose sessions were not among the 100 most recent got an empty
    first page with a nextCursor. 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 attach now 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

  • Esc after 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.
  • Esc while 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-id alias 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 SIGTSTP sent 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
    fg brings 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,
    SIGHUP and SIGINT with 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 doctor passed 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 .git read-only inside a writable
    workspace. The launch, the shell's readiness and orca doctor now 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/json body 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 exec stopped 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 session hint.
  • 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, --resume and ACP session/list. A page
    now reads on past them.

Development

  • The runtime_surface_host tests share no Orca home under cargo 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 reqwest client 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:seo

Upgrade

npm install -g @blade-ai/orca@0.5.9
orca --version