Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
553443f
Consolidate desktop and WSL terminals on bundled Bun
Sep 28, 2026
09d1fb9
Normalize vendored license and fixture whitespace
Sep 28, 2026
362ba8c
Keep guest listeners detached during restart and simplify byte streams
Sep 28, 2026
7f0dfbb
Document the Node stream-pair typing gap
Sep 28, 2026
3c81563
Prepare replacement runtimes before retiring daemons and shorten prun…
Sep 28, 2026
84aa535
Recover retained WSL terminals only after exact owner exit proof
Sep 28, 2026
8dd6a15
Validate daemon identity fields without unchecked casts
Sep 28, 2026
7deaccb
Repair bundled Bun fixture results and platform test prerequisites
Sep 28, 2026
a716a7c
Keep process-group qualification compatible with stock Alpine ps
Sep 28, 2026
da9ac29
Preserve restart listener updates and bound replacement rechecks
Sep 28, 2026
40507a9
Avoid waiting for startup markers in plain guest shells
Sep 28, 2026
bf6dc89
Remove retired WSL paths from failure-semantics exceptions
Sep 28, 2026
66db147
Fix BusyBox fixture flags and extract rate-limit PTY fixtures
Sep 28, 2026
cbe2a61
Keep exported PTY mock types portable
Sep 28, 2026
2596e3d
Cold restore retained WSL panes after authenticated session absence
Sep 28, 2026
93a8997
Cover retained guest preparation failure and live attach policy
Sep 28, 2026
1daf97b
fix: prepare Windows runtime artifacts before CI probes
Sep 28, 2026
6e3e09c
test(runtime): repair migrated terminal CI contracts and BusyBox oracle
Sep 28, 2026
403fec6
Preserve daemon spawn identity after routing recovery
Sep 28, 2026
65f71db
Separate staged runtime tests from built artifact qualification
Sep 28, 2026
82bcb01
Include ConPTY files in Windows artifact materialization fixture
Sep 28, 2026
a03df6c
Remove retired in-process fallback spawn contract
Sep 28, 2026
5b9c9b5
Dispose router recovery fixtures after each test
Sep 28, 2026
d192cd0
Remove obsolete node-pty mocks from daemon IPC tests
Sep 28, 2026
c896a22
Remove unshipped node-pty patch scripts and obsolete fixtures
Sep 28, 2026
156dc0f
Run Windows Git Bash foreground proof under bundled Bun
Sep 28, 2026
6e94a24
Register terminal service retry localization messages
Sep 28, 2026
b026aee
Remove unused legacy relay native-cache creation
Sep 28, 2026
9516f2d
Bound Docker qualification phases and clean up timed-out containers
Sep 28, 2026
3581de6
test: wait for asynchronous Bun terminal descriptor cleanup
Sep 28, 2026
fa5ccd8
test: drain detached AppImage fixture writers before cleanup
Sep 28, 2026
8d516cc
test: avoid subprocesses when reading fixture process identities
Sep 28, 2026
ad07580
ci: qualify Linux Bun terminal packages without publishing
Sep 28, 2026
cf8f6a7
test: create shutdown logs before polling readiness
Sep 28, 2026
900497a
test: repair terminal lifecycle fixture contracts
Sep 28, 2026
01daa3f
fix(wsl): retain daemon protocol across client upgrades
Sep 28, 2026
237a787
fix(terminal): preserve guest streams and admission across daemon rec…
Sep 28, 2026
bce0937
fix(wsl): normalize legacy protocol metadata in owner comparisons
Sep 28, 2026
6cfa81d
fix(wsl): subscribe new guests during daemon restart
Sep 28, 2026
1ffab10
fix(terminal): consume startup output before shell confirmation
Sep 28, 2026
a2ba9fb
fix(terminal): release startup inputs and preserve cleanup errors
Sep 28, 2026
02e7f7b
fix(terminal): clean up failed and exited startup admissions
Sep 28, 2026
c7cf94b
test(terminal): model independent exit subscriptions
Sep 28, 2026
c8c74d1
Speed up headless ASCII terminal parsing with a source-derived patch
Sep 28, 2026
04d9099
Use a CommonJS-compatible path in the Unicode patch contract
Sep 28, 2026
a88eb09
fix: initialize profile updater for windowless serve
Sep 28, 2026
2956015
fix: own supervised macOS update staging through native readiness
Sep 28, 2026
c84a9f0
fix: recover when native update staging finds no update
Sep 28, 2026
fab1f1e
Use checked method access in pinned updater contract test
Sep 28, 2026
b478600
Prepare Linux offline xwin qualification
Sep 28, 2026
50cf92e
Keep runtime qualification diagnostics out of production changes
Sep 28, 2026
cdfad07
fix(ssh): canonicalize upload roots before containment checks
Sep 28, 2026
60d4f78
test(updater): distinguish macOS staging from direct installs
Sep 28, 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
  •  
  •  
  •  
