Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
5cf3585
fix(native-chat): keep a message accepted before a quit or crash as a…
brennanb2025 Oct 6, 2026
7faa9f7
fix(native-chat): reasoning rows with a real open/finished state, and…
brennanb2025 Oct 6, 2026
cad8ea4
fix(tabs): stop tab and close tooltips firing while grazing the strip…
AmethystLiang Oct 6, 2026
842c6c6
fix(jira): tolerate malformed nested Jira status fields (#25656)
brennanb2025 Oct 6, 2026
ccab2a3
fix(native-chat): a long reply keeps its Working bar and Stop after a…
brennanb2025 Oct 6, 2026
468e4e1
fix(native-chat): a prompt card owns the chat input until its answer …
brennanb2025 Oct 6, 2026
f27ef42
fix(runtime): build the host terminal model when a phone opens an idl…
Jinwoo-H Oct 6, 2026
8d049b5
fix(codex): approve Orca's hook in managed Codex homes with Codex's o…
Jinwoo-H Oct 6, 2026
128d154
Fix Codex chat creation after its own model listing fails (#25754)
brennanb2025 Oct 6, 2026
e63e4f8
Update README downloads badge
github-actions[bot] Oct 6, 2026
defd85a
feat(floating-workspace): render the floating panel through the share…
brennanb2025 Oct 6, 2026
07981bd
fix(native-chat): chat copy that promised a retry, an update, or a co…
brennanb2025 Oct 6, 2026
61c9a3a
test(mobile): split the turn-disclosure test under the 800-line test …
brennanb2025 Oct 6, 2026
3268760
Add chat contrast and "Match terminal interface" (#25659)
brennanb2025 Oct 6, 2026
ab63890
fix(native-chat): start Windows chats without reading process creatio…
brennanb2025 Oct 6, 2026
975e732
feat(native-chat): a solid, fading Jump to latest (#25759)
brennanb2025 Oct 6, 2026
19661df
fix: stop Claude and agent helper processes when Orca quits or crashe…
brennanb2025 Oct 6, 2026
b922342
feat(native-chat): the chat reads "Stopping…" from your Stop until th…
brennanb2025 Oct 6, 2026
4c35516
fix(ci): restore main's typecheck and lint after #25751 and #24369 (#…
Jinwoo-H Oct 6, 2026
81a1968
feat(native-chat): attach several files from one picker selection (#2…
AmoabaKelvin Oct 6, 2026
a0a7535
fix(native-chat): say each chat outcome once and drop internal-only s…
brennanb2025 Oct 6, 2026
2f001fe
fix(remote-browser): host client browser pages again when a paired ho…
Jinwoo-H Oct 6, 2026
6a71732
Keep sidebar section collapse independent across execution hosts (#25…
nwparker Oct 6, 2026
ac8ea9f
fix(codex): write Orca's hook into ~/.codex only when something chang…
Jinwoo-H Oct 6, 2026
9e8a3a5
fix(repos): stop reporting clones that never ran as successful (#23770)
AmoabaKelvin Oct 6, 2026
83cf7cf
perf(ci): compile release JavaScript once for all packaging hosts (#2…
nwparker Oct 6, 2026
58b4633
refactor(codex): remove code the ~/.codex hook rework left unused (#2…
Jinwoo-H Oct 6, 2026
53edf8e
fix: recover deleted Active Server defaults and preserve editor hosts…
nwparker Oct 6, 2026
7e52bed
fix(editor): recover PDF previews after failed refreshes
nwparker Oct 6, 2026
d6b155d
Fix Claude's stuck spinner after Escape cancellation (#25846)
nwparker Oct 6, 2026
40f0319
fix(native-chat): fingerprint the consumed transcript boundary (#25965)
nwparker Oct 6, 2026
f7c542c
Keep profile saving alive after a stalled main loop (#25318)
AmethystLiang Oct 6, 2026
ce4c99a
fix(terminal): keep a pane closed just before quit from coming back o…
Jinwoo-H Oct 6, 2026
0a26f3e
fix(native-chat): honor saved agent Command and Arguments (#25721)
brennanb2025 Oct 6, 2026
e1e9d1c
feat(agent-launch): host-assigned caller identity and a launch record…
brennanb2025 Oct 6, 2026
28ed544
Fix send picker reveal under collapsed hosts and parents (#25950)
nwparker Oct 6, 2026
e813fa5
feat(native-chat): keep a message a Stop took back on screen, with on…
brennanb2025 Oct 6, 2026
6aa12c3
Name native Claude and Codex chats after their first message (#25724)
brennanb2025 Oct 6, 2026
51062e6
fix(test): pass resolveLaunchArgs in the record store slot test so ma…
Jinwoo-H Oct 6, 2026
cc60067
fix(test): pass resolveLaunchArgs in the Codex stopped-send-order tes…
Jinwoo-H Oct 6, 2026
c893048
feat(native-chat): show which agent a chat message is from, and open …
brennanb2025 Oct 6, 2026
72b8411
test(e2e): terminal layout parity check against main (#25681)
Jinwoo-H Oct 6, 2026
6352ff3
Run nested workspace deletion in the background (#25975)
nwparker Oct 6, 2026
d8c871a
Speed up unit tests with cross-runtime duration scheduling (#25967)
nwparker Oct 6, 2026
fa42e57
fix(gitlab): select SSH workspace host for merge request and issue wr…
nwparker Oct 6, 2026
add5344
fix(browser): detect Comet in its Windows vendor directory (#25983)
nwparker Oct 6, 2026
7bc9ff9
fix(grok): add Grok 4.7 to the fallback model catalog (#25976)
Jinwoo-H Oct 6, 2026
1eeb8f3
fix(test): drop the duplicate resolveLaunchArgs that two merges both …
brennanb2025 Oct 6, 2026
2137295
fix(git): use branch-safe author names as username fallback (#25984)
nwparker Oct 6, 2026
deb7374
Simplify reveal and test fixture cleanup (#25978)
nwparker Oct 6, 2026
5345ba3
Fix ownership for terminal and chat file drops (STA-6940, PR 1/6) (#2…
brennanb2025 Oct 6, 2026
31f1035
fix(orchestration): serve a /clear'd native-chat worker through the s…
brennanb2025 Oct 6, 2026
53b9ccb
refactor(terminal): add in-place pane layout geometry apply (unused) …
Jinwoo-H Oct 6, 2026
35e173a
fix(native-chat): alert when a structured chat asks for approval or i…
brennanb2025 Oct 6, 2026
f6448a1
fix(native-chat): say which retry a Claude retry is on and what it la…
brennanb2025 Oct 6, 2026
e717ea6
feat(native-chat): copy chat images from the right-click menu (#24161)
AmoabaKelvin Oct 6, 2026
faed899
fix(ci): run three new SQLite-backed tests in the Node runtime projec…
Jinwoo-H Oct 6, 2026
86d03ff
fix(native-chat): sending brings the latest into view and follows the…
AmoabaKelvin Oct 6, 2026
61bcca9
fix: stop Codex and OpenCode helper servers when Orca quits or crashe…
brennanb2025 Oct 7, 2026
323f312
refactor(terminal): mark layout updates from user gestures (#25680)
Jinwoo-H Oct 7, 2026
3308ff8
Bound YAML merge conversion and close SQLite routing review gaps (#25…
nwparker Oct 7, 2026
9c6702b
test(codex): guard that turning hooks off wins over an in-flight turn…
Jinwoo-H Oct 7, 2026
c9f4cd7
fix(editor): close stale duplicate documents safely
nwparker Oct 5, 2026
91bb636
test(editor): align model and cursor custody fixtures with owner-clos…
nwparker Oct 5, 2026
8bd567a
fix(editor): protect document backing files and complete close cleanup
nwparker Oct 6, 2026
31d8574
fix(editor): retain placeholders for drafts during bulk close
nwparker Oct 6, 2026
983098d
test(codex): synchronize fake clock with forced process close
nwparker Oct 6, 2026
0c32e80
test(codex): reuse unproven close fixture sequence
nwparker Oct 6, 2026
14bae2e
Route mirrored editor closes through their captured runtime owner
nwparker Oct 6, 2026
1040f67
Keep orchestration SQLite fixtures in the Node test runtime
nwparker Oct 6, 2026
f052085
Keep mobile restore SQLite fixture in the Node test runtime
nwparker Oct 7, 2026
dc10a14
Merge remote-tracking branch 'origin/main' into OrcaWin/node-rt-phase…
Oct 7, 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
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@
/skill-stubs/_shared/*.md text eol=lf
/skills/*/SKILL.md text eol=lf
/src/cli/bundled-skill-guides.ts text eol=lf
# SVG bytes feed embedded data URLs and asset hashes on every build host.
*.svg text eol=lf
# Compiler input line breaks must not depend on the checkout OS.
*.ts text eol=lf
*.tsx text eol=lf
*.html text eol=lf
# Bundled plugin trees are byte-hashed; CRLF checkout would break the pinned hash.
/resources/plugins/** text eol=lf
# Relay assets are copied verbatim into the bundle and hashed byte-for-byte into
Expand Down
31 changes: 31 additions & 0 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,35 @@ jobs:
pnpm exec vitest run --config config/vitest.config.ts \
src/main/pty/codex-no-daemon-binary-contract.test.ts

# Why both pins and latest: Orca approves its managed-home hook entry with a hash
# Codex computes, so a release that changes it must redden here before users
# meet a review screen.
- name: Verify Codex hook file-entry contract (pinned)
env:
ORCA_CODEX_HOOK_CONTRACT_REQUIRED: '1'
run: |
set -euo pipefail
for install in codex-cli:"$CODEX_CLI_VERSION" codex-cli-no-daemon:"$CODEX_NO_DAEMON_CLI_VERSION"; do
ORCA_CODEX_HOOK_CONTRACT_BINARY="$RUNNER_TEMP/${install%%:*}/node_modules/.bin/codex" \
ORCA_CODEX_HOOK_CONTRACT_VERSION="${install#*:}" \
pnpm exec vitest run --config config/vitest.config.ts \
src/main/codex/codex-hook-file-entry-binary-contract.test.ts
done

- name: Install latest Codex CLI
run: |
set -euo pipefail
npm install --no-audit --no-fund --prefix "$RUNNER_TEMP/codex-cli-latest" "@openai/codex@latest"

- name: Verify Codex hook file-entry contract (latest)
env:
ORCA_CODEX_HOOK_CONTRACT_REQUIRED: '1'
run: |
set -euo pipefail
ORCA_CODEX_HOOK_CONTRACT_BINARY="$RUNNER_TEMP/codex-cli-latest/node_modules/.bin/codex" \
pnpm exec vitest run --config config/vitest.config.ts \
src/main/codex/codex-hook-file-entry-binary-contract.test.ts

# Why the no-daemon install: it is the newest pinned Codex, and its project
# lookup decides whether a worktree launch stops at the trust prompt.
- name: Verify Codex project-trust contract
Expand Down Expand Up @@ -1032,6 +1061,7 @@ jobs:
src/main/browser/browser-route-webrtc-egress.electron.test.ts
src/main/browser/browser-route-h3-egress.electron.test.ts
src/main/browser/browser-route-dns-prefetch.electron.test.ts
src/main/persistence/profile-state/profile-state-writer-stall.electron.test.ts

# Restore independent fixtures during builds; keep native lifecycle probes serial.
- uses: ./.github/actions/prepare-linux-package-fixture
Expand Down Expand Up @@ -1203,6 +1233,7 @@ jobs:
src/main/browser/browser-route-webrtc-egress.electron.test.ts
src/main/browser/browser-route-h3-egress.electron.test.ts
src/main/browser/browser-route-dns-prefetch.electron.test.ts
src/main/persistence/profile-state/profile-state-writer-stall.electron.test.ts
src/main/providers/windows-conpty-wide-char-duplication.node-pty.test.ts
src/main/providers/pty-repaint-wide-char-buffer.node-pty.test.ts
src/shared/child-process/windows-command-line.win32.test.ts
Expand Down
49 changes: 35 additions & 14 deletions .github/workflows/release-cut.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1212,12 +1212,25 @@ jobs:
with:
ref: refs/tags/${{ needs.cut.outputs.tag }}

# Compilation can overlap the release gates; signing remains behind release-preflight.
release-javascript:
needs: cut
if: needs.cut.outputs.should_release == 'true'
permissions:
contents: read
uses: ./.github/workflows/release-javascript.yml
with:
ref: refs/tags/${{ needs.cut.outputs.tag }}
secrets:
ORCA_POSTHOG_WRITE_KEY: ${{ secrets.ORCA_POSTHOG_WRITE_KEY }}

build:
needs:
- cut
- create-release
- orcad-template
- release-preflight
- release-javascript
- relay-windows-process-tree
# Why not the implicit success(): a tag without the orcad template skips that job on purpose.
if: >-
Expand All @@ -1226,6 +1239,7 @@ jobs:
needs.cut.outputs.should_release == 'true' &&
needs.create-release.result == 'success' &&
needs.release-preflight.result == 'success' &&
needs.release-javascript.result == 'success' &&
needs.relay-windows-process-tree.result == 'success' &&
(needs.orcad-template.result == 'success' ||
(needs.orcad-template.result == 'skipped' && needs.cut.outputs.ships_orcad_template == 'false'))
Expand Down Expand Up @@ -1460,26 +1474,30 @@ jobs:
}
cargo --version

# Why ORCA_POSTHOG_WRITE_KEY here: this is the only build that
# produces a published binary, so this is the only place the secret
# needs to be in scope. The key is a PostHog *project* API key, not
# a server secret — it ships in every official binary's app.asar
# and is therefore extractable from any release. We still keep it
# in GitHub Actions secrets so the literal stays out of the repo
# (and out of fork CI runs / log scrapers / casual greps).
# Why ORCA_BUILD_IDENTITY here (not in env at the job level): the
# value comes from the per-tag classification above and electron-vite
# reads it from `process.env` during `pnpm build:release` only.
# Why ORCA_DIAGNOSTICS_TOKEN_URL here: official builds pin crash
# diagnostic uploads to Orca's endpoint at compile time, matching the
# telemetry gate's "official binary only" behavior.
# Consumers verify the same official build configuration before restoring the bundle.
- name: Download release JavaScript
if: needs.release-javascript.outputs.supported == 'true'
uses: actions/download-artifact@v8
with:
name: release-javascript
path: .build/release-javascript

- name: Build app
run: pnpm build:release
shell: bash
run: |
if [ "$SHARED_JAVASCRIPT" = true ]; then
node config/scripts/release-javascript-artifact.mjs restore
pnpm run build:release:host
else
pnpm run build:release
fi
env:
# Why: Vite's web build crossed Node's default old-space ceiling on
# the macOS release runner, leaving v1.4.2-rc.8 as an incomplete draft.
NODE_OPTIONS: --max-old-space-size=4096
ORCA_BUILD_IDENTITY: ${{ steps.tag-classify.outputs.identity }}
SHARED_JAVASCRIPT: ${{ needs.release-javascript.outputs.supported }}
ORCA_RELEASE_JAVASCRIPT_SOURCE_SHA: ${{ needs.release-javascript.outputs.source_sha }}
ORCA_DIAGNOSTICS_TOKEN_URL: https://www.onorca.dev/diagnostics/token
ORCA_POSTHOG_WRITE_KEY: ${{ secrets.ORCA_POSTHOG_WRITE_KEY }}
# Fail the release rather than ship a relay that cannot launch outside
Expand Down Expand Up @@ -2330,6 +2348,7 @@ jobs:
- create-release
- orcad-template
- release-preflight
- release-javascript
# release-mac-build.yml downloads the relay addons from this run.
- relay-windows-process-tree
# Why not the implicit success(): a tag without the orcad template skips that job on purpose.
Expand All @@ -2339,6 +2358,7 @@ jobs:
needs.cut.outputs.should_release == 'true' &&
needs.create-release.result == 'success' &&
needs.release-preflight.result == 'success' &&
needs.release-javascript.result == 'success' &&
needs.relay-windows-process-tree.result == 'success' &&
(needs.orcad-template.result == 'success' ||
(needs.orcad-template.result == 'skipped' && needs.cut.outputs.ships_orcad_template == 'false'))
Expand All @@ -2364,6 +2384,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_MAC_BUILD_REF: ${{ github.ref_name }}
RELEASE_MAC_BUILD_RELEASE_RUN_ID: ${{ github.run_id }}
RELEASE_MAC_BUILD_JAVASCRIPT_SOURCE_SHA: ${{ needs.release-javascript.outputs.supported == 'true' && needs.release-javascript.outputs.source_sha || '' }}
RELEASE_MAC_BUILD_TAG: ${{ needs.cut.outputs.tag }}
RELEASE_MAC_BUILD_WORKFLOW: release-mac-build.yml

Expand Down
120 changes: 120 additions & 0 deletions .github/workflows/release-javascript-benchmark.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
name: Release JavaScript comparison

on:
pull_request:
paths: ['.github/workflows/release-javascript-benchmark.yml']
workflow_dispatch:

permissions:
contents: read

concurrency:
group: release-javascript-comparison-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

env:
ORCA_BACKGROUND_LAUNCH: '1'
ORCA_DIAGNOSTICS_TOKEN_URL: https://www.onorca.dev/diagnostics/token
ORCA_POSTHOG_WRITE_KEY: ci-build-comparison
NODE_OPTIONS: --max-old-space-size=4096

jobs:
bundle:
uses: ./.github/workflows/release-javascript.yml
with:
ref: ${{ github.sha }}
secrets:
ORCA_POSTHOG_WRITE_KEY: ci-build-comparison

measure:
needs: bundle
name: ${{ matrix.mode }} ${{ matrix.host.platform }} ${{ matrix.host.arch }}
runs-on: ${{ matrix.host.os }}
timeout-minutes: 30
strategy:
fail-fast: false
max-parallel: 8
matrix:
mode: [baseline, shared]
host:
- os: ubuntu-latest
platform: linux
arch: x64
- os: ubuntu-24.04-arm
platform: linux
arch: arm64
- os: windows-2022
platform: win32
arch: x64
- os: macos-15
platform: darwin
arch: arm64
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.bundle.outputs.source_sha }}
persist-credentials: false
- uses: ./.github/actions/install-node-dependencies
with:
native-runtime: node
persist-native-cache: 'false'
- uses: ./.github/actions/install-mobile-dependencies
- name: Install Linux provider dependencies
if: runner.os == 'Linux'
run: sudo apt-get update && sudo apt-get install -y python3-gi gir1.2-atspi-2.0 at-spi2-core xclip xdotool
- name: Resolve build identity
shell: bash
run: |
RELEASE_TAG="v$(node -p 'require("./package.json").version')"
export RELEASE_TAG
echo "ORCA_BUILD_IDENTITY=$(node config/scripts/release-javascript-artifact.mjs identity)" >> "$GITHUB_ENV"
- name: Download shared JavaScript
if: matrix.mode == 'shared'
uses: actions/download-artifact@v8
with:
name: release-javascript
path: .build/release-javascript
- name: Measure release build
shell: bash
env:
MEASUREMENT_MODE: ${{ matrix.mode }}
ORCA_RELEASE_JAVASCRIPT_SOURCE_SHA: ${{ needs.bundle.outputs.source_sha }}
run: node config/scripts/release-javascript-benchmark.mjs "$MEASUREMENT_MODE"
- uses: actions/upload-artifact@v7
with:
name: release-javascript-measurement-${{ matrix.mode }}-${{ matrix.host.platform }}-${{ matrix.host.arch }}
path: .build/release-javascript-measurements/
retention-days: 7

comparison:
needs: [bundle, measure]
runs-on: ubuntu-slim
permissions:
contents: read
actions: read
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.bundle.outputs.source_sha }}
persist-credentials: false
- uses: actions/setup-node@v6
with:
node-version-file: package.json
- uses: ./.github/actions/install-node-dependencies
- uses: actions/download-artifact@v8
with:
pattern: release-javascript-measurement-*
path: .build/release-javascript-measurements
- name: Compare build and transfer timings
env:
GH_TOKEN: ${{ github.token }}
run: |
gh api "repos/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID/jobs?per_page=100" > .build/release-javascript-measurements/jobs.json
node config/scripts/release-javascript-benchmark.mjs summary
cat .build/release-javascript-measurements/comparison.md >> "$GITHUB_STEP_SUMMARY"
- uses: actions/upload-artifact@v7
if: always()
with:
name: release-javascript-comparison
path: .build/release-javascript-measurements/comparison.md
retention-days: 30
79 changes: 79 additions & 0 deletions .github/workflows/release-javascript.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: Release JavaScript bundle

on:
workflow_call:
inputs:
ref:
required: true
type: string
outputs:
supported:
value: ${{ jobs.bundle.outputs.supported }}
source_sha:
value: ${{ jobs.bundle.outputs.source_sha }}
secrets:
ORCA_POSTHOG_WRITE_KEY:
required: true

permissions:
contents: read

env:
ORCA_BACKGROUND_LAUNCH: '1'

jobs:
bundle:
runs-on: ubuntu-latest
timeout-minutes: 20
outputs:
supported: ${{ steps.source.outputs.supported }}
source_sha: ${{ steps.source.outputs.sha }}
steps:
- uses: actions/checkout@v6
with:
ref: ${{ inputs.ref }}
persist-credentials: false

# Older release refs retain their original per-platform build commands.
- name: Resolve bundle source and support
id: source
shell: bash
run: |
echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
node -e 'const p = require("./package.json"); console.log("supported=" + Boolean(p.scripts["build:release:javascript"] && p.scripts["build:release:host"]))' >> "$GITHUB_OUTPUT"

- uses: ./.github/actions/install-node-dependencies
if: steps.source.outputs.supported == 'true'
with:
native-runtime: node

- uses: ./.github/actions/install-mobile-dependencies
if: steps.source.outputs.supported == 'true'

- name: Resolve release build identity
id: identity
if: steps.source.outputs.supported == 'true'
run: |
RELEASE_TAG="v$(node -p 'require("./package.json").version')"
export RELEASE_TAG
echo "value=$(node config/scripts/release-javascript-artifact.mjs identity)" >> "$GITHUB_OUTPUT"

- name: Build and archive release JavaScript
if: steps.source.outputs.supported == 'true'
env:
NODE_OPTIONS: --max-old-space-size=4096
ORCA_BUILD_IDENTITY: ${{ steps.identity.outputs.value }}
ORCA_DIAGNOSTICS_TOKEN_URL: https://www.onorca.dev/diagnostics/token
ORCA_POSTHOG_WRITE_KEY: ${{ secrets.ORCA_POSTHOG_WRITE_KEY }}
run: |
pnpm run build:release:javascript
node config/scripts/release-javascript-artifact.mjs pack

- uses: actions/upload-artifact@v7
if: steps.source.outputs.supported == 'true'
with:
name: release-javascript
path: .build/release-javascript/
compression-level: 0
retention-days: 7
if-no-files-found: error
Loading
Loading