Commit Graph
256 Commits
Author SHA1 Message Date
Jinwoo-HandOrca 9c03572358 ci(ssh): run native signing plan contracts
Co-authored-by: Orca <help@stably.ai>
2026-07-14 21:21:29 -04:00
Jinwoo-HandOrca 9bdae7f5bd build(ssh): define native signing plan
Co-authored-by: Orca <help@stably.ai>
2026-07-14 21:02:44 -04:00
Jinwoo-HandOrca 05b3a4b18a build(ssh): preserve Linux runner ownership
Co-authored-by: Orca <help@stably.ai>
2026-07-14 20:29:40 -04:00
Jinwoo-HandOrca 53082dd1f9 test(ssh): normalize Windows workflow fixtures
Co-authored-by: Orca <help@stably.ai>
2026-07-14 20:07:13 -04:00
Jinwoo-HandOrca 0cb3f7510b build(ssh): prove Linux runtime floor
Co-authored-by: Orca <help@stably.ai>
2026-07-14 20:00:11 -04:00
Jinwoo-HandOrca 5f0c1417d5 build(ssh): select canonical MSVC linker
Co-authored-by: Orca <help@stably.ai>
2026-07-14 18:33:47 -04:00
Jinwoo-HandOrca d1eb45d613 build(ssh): bound linker path diagnostic
Co-authored-by: Orca <help@stably.ai>
2026-07-14 18:18:31 -04:00
Jinwoo-HandOrca 18d10da275 build(ssh): identify linker by MSVC toolset
Co-authored-by: Orca <help@stably.ai>
2026-07-14 18:09:32 -04:00
Jinwoo-HandOrca 1b775e6afe build(ssh): read numeric linker PE version
Co-authored-by: Orca <help@stably.ai>
2026-07-14 17:58:42 -04:00
Jinwoo-HandOrca 714308114d build(ssh): isolate linker version path input
Co-authored-by: Orca <help@stably.ai>
2026-07-14 17:36:56 -04:00
Jinwoo-HandOrca e85f0c700c build(ssh): record linker PE file version
Co-authored-by: Orca <help@stably.ai>
2026-07-14 17:27:55 -04:00
Jinwoo-HandOrca e3f76d3ba7 build(ssh): correct native runtime metadata contracts
Co-authored-by: Orca <help@stably.ai>
2026-07-14 17:21:26 -04:00
Jinwoo-HandOrca 26bbd7b67a build(ssh): complete runtime artifact provenance
Co-authored-by: Orca <help@stably.ai>
2026-07-14 17:06:44 -04:00
Jinwoo-HandOrca ec5461affb build(ssh): enforce exact relay runtime closure
Co-authored-by: Orca <help@stably.ai>
2026-07-14 16:52:32 -04:00
Jinwoo-HandOrca 6dfdfa0bd0 build(ssh): disable incremental relay linking
Co-authored-by: Orca <help@stably.ai>
2026-07-14 16:25:48 -04:00
Jinwoo-HandOrca e7d9a1c8d3 build(ssh): inspect Windows incremental database
Co-authored-by: Orca <help@stably.ai>
2026-07-14 16:06:27 -04:00
Jinwoo-HandOrca 6f28a8cbf5 build(ssh): scope linker discovery to release output
Co-authored-by: Orca <help@stably.ai>
2026-07-14 15:50:35 -04:00
Jinwoo-HandOrca 6198f0ddd5 build(ssh): discover native linker tracking record
Co-authored-by: Orca <help@stably.ai>
2026-07-14 15:38:24 -04:00
Jinwoo-HandOrca 4a66435b71 build(ssh): inspect native linker command tracking
Co-authored-by: Orca <help@stably.ai>
2026-07-14 15:22:44 -04:00
Jinwoo-HandOrca 36a19f525c test(ssh): evaluate Windows incremental link state
Co-authored-by: Orca <help@stably.ai>
2026-07-14 14:55:29 -04:00
Jinwoo-HandOrca 4207c207ab fix(ssh): accept native arm64 MSBuild casing
Co-authored-by: Orca <help@stably.ai>
2026-07-14 14:30:15 -04:00
Jinwoo-HandOrca 0d3a0c9d3f test(ssh): diagnose generated arm64 build inputs
Co-authored-by: Orca <help@stably.ai>
2026-07-14 14:16:12 -04:00
Jinwoo-HandOrca 6546f54d53 build(ssh): make copied MSVC inputs deterministic
Co-authored-by: Orca <help@stably.ai>
2026-07-14 13:57:00 -04:00
Jinwoo-HandOrca cd7f941365 test(ssh): summarize complete Windows PE drift
Co-authored-by: Orca <help@stably.ai>
2026-07-14 13:37:48 -04:00
Jinwoo-HandOrca 39ee3451b8 build(ssh): diagnose Windows PE reproducibility drift
Co-authored-by: Orca <help@stably.ai>
2026-07-14 13:19:46 -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 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 e58913d1a5 test(ssh): improve native reproducibility diagnostics
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:05:53 -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 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 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 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 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 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 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 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 f2b387b21b build(ssh): assemble relay runtime artifacts
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:03:25 -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
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
Jinjing 302b97029a P2 windows cli hardening (#8638)
* fix(cli): harden Windows launcher transports

* Fix csc.exe compile failures on space-bearing Windows install paths

- Legacy csc.exe mangles absolute paths containing spaces, so the
  compile step now cd's into the bin directory and passes bare
  file names for /out and the source file instead of full paths
2026-07-13 18:58:21 -07:00
JinjingandOrca e98bfd67c1 Fix e2e tests (#8495)
* fix(e2e): repair release e2e suite — parking regression tests, stale/flaky specs, profile switcher gate

Diagnosed 20 failing tests across the release e2e shards. Most are test debt,
plus two genuine product-side issues.

Product fixes:
- OrcaProfileSwitcher: the PROD gate hid the "Switch profile" button in the
  e2e build (electron-vite build bakes NODE_ENV=production). Exempt
  MODE==='e2e' so the specs render it while packaged prod builds stay hidden.

Parking cluster (8 tests): #8262 intentionally keeps the most-recently-hidden
tab warm (exempt from cold-park). The specs hid exactly one tab — always the
exempt one — so it never parked. Open a throwaway decoy tab that absorbs the
last-active exemption so the target parks. (terminal-hidden-view-parking,
terminal-pane-close-layout-consistency)

Stale tests updated to match intended product behavior:
- rich-markdown-link-bubble: match Edit link by aria-label (title dropped in #8307)
- terminal-codex-hidden-startup-background: drop the dead hiddenRendererSkipCount
  poll (Phase-4 main-side delivery gate #7214 bypasses that renderer path)

Brittle threshold/geometry/timing hardening (no product regression):
- agent-session-log-tail-stability: assert full-model length instead of a
  machine-specific word-wrap pixel baseline
- artificial-opencode revisit: dedicated under-backpressure latency bound
- terminal-history-size-typing-latency: gate p90 not max (tolerate one
  checkpoint-in-window spike; median stays strict)
- combined-diff-scroll-restore: assert viewport barely moved vs exact anchor key
- terminal-shortcuts: idempotent kitty-flag reset instead of a racing stack pop
- agent-session-live-force-exit-resume: drive the product quit-capture path
- renderer-crash-recovery-terminal-input: poll the transport probe over the
  recovery budget (still flags a permanently frozen pane)

terminal-push-delivery-loss-recovery left unchanged (no safe test-only
improvement; recovery is wall-clock bounded with ample slack).

* Extract shared parking helpers into terminal-hidden-parking.ts for e2e s

- Deduplicate waitForTabParked/parkHiddenTabBehindDecoy, previously
  copy-pasted across the parking and layout-consistency specs
- Parameterize parkDelayMs so the helper no longer depends on a
  file-local PARKING_DELAY_MS constant

* fix(e2e): second pass — fix link-editor Escape regression + deeper test failures

CI validated round 1 (parking + 5 areas green). This fixes the tests that were
still red because the first fix cleared only the first assertion or the root
cause was deeper.

Product fix (real regression found by the test):
- RichMarkdownLinkBubble: Escape while editing a link dismissed the whole bubble
  instead of cancelling the edit. #8307 added a container-level Escape→onDismiss
  with stopPropagation, but the edit input's older Escape→onEditCancel never
  stopped propagation, so both fired. Add e.stopPropagation() in the input's
  Escape branch so editing Escape only cancels the edit.

Test fixes:
- agent-session-live-force-exit-resume: wait for hydrationSucceeded (not just
  workspaceSessionReady) before persisting — shouldPersistWorkspaceSession gates
  the writer on it, so the record write was a silent no-op until hydration.
- terminal-shortcuts: clear the shell line deterministically (Ctrl-U + Ctrl-C)
  then send the kitty flag reset as its own settled command, so the reset byte
  isn't swallowed mid line-edit.
- agent-session-log-tail-stability: allow a 25MB GC-noise margin on the
  append-vs-replacement peak comparison. The append path provably allocates less
  than the replacement control (which also encode/decode/setValue), so a peak
  above it is uncollected-transient noise, not a regression; the deterministic
  retention budget and bench are untouched.
- artificial-opencode hidden-restore: 1500→2000ms for whole-buffer serialize-poll
  overhead under reveal (still 2x stricter than main's 4s).
- terminal-push-delivery-loss-recovery: assert the observable watchdog healCount>0
  instead of 'wedged-123' in the pane. In headless e2e a desktop-only local pty
  has no main headless emulator, so getMainBufferSnapshot falls back to the
  blackholed renderer xterm and the repaint cannot carry the wedged bytes.

* fix(e2e): third pass — harden the last 4 chronic/flaky e2e gates

- agent-session-live-force-exit-resume: raise persisted-record poll 15s→30s
  (two-stage debounced write + main scheduleSave needs headroom under the CI
  event-loop starvation that also drifts renderer timers ~1s in this shard);
  on miss, dump store vs disk state to distinguish a lost write from slow flush.
- artificial-opencode-terminal-load: add MAX_TIMER_DRIFT_UNDER_LOAD_MS (2.5s)
  for the injected-load scenarios, mirroring MAX_WORST_KEY_LATENCY_UNDER_LOAD_MS;
  baseline single-terminal gate stays at 250ms.
- combined-diff-scroll-restore: converge the after-tab-switch anchor via bounded
  retry (Monaco restores scroll over several layout passes) before asserting;
  a genuine restore miss still fails since the last anchor is returned on timeout.
- terminal-reattach-mouse-mode-leak: poll rAFs until the enable-mouse-events
  class lands after re-arming instead of a single frame (batched xterm render).

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

* Widen timer-drift and scroll-restore budgets for loaded/slow e2e scenari

- Add maxTimerDriftUnderLoadMs budget so multi-pane opencode redraw
  scenarios aren't judged against the unloaded timer-drift ceiling
- Start the combined-diff scroll-restore poll window after the initial
  viewport anchor settles, since that settle can itself take up to 15s

* fix(e2e): round-2 — gate mouse-probe on arm capability; align revisit budgets

- terminal-reattach-mouse-mode-leak: xterm binds the enable-mouse-events class
  and the motion listener together in one _handleProtocolChange; some headless CI
  renderers never bind it on a warm reattach (core mouseTrackingMode still flips),
  so the positive control cannot arm. Poll a bounded window for arming, then skip
  when it never arms (matching the pane-manager/shell guards) instead of failing.
- artificial-opencode-terminal-load: the worktree-revisit scenario sampled worst-key
  and timer drift under ACK-gate-held load but asserted the strict unloaded budgets
  (worst seen ~2s); switch it to the under-load budgets like its siblings.

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

* Expand timer-drift budget test coverage to all scenario branches

- Splits the pass/fail assertions into separate it blocks and adds
  it.each over all four isUnderLoadTimerDriftScenario matches (two
  exact, two prefix) so a predicate regression can't silently fall
  back to the unloaded 150ms ceiling for any of them.

---------

Co-authored-by: Orca <help@stably.ai>
2026-07-13 00:48:51 -07:00
Kaynan Sampaio de CamargoandJinjing c3ab805d12 fix(agent-hooks): drain stdin before hook script early exits so agents never hit EPIPE (#8430)
* Fix hook scripts to drain stdin before any early-exit path

Generated agent hook scripts and missing-script launchers could exit
successfully before consuming the payload written to their stdin,
leaving the writer with a broken pipe (EPIPE/ERROR_BROKEN_PIPE) once
the reader closed early. Capture stdin (or drain it via a shared
epilogue/fast-path guard) before any whole-script success exit across
all POSIX, batch, PowerShell, and Git Bash launcher variants, and add
a cross-agent lifecycle test suite plus a live Electron verification
script to guard the contract going forward.

* Harden hook scripts against unreadable managed scripts and add a Claude/

- Extend the POSIX launcher guard to also require `[ -r ]`, not just `-f`/`-x`,
  so an executable-but-unreadable managed script still drains stdin instead of
  erroring or silently misbehaving.
- Add a verifier case (`verifyClaudeDevinSkip`) that spins up a local HTTP
  server and confirms the Claude hook never forwards a request that Devin
  already imported, catching accidental double-forwarding.
- Update installer-utils tests and stdin-lifecycle docs to match the new
  readable-file guard and the added verification case.

* Fix hook-launcher verification to derive script paths from the installed

Extract the quoted path from the launcher's `if [ -f '...'` clause instead of
reconstructing it via join(home, ...), so missing/failing-script test cases
can't silently fall through to the real script if the install layout changes.

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-07-13 00:26:22 -07:00
Jinjing b69c6043e3 Ssh watcher isolation e2e (#8494)
* Add a Docker SSH watcher-isolation E2E test to verify remote relay-watch

- Covers two scenarios: crashed watcher children are respawned under the
  same relay without dropping the terminal PTY or file-explorer view, and
  a missing deployed relay-watcher.js artifact is repaired on reconnect
- Extracts shared connect/disconnect/reconnect logic out of the perf spec
  into docker-ssh-relay-connection.ts, and adds docker-ssh-relay-processes.ts
  for inspecting/signaling remote relay and watcher PIDs
- Wires the new spec into a dedicated CI job and pnpm script

* Fix Windows and Linux-only issues in Docker SSH watcher-isolation E2E ha

- node-gyp override only applies on Linux runners now, since the CI job
  moved to ubuntu-latest but shares the workflow with non-Linux jobs
- spawn the e2e runner scripts through a shell on win32 to satisfy
  Node's CVE-2024-27980 restriction on unshelled .cmd spawns
- harden relay process row parsing against empty pid/ppid fields so a
  vanished /proc entry fails loudly instead of coercing to pid 0
- dedupe the reconnect helpers and export shellQuote for reuse across
  the docker-ssh-relay test helpers
2026-07-12 23:50:00 -07:00
Brennan Benson 43e481b1c3 Revert "Decouple feature copy from translated locale catalogs (#8488)" (#8500)
This reverts commit a5e9e139b1.
2026-07-12 23:43:07 -07:00
Brennan Benson a5e9e139b1 Decouple feature copy from translated locale catalogs (#8488)
* Decouple feature copy from locale catalogs

* Update PR workflow contract tests

* Address localization review findings

* Document localization cache context
2026-07-12 23:42:45 -07:00