Commit Graph
6180 Commits
Author SHA1 Message Date
Jinwoo Hong 87cfb035b0 fix(win-update-e2e): install wait compared incomparable exe version formats (#7850) 2026-07-08 19:45:48 -04:00
Brennan BensonandOrca c8c5201145 perf(windows): relax whole-process-table scans for terminals with no agent evidence (#7607)
Co-authored-by: Orca <help@stably.ai>
2026-07-08 16:41:21 -07:00
Jinwoo Hong 685418d8e4 fix(daemon): daemon cannot start in 1.4.129-rc.1 — electron require leaked into daemon-entry chunk (#7844) 2026-07-08 19:41:09 -04:00
NeilandOrca 4a6d12959f fix: recover fresh local terminal spawns from a deleted saved cwd (#7847)
After #7750 removed the containment guard, the residual #7239 failure mode
is a persisted/inherited startupCwd whose directory no longer exists: every
spawn dies with the provider's missing-directory error. Fresh local renderer
spawns now opt in (cwdFallback: 'worktree') to recover at the workspace root
with a generic in-terminal notice; reattach, SSH, remote-runtime, runtime/API
and mobile callers keep exact cwd semantics, and existing directories —
including outside the worktree (#7685) — spawn as requested.

Co-authored-by: Orca <help@stably.ai>
2026-07-08 16:33:58 -07:00
github-actions[bot] 19f1ad4c3d release: v1.4.129-rc.2 v1.4.129-rc.2 2026-07-08 22:38:00 +00:00
Brennan BensonandOrca bd4f2e02db Fix Orca Mobile agent tabs opening as a plain shell instead of launching the agent (#7837)
Co-authored-by: Orca <help@stably.ai>
2026-07-08 15:34:37 -07:00
Brennan Benson e218bf88f6 Keep your New GitHub issue draft after an accidental dismissal (#7778) 2026-07-08 14:38:25 -07:00
Jinwoo HongandOrca 5a390cd60e Fix Claude Agent Teams detection without Claude CLI (#7834)
Co-authored-by: Orca <help@stably.ai>
2026-07-08 14:34:16 -07:00
Jinwoo HongandOrca 0784a7ea37 fix(ssh): bridge the full Orca CLI over the SSH relay instead of a hardcoded command switch (#7771)
The relay CLI shim on SSH remotes rejected every orchestration/mutation
command with 'Unsupported SSH Orca CLI command' because the host handled
relay CLI requests with a hand-rolled allowlist of five read-only-ish
commands. The host now runs the real bundled orca CLI entry (same entry
as the local shell command, via ELECTRON_RUN_AS_NODE) as a captured
subprocess, so remote invocations get the full command surface by
construction. Remote cwd is carried via ORCA_CLI_CWD so cwd-based
selectors (--worktree active) resolve against the caller's remote
directory; only Orca terminal-context env vars cross the bridge.

Host-interactive commands (serve, claude-teams, agent-teams-tmux) get a
targeted error, and the legacy in-process switch remains as a fallback
when the host CLI entry cannot be launched. Relay-side request timeouts
are raised to fit mutation and long-poll (--wait/--timeout-ms) commands,
and stdin forwarding now covers *-stdin payload flags.

Fixes #7716

Co-authored-by: Orca <help@stably.ai>
2026-07-08 13:59:42 -07:00
Brennan Benson e3eec5c39f Let pane-scoped evidence beat stale tab icon identity (#7755) 2026-07-08 13:54:06 -07:00
c2468ab820 fix(source-control): keep unresolved PR comment prompts retryable (#7466) (#7638)
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-07-08 13:24:04 -07:00
Jinwoo HongandOrca 2b3eba46cb Per-environment SSH state so desktop clients get live SSH overlays for Remote Orca Server workspaces (STA-1468 desktop topology) (#7831)
Co-authored-by: Orca <help@stably.ai>
2026-07-08 13:17:19 -07:00
Jinwoo HongandOrca ace196b08e fix(ssh): stop false "Remote connection dropped" after sleep/App Nap pauses (#7828)
* fix(ssh): guard mux dead-link detector against sleep/App Nap timer pauses

After system sleep or App Nap timer throttling, the first post-wake
timeout-check tick saw pre-pause keepalives as >20s stale and killed a
healthy link (false 'Connection timed out (no ack received)' ->
dispose('connection_lost') -> reconnect overlay churn). Track the last
tick time; when a tick gap far exceeds the interval, reset staleness
tracking, probe with a fresh keepalive, and let the next full window
make an honest liveness determination. A genuinely dead link is still
detected within ~25s after wake.

Also adds probeLiveness(timeoutMs): a keepalive round-trip primitive
that resolves true on the first frame of any kind, used by the resume
path to distinguish surviving links from dead ones.

Refs #7773

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

* fix(ssh): probe relay liveness on system resume instead of unconditional reconnect

powerMonitor 'resume' previously called connectionManager.reconnect()
for every active target, guaranteeing a teardown + reconnect overlay on
every wake even when the connection survived sleep. Now each session's
relay link is probed (keepalive round-trip, 5s timeout, one retry for
slow post-wake network); only targets whose probe fails are reconnected.
Dead-after-sleep connections still reconnect promptly. The 'suspend'
grace-time handling is unchanged.

Refs #7773

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

* feat(relay): prefix relay.log diagnostic lines with ISO timestamps

The remote relay.log had no timestamps, which blocked correlating
reconnect flaps with user activity and sleep/wake windows while
diagnosing #7773. Daemon-mode diagnostic lines now carry an ISO
timestamp prefix ('<ISO> [relay] ...', grep-stable). Connect-mode and
orca-cli passthrough stderr is untouched since it goes back to the
app/user terminal and is parsed (handshake-mismatch detection).

The relay bundle is content-hashed at build time, so the versioned
install picks up the new relay automatically on next deploy.

Refs #7773

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

* fix(ssh): re-check session identity before post-probe resume reconnect

The resume probe can take ~10s; if the user disconnected the target or the
session/connection was replaced during that window, reconnecting would
resurrect an intentionally torn-down connection (CodeRabbit).

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-07-08 13:06:39 -07:00
Jinwoo HongandOrca 6c988356e2 fix: Remote Orca Server reconnect liveness — recover mirrors, input routing, and creates after tunnel drops (#7827)
Co-authored-by: Orca <help@stably.ai>
2026-07-08 12:08:27 -07:00
Jinwoo HongandOrca b665708c7f fix(ssh): make fs.listFiles cancellable and single-flight per relay client (#7769)
Co-authored-by: Orca <help@stably.ai>
2026-07-08 12:01:06 -07:00
Jinwoo HongandOrca 864594ffdd Fix SSH state for paired remote clients + complete target re-adoption sweep (STA-1468) (#7767)
* Sweep all persisted carriers of a removed SSH target id on re-adoption

reassignSshTargetId re-pointed repos and worktree metas but left the old
target id embedded in persisted session pty ids (ssh:<id>@@pty-N in tabs,
layouts, remoteSessionIdsByTabId), the startup reconnect list
(activeConnectionIdsAtShutdown, replayed via ssh.connect at boot — the
exact 'SSH target not found' in STA-1468), sleeping-agent resume records,
provisioned project host setups, sidebar host-scope arrays, and relay pty
leases. Any survivor resurfaces later as a failing connect or reattach.

New ssh-target-id-migration module re-points every carrier in one pass,
wired into reassignSshTargetId with per-carrier unit and store-level
round-trip tests.

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

* Bridge SSH connection state to paired remote clients

The SSH surface was desktop-only: ssh:state-changed went to the host's
own BrowserWindow and the web client's ssh API was a no-op stub, so a
paired client's reconnect overlay never learned the host connected and
its target labels stayed empty (STA-1468 — overlay stuck on 'please
connect' over a live terminal).

- New sshStateChanged runtime client event, emitted from broadcastSshState
  through OrcaRuntimeService onto the existing clientEvents stream.
- New ssh.listTargets / ssh.listRemovedTargetLabels RPC methods next to
  the previously unused ssh.getState / ssh.connect.
- Web preload now routes listTargets / listRemovedTargetLabels / getState
  / connect to the paired host's runtime RPC instead of stubbing them.
- useIpcEvents applies sshStateChanged on paired web clients through the
  same guarded path as desktop ssh.onStateChanged; desktop clients ignore
  the event since a foreign runtime's targets would pollute their local
  SSH store.

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

* Harden the SSH reconnect overlay against stale or unknown target state

- Only present the destructive 'SSH host removed' state on positive
  evidence (a removal tombstone label, or a hydrated non-empty target
  list lacking the id). A client whose SSH state never hydrated has an
  empty labels map for every id and must not offer workspace removal.
- After a failed Connect, resync target metadata so a stale overlay
  converges to the ghost/re-adopted state instead of offering the same
  failing Connect forever (the repeated 'SSH target not found' toast
  loop in STA-1468).

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

* Address CodeRabbit review on #7767

- Re-key workspaceSessionsByHostId partitions stored under a removed SSH
  host id during re-adoption (no writer keys partitions by ssh host today,
  but the schema tolerates it — re-key instead of stranding; live partition
  wins when both keys exist).
- Track SSH target-list hydration explicitly (sshTargetsHydrated) instead
  of inferring it from a non-empty label map, so a legitimately empty
  target list still counts as removal evidence and a never-hydrated client
  still never offers destructive removal.
- Apply the refreshed target list before the best-effort removed-labels
  fetch in the overlay resync, so a labels failure can't discard it.

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-07-08 11:36:19 -07:00
38e82b4fff Fix AI Vault scanning for runtime hosts (#7631)
* Fix AI Vault runtime host scanning

* fix runtime ai vault response validation

* test runtime ai vault validation more loosely

* fix(ai-vault): harden runtime host scanning

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

* fix(ai-vault): resume runtime host sessions

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-08 11:20:26 -07:00
github-actions[bot] ea652a1ffe Update README downloads badge 2026-07-08 12:50:39 +00:00
github-actions[bot] 745765bb96 release: v1.4.129-rc.1 v1.4.129-rc.1 2026-07-08 09:34:47 +00:00
14ac945c50 fix(main): detect CJK input source via cfprefsd on macOS 15 (#7572)
* fix(main): detect CJK input source via cfprefsd on macOS 15

macOS 15's `plutil -extract <key> json` aborts with "invalid object in
plist for destination format" on the AppleSelectedInputSources array even
though it is all strings, so the selected-input-source probe threw and fell
back to the keyboard layout id (com.apple.keylayout.US). That disabled
forwardAsciiPunctuation, so third-party IMEs (Sogou, Doubao) sent half-width
,.? to the PTY instead of full-width ,。? in terminal panes and agent chat.
Apple's built-in IME happened not to trip the plutil bug.

Read the live prefs via `defaults export` (cfprefsd) and extract as xml1
before converting the clean subtree to JSON, dodging both the plutil json
bug and the stale on-disk plist. The parser and CJK term list are unchanged.

* fix(main): reap CJK input-source probe process group on timeout

Run the macOS input-source probe via detached spawn and SIGKILL the whole
process group on timeout so a wedged cfprefsd can't orphan the defaults/plutil
pipeline stages (the probe re-runs on every window focus-in). Pin absolute
/usr/bin paths, guard the stdout stream, and cover the non-zero-exit, spawn-
failure, and timeout fallbacks in tests.

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

---------

Co-authored-by: su'qiang <nslogname@MacBook-Pro.local>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-08 02:24:41 -07:00
Ken FukuyamaandJinjing 45931a716e Allow browser annotations to target existing agents (#7347)
* Allow browser annotations to target existing agents

* Update browser annotation send tooltip

* test: guard browser annotation send menu wiring

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-07-08 01:35:37 -07:00
Brennan BensonandOrca c0091c07c3 perf(ssh): visibility-gate and back off the remote port scanner (#7610)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 21:42:12 -07:00
a09a00f066 fix(pty): load omp status extension in wsl shells (#7642)
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-07-07 21:24:08 -07:00
2ce77d9098 fix(runtime): keep same-path imports host-qualified (#7395)
* fix(runtime): keep same-path imports host-qualified (#7018)

* review: harden runtime repo host match against SSH-repo hijack

An unstamped repo with a connectionId is an SSH repo (resolves to
ssh:<id>), so a same-path runtime import must not adopt it into a
runtime/local host. Match/adopt an unstamped repo only when it has no
connectionId, mirroring the existing local-IPC dedup guard
(src/main/ipc/repos.ts). Adds a regression test that fails without the
guard (SSH repo hijacked into runtime host).

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

* review: only runtime hosts backfill an unstamped repo

A legacy unstamped repo is indistinguishable from a genuine local repo
(both have null executionHostId and connectionId). Restrict the adoption
branch to runtime incoming hosts so a local/ssh import at a colliding
path can never re-attribute a real local project to the wrong host.
Runtime is the only host that lost its identity to the pre-#7018
path-only import and needs the backfill. Adds a regression test.

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-07 20:45:55 -07:00
Jinwoo HongandOrca 8368e946df Fix orchestration agent prompt injection (#7758)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 19:50:57 -07:00
Jinwoo Hong dfc12f2cf6 fix(watcher): isolate @parcel/watcher in a forked process so native crashes can't kill the app (#7547) (#7757) 2026-07-07 22:10:22 -04:00
Jinwoo HongandOrca 98bee1b419 Fix un-removable SSH ghost worktrees after host remove/re-add (#7753)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 19:01:42 -07:00
Jinjing 7385494560 Add backup WeChat QR to main README 2026-07-07 18:42:57 -07:00
Jinjing 01f6cb6de9 Add backup WeChat QR image 2026-07-07 18:41:10 -07:00
github-actions[bot] 5c3c2f2b3d release: v1.4.129-rc.0 v1.4.129-rc.0 2026-07-08 00:55:27 +00:00
Brennan BensonandOrca f311539f9c Split agent-detection into title status/display/identity domain modules (title evidence plan, PR 3) (#7612)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 17:50:37 -07:00
Luis Sebastian Urrutia Fuentes 37ba94a228 fix(i18n): polish Spanish locale copy (#7422) 2026-07-07 17:10:53 -07:00
Brennan BensonandOrca 482bfbc9bb Keep editor tabs in sync with external file changes instead of silently dropping them (#7591)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 17:10:40 -07:00
Jinjing 9cc177b8ea Update mobile Android APK links to 0.0.24 (#7756) 2026-07-07 17:05:24 -07:00
c1d8086a04 fix(omp): migrate legacy overlay state (#7735)
* fix(omp): migrate legacy overlay state

* fix(omp): harden legacy overlay migration

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-07 16:55:08 -07:00
Jinwoo HongandOrca 79d0de9c33 fix(terminal): remote query-reply corruption (#7329) + snapshot grid-width repaint (#7279) (#7736)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 16:42:43 -07:00
Jinwoo Hong c256a5a417 Windows terminal update-survival (single consolidated PR) (#7538) 2026-07-07 19:21:07 -04:00
Brennan BensonandOrca 46fe1b5799 Prepare mobile 0.0.25 (#7751)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 16:05:18 -07:00
Brennan BensonandOrca d8df9c818f fix(terminal): allow terminals to spawn outside the worktree (#7685) (#7750)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 15:34:29 -07:00
Brennan Benson c4db3ca51d Fix mobile "phone size" Restore buttons doing nothing (#7749) 2026-07-07 15:31:34 -07:00
github-actions[bot] 1b66de0426 release: v1.4.127-rc.5 v1.4.127-rc.5 2026-07-07 22:14:27 +00:00
Brennan BensonandOrca 46dcfd33ea Fix offline runtime worktree refresh call fanout (#7660)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 14:53:56 -07:00
Brennan BensonandOrca 9e03e28d37 Stop unreachable-runtime request storms (negative cache, stable hook deps, subscribe backoff) (#7743)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 14:50:44 -07:00
Brennan BensonandOrca d9225c5ccd fix(github): route all PR mutations through the repo's owner host (#7739)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 14:43:31 -07:00
Jinwoo HongandOrca 5790793649 fix(agent-hooks): install Droid & Copilot managed hooks over SSH (#7253) (#7744)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 14:21:23 -07:00
bea9b38544 Fix OMP worktree title identity flicker
* Fix OMP worktree title identity flicker

* Add headless fresh pairing server script

* Harden fresh pairing server script startup

* Default fresh pairing server to reachable address

* review: harden OMP tab identity validation

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-07 13:51:25 -07:00
Brennan BensonandOrca ee6405052a Keep terminals created from Orca Mobile alive when the desktop renderer is throttled or stalled (#7664)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 13:17:13 -07:00
Brennan BensonandOrca 0fe20ddff9 Fix Monaco Peek References preview collapse (#7662)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 12:55:41 -07:00
Brennan BensonandOrca fed545d330 Stop wiping the shared WebGL glyph atlas on plain window refocus (#7604)
Co-authored-by: Orca <help@stably.ai>
2026-07-07 12:43:53 -07:00
Jinjing 599f9f2138 Update WeChat community info in localized READMEs
- Remove the WeChat community section from the Portuguese translation.
- Add the main and backup WeChat QR codes to the Chinese translation.
2026-07-07 12:33:52 -07:00