9 changes: 3 additions & 6 deletions .github/actions/install-node-dependencies/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,7 @@ runs:
path: ${{ steps.electron-package-cache.outputs.cache-root }}
key: electron-package-${{ runner.os }}-${{ runner.arch }}-${{ steps.electron-package-cache.outputs.version }}

# Why cached: `--ignore-scripts` leaves node-pty without build/Release, so
# ensure-native-runtime node-gyp-compiles it in every job that asks for a runtime.
# Cache Windows registry and process-tree addons built by ensure-native-runtime.
# The artifacts are ABI-bound, so the key carries the target runtime, the resolved
# Node version, and the patch whose contents the build has to match.
# Windows extra globs are empty on Linux. No restore-keys: a partial-match key is
Expand All @@ -173,21 +172,19 @@ runs:
uses: actions/cache@v5
with:
path: |
node_modules/.pnpm/node-pty@*/node_modules/node-pty/build
native/windows-registry/build
node_modules/.pnpm/@vscode+windows-process-tre*/node_modules/@vscode/windows-process-tree/build
key: native-modules-${{ runner.os }}-${{ steps.native-cache-scope.outputs.scope }}-${{ runner.arch }}-${{ inputs.native-runtime }}-node${{ steps.requested-node.outputs.node-version || steps.default-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml', '.github/actions/install-node-dependencies/action.yml', 'config/scripts/ensure-native-runtime.mjs', 'config/scripts/rebuild-native-deps.mjs', 'config/patches/node-pty@1.1.0.patch', 'config/patches/@vscode__windows-process-tree@0.8.0.patch', 'native/windows-registry/src/addon.cc', 'native/windows-registry/binding.gyp', 'native/windows-registry/package.json') }}
key: native-modules-${{ runner.os }}-${{ steps.native-cache-scope.outputs.scope }}-${{ runner.arch }}-${{ inputs.native-runtime }}-node${{ steps.requested-node.outputs.node-version || steps.default-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml', '.github/actions/install-node-dependencies/action.yml', 'config/scripts/ensure-native-runtime.mjs', 'config/scripts/rebuild-native-deps.mjs', 'config/patches/@vscode__windows-process-tree@0.8.0.patch', 'native/windows-registry/src/addon.cc', 'native/windows-registry/binding.gyp', 'native/windows-registry/package.json') }}

- name: Restore compiled native modules without saving
id: native-cache-restore-only
if: inputs.native-runtime != 'none' && inputs.persist-native-cache == 'false'
uses: actions/cache/restore@v5
with:
path: |
node_modules/.pnpm/node-pty@*/node_modules/node-pty/build
native/windows-registry/build
node_modules/.pnpm/@vscode+windows-process-tre*/node_modules/@vscode/windows-process-tree/build
key: native-modules-${{ runner.os }}-${{ steps.native-cache-scope.outputs.scope }}-${{ runner.arch }}-${{ inputs.native-runtime }}-node${{ steps.requested-node.outputs.node-version || steps.default-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml', '.github/actions/install-node-dependencies/action.yml', 'config/scripts/ensure-native-runtime.mjs', 'config/scripts/rebuild-native-deps.mjs', 'config/patches/node-pty@1.1.0.patch', 'config/patches/@vscode__windows-process-tree@0.8.0.patch', 'native/windows-registry/src/addon.cc', 'native/windows-registry/binding.gyp', 'native/windows-registry/package.json') }}
key: native-modules-${{ runner.os }}-${{ steps.native-cache-scope.outputs.scope }}-${{ runner.arch }}-${{ inputs.native-runtime }}-node${{ steps.requested-node.outputs.node-version || steps.default-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml', '.github/actions/install-node-dependencies/action.yml', 'config/scripts/ensure-native-runtime.mjs', 'config/scripts/rebuild-native-deps.mjs', 'config/patches/@vscode__windows-process-tree@0.8.0.patch', 'native/windows-registry/src/addon.cc', 'native/windows-registry/binding.gyp', 'native/windows-registry/package.json') }}

# pnpm's bundled gyp_main.py is not executable on fresh Linux runners.
- name: Use external node-gyp
Expand Down
76 changes: 75 additions & 1 deletion .github/workflows/bun-profile-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,18 @@ on:
- '.github/actions/load-windows-watcher-artifacts/**'
workflow_dispatch:
inputs:
linux_package:
description: Package and test Linux x64 and ARM64 without publishing a release
type: boolean
default: false
signed_mac_package:
description: Sign, notarize and test macOS packages without publishing a release
type: boolean
default: false

env:
ORCA_TEST_REQUIRE_ORCAD_ARTIFACTS: '1'

permissions:
contents: read

Expand Down Expand Up @@ -183,7 +190,7 @@ jobs:
- name: Verify native Alpine artifact and persistence
run: |
docker run --rm --init -i \
-e ORCA_BACKGROUND_LAUNCH=1 \
-e ORCA_BACKGROUND_LAUNCH=1 -e ORCA_TEST_REQUIRE_ORCAD_ARTIFACTS=1 \
-v "$GITHUB_WORKSPACE:/work" -w /work \
node:24-alpine3.23 sh -s <<'BUN_QUALIFICATION'
set -eu
Expand All @@ -200,6 +207,73 @@ jobs:
node node_modules/vitest/vitest.mjs run --config config/vitest.config.ts config/scripts/orcad-companion-artifacts.test.mjs
BUN_QUALIFICATION

linux_package:
needs: windows_watcher
if: ${{ !cancelled() && github.event_name == 'workflow_dispatch' && inputs.linux_package && needs.windows_watcher.result == 'success' }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-22.04
arch: x64
unpacked_dir: dist/linux-unpacked
- os: ubuntu-24.04-arm
arch: arm64
unpacked_dir: dist/linux-arm64-unpacked
runs-on: ${{ matrix.os }}
timeout-minutes: 90
env:
ORCA_BACKGROUND_LAUNCH: '1'
NODE_OPTIONS: --max-old-space-size=4096
PACKAGE_ARCH: ${{ matrix.arch }}
PACKAGE_DIRECTORY: ${{ matrix.unpacked_dir }}
ORCA_LINUX_ARM64_RELEASE: ${{ matrix.arch == 'arm64' && '1' || '0' }}
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.sha }}
persist-credentials: false
- uses: ./.github/actions/load-windows-watcher-artifacts
- uses: ./.github/actions/install-node-dependencies
with:
native-runtime: electron
cache-dependency-path: |
pnpm-lock.yaml
mobile/pnpm-lock.yaml
- uses: ./.github/actions/install-mobile-dependencies
- name: Install Linux package and computer-use dependencies
run: sudo apt-get update && sudo apt-get install -y python3-gi gir1.2-atspi-2.0 at-spi2-core xclip xdotool rpm
- run: pnpm build:release
- name: Package without release publication
run: |
node config/scripts/ensure-native-runtime.mjs --runtime=electron
pnpm exec electron-builder --config config/electron-builder.config.cjs --linux AppImage deb rpm --"$PACKAGE_ARCH" --publish never
- name: Preserve exact package and provenance
run: |
set -euo pipefail
mkdir -p "$RUNNER_TEMP/linux-package-evidence"
git rev-parse HEAD > "$RUNNER_TEMP/linux-package-evidence/source-commit.txt"
uname -a > "$RUNNER_TEMP/linux-package-evidence/host-kernel.txt"
tar -czf "$RUNNER_TEMP/linux-package-evidence/unpacked-$PACKAGE_ARCH.tar.gz" -C "$PACKAGE_DIRECTORY" .
(cd "$PACKAGE_DIRECTORY" && find . -type f -print0 | sort -z | xargs -0 sha256sum) > "$RUNNER_TEMP/linux-package-evidence/payload-sha256.txt"
sha256sum dist/*.AppImage dist/*.deb dist/*.rpm > "$RUNNER_TEMP/linux-package-evidence/installers-sha256.txt"
(cd "$RUNNER_TEMP/linux-package-evidence" && sha256sum "unpacked-$PACKAGE_ARCH.tar.gz") > "$RUNNER_TEMP/linux-package-evidence/archive-sha256.txt"
- name: Qualify packaged terminal on Ubuntu 20.04 userspace
run: |
set -euo pipefail
node config/scripts/run-linux-packaged-terminal-floor-smoke.mjs --app-dir "$PACKAGE_DIRECTORY" 2>&1 | tee "$RUNNER_TEMP/linux-package-evidence/floor-smoke.log"
- uses: actions/upload-artifact@v7
if: ${{ always() }}
with:
name: bun-linux-package-${{ matrix.arch }}
path: |
${{ runner.temp }}/linux-package-evidence/
dist/*.AppImage
dist/*.deb
dist/*.rpm
if-no-files-found: error
retention-days: 7

signed_mac_package:
needs: windows_watcher
if: ${{ !cancelled() && github.event_name == 'workflow_dispatch' && inputs.signed_mac_package && github.repository == 'stablyai/orca' && startsWith(github.ref, 'refs/heads/') && needs.windows_watcher.result == 'success' }}
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/ci-cache-warmup.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ on:
- 'config/tsconfig*.json'
- 'config/scripts/ensure-native-runtime.mjs'
- 'config/scripts/rebuild-native-deps.mjs'
- 'config/patches/node-pty@1.1.0.patch'
- 'config/patches/@vscode__windows-process-tree@0.8.0.patch'
- 'native/windows-registry/**'
pull_request:
Expand Down
27 changes: 19 additions & 8 deletions .github/workflows/computer-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,21 @@ on:
- 'config/scripts/daemon-endpoint-handover-smoke.mjs'
- 'config/scripts/windows-daemon-workspace-close-repro.mjs'
- 'config/scripts/verify-computer-native.mjs'
# Why: the native-smoke job boots the built terminal daemon under plain
# Node, so any change to the daemon bundle graph or the main build must
# re-run it (the v1.4.129-rc.1 daemon outage shipped with green CI).
# Runtime and standalone bundle changes must exercise actual daemon startup.
- 'config/scripts/daemon-smoke-launch*'
- 'config/scripts/build-terminal-daemon.mjs'
- 'config/scripts/orcad-entry-build.mjs'
- 'config/scripts/build-cli-runtime.mjs'
- 'config/scripts/build-orcad-bun.mjs'
- 'config/scripts/build-windows-conpty.mjs'
- 'config/licenses/windows-conpty-LICENSE.txt'
- 'resources/licenses/bun/**'
- 'config/bundled-cli-runtime.cjs'
- 'src/shared/orcad-bun-runtime.ts'
- 'src/shared/windows-conpty-release.ts'
- 'electron.vite.config.ts'
- 'config/build-plugins/**'
- 'src/main/daemon/**'
- 'src/main/providers/local-pty-provider.ts'
- 'src/main/providers/windows-shell-args.ts'
- 'src/main/providers/windows-shell-preflight-runtime.windows.test.ts'
- 'native/computer-use-macos/**'
Expand Down Expand Up @@ -81,6 +89,11 @@ jobs:
- uses: ./.github/actions/install-node-dependencies
with:
native-runtime: node
- name: Prepare pinned Bun for Windows shell fixtures
if: runner.os == 'Windows'
run: node --input-type=module -e "import { buildCliRuntime } from './config/scripts/build-cli-runtime.mjs'; await buildCliRuntime(process.platform, process.arch)"
- name: Build terminal service and Windows gate for shell fixtures
run: pnpm run build:terminal-daemon
# Why: without --config, bare vitest ignores config/vitest.config.ts (there
# is no root config) and falls back to the 5s default timeout with no
# Windows worker cap, so the real csc.exe launcher-compile tests time out
Expand Down Expand Up @@ -126,10 +139,8 @@ jobs:
- run: pnpm verify:computer-native
- run: pnpm build:cli
- run: pnpm run build:electron-vite:parallel
# Why: boot the BUILT daemon-entry under plain Node the way production
# forks it. v1.4.129-rc.1 shipped a daemon that exited at module load
# (leaked electron require) while every other check passed; this fails
# the PR when the built daemon cannot start on ubuntu-22.04 / windows.
- run: pnpm exec vitest run --config config/vitest.config.ts config/scripts/daemon-smoke-launch.test.mjs
# Exercise the shipped Bun runtime and standalone daemon bundle together.
- name: Daemon boot smoke
run: node config/scripts/daemon-boot-smoke.mjs
# Why: a daemon that lost its endpoint name used to delete the replacement's
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ jobs:
with:
ref: ${{ inputs.ref || github.ref }}

# Why: the build's plain-Node daemon smoke load resolves node-pty.
# Build checks require the Electron runtime and Windows native addons.
- uses: ./.github/actions/install-node-dependencies
with:
native-runtime: node
Expand All @@ -77,6 +77,8 @@ jobs:
VITE_EXPOSE_STORE: 'true'
run: |
status=0
pnpm run build:cli || status=1
pnpm run build:terminal-daemon || status=1
pnpm run build:relay &
relay_pid=$!
npx electron-vite build --mode e2e || status=1
Expand Down
Loading
Loading