Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
43645e5
feat(push): carry a notification's workspace server to the phone (#26…
Jinwoo-H Oct 11, 2026
76687bf
ci(relay-staging): let the staging load ask for asia-east2 from a hos…
Jinwoo-H Oct 11, 2026
b241ba5
test(ci): point server-scope qualification fixtures at SSH after rela…
Jinwoo-H Oct 11, 2026
305474c
ci(relay-staging): split the staging load across two hosted runners (…
Jinwoo-H Oct 11, 2026
c37ce7a
fix(zsh): keep deferred line-init defined for plugins that call it by…
nwparker Oct 11, 2026
58d1d8d
fix(persistence): save editor-only host sessions during quit (#26848)
nwparker Oct 11, 2026
7abee44
feat(mobile): show SSH host health on the workspace row badge (#26415)
Jinwoo-H Oct 11, 2026
de00a4f
feat(runtime): let a paired desktop register its phones as phone devi…
Jinwoo-H Oct 11, 2026
08c8d30
fix(e2ee): stop dropping terminal output on a backed-up legacy connec…
Jinwoo-H Oct 11, 2026
b197bc6
fix(remote): move tabs into a split-off group on the server too (#26522)
Jinwoo-H Oct 11, 2026
29b0aa5
test(relay): load generator can reopen a closed phone splice instead …
Jinwoo-H Oct 11, 2026
5a0795a
fix(browser): double-click in the address bar selects a word, like ot…
Jinwoo-H Oct 11, 2026
c19e2dd
fix(relay-load): reuse an Asia load principal set for shards past the…
Jinwoo-H Oct 11, 2026
38aa54f
fix(doc-preview): serve authorized web fonts as binary bytes (#26849)
nwparker Oct 11, 2026
ff5c284
feat(mobile): relay a paired phone's server-workspace requests throug…
Jinwoo-H Oct 11, 2026
6a77d05
refactor(runtime): compose typed file search and listing ownership (#…
nwparker Oct 11, 2026
68dc48a
fix(packaging): unpack the orcad serve-selection entry so orca serve …
OrcaWin Oct 11, 2026
cc5c85f
ci: ship the orcad template in hourly and daily builds (#27407)
OrcaWin Oct 11, 2026
d56c0fb
fix(runtime): publish project setup changes and retire stale worktree…
nwparker Oct 11, 2026
e3be586
fix(ssh): a fast remote directory listing no longer reports a false f…
nwparker Oct 11, 2026
e9928c3
feat(mobile): let the desktop list its servers and their workspaces f…
Jinwoo-H Oct 11, 2026
ec460e5
fix(rate-limits): route Codex usage requests through the configured p…
nwparker Oct 11, 2026
0024735
fix(ssh): remove the relay-only remote workspace sync so reconnect ne…
OrcaWin Oct 11, 2026
6b747f8
test(e2e): delete helpers orphaned by relay deletion (#27411)
OrcaWin Oct 11, 2026
57452c6
Fix cold proxy authentication in the desktop HTTP client (#26957)
nwparker Oct 11, 2026
a46ddb8
fix(composer): keep current choices when a delayed review lookup retu…
nwparker Oct 11, 2026
12a8fc0
fix(relay): report event-loop freezes and keep seat polls off the cel…
Jinwoo-H Oct 11, 2026
2bdb553
fix(relay): director reaches Cloud SQL through a proxy sidecar (stagi…
Jinwoo-H Oct 11, 2026
c5778f3
ci: drop the relay Windows process-tree job from desktop packaging (#…
OrcaWin Oct 11, 2026
264dc34
fix(automations): find folder-workspace targets on the Automations pa…
OrcaWin Oct 11, 2026
80d34c3
fix(browser): refuse web pages on the agent-browser CDP proxy (#27415)
OrcaWin Oct 11, 2026
e8b3981
Remove the unused runtime text-search spawn hook (#27418)
nwparker Oct 11, 2026
3727780
test(ssh): hostile-host cells state managed-orcad expectations only (…
OrcaWin Oct 11, 2026
c69f9d2
Add manual cleanup for worktree Electron storage (#27414)
nwparker Oct 11, 2026
2d5e9b6
fix(pty): only force-kill processes in the terminal's own Linux sessi…
OrcaWin Oct 11, 2026
34d7884
chore(ratchet): one focus-read ratchet (#27426)
OrcaWin Oct 11, 2026
e3d747b
fix(runtime): scope layout.unsubscribe to the caller's connection (#2…
Jinwoo-H Oct 11, 2026
6239c0c
fix(linux): stop the AppImage crashpad handler before the mount goes …
sergeytiron Oct 11, 2026
92e204f
test(ssh): Windows host lane drops relay cells (#27421)
OrcaWin Oct 11, 2026
f8ea867
feat(daemon): observe-only fork gate for automatic terminal restores …
OrcaWin Oct 11, 2026
2148111
refactor(renderer): delete dead owner and settings shims (#27430)
OrcaWin Oct 11, 2026
b53ba14
fix(linux): launch the AppImage terminal daemon through its own mount…
OrcaWin Oct 11, 2026
be59462
feat(daemon): pace automatic terminal restores on headless hosts (#27…
OrcaWin Oct 11, 2026
5651141
chore: delete verified-unused modules and exports (#27438)
OrcaWin Oct 11, 2026
6ad1a67
refactor(rpc): delete the SSH-bridge caller scope (#27440)
OrcaWin Oct 11, 2026
0418773
feat(daemon): pause automatic restores after a same-boot crash (#27433)
OrcaWin Oct 11, 2026
398cb84
fix(serve): report secrets unavailable instead of hanging on an unrea…
OrcaWin Oct 11, 2026
7263f49
refactor(rpc): name the terminal.subscribe modules (#27444)
OrcaWin Oct 11, 2026
c2624ab
feat(daemon): process-growth breaker that pauses automatic restores (…
OrcaWin Oct 11, 2026
43bf799
fix(daemon): drop a legacy daemon that can no longer accept a connect…
OrcaWin Oct 11, 2026
e2339f2
fix(daemon): count a claimed agent resume as automatic even without a…
OrcaWin Oct 11, 2026
ff5be7f
fix(runtime): reuse cached worktree rows when the admin probe cannot …
OrcaWin Oct 11, 2026
616e9c3
refactor(cli): extract the serve supervisor's after-exit decision int…
OrcaWin Oct 11, 2026
061cb22
refactor(orcad): shared serve-option validation; no daemon barrel (#2…
OrcaWin Oct 11, 2026
6d51651
[CI] Remove copied probes and advance queued-card test waits (#27447)
nwparker Oct 11, 2026
4468a53
fix(terminal): phone wake reaches mounted hibernated agent panes (#27…
OrcaWin Oct 11, 2026
71905c4
merge: sync fork-main from stablyai/orca main
karlorz Oct 11, 2026
58ffb7e
fix(ci): classify pet.speak.subscribe for mobile desktop relay
karlorz Oct 11, 2026
0de5682
fix(ci): expose fs.constants on daemon-init test mocks
karlorz Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
39 changes: 12 additions & 27 deletions .github/workflows/adhoc-mac-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,18 +128,6 @@ jobs:
echo "Resolved $REQUESTED_REF -> $sha"
echo "sha=$sha" >>"$GITHUB_OUTPUT"

# Why its own job: this package ships relays for Windows SSH hosts, and only a
# Windows runner compiles the addon that launches one outside sshd's job.
# Why the unvetted ref is safe here: this job holds no secrets, and the mac job
# vets the same ref before it downloads anything, so fork code never gets signed.
relay-windows-process-tree:
needs: resolve-ref
permissions:
contents: read
uses: ./.github/workflows/relay-windows-process-tree.yml
with:
ref: ${{ needs.resolve-ref.outputs.sha }}

# Why: a branch cut before the orcad template landed has none to build or ship.
orcad-template-support:
needs: resolve-ref
Expand All @@ -156,8 +144,17 @@ jobs:
ref: ${{ needs.resolve-ref.outputs.sha }}
sparse-checkout: |
/config/scripts/packaged-orcad-template.cjs
/config/tsconfig.relay.json
sparse-checkout-cone-mode: false
persist-credentials: false
# Why: a relay-era ref (before #27215) needs the Windows relay addon this build no longer compiles.
- name: Refuse a ref that still ships the SSH relay
shell: bash
run: |
if [[ -e config/tsconfig.relay.json ]]; then
echo "::error::This ref predates #27215 and still ships the SSH relay; build a commit at or after 2b4b60a87e."
exit 1
fi
- name: Detect whether the ref ships the orcad template
id: detect
shell: bash
Expand All @@ -171,8 +168,8 @@ jobs:

# Design D2, as release-cut does: every desktop build ships the orcad template (server JS plus
# every target's addons), merged from the node-server lanes that qualify each slot at this ref.
# Without it an adhoc build cannot deploy managed orcad to an SSH host. No secrets, like the
# relay job, and the mac job vets the ref before anything is signed.
# Without it an adhoc build cannot deploy managed orcad to an SSH host. No secrets, and the mac
# job vets the ref before anything is signed.
orcad-template:
needs: [resolve-ref, orcad-template-support]
if: needs.orcad-template-support.outputs.ships == 'true'
Expand All @@ -184,11 +181,10 @@ jobs:
build_template: true

build-adhoc-mac:
needs: [resolve-ref, relay-windows-process-tree, orcad-template-support, orcad-template]
needs: [resolve-ref, orcad-template-support, orcad-template]
# Why not the implicit success(): a ref without the orcad template skips that job on purpose.
if: >-
!cancelled() && github.repository == 'stablyai/orca' &&
needs.relay-windows-process-tree.result == 'success' &&
needs.orcad-template-support.result == 'success' &&
(needs.orcad-template.result == 'success' ||
(needs.orcad-template.result == 'skipped' &&
Expand Down Expand Up @@ -371,14 +367,6 @@ jobs:
fi
cat "$RUNNER_TEMP/adhoc-identity.txt" >>"$GITHUB_OUTPUT"

# Only a Windows runner compiles these; the relay-windows-process-tree job
# built them for this run.
- name: Collect the Windows process-table addons for the relay
uses: actions/download-artifact@v8
with:
name: relay-windows-process-tree
path: .build/windows-process-tree

- name: Build app
run: pnpm build:release
env:
Expand All @@ -387,9 +375,6 @@ jobs:
# gate accepts only 'stable' or 'rc', so leaving this unset keeps them
# silent, which is correct for unvetted branch artifacts.
ORCA_DIAGNOSTICS_TOKEN_URL: https://www.onorca.dev/diagnostics/token
# Fail the build rather than ship a relay that cannot launch outside
# sshd's job for a standard user on a Windows SSH host.
ORCA_REQUIRE_RELAY_NATIVE_ADDONS: x64,arm64

# After the app build so nothing that cleans out/ can drop it; electron-builder ships it.
- name: Download the orcad deployment template
Expand Down
16 changes: 16 additions & 0 deletions .github/workflows/cloud-deploy-relay-production-director.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ on:
description: Exact immutable serving predecessor digest for the one-time identity bootstrap
required: true
type: string
shape-baseline-revision:
description: Only after a Terraform apply changed the director template. The apply's 0% revision, whose shape the deploy adopts
required: false
type: string

permissions:
contents: read
Expand Down Expand Up @@ -93,6 +97,7 @@ jobs:
EXPECTED_REHOME_GENERATION: ${{ inputs.expected-rehome-generation }}
BOOTSTRAP_RUNTIME_IDENTITY: ${{ inputs.bootstrap-runtime-identity }}
PREDECESSOR_IMAGE_DIGEST: ${{ inputs.predecessor-image-digest }}
SHAPE_BASELINE_REVISION: ${{ inputs.shape-baseline-revision }}
steps:
- uses: actions/checkout@v4

Expand Down Expand Up @@ -140,7 +145,13 @@ jobs:
[[ "${PREDECESSOR_IMAGE_DIGEST}" =~ ^sha256:[a-f0-9]{64}$ ]]
test "${PRUNE_INCOMPATIBLE_REVISIONS}" = false
test "${REGIONAL_PLACEMENT_MODE}" = preserve
test -z "${SHAPE_BASELINE_REVISION}"
test "${CONFIRMATION}" = BOOTSTRAP_RELAY_DIRECTOR_REHOME_IDENTITY
elif test -n "${SHAPE_BASELINE_REVISION}"; then
[[ "${SHAPE_BASELINE_REVISION}" =~ ^orca-cloud-relay-[0-9]{5}-[a-z0-9]{3}$ ]]
test "${PRUNE_INCOMPATIBLE_REVISIONS}" = false
test "${REGIONAL_PLACEMENT_MODE}" = preserve
test "${CONFIRMATION}" = ADOPT_RELAY_DIRECTOR_TERRAFORM_SHAPE
elif test "${PRUNE_INCOMPATIBLE_REVISIONS}" = true; then
test "${REGIONAL_PLACEMENT_MODE}" = preserve
test "${CONFIRMATION}" = PRUNE_INCOMPATIBLE_RELAY_DIRECTOR_REVISIONS
Expand Down Expand Up @@ -222,12 +233,17 @@ jobs:
fi
[[ "${target_version}" =~ ^[1-9][0-9]*$ ]]
RELEASE_ID="${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}-${GITHUB_SHA:0:8}"
shape_args=()
if test -n "${SHAPE_BASELINE_REVISION}"; then
shape_args=(--shape-baseline-revision "${SHAPE_BASELINE_REVISION}")
fi
node dev/scripts/deploy-relay-blue-green.mjs \
--project "${GCP_PROJECT_ID}" \
--region "${GCP_REGION}" \
--service "${DIRECTOR_SERVICE_NAME}" \
--image "${IMAGE}" \
--role director \
"${shape_args[@]}" \
--runtime-service-account "${DIRECTOR_RUNTIME_SERVICE_ACCOUNT}" \
--predecessor-runtime-service-account "${PREDECESSOR_RUNTIME_SERVICE_ACCOUNT}" \
--bootstrap-runtime-identity "${BOOTSTRAP_RUNTIME_IDENTITY}" \
Expand Down
18 changes: 17 additions & 1 deletion .github/workflows/cloud-deploy-relay-staging.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,11 @@ on:
type: choice
options: [preserve, '0', '2']
confirmation:
description: BOOTSTRAP_RELAY_DIRECTOR_REHOME_IDENTITY for a bootstrap
description: BOOTSTRAP_RELAY_DIRECTOR_REHOME_IDENTITY for a bootstrap, ADOPT_RELAY_DIRECTOR_TERRAFORM_SHAPE with a shape baseline
required: false
type: string
shape-baseline-revision:
description: Only after a Terraform apply changed the director template. The apply's 0% revision, whose shape the deploy adopts
required: false
type: string
shadow-seat-feed-cells:
Expand Down Expand Up @@ -86,6 +90,7 @@ jobs:
PREDECESSOR_IMAGE_DIGEST: ${{ inputs.predecessor-image-digest }}
CAPACITY_CELL_ID: ${{ inputs.capacity-cell-id }}
MIN_INSTANCES: ${{ inputs.min-instances }}
SHAPE_BASELINE_REVISION: ${{ inputs.shape-baseline-revision }}
steps:
- uses: actions/checkout@v4

Expand All @@ -106,6 +111,12 @@ jobs:
else
test -z "${PREDECESSOR_IMAGE_DIGEST}"
fi
if test -n "${SHAPE_BASELINE_REVISION}"; then
[[ "${SHAPE_BASELINE_REVISION}" =~ ^orca-cloud-relay-staging-[0-9]{5}-[a-z0-9]{3}$ ]]
test "${BOOTSTRAP_RUNTIME_IDENTITY}" = false
test "${CAPACITY_CELL_ID}" = none
test "${CONFIRMATION}" = ADOPT_RELAY_DIRECTOR_TERRAFORM_SHAPE
fi

- uses: hashicorp/setup-terraform@v3
with:
Expand Down Expand Up @@ -186,6 +197,10 @@ jobs:
if test "${MIN_INSTANCES}" != preserve; then
floor_args=(--min-instances "${MIN_INSTANCES}")
fi
shape_args=()
if test -n "${SHAPE_BASELINE_REVISION}"; then
shape_args=(--shape-baseline-revision "${SHAPE_BASELINE_REVISION}")
fi
topology_args=()
if test "${CAPACITY_CELL_ID}" != none; then
topology_args=(
Expand All @@ -207,6 +222,7 @@ jobs:
"${floor_args[@]}" \
--runtime-service-account "${DIRECTOR_RUNTIME_SERVICE_ACCOUNT}" \
"${identity_args[@]}" \
"${shape_args[@]}" \
--rehome-director-service-account "${DIRECTOR_RUNTIME_SERVICE_ACCOUNT}" \
--rehome-audience "${REHOME_AUDIENCE}" \
--rehome-control-origin https://relay-staging.onorca.dev \
Expand Down
39 changes: 31 additions & 8 deletions .github/workflows/cloud-prove-relay-asia-staging.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,27 @@ on:
required: false
type: string
load-region:
description: Load only. asia-east2 runs on the Asia load runner; us-central1 on a hosted runner
description: >-
Load only. asia-east2 runs on the Asia load runner; asia-east2-hosted asks for asia-east2
from a hosted runner; us-central1 runs on a hosted runner
required: false
default: asia-east2
type: choice
options: [asia-east2, us-central1]
options: [asia-east2, asia-east2-hosted, us-central1]
load-shards:
description: Load only. Generator processes, each with its own shard of the 32 load principals
required: false
default: '4'
type: choice
options: ['1', '2', '3', '4']
load-runners:
description: >-
Load only, hosted runners only. Runner machines, each with load-shards generators; one
hosted runner holds about 2,000 connections to one cell
required: false
default: '1'
type: choice
options: ['1', '2']
load-args:
description: >-
Load only. Per-shard generator arguments, e.g. --controls 150 --splices 15
Expand Down Expand Up @@ -364,14 +374,21 @@ jobs:
# free-form staging load lives here rather than in a workflow of its own.
load:
if: ${{ vars.ORCA_CLOUD_OPERATIONS_ENABLED == 'true' && (github.ref == 'refs/heads/main') && inputs.mode == 'load' }}
runs-on: ${{ inputs.load-region == 'us-central1' && 'ubuntu-latest' || fromJSON('["self-hosted","linux","x64","relay-asia-east2-load"]') }}
runs-on: ${{ inputs.load-region == 'asia-east2' && fromJSON('["self-hosted","linux","x64","relay-asia-east2-load"]') || 'ubuntu-latest' }}
strategy:
# One runner's failure must not drop the other half of the load mid-run.
fail-fast: false
matrix:
runner: ${{ fromJSON(inputs.load-runners == '2' && '[0, 1]' || '[0]') }}
timeout-minutes: 180
environment: staging
env:
DIRECTOR_ORIGIN: https://relay-staging.onorca.dev
AUTH_ORIGIN: https://auth-staging.onorca.dev
LOAD_REGION: ${{ inputs.load-region }}
LOAD_SHARDS: ${{ inputs.load-shards }}
LOAD_RUNNERS: ${{ inputs.load-runners }}
LOAD_RUNNER_INDEX: ${{ matrix.runner }}
LOAD_ARGS: ${{ inputs.load-args }}
steps:
- uses: actions/checkout@v4
Expand All @@ -383,8 +400,14 @@ jobs:
run: |
set -euo pipefail
test "${CONFIRMATION}" = LOAD_RELAY_STAGING
[[ "${LOAD_REGION}" =~ ^(asia-east2|us-central1)$ ]]
[[ "${LOAD_REGION}" =~ ^(asia-east2|asia-east2-hosted|us-central1)$ ]]
[[ "${LOAD_SHARDS}" =~ ^[1-4]$ ]]
[[ "${LOAD_RUNNERS}" =~ ^[12]$ ]]
# The Asia runner is one machine; a second matrix job would only queue behind the first.
if test "${LOAD_RUNNERS}" != 1 && test "${LOAD_REGION}" = asia-east2; then
echo "load-runners 2 needs a hosted runner" >&2
exit 1
fi
read -r -a args <<< "${LOAD_ARGS}"
for arg in "${args[@]}"; do
[[ "${arg}" =~ ^[A-Za-z0-9=:/._,-]+$ ]] || { echo "unsupported characters in load-args" >&2; exit 1; }
Expand Down Expand Up @@ -445,10 +468,10 @@ jobs:
node dev/scripts/load-relay-controls.mjs \
--director-origin "${DIRECTOR_ORIGIN}" \
--auth-origin "${AUTH_ORIGIN}" \
--preferred-region "${LOAD_REGION}" \
--preferred-region "${LOAD_REGION%-hosted}" \
--relay-asia-load-principals 32 \
--shard-count "${LOAD_SHARDS}" \
--shard-index "${shard}" \
--shard-count "$((LOAD_SHARDS * LOAD_RUNNERS))" \
--shard-index "$((LOAD_RUNNER_INDEX * LOAD_SHARDS + shard))" \
"${args[@]}" \
> "${load_dir}/shard-${shard}.jsonl" &
pids+=("$!")
Expand All @@ -468,7 +491,7 @@ jobs:
if: ${{ always() }}
uses: actions/upload-artifact@v4
with:
name: relay-staging-load-${{ github.run_id }}-${{ github.run_attempt }}
name: relay-staging-load-${{ github.run_id }}-${{ github.run_attempt }}-${{ matrix.runner }}
path: ${{ runner.temp }}/relay-staging-load/
if-no-files-found: warn
retention-days: 7
3 changes: 0 additions & 3 deletions .github/workflows/computer-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,6 @@ on:
- 'src/main/runtime/rpc/dispatcher.ts'
- 'src/main/runtime/rpc/errors.ts'
- 'src/main/runtime/rpc/methods/computer*.ts'
- 'src/main/ssh/ssh-remote-cli-launcher.ts'
- 'src/main/ssh/ssh-remote-cli-launcher.test.ts'
- 'src/shared/computer-use-*.ts'
- 'tests/e2e/computer-linux.e2e.ts'
- 'tests/e2e/computer-windows.e2e.ts'
Expand Down Expand Up @@ -85,7 +83,6 @@ jobs:
# on hosted Windows. Use the shared config so this job matches pnpm test.
- run: >-
pnpm vitest run --config config/vitest.config.ts
src/main/ssh/ssh-remote-cli-launcher.test.ts
config/scripts/macos-computer-helper-owner-loss-group-recovery.test.mjs
config/scripts/macos-computer-helper-owner-loss-processes.test.mjs
config/scripts/computer-use-smoke.test.mjs
Expand Down
Loading
Loading