Commit Graph
6658 Commits
Author SHA1 Message Date
Jinwoo-HandOrca a7151f9750 docs(ssh): record arm64 reproducibility boundary
Co-authored-by: Orca <help@stably.ai>
2026-07-14 13:08:01 -04:00
Jinwoo-HandOrca de541efd11 docs(ssh): record builder parser correction
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:54:04 -04:00
Jinwoo-HandOrca f864d3fa6d build(ssh): syntax-check runtime builder
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:52:15 -04:00
Jinwoo-HandOrca 25ca53910d docs(ssh): record builder parser boundary
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:52:02 -04:00
Jinwoo-HandOrca 54df2cb998 docs(ssh): record native linker correction
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:40:31 -04:00
Jinwoo-HandOrca 3e433b3438 build(ssh): canonicalize native build path
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:36:14 -04:00
Jinwoo-HandOrca a09b02ec4e build(ssh): stabilize native runtime rebuilds
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:32:30 -04:00
Jinwoo-HandOrca c62b0d0a95 docs(ssh): record native reproducibility red
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:08:20 -04:00
Jinwoo-HandOrca e58913d1a5 test(ssh): improve native reproducibility diagnostics
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:05:53 -04:00
Jinwoo-HandOrca 09b047f4ee docs(ssh): record clean-build oracle gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:52:07 -04:00
Jinwoo-HandOrca c70e96374c test(ssh): gate runtime clean-build identity
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:49:48 -04:00
Jinwoo-HandOrca d35ab55b9f docs(ssh): record native Windows runtime proof
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:35:19 -04:00
Jinwoo-HandOrca d9a556b9c8 docs(ssh): record ConPTY worker settlement gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:23:18 -04:00
Jinwoo-HandOrca c04b4f6300 fix(ssh): settle copied Windows ConPTY worker
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:20:42 -04:00
Jinwoo-HandOrca 2aaea70465 docs(ssh): record Windows resource diagnostic gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:05:43 -04:00
Jinwoo-HandOrca 6bba900209 test(ssh): classify lingering Windows smoke resources
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:05:09 -04:00
Jinwoo-HandOrca b6291e55b1 docs(ssh): record Windows smoke settlement gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:53:50 -04:00
Jinwoo-HandOrca ddf28eb8db test(ssh): settle Windows runtime PTY smoke
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:52:54 -04:00
Jinwoo-HandOrca df661e3701 docs(ssh): record Windows smoke timeout gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:36:47 -04:00
Jinwoo-HandOrca 3aab5aff8c test(ssh): preserve runtime smoke failure details
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:36:28 -04:00
Jinwoo-HandOrca 42aa02fa9e docs(ssh): record Windows GPG path gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:24:00 -04:00
Jinwoo-HandOrca b6903b2205 fix(ssh): keep GPG verification paths portable
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:23:38 -04:00
Jinwoo-HandOrca b387ac48cd test(ssh): preserve Windows verification fixtures
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:14:48 -04:00
Jinwoo-HandOrca ef94c90663 test(ssh): keep relay CLI modules importable
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:11:21 -04:00
Jinwoo-HandOrca 55f7137c6e test(ssh): make relay tar fixture portable
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:07:55 -04:00
Jinwoo-HandOrca 539cd060e7 docs(ssh): record Windows runtime artifact gates
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:59:58 -04:00
Jinwoo-HandOrca 922edb6ff2 build(ssh): add Windows relay runtime artifacts
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:58:21 -04:00
Jinwoo-HandOrca c308107a96 docs(ssh): record native runtime artifact CI
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:23:40 -04:00
Jinwoo-HandOrca 151628992f fix(ssh): canonicalize runtime watcher smoke paths
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:10:28 -04:00
Jinwoo-HandOrca f8a230ef30 docs(ssh): record runtime artifact draft PR
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:04:47 -04:00
Jinwoo-HandOrca f2b387b21b build(ssh): assemble relay runtime artifacts
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:03:25 -04:00
Jinwoo-HandOrca 0c299fe189 docs(ssh): record relay contract CI
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:58:41 -04:00
Jinwoo-HandOrca 6732d911a8 docs(ssh): link relay contract evidence
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:44:23 -04:00
Jinwoo-HandOrca b9d80a4cbc feat(ssh): define relay runtime artifact contracts
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:43:28 -04:00
Jinwoo-HandOrca 959bc05cac docs(ssh): link safety decision evidence
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:15:52 -04:00
Jinwoo-HandOrca 5c37e8efeb docs(ssh): close relay safety contracts
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:14:40 -04:00
Jinwoo-HandOrca 12291e1ad0 docs(ssh): link baseline decision evidence
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:01:19 -04:00
Jinwoo-HandOrca a84d52dc63 docs(ssh): close runtime baseline decisions
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:00:30 -04:00
Jinwoo-HandOrca 9a8f98fd9b docs(ssh): record WP0 CI evidence
Co-authored-by: Orca <help@stably.ai>
2026-07-14 06:51:29 -04:00
Jinwoo-HandOrca 94e58d83ea docs(ssh): record WP0 draft PR evidence
Co-authored-by: Orca <help@stably.ai>
2026-07-14 06:35:12 -04:00
Jinwoo-HandOrca c4259d94fc fix(ssh): resolve complete remote node toolchains
Co-authored-by: Orca <help@stably.ai>
2026-07-14 06:28:26 -04:00
Jinwoo-HandOrca 2b67de8701 docs(ssh): add relay runtime distribution plan
Co-authored-by: Orca <help@stably.ai>
2026-07-14 06:28:26 -04:00
Brennan Benson 9d51732523 perf(terminal): defer cold worktree activation tab mounts until first reveal (#8597)
* perf(terminal): defer cold worktree activation tab mounts until first reveal

Activating a worktree mounted a TerminalPane for every saved terminal tab
in one render pass. Each mount replays scrollback through xterm, attaches
a WebGL renderer, and issues a sync-IPC snapshot read, so a worktree with
many agent-session tabs froze the renderer for tens of seconds (field
trace: 200+ replay-guard stall releases inside one activation window,
plus restore-marker feedback loops re-fetching snapshots at ~4/sec).

Cold activations now mount only the tabs the user can see (active tab,
each split group's active tab, activity-portal tabs, pending spawns) plus
tabs that are already live or that parked byte watchers cannot cover.
Every other tab defers like a cold-parked tab from birth: no view until
first reveal, with the parked byte watchers owning bell/title/completion
side effects meanwhile. The restriction reuses the targeted background
mount mechanism and lifts once every tab has been revealed.

Deferral only engages when more than four tabs would mount cold, and only
while hidden-view parking is enabled, so small worktrees and the parking
kill switch keep today's behavior.

* test(terminal): prove cold-activation deferral end-to-end; unblock it past hydration's blanket spawn flag

The new e2e (child worktree, 8 tabs, renderer reload against live daemon
sessions) caught the deferral never engaging: session hydration marks
every persisted tab pendingActivationSpawn, and treating that flag as
must-mount-now put all tabs in the immediate set. Only explicit queued
startups (pendingStartupByTabId) mount eagerly; a deferred tab's reveal
consumes the hydration flag exactly like an activation mount would.
Sleep/wake respawn flows go through targeted background mounts and are
unaffected (terminal-sleep-wake-restore passes).

The spec asserts the visible tab mounts, deferred tabs stay unmounted
with parked byte-watcher coverage, and a revealed tab mounts on demand.

* fix(terminal): harden deferred activation lifecycle

* docs(reliability): correct SSH startup assertion evidence
2026-07-14 02:58:34 -07:00
Brennan Benson 8e17e75a3d fix(mobile): harden terminal height refit (follow-up to #8647) (#8707)
* fix(mobile): harden terminal height refit (follow-up to #8647)

Addresses review feedback on #8647:

- Defer height refits while the keyboard is visible and coalesce every
  skipped layout change into one correction after the keyboard closes,
  via a pure reducer. Prevents an over-fit that settles with the keyboard
  up from surviving (on iOS the edge-to-edge keyboard doesn't change the
  frame height on close, so there was no later event to re-trigger it).
- Drive height layout callbacks imperatively (notifyTerminalFrameHeight)
  instead of setState, so height-only layout bursts no longer re-render
  SessionScreen.
- Cache the updateViewport capability (method_not_found -> unsupported):
  old desktops now get one unsupported probe then legacy resubscribe,
  instead of one probe per refit. Reconnect resets the cache so an
  upgraded desktop is re-detected.

No server schema or subscription-protocol changes; desktop-first stays
compatible.

Tests: 703 mobile terminal/session pass; tsc, oxlint, formatting clean.

* fix(mobile): re-check keyboard when a deferred height refit fires

Close a race in the keyboard-deferral: a height refit deferred at
keyboard-close arms a 150ms debounce timer, and if the keyboard reopens
inside that window the timer still fired and reflowed the PTY mid-keystroke.

The timer callback now re-consults the reducer (new `refit-committed`
event) when the armed refit is height-originated: if the keyboard is
visible again it re-defers (pending) instead of reflowing, and runs on the
next keyboard close. Scoped via a height-originated flag so width/rotation
and the forced reconnect/foreground re-asserts stay unguarded and always run.

Tests: reducer coverage for the reopen-during-debounce re-defer + a wiring
assertion; 705 mobile terminal/session pass; tsc, oxlint clean.
2026-07-14 02:52:50 -07:00
Brennan Benson 31f643ca42 Add version-matched skill guides to the CLI (#8624)
* Add version-matched bundled skill guides

* Clarify skill freshness rollout PRs

* Add canonical skills show alias

* fix(skills): address guide review feedback

* fix(skills): make guide commands cross-platform

* fix(skills): apply the ORCA convention to the emulator guides

Review follow-up: the emulator guides still instructed literal
`orca emulator ...` in sh fences with no Linux disambiguation, so on
unmanaged Linux they could launch the GNOME screen reader — the exact
failure the executable-selection preamble prevents. Both emulator
guides now carry the preamble and ORCA placeholder across fences,
tables, and prose, and the cross-platform safety test covers all four
converted guides. Also replaces computer-use's "unless a block names a
shell" carve-out, which contradicted its own POSIX example, with the
unconditional placeholder rule.
2026-07-14 02:17:55 -07:00
Rod BoevandOrcaWin 59460f7576 fix(terminal): derive zsh wrapper ZDOTDIR from %x so non-ASCII WSL logins load .zshrc (#8003) (#8209)
The shell-ready zsh wrapper restored ZDOTDIR from the env-imported
`${ZDOTDIR}`. On Windows+WSL the wrappers are generated with a Windows
path baked in but sourced via /mnt/c, and for non-ASCII Windows
usernames (e.g. a Korean login) zsh corrupts environment values whose
UTF-8 bytes fall in its 0x84-0x9D token range while processing startup
files. The corrupted `${ZDOTDIR}` failed the self-check, so the wrapper
fell back to the unusable baked Windows literal and the user's ~/.zshrc
never loaded — a bare `HOSTNAME%` prompt with no theme/aliases/PATH.

Derive the wrapper dir from `${${(%):-%x}:h}` instead — %x is zsh's
internal script name for the file being sourced and is not subject to
the env-import corruption. `${ZDOTDIR}` is kept only as a fallback when
%x expansion yields nothing; the existing final restore still validates
with -f before trusting the value. On native macOS/Linux the derived
value equals the old one, so behavior there is unchanged.

Covers local PTYs, the daemon, and the Windows→WSL launch path, which
all share getZshEnvTemplate. Adds a live-zsh regression test that sources
the wrappers from a non-ASCII (token-range) runtime path.

Supersedes the ORCA_ORIG_ZDOTDIR path-normalization approach with a wrapper self-location fix that also covers the non-ASCII (token-range) corruption trigger.

Co-authored-by: OrcaWin <alpha-eng@stably.ai>
2026-07-14 01:55:04 -07:00
NeilandOrca 840d3277d1 fix(daemon): replace a permanently wedged daemon instead of preserving it forever (#8689) (#8697)
* fix(daemon): replace a permanently wedged daemon instead of preserving it forever (#8689)

A daemon whose socket accepts connections but whose event loop never answers the
'hello' handshake was adopted by the launcher unconditionally and never re-evaluated,
so every terminal spawn failed with 'DaemonProtocolError: Hello response timed out'
with no recovery.

- daemon-init.ts: bound the launcher's 'preserve any unresponsive-but-connectable
  daemon' with a grace window. A transient wedge (Windows update-relaunch AV/disk
  pressure) drains within ~20s and is preserved WITH its live sessions; a permanent
  wedge exhausts the grace and is replaced. Stays well under the 60s local-PTY
  fail-open cap.
- daemon-pty-adapter.ts: isDaemonGoneError now treats 'Hello response timed out' as
  daemon-gone, so a runtime wedge triggers withDaemonRetry's respawn (re-entering the
  same grace-bounded launcher) instead of failing every spawn until app restart.

Tests pin the grace magnitude so it cannot be silently shrunk.

Co-authored-by: Orca <help@stably.ai>

* fix(daemon): widen wedged-daemon grace window to ~60s

Bump WEDGED_DAEMON_GRACE_RETRIES 3 -> 11 (~20s -> ~60s) to keep live-session
loss on the transient-wedge (Windows update-relaunch) path as close to zero as
possible. A transient wedge drains early and stays under the 60s fail-open cap;
only a permanent wedge runs the full window. Export the constant and pin its
floor in tests so it can't be silently shrunk.

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: Orca <help@stably.ai>
2026-07-14 01:50:56 -07:00
Brennan Benson e04ca97dc2 fix(mobile): re-fit terminal PTY when the frame height settles (#8647)
* fix(mobile): re-fit terminal PTY when the frame height settles

A freshly-created agent terminal fits its PTY to rows = floor(frameHeight
/ cellHeight) before the accessory/live-input dock has laid out, so the
frame is briefly too tall and the PTY gets too many rows. Claude/Codex
pin their input box to the bottom of the grid, so those extra bottom rows
— the input box and status lines — render behind the dock and you can't
see what you're typing. Leaving and re-entering the workspace worked
around it by re-measuring against the settled layout.

The refit hook previously re-fit only on width changes and deliberately
ignored height-only changes, so the over-fit was never corrected. Track
the measured frame height and re-fit on its change too, mirroring the
width path. Safe because Expo SDK 55's edge-to-edge IME overlays instead
of resizing, so the frame height doesn't change on keyboard toggle and
the PTY is never reflowed while typing; the refit's row-count guard makes
sub-row jitter a no-op.

* fix(mobile): guard height refit against IME resize; test the decision

Address review on #8647:
- Extract shouldRefitOnFrameHeightChange (pure) and gate the height refit on
  keyboard-visible, so an IME that resizes the window (Android adjustResize)
  can never reflow the PTY while typing — no longer relies on the edge-to-edge
  no-resize assumption alone.
- Add a behavioral test for the decision helper (height transition, same-value
  no-op, keyboard-open skip) instead of only source-string assertions.
- Trim the added comments to 1-2 lines per AGENTS.md.
2026-07-14 01:33:27 -07:00
fsdwen 2b8cec36d9 fix(i18n/zh): 修复3处翻译质量错误 (#8693) 2026-07-14 01:21:05 -07:00
Neil 8e0977d295 fix(mobile): resync worktree list + idempotent notification replay on reconnect (#8498 #8129)
Take-over of #8605 (issue #8591). Ships #8498 (worktree resync + pull-to-refresh + cache write-through) and #8129 (idempotent notification replay on reconnect). Fixes the original PR's field mismatch (seq vs notificationSeq) and adds the missing notifications.getMissedSince mobile RPC allowlist entry. #6784 and #4500 held back to avoid conflicting with the relay work (#8536). Co-authored-by: Brandon Bennett (@branben).
2026-07-14 00:23:53 -07:00