name: Terminal Perf # On demand only; see docs/readme/terminal-perf.md. 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 permissions: contents: read # Candidate source must not write caches in the dispatch branch's scope. cache-mode: read jobs: terminal-perf: name: terminal scale perf # Presented-frame measurement only accepts GitHub-hosted Xvfb displays. runs-on: ubuntu-24.04 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/native-build/node-addons/rebuild-native-deps.mjs', 'node config/scripts/rebuild-native-deps.mjs', 'pnpm run build:packages && node config/scripts/native-build/node-addons/rebuild-native-deps.mjs', 'pnpm run build:packages && node config/scripts/rebuild-native-deps.mjs' ] const supportedRunner = process.env.RUNNER_KIND === 'github-hosted' || process.env.RUNNER_NAME?.startsWith('blacksmith-') const shared = supportedRunner && !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.14.0' && 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/native-build/node-addons/ensure-native-runtime.mjs') || 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 check-latest: true 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