mirror of
https://github.com/stablyai/orca.git
synced 2026-11-01 17:47:40 +00:00
Extract subprocess execution and process contracts into @orca/process-host with explicit public entry points, independent checks, and one Node 18 compatible CommonJS runtime. Migrate application consumers and integrate package builds, dependency selection, import enforcement, and runtime resource staging. Preserve daemon startup ownership and profile isolation, and qualify development rebuild recovery and concurrent output publication. Remove unnecessary aliases, test forwarding exports, and a duplicate output scan. Validation: full typechecks, changed-code quality, package and artifact checks, native Windows builds/types plus 306 runtime tests, and independent native reviews. Matched full E2E controls on original main and unchanged reviewed head both pass all 17 applicable tests (nine skips). Earlier intermittent E2E failures are documented in the PR; no assertions were weakened. The final combined-tree audit preserves both branches with no import-boundary violations.
190 lines
7.8 KiB
YAML
190 lines
7.8 KiB
YAML
name: Terminal Perf
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
ref:
|
|
description: Ref to check out (defaults to the workflow ref)
|
|
required: false
|
|
type: string
|
|
grep:
|
|
description: Optional Playwright grep for a targeted terminal perf run
|
|
required: false
|
|
type: string
|
|
report_path:
|
|
description: Path for the generated terminal perf JSON report
|
|
required: false
|
|
type: string
|
|
frame_count:
|
|
description: Number of prompt redraw frames per typing measurement
|
|
required: false
|
|
type: string
|
|
frame_interval_ms:
|
|
description: Milliseconds between synthetic OpenCode redraw frames
|
|
required: false
|
|
type: string
|
|
pressure_output_chars:
|
|
description: Bytes/chars each ACK-backpressured real PTY should emit
|
|
required: false
|
|
type: string
|
|
scale_panes:
|
|
description: Comma-separated same-workspace pane counts
|
|
required: false
|
|
type: string
|
|
scale_cross_workspace_panes:
|
|
description: Comma-separated hidden cross-workspace pane counts
|
|
required: false
|
|
type: string
|
|
scale_pressure_panes:
|
|
description: Comma-separated active real-PTY pressure pane counts
|
|
required: false
|
|
type: string
|
|
scale_hidden_pressure_panes:
|
|
description: Comma-separated hidden real-PTY pressure pane counts
|
|
required: false
|
|
type: string
|
|
schedule:
|
|
# Why: keep the expensive scale run off PRs, but exercise it daily so
|
|
# terminal throughput regressions are caught before users report typing lag.
|
|
- cron: '30 8 * * *'
|
|
|
|
jobs:
|
|
terminal-perf:
|
|
name: terminal scale perf
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 45
|
|
env:
|
|
NODE_OPTIONS: --max-old-space-size=4096
|
|
ORCA_BACKGROUND_LAUNCH: '1'
|
|
ORCA_E2E_FORWARD_APP_LOGS: '1'
|
|
ORCA_E2E_TERMINAL_PERF_REPORT_PATH: ${{ inputs.report_path || 'test-results/terminal-scale-perf-report.json' }}
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v6
|
|
with:
|
|
ref: ${{ inputs.ref || github.ref }}
|
|
|
|
- name: Install native build tools and xvfb
|
|
run: sudo apt-get update && sudo apt-get install -y build-essential python3 xvfb zsh
|
|
|
|
- name: Select dependency preparation
|
|
id: install-mode
|
|
shell: bash
|
|
env:
|
|
RUNNER_KIND: ${{ runner.environment }}
|
|
JOB_CONTAINER: ${{ job.container.id }}
|
|
run: |
|
|
node <<'NODE'
|
|
const fs = require('node:fs')
|
|
const manifest = JSON.parse(fs.readFileSync('package.json', 'utf8'))
|
|
const actionPath = '.github/actions/install-node-dependencies/action.yml'
|
|
const action = fs.existsSync(actionPath) ? fs.readFileSync(actionPath, 'utf8') : ''
|
|
const inputs = action.split(/^inputs:[ \t]*\r?$/m)[1]?.split(/^\S/m)[0] ?? ''
|
|
const supportedPostinstalls = [
|
|
'node config/scripts/rebuild-native-deps.mjs',
|
|
'pnpm run build:packages && node config/scripts/rebuild-native-deps.mjs'
|
|
]
|
|
const shared = process.env.RUNNER_KIND === 'github-hosted' && !process.env.JOB_CONTAINER &&
|
|
process.env.RUNNER_OS === 'Linux' && process.env.RUNNER_ARCH === 'X64' &&
|
|
manifest.engines?.node === '24' && typeof manifest.packageManager === 'string' &&
|
|
manifest.packageManager.split('+')[0] === 'pnpm@12.8.1' &&
|
|
supportedPostinstalls.includes(manifest.scripts?.postinstall) &&
|
|
/^ native-runtime:/m.test(inputs) && /^ cache-pnpm-store-lookup-only:/m.test(inputs) &&
|
|
fs.existsSync('.github/actions/prepare-native-runtime/action.yml') &&
|
|
fs.existsSync('config/scripts/ensure-native-runtime.mjs')
|
|
fs.appendFileSync(process.env.GITHUB_OUTPUT, `shared=${shared}\n`)
|
|
NODE
|
|
|
|
- name: Prepare current dependencies
|
|
if: steps.install-mode.outputs.shared == 'true'
|
|
uses: ./.github/actions/install-node-dependencies
|
|
with:
|
|
native-runtime: electron
|
|
cache-electron-package: 'true'
|
|
cache-pnpm-store-lookup-only: 'true'
|
|
|
|
- name: Setup pnpm
|
|
if: steps.install-mode.outputs.shared != 'true'
|
|
uses: pnpm/setup@v2
|
|
with:
|
|
install: false
|
|
|
|
- name: Setup Node.js
|
|
if: steps.install-mode.outputs.shared != 'true'
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version-file: package.json
|
|
cache: pnpm
|
|
|
|
# Historical refs can lack the shared action; retain their original install path.
|
|
- name: Use external node-gyp to avoid pnpm's bundled copy
|
|
if: steps.install-mode.outputs.shared != 'true'
|
|
run: |
|
|
npm install -g node-gyp@11.5.0
|
|
echo "npm_config_node_gyp=$(npm root -g)/node-gyp/bin/node-gyp.js" >> "$GITHUB_ENV"
|
|
|
|
- name: Install dependencies
|
|
if: steps.install-mode.outputs.shared != 'true'
|
|
run: pnpm install --frozen-lockfile
|
|
|
|
- name: Build Electron app for terminal perf
|
|
run: npx electron-vite build --mode e2e
|
|
|
|
- name: Run terminal scale perf report gate
|
|
env:
|
|
ORCA_TERMINAL_PERF_GREP: ${{ inputs.grep }}
|
|
ORCA_TERMINAL_PERF_FRAME_COUNT: ${{ inputs.frame_count }}
|
|
ORCA_TERMINAL_PERF_FRAME_INTERVAL_MS: ${{ inputs.frame_interval_ms }}
|
|
ORCA_TERMINAL_PERF_PRESSURE_OUTPUT_CHARS: ${{ inputs.pressure_output_chars }}
|
|
ORCA_TERMINAL_PERF_SCALE_PANES: ${{ inputs.scale_panes }}
|
|
ORCA_TERMINAL_PERF_SCALE_CROSS_WORKSPACE_PANES: ${{ inputs.scale_cross_workspace_panes }}
|
|
ORCA_TERMINAL_PERF_SCALE_PRESSURE_PANES: ${{ inputs.scale_pressure_panes }}
|
|
ORCA_TERMINAL_PERF_SCALE_HIDDEN_PRESSURE_PANES: ${{ inputs.scale_hidden_pressure_panes }}
|
|
run: |
|
|
set -euo pipefail
|
|
args=()
|
|
if [ -n "${ORCA_TERMINAL_PERF_GREP:-}" ]; then
|
|
args+=(--grep "$ORCA_TERMINAL_PERF_GREP")
|
|
fi
|
|
if [ -n "${ORCA_TERMINAL_PERF_FRAME_COUNT:-}" ]; then
|
|
export ORCA_E2E_OPENCODE_FRAME_COUNT="$ORCA_TERMINAL_PERF_FRAME_COUNT"
|
|
fi
|
|
if [ -n "${ORCA_TERMINAL_PERF_FRAME_INTERVAL_MS:-}" ]; then
|
|
export ORCA_E2E_OPENCODE_FRAME_INTERVAL_MS="$ORCA_TERMINAL_PERF_FRAME_INTERVAL_MS"
|
|
fi
|
|
if [ -n "${ORCA_TERMINAL_PERF_PRESSURE_OUTPUT_CHARS:-}" ]; then
|
|
export ORCA_E2E_OPENCODE_PRESSURE_OUTPUT_CHARS="$ORCA_TERMINAL_PERF_PRESSURE_OUTPUT_CHARS"
|
|
fi
|
|
if [ -n "${ORCA_TERMINAL_PERF_SCALE_PANES:-}" ]; then
|
|
export ORCA_E2E_OPENCODE_SCALE_PANES="$ORCA_TERMINAL_PERF_SCALE_PANES"
|
|
fi
|
|
if [ -n "${ORCA_TERMINAL_PERF_SCALE_CROSS_WORKSPACE_PANES:-}" ]; then
|
|
export ORCA_E2E_OPENCODE_SCALE_CROSS_WORKSPACE_PANES="$ORCA_TERMINAL_PERF_SCALE_CROSS_WORKSPACE_PANES"
|
|
fi
|
|
if [ -n "${ORCA_TERMINAL_PERF_SCALE_PRESSURE_PANES:-}" ]; then
|
|
export ORCA_E2E_OPENCODE_SCALE_PRESSURE_PANES="$ORCA_TERMINAL_PERF_SCALE_PRESSURE_PANES"
|
|
fi
|
|
if [ -n "${ORCA_TERMINAL_PERF_SCALE_HIDDEN_PRESSURE_PANES:-}" ]; then
|
|
export ORCA_E2E_OPENCODE_SCALE_HIDDEN_PRESSURE_PANES="$ORCA_TERMINAL_PERF_SCALE_HIDDEN_PRESSURE_PANES"
|
|
fi
|
|
xvfb-run --auto-servernum env SKIP_BUILD=1 ORCA_E2E_TERMINAL_PERF_XVFB=1 pnpm run test:e2e:terminal-perf:scale:report -- "${args[@]}"
|
|
|
|
- name: Upload terminal perf report
|
|
if: always()
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: terminal-scale-perf-report
|
|
path: ${{ env.ORCA_E2E_TERMINAL_PERF_REPORT_PATH }}
|
|
retention-days: 14
|
|
if-no-files-found: warn
|
|
|
|
- name: Upload Playwright traces
|
|
if: failure()
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: terminal-scale-perf-traces
|
|
path: test-results/
|
|
retention-days: 7
|
|
if-no-files-found: ignore
|