Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
210 commits
Select commit Hold shift + click to select a range
cf20e08
fix(native-chat): wait for the runtime capability probe before resolv…
brennanb2025 Sep 13, 2026
974af8c
fix(worktrees): retire the chat tab of a chat with no child when its …
brennanb2025 Sep 13, 2026
1f7655f
feat(ai-vault-search): public session search contract and transports …
Jinwoo-H Sep 13, 2026
b0070e3
refactor(mobile): migrate settings reads to RpcOperation (#20499)
Jinwoo-H Sep 13, 2026
2fc84cb
fix(mobile): give native chat one tail-follow owner so streaming stop…
brennanb2025 Sep 13, 2026
85d7cf3
fix(mobile): preserve delivery ambiguity across transport cutover (#2…
Jinwoo-H Sep 13, 2026
22f56f7
fix(runtime): reject malformed file Base64 padding (#20283)
Jinwoo-H Sep 13, 2026
149164b
fix(tasks): preserve repository results under GitHub search quota (#2…
OrcaWin Sep 13, 2026
09187fc
fix(ai-vault): stream oversized remote session transcripts (#20455)
OrcaWin Sep 13, 2026
e944e76
fix(grok): stop replayed Claude/Cursor hooks reporting Grok panes as …
brennanb2025 Sep 13, 2026
a28cd9e
fix(browser): press keys through a US-layout CDP key table instead of…
atreidesend Sep 13, 2026
c853e10
fix(rpc): validate provider-specific fields in TaskProviderIdentity (…
Jinwoo-H Sep 13, 2026
241fb9e
perf(terminal): batch file-link checks on their owning host (#20463)
OrcaWin Sep 13, 2026
5e70014
feat(native-chat): support file drag and drop (#20494)
brennanb2025 Sep 13, 2026
d138c32
fix: show unexpected signout notice only once across versions (#20526)
Jinwoo-H Sep 14, 2026
7ce8e18
test(mobile): consolidate the RPC migration's verification infrastruc…
Jinwoo-H Sep 14, 2026
9f435df
Update README downloads badge
github-actions[bot] Sep 14, 2026
e9db164
refactor(attention): move the agent attention boundary off terminal p…
brennanb2025 Sep 14, 2026
4784fa0
fix(grok): defer managed hook pane guard expansion to shell (#20534)
brennanb2025 Sep 14, 2026
c21c083
fix(auth): report callback failures instead of cancellation (#20535)
Jinwoo-H Sep 14, 2026
16d1ab8
perf(skills): bound WSL installed skill discovery (#12314)
PPP-JH Sep 14, 2026
31db277
fix(git): skip upstream remote probes when the remote is absent (#18455)
innocarpe Sep 14, 2026
3ab2a1b
refactor(orchestration): derive delivery eligibility from messages (#…
Jinwoo-H Sep 14, 2026
96b450f
fix(ssh): bound relay incumbent lsof probe (#18304)
kaluli123123 Sep 14, 2026
9cf0a6c
perf(remote): avoid repeated capability probes during file imports (#…
dngur6344 Sep 14, 2026
2ce252f
fix(grok): announce a completion once, when Grok is actually finished…
brennanb2025 Sep 14, 2026
c287a5d
feat(native-chat): add provider-aware Fast mode (#20506)
brennanb2025 Sep 14, 2026
33149fc
fix(claude): install SessionEnd for capable versions (#20530)
brennanb2025 Sep 14, 2026
7d98c8e
refactor(mobile): send the source-control domain through typed RpcOpe…
Jinwoo-H Sep 14, 2026
d2d3269
perf(persistence): skip redundant whole-state flushes on terminal rea…
AmethystLiang Sep 14, 2026
3cd60e7
feat(agent-status): run-identity types for keying rows by agent inste…
brennanb2025 Sep 14, 2026
3763103
fix(hooks): report a timed-out hook as unverifiable and terminate its…
nwparker Sep 14, 2026
55b3392
fix(terminal): drop the agent gutter from copied selections (#19770) …
nwparker Sep 14, 2026
243f443
fix(session-search): read oversized numeric file IDs on Windows (#20551)
OrcaWin Sep 14, 2026
ad49aae
fix(workspaces): re-seed a gate-reported empty workspace after an age…
brennanb2025 Sep 14, 2026
06c83e2
fix(workspaces): recover a real terminal when activation throws for a…
brennanb2025 Sep 14, 2026
0c81284
feat(native-chat): show a drop target on the whole chat pane (#20561)
brennanb2025 Sep 14, 2026
4634d2c
fix(native-chat): let the provider reopen a Claude turn it resumed it…
brennanb2025 Sep 14, 2026
539d4d1
fix(native-chat): resume structured chats cleanly after restart (#20509)
brennanb2025 Sep 14, 2026
2ed89b8
fix(github): name an unfiltered empty project view instead of blaming…
nwparker Sep 14, 2026
170dbdb
fix(ai-vault): ignore non-absolute env overrides for agent scan roots…
manuaudio Sep 14, 2026
01f8aa8
fix(grok): stop SessionStart orca-status hook hanging for 10s (#20090)
bjornrun Sep 14, 2026
8e26d51
perf(browser): dispatch coordinate pointer input in process instead o…
nwparker Sep 14, 2026
b87a6c0
fix(pty): pace the EAGAIN write retry so a stalled reader can't satur…
nireak Sep 14, 2026
93c3702
Update README downloads badge
github-actions[bot] Sep 14, 2026
e53f155
fix(mobile): two known main bugs the RPC migration preserved (#20563)
Jinwoo-H Sep 14, 2026
50e752f
test(mobile): pin each RPC golden to its own scenario input, not the …
Jinwoo-H Sep 14, 2026
a4c11f1
fix(native-chat): stop a bounded tail read from moving the chat curso…
brennanb2025 Sep 14, 2026
fc525c3
refactor(mobile): send the task workspace-creation domain through typ…
Jinwoo-H Sep 14, 2026
eba56f2
feat(ai-vault-search): construct the session search indexer in the sc…
Jinwoo-H Sep 14, 2026
c6a7216
fix(native-chat): hide activity while awaiting input (#20496)
brennanb2025 Sep 14, 2026
875b86d
Update README downloads badge
github-actions[bot] Sep 14, 2026
1d1bca2
Bump mobile app.json to 0.0.50 (#20661)
brennanb2025 Sep 14, 2026
b4d4358
fix(native-chat): bound a dispatch reason before it reaches the journ…
brennanb2025 Sep 14, 2026
d8b6151
fix(native-chat): keep a resumed transcript pinned to its end (#20651)
brennanb2025 Sep 14, 2026
2acd2f4
Surface stage, unstage and discard failures with retry capability (#2…
AmethystLiang Sep 14, 2026
d5be0d6
Add copy button to code blocks (#20357)
AmethystLiang Sep 14, 2026
6c70801
fix(source-control): prevent text wrapping in section headers and act…
AmethystLiang Sep 14, 2026
2186a88
fix(store): stop two no-op writes from re-running every selector in t…
OrcaWin Sep 14, 2026
c3372ae
fix(ai-vault): bound streamed remote JSONL records (#20700)
nwparker Sep 14, 2026
1ba9801
fix(ci): stop hourly versions dropping below a tagged or already-ship…
nwparker Sep 14, 2026
dede24d
fix(store): preserve state identity for no-op updater branches (#20703)
nwparker Sep 14, 2026
955051d
fix(codex): settle a structured send on admission, and stop minting a…
brennanb2025 Sep 14, 2026
59d29af
test: add a verified OMP native-chat mock scenario (#20655)
nwparker Sep 14, 2026
3632311
fix(omp): preserve status after terminal title owner rewrite (#20610)
nwparker Sep 14, 2026
fc4519c
fix(omp): preserve zsh startup with global aliases (#20621)
nwparker Sep 14, 2026
ee1a0a4
fix(git): avoid Windows tree kills after the command has exited (#20606)
nwparker Sep 14, 2026
8d93505
fix(terminal): retain renames before renderer pane hydration (#20619)
nwparker Sep 14, 2026
f21f81d
fix(agents): find OMP by its full project name (#20647)
nwparker Sep 14, 2026
68f0b2e
feat(runtime): stream file uploads instead of buffering whole files (…
mmarabel Sep 14, 2026
389d672
fix(omp): preserve saved conversation names in session history (#20636)
nwparker Sep 14, 2026
46eb595
fix(ui): contain idle caret paint so agent panes stop burning CPU (#1…
innocarpe Sep 14, 2026
d51747e
feat(relay): expose preloaded PostgreSQL statement statistics (#20712)
Jinwoo-H Sep 14, 2026
49fba59
fix(runtime): apply the tui-idle evidence ranking to mailbox delivery…
nwparker Sep 14, 2026
4a02762
fix(agent-session): honour the backup-recovery fence floor on surface…
brennanb2025 Sep 14, 2026
bac96b2
fix(hooks): actually terminate a timed-out hook's process tree (#20576)
nwparker Sep 14, 2026
41e42be
fix(worktrees): safely remove prunable git-file registrations (#20617)
nwparker Sep 14, 2026
dd85e5f
fix: keep OMP terminals when folder workspaces become Git repos (#20653)
nwparker Sep 14, 2026
f55b7ba
fix(native-chat): cancel pending prompts precisely (#20601)
brennanb2025 Sep 14, 2026
742a7ad
fix(omp): resume independent child sessions from history (#20629)
nwparker Sep 14, 2026
767b7c1
fix(ai-vault): expand nested OMP session history (#20663)
nwparker Sep 14, 2026
b8554f1
fix(composer): clarify failed attachment drops (#20704)
AmethystLiang Sep 14, 2026
6cb5643
fix(deps): migrate Tiptap security updates with Markdown compatibilit…
OrcaWin Sep 14, 2026
4bcdc67
Distinguish pane load failures from empty states (#20735)
AmethystLiang Sep 14, 2026
b07c403
Log bounded PostgreSQL acquisition and execution failure diagnostics …
Jinwoo-H Sep 15, 2026
6a11a0b
test(mobile): pin each RPC golden to the recorder inputs that can rea…
Jinwoo-H Sep 15, 2026
ffc3312
Fix PTY child process verdict to preserve unverifiable state (#20729)
AmethystLiang Sep 15, 2026
20794ee
ci: keep the baseline build off the compatibility matrix lanes (#20733)
nwparker Sep 15, 2026
2b34255
fix(ci): stop defining pilot mutant tests inside a conditional (#20755)
nwparker Sep 15, 2026
db09a7b
fix(native-chat): let a reader park just above the latest message (#2…
brennanb2025 Sep 15, 2026
b61a234
feat(design-system): gate renderer UI with @shadcn/lint (#20731)
nwparker Sep 15, 2026
6f4e4bf
Update README downloads badge
github-actions[bot] Sep 15, 2026
ff5b1a5
fix(native-chat): preserve detached transcript position during growth…
brennanb2025 Sep 15, 2026
438603f
feat(native-chat): add a message rail for jumping between your prompt…
brennanb2025 Sep 15, 2026
99062ed
fix(worktrees): preserve unverifiable disk witness (#20713)
AmethystLiang Sep 15, 2026
ef39f32
test(native-chat): split the windowing test harness out of the suite …
nwparker Sep 15, 2026
11180fa
chore(lint): add anti-slop oxlint plugin (pinned, all rules off) (#20…
nwparker Sep 15, 2026
b792065
chore(lint): enable anti-slop no-reduce-accumulator-copy and no-widen…
nwparker Sep 15, 2026
4a5b058
fix(runtime): keep listed handles when graph sync learns a PTY incarn…
nwparker Sep 15, 2026
ab6b86d
fix(orchestration): require registered structured worker pane key (#2…
brennanb2025 Sep 15, 2026
bbd808a
fix(lint): keep root postinstall as the sole Electron binary install …
nwparker Sep 15, 2026
cf19735
Update README downloads badge
github-actions[bot] Sep 15, 2026
18d0afc
test(package): let the postinstall contract allow unrelated chained s…
nwparker Sep 15, 2026
3ec6193
fix(pty): preserve child-process inspection uncertainty (#20756)
AmethystLiang Sep 15, 2026
c9ae17f
fix(lint): enable anti-slop/no-unknown-type-aliases (#20784)
nwparker Sep 15, 2026
49e5fa5
refactor(lint): enable anti-slop/no-reflect-apply (#20782)
nwparker Sep 15, 2026
775a932
fix(git): distinguish binary absence from missing cwd on spawn ENOENT…
AmethystLiang Sep 15, 2026
22ce8d6
fix(lint): enable anti-slop/no-module-mocking (#20783)
nwparker Sep 15, 2026
0569ca4
Improve microphone permission errors and drop failure reporting (#20801)
AmethystLiang Sep 15, 2026
6fe140d
Report clipboard and composer drop failures (#20795)
AmethystLiang Sep 15, 2026
37a5b27
test(package): reject an Electron install takeover by exact command (…
nwparker Sep 15, 2026
f7b2736
fix(worktree): block removal when the archive hook fails (#20153)
nwparker Sep 15, 2026
f107499
fix(lint): enable anti-slop/no-reflect-get (#20786)
nwparker Sep 15, 2026
c0fb04c
fix(relay): open the real null device when detaching Windows stdio (#…
nwparker Sep 15, 2026
37394e9
build(release): compile the Windows relay process-table addon (#20809)
nwparker Sep 15, 2026
e4a9d24
fix(automations): repair cron step expansion and day restriction (#20…
nwparker Sep 15, 2026
bfdec26
fix(lint): enable anti-slop/no-object-parameters (#20781)
nwparker Sep 15, 2026
231e805
fix(lint): enable anti-slop/no-shape-in-symbol-names (#20785)
nwparker Sep 15, 2026
caa465d
fix(automations): stop tick latency counting against the missed-run g…
nwparker Sep 15, 2026
36ef93a
refactor(mobile): migrate the small domains onto RpcOperation (step 4…
Jinwoo-H Sep 15, 2026
9ab0a18
refactor(agent-status): isolate legacy status ingress behind one admi…
brennanb2025 Sep 15, 2026
f742ab8
Update README downloads badge
github-actions[bot] Sep 15, 2026
44268d9
refactor(mobile): send the github.* PR surface and the diff-review lo…
Jinwoo-H Sep 15, 2026
9878482
refactor(mobile): send the transport pairing and status domain throug…
Jinwoo-H Sep 15, 2026
2dfdbc8
refactor(mobile): send the task provider, detail and board domains th…
Jinwoo-H Sep 15, 2026
d130347
refactor(mobile): send the dictation, terminal, notification and brow…
Jinwoo-H Sep 15, 2026
62c5037
fix(lint): avoid reflective status entry reads (#20872)
Jinwoo-H Sep 15, 2026
2eb9320
refactor(agent-launch): make the launch-mode decision surface-neutral…
brennanb2025 Sep 15, 2026
22857cd
fix(crash-reporting): stop periodic emitters from evicting the crash …
OrcaWin Sep 15, 2026
60d7939
fix(native-chat): replace the raw question tool row with an awaiting-…
brennanb2025 Sep 15, 2026
6c03bb6
fix(lint): replace Reflect.get with typed property access in mounting…
brennanb2025 Sep 15, 2026
22ca862
test(native-chat): widen real-timer waitFor budget in agent-session-w…
brennanb2025 Sep 15, 2026
e7206f6
fix(mobile): retire a structured operation id the host has refused (#…
brennanb2025 Sep 15, 2026
783d8fe
fix(lint): merge duplicate type imports in the mobile RPC recorder ad…
Jinwoo-H Sep 15, 2026
1457d39
fix(native-chat): release sessions after provider root exit (#20502)
brennanb2025 Sep 15, 2026
0056161
test(mobile): record the real worktree catalog snapshot result in the…
Jinwoo-H Sep 15, 2026
2fccaca
test(mobile): mount screens, declared device stores and declared OS s…
Jinwoo-H Sep 15, 2026
981a482
fix(cli,relay): stop reading an unsignalable pid as a dead one (+ unv…
nwparker Sep 15, 2026
72a8c09
fix(ssh): corroborate an empty lsof answer before calling an endpoint…
nwparker Sep 15, 2026
946dacc
fix(worktrees): route unstamped local worktrees local in the two stat…
LesleyMurfin Sep 15, 2026
8edec28
fix(worktree): keep a WSL checkout case so delete cannot take the twi…
nwparker Sep 15, 2026
52b6851
fix(worktree-create): prioritize creation Git and defer background pr…
Jinwoo-H Sep 15, 2026
0325f1a
feat(agent-status): add the canonical store and child-work contract (…
brennanb2025 Sep 15, 2026
0869d99
refactor(mobile): send the rest of the session domain through typed R…
Jinwoo-H Sep 15, 2026
b5a9946
fix(e2e): fabricate runtime-host health through the snapshot that own…
brennanb2025 Sep 15, 2026
13ba649
fix(terminal): let a runtime-created Windows terminal BE the requeste…
nwparker Sep 15, 2026
6da7238
feat(agent-launch): one executor for agent launches, exposed as agent…
brennanb2025 Sep 15, 2026
a9232e8
fix(claude): single-own turn identity so Stop reaches a provider-open…
brennanb2025 Sep 15, 2026
3520e8e
fix: highlight bash fences in Markdown source mode (#20592)
100space Sep 16, 2026
7ec2986
fix(lint): merge the duplicate agent-status contract type imports (#2…
brennanb2025 Sep 16, 2026
ea7902c
refactor(mobile): send the device-state holdouts through typed RpcOpe…
Jinwoo-H Sep 16, 2026
615b137
refactor(mobile): own the request/cache lifecycle in GenerationScoped…
Jinwoo-H Sep 16, 2026
b8d4cde
refactor(mobile): send six screen-mounted call sites through typed Rp…
Jinwoo-H Sep 16, 2026
d4c19d5
test(mobile): let the RPC recorder open a subscription and script its…
Jinwoo-H Sep 16, 2026
c33a446
feat(mobile): clarify the notification opt-in screen (#20930)
Jinwoo-H Sep 16, 2026
07c7606
fix(computer-use): reap detached macOS helpers through owner exit (#2…
nwparker Sep 16, 2026
7f23d44
refactor(daemon): consolidate snapshot-safe listener delivery (#20945)
nwparker Sep 16, 2026
e6a4108
fix: name the id-kind mismatch when --ack is given a message id (#15743)
kaluli123123 Sep 16, 2026
357c978
refactor(agent-launch): retire the duplicate worker-start mode decisi…
brennanb2025 Sep 16, 2026
96d77b3
perf: always show project names and remove notification scans (#20931)
Jinwoo-H Sep 16, 2026
47bb473
Remove agent map from dashboard popout (#20929)
AmethystLiang Sep 16, 2026
9ed561c
fix(claude): judge Stop against the turn the journal published (#20921)
brennanb2025 Sep 16, 2026
bfc297d
fix(settings): keep integration connect dialog drafts on backdrop cli…
AmethystLiang Sep 16, 2026
b0d46e2
fix(settings): preserve multiline proxy bypass rules (#20957)
AmethystLiang Sep 16, 2026
feb04ec
Virtualize automations run history table for large histories (#20916)
AmethystLiang Sep 16, 2026
4948afc
fix(linear): show 'Cannot verify' when skill scan is inconclusive (#2…
AmethystLiang Sep 16, 2026
f78483e
refactor(mobile): send the subscription-gated holdouts through typed …
Jinwoo-H Sep 16, 2026
c702e77
Stop reading the terminal arguments field on the structured chat rout…
brennanb2025 Sep 16, 2026
16ac901
docs: remove unavailable diff shortcuts (#20974)
OrcaWin Sep 16, 2026
e39b432
fix(editor): preserve Markdown scroll after image layout (#20956)
nwparker Sep 16, 2026
7860933
Fix browser viewport presets incorrectly scaled by UI zoom (#20962)
AmethystLiang Sep 16, 2026
d62328a
fix(codex): remove redundant Windows hook launcher for Unicode profil…
nwparker Sep 16, 2026
07b7687
fix(sidebar): keep the Projects filter when a project is added (#20987)
OrcaWin Sep 16, 2026
15cac68
Native chat keeps scrolling to bottom (#20898)
AmethystLiang Sep 16, 2026
170ebce
fix(ci): run static analysis for every tree the repo-wide audits scan…
brennanb2025 Sep 16, 2026
291b4dd
feat(agent-status): route structured sessions through canonical owner…
brennanb2025 Sep 16, 2026
0b28d35
Update README downloads badge
github-actions[bot] Sep 16, 2026
dec0e2c
feat(session-history): add local search settings and index controls (…
Jinwoo-H Sep 16, 2026
3e5eb03
feat(cli): orca search over the agent session index (#20514)
Jinwoo-H Sep 16, 2026
f85d2bf
fix(ai-vault): say OpenCode-in-WSL is not searchable from Windows yet…
Jinwoo-H Sep 16, 2026
a7e34d5
feat(session-search): add panel search and opt-in consent (PR7) (#20580)
Jinwoo-H Sep 16, 2026
dbd750f
fix(session-search): keep the index status honest while a sweep has a…
Jinwoo-H Sep 16, 2026
b997fcc
fix(session-search): try phrase and AND routes for prose queries befo…
Jinwoo-H Sep 16, 2026
0d2f7bc
fix(session-search): index OpenCode SQLite sessions (#20870)
Jinwoo-H Sep 16, 2026
f6197db
fix(ai-vault): index Codex agent replies whose content blocks are typ…
Jinwoo-H Sep 16, 2026
46ed53b
feat(session-search): merge all-computers search across hosts (#20670)
Jinwoo-H Sep 16, 2026
3631a1e
feat(cli): show orca search now the settings toggle ships (#20677)
Jinwoo-H Sep 16, 2026
8153ec2
feat(session-search): search every computer from the history panel (#…
Jinwoo-H Sep 16, 2026
a010276
feat(session-search): enable indexing on paired servers from a client…
Jinwoo-H Sep 16, 2026
7c43254
fix: name the notification project by the worktree's own host (#20958)
Jinwoo-H Sep 16, 2026
bdb1800
test: add accumulated-workspace terminal typing reproduction (#20934)
Jinwoo-H Sep 16, 2026
aee98cc
fix(browser): make the browser identity one process-wide choice (#138…
brennanb2025 Sep 16, 2026
740887f
feat(settings): connected computers rows for session history indexing…
Jinwoo-H Sep 16, 2026
a28085a
refactor(mobile): checked reply readers for the source-control domain…
Jinwoo-H Sep 16, 2026
383c543
test(mobile): repin the recording baseline to main after #20950 (#21065)
Jinwoo-H Sep 16, 2026
36cdb34
test(agent-status): pin each legacy-bypass detector to its own case (…
brennanb2025 Sep 16, 2026
f02d09c
fix(native-chat): deliver queued messages while the chat pane is hidd…
brennanb2025 Sep 16, 2026
d23467e
perf(usage): resolve each cwd's worktree once per scan (#21130)
Jinwoo-H Sep 17, 2026
75ad979
perf(codex-usage): resume rollout scans at the last parsed byte (#21102)
Jinwoo-H Sep 17, 2026
5797668
perf(usage): run the Claude/Codex/OpenCode usage scans on a worker th…
Jinwoo-H Sep 17, 2026
c464b10
release: v1.4.206
github-actions[bot] Sep 18, 2026
e0838d9
Merge commit 'c464b1014972bd771324fed84b7de7fb100e837b' into zpyoung/…
zpyoung Sep 18, 2026
b303fb5
sync: resolve file ownership for v1.4.206
zpyoung Sep 18, 2026
358af6a
sync: repair the seams -X ours damaged in the v1.4.206 merge
zpyoung Sep 18, 2026
58a4292
fix(sync): adapt three fork surfaces to v1.4.206 API shapes
zpyoung Sep 18, 2026
f1aa56b
fix(lint): adopt anti-slop/no-shape-in-symbol-names in fork files
zpyoung Sep 18, 2026
91b3be8
fix(lint): adopt anti-slop/no-object-parameters in fork files
zpyoung Sep 18, 2026
551de19
fix(lint): adopt anti-slop/no-reflect-get in the git-diff budget test
zpyoung Sep 18, 2026
861fb57
fix(sync): stop re-including the omp alias-safety contract in sandbox…
zpyoung Sep 18, 2026
f565adf
fix(sync): unpin the hourly base case from the repo's package version
zpyoung Sep 18, 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
  •  
  •  
  •  
13 changes: 8 additions & 5 deletions .github/workflows/adhoc-mac-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -235,11 +235,14 @@ jobs:
fi
done
echo "head_sha=$(git rev-parse HEAD)" >>"$GITHUB_OUTPUT"
# Why the main repo's tags: package.json on a branch is as stale as the
# main it forked from, and stable patches never merge back into it.
published="$(GH_TOKEN="$MAIN_REPO_TOKEN" gh release list \
--repo "$GITHUB_REPOSITORY" --limit 100 --exclude-drafts \
--json tagName --jq '.[].tagName' || true)"
# Why git tags, not GitHub releases: unpublishing a buggy cut deletes the
# GitHub release and leaves the tag, which still owns that number.
# Releases-only let adhoc sit on a number already taken, so the updater
# would not install it. Empty on failure — the script then falls back
# to package.json.
published="$(GH_TOKEN="$MAIN_REPO_TOKEN" gh api \
"repos/$GITHUB_REPOSITORY/git/matching-refs/tags/v" \
--jq '.[].ref | sub("^refs/tags/"; "")' || true)"
ORCA_PUBLISHED_VERSIONS="$published" ORCA_ADHOC_LABEL="${LABEL:-$REF}" \
node config/scripts/adhoc-build-version.mjs \
>"$RUNNER_TEMP/adhoc-identity.txt"
Expand Down
22 changes: 13 additions & 9 deletions .github/workflows/daily-mac-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ jobs:
uses: actions/checkout@v6
with:
ref: main
# Version helpers only read HEAD; published versions come from the release API.
# Version helpers only read HEAD; published versions come from git tags.
fetch-depth: 1
# Why: this job only reads stablyai/orca and never pushes; every write
# goes to the daily repo through a minted App token passed by env.
Expand Down Expand Up @@ -209,17 +209,21 @@ jobs:
# number free", where a stranded draft still holds one.
names="$(gh release list --repo "$DAILY_REPO" --limit 200 --json name \
--jq '.[].name // empty')"
# Why the main repo's tags decide the base version rather than
# package.json: main's version only moves on `release:` commits, and
# stable patches are cut from release branches that never merge back, so
# package.json can sit several patches behind what users are running. A
# Why git tags, not GitHub releases: unpublishing a buggy cut deletes the
# GitHub release and leaves the tag. That dragged hourlies backwards so
# electron-updater stopped offering them; dailies would do the same. A
# separate token because GH_TOKEN above is the App's, scoped to the
# daily repo. Empty on failure — the script then falls back to
# package.json, which is stale but never wrong enough to fail a build.
published="$(GH_TOKEN="$MAIN_REPO_TOKEN" gh release list \
--repo "$GITHUB_REPOSITORY" --limit 100 --exclude-drafts \
--json tagName --jq '.[].tagName' || true)"
echo "Highest published tag seen: $(head -1 <<<"$published")"
main_tags="$(GH_TOKEN="$MAIN_REPO_TOKEN" gh api \
"repos/$GITHUB_REPOSITORY/git/matching-refs/tags/v" \
--jq '.[].ref | sub("^refs/tags/"; "")' || true)"
# Already-shipped channel tags are a second floor so unpublishing a
# buggy main release cannot drag this series below a daily already out.
channel_tags="$(gh release list --repo "$DAILY_REPO" --limit 200 --json tagName \
--jq '.[].tagName' || true)"
published="$main_tags"$'\n'"$channel_tags"
echo "Published version sources: $(grep -c . <<<"$main_tags" || true) main tags, $(grep -c . <<<"$channel_tags" || true) channel tags"
ORCA_PUBLISHED_VERSIONS="$published" ORCA_DAILY_RELEASE_NAMES="$names" \
node config/scripts/daily-build-version.mjs \
>"$RUNNER_TEMP/daily-identity.txt"
Expand Down
22 changes: 22 additions & 0 deletions .github/workflows/git-command-termination-runtime.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: Git command termination runtime
on:
pull_request:
paths:
- 'src/main/git/command-runner/spawned-command-tree-kill*'
- '.github/workflows/git-command-termination-runtime.yml'
workflow_dispatch:
permissions:
contents: read
jobs:
windows-exit:
runs-on: windows-latest
timeout-minutes: 20
env:
ORCA_BACKGROUND_LAUNCH: '1'
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: ./.github/actions/install-node-dependencies
- name: Verify exited native child does not trigger taskkill
run: node node_modules/vitest/vitest.mjs run --config config/vitest.config.ts src/main/git/command-runner/spawned-command-tree-kill.test.ts
32 changes: 20 additions & 12 deletions .github/workflows/hourly-mac-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ jobs:
uses: actions/checkout@v6
with:
ref: ${{ needs.preflight.outputs.head_sha }}
# Version helpers only read HEAD; published versions come from the release API.
# Version helpers only read HEAD; published versions come from git tags.
fetch-depth: 1
# Why: this job only reads stablyai/orca and never pushes; every write
# goes to the hourly repo through a minted App token passed by env.
Expand Down Expand Up @@ -213,17 +213,25 @@ jobs:
# number free", where a stranded draft still holds one.
names="$(gh release list --repo "$HOURLY_REPO" --limit 200 --json name \
--jq '.[].name // empty')"
# Why the main repo's tags decide the base version rather than
# package.json: main's version only moves on `release:` commits, and
# stable patches are cut from release branches that never merge back, so
# package.json can sit several patches behind what users are running. A
# separate token because GH_TOKEN above is the App's, scoped to the
# hourly repo. Empty on failure — the script then falls back to
# package.json, which is stale but never wrong enough to fail a build.
published="$(GH_TOKEN="$MAIN_REPO_TOKEN" gh release list \
--repo "$GITHUB_REPOSITORY" --limit 100 --exclude-drafts \
--json tagName --jq '.[].tagName' || true)"
echo "Highest published tag seen: $(head -1 <<<"$published")"
# Why git tags, not GitHub releases: unpublishing a buggy cut deletes the
# GitHub release and leaves the tag. On 2026-09-14 we deleted v1.4.202's
# release for a bug; hourlies had already climbed to 1.4.203, then
# `gh release list` fell back to v1.4.201 and the next hourlies shipped
# as 1.4.202-hourly — which electron-updater will not install over
# 1.4.203-hourly or over the still-tagged 1.4.202. A separate token
# because GH_TOKEN above is the App's, scoped to the hourly repo. Empty
# on failure — the script then falls back to package.json, which is
# stale but never wrong enough to fail a build.
main_tags="$(GH_TOKEN="$MAIN_REPO_TOKEN" gh api \
"repos/$GITHUB_REPOSITORY/git/matching-refs/tags/v" \
--jq '.[].ref | sub("^refs/tags/"; "")' || true)"
# Already-shipped channel tags are a second floor: even if main's tag
# list is empty this run, a 1.4.203-hourly already out must not be
# followed by a 1.4.202-hourly.
channel_tags="$(gh release list --repo "$HOURLY_REPO" --limit 200 --json tagName \
--jq '.[].tagName' || true)"
published="$main_tags"$'\n'"$channel_tags"
echo "Published version sources: $(grep -c . <<<"$main_tags" || true) main tags, $(grep -c . <<<"$channel_tags" || true) channel tags"
ORCA_PUBLISHED_VERSIONS="$published" ORCA_HOURLY_RELEASE_NAMES="$names" \
node config/scripts/hourly-build-version.mjs \
>"$RUNNER_TEMP/hourly-identity.txt"
Expand Down
63 changes: 44 additions & 19 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@ jobs:
- name: Lint
run: pnpm exec oxlint --format github

- name: Reject low-evidence patterns
run: pnpm run audit:anti-slop

- name: Enforce focused code-quality plugins
run: pnpm run audit:code-quality:native

Expand Down Expand Up @@ -186,6 +189,9 @@ jobs:
- name: Check reliability gate manifest
run: pnpm run check:reliability-gates

- name: Enforce dead design-system classes
run: pnpm run check:dead-classes

- name: Check VM runtime rollback compatibility
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
Expand Down Expand Up @@ -369,40 +375,59 @@ jobs:
# Why: the 2.25.5 lane is a source build of a pinned tarball, so it produced the
# same binary on every PR for minutes of runner time. The key carries the version
# because that is the only input; the sha256 assertion below still guards the
# tarball on the miss path that actually builds.
# tarball on the miss path that actually builds. Only this PR's own later pushes
# can restore it — GitHub scopes a cache written from a pull_request run to that
# ref — so a first push always takes the build path below.
- name: Cache baseline Git build
uses: actions/cache@v5
with:
path: ~/.cache/orca-git-compat/git-2.25.5
key: git-compat-baseline-${{ runner.os }}-${{ runner.arch }}-2.25.5

# Why its own step: this is `make -j$(nproc)` on every core, and the lanes below
# spend their wall clock waiting on container starts, not on Git. Sharing a runner
# with the build stretched one ~1.5s boundary case past Vitest's 30s timeout, so
# the build has to finish before anything timed starts.
- name: Build the baseline Git binary
run: |
archive="$RUNNER_TEMP/git-2.25.5.tar.gz"
source="$HOME/.cache/orca-git-compat/git-2.25.5"
if [ -x "$source/git" ]; then
exit 0
fi
curl -fsSL https://www.kernel.org/pub/software/scm/git/git-2.25.5.tar.gz -o "$archive"
echo "41662c52fc16fec4963bfc41075e71f8ead6b5e386797eb6f9a1111ff95a8ddf $archive" \
| sha256sum --check
mkdir -p "$source"
tar -xzf "$archive" -C "$source" --strip-components=1
make -C "$source" -j"$(nproc)" \
NO_GETTEXT=YesPlease NO_TCLTK=YesPlease NO_PYTHON=YesPlease git
# Why: the linked binaries are what the next run needs; the objects that
# produced them are most of the tree and would bloat the cache entry.
find "$source" -name '*.o' -delete

- name: Verify Git binary compatibility matrix
run: |
specs=(
"alpine/git:edge-2.38.1|2.38.1"
"alpine/git:v2.49.1|2.49.1"
)
# Why pull up front: a lane's first `docker run` otherwise pulls its image
# while the sibling lane is mid-test, and that stall is charged to the test.
for spec in "${specs[@]}"; do
docker pull --quiet "${spec%%|*}"
done

pids=()
(
archive="$RUNNER_TEMP/git-2.25.5.tar.gz"
source="$HOME/.cache/orca-git-compat/git-2.25.5"
if [ ! -x "$source/git" ]; then
curl -fsSL https://www.kernel.org/pub/software/scm/git/git-2.25.5.tar.gz -o "$archive"
echo "41662c52fc16fec4963bfc41075e71f8ead6b5e386797eb6f9a1111ff95a8ddf $archive" \
| sha256sum --check
mkdir -p "$source"
tar -xzf "$archive" -C "$source" --strip-components=1
make -C "$source" -j"$(nproc)" \
NO_GETTEXT=YesPlease NO_TCLTK=YesPlease NO_PYTHON=YesPlease git
# Why: the linked binaries are what the next run needs; the objects that
# produced them are most of the tree and would bloat the cache entry.
find "$source" -name '*.o' -delete
fi
ORCA_GIT_COMPAT_BINARY="$source/git" ORCA_GIT_COMPAT_VERSION="2.25.5" \
ORCA_GIT_COMPAT_BINARY="$HOME/.cache/orca-git-compat/git-2.25.5/git" \
ORCA_GIT_COMPAT_VERSION="2.25.5" \
pnpm exec vitest run --config config/vitest.config.ts \
src/shared/git-binary-compatibility.test.ts
) &
pids+=("$!")

for spec in \
"alpine/git:edge-2.38.1|2.38.1" \
"alpine/git:v2.49.1|2.49.1"; do
for spec in "${specs[@]}"; do
(
image="${spec%%|*}"
version="${spec#*|}"
Expand Down
17 changes: 17 additions & 0 deletions .github/workflows/release-cut.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1222,6 +1222,20 @@ jobs:
echo "identity=$identity" >>"$GITHUB_OUTPUT"
echo "Classified $TAG as $identity"

# Why here and not in build:relay: only a Windows runner can compile it, and
# arm64 cross-compiles from this same x64 agent. Mirrors dev-channel-win-build.yml,
# which had it while release-cut did not — so every stable installer through
# v1.4.203 shipped Windows relays with no windows-process-tree.node, silently
# falling back to the PowerShell scan on every Windows SSH host.
# Why no run_attempt guard, unlike the artifact steps below: Build app is ungated,
# so a rerun would reach the required-addon check with nothing staged and fail.
- name: Build Windows process-table addon for the relay
if: matrix.platform == 'win'
shell: bash
run: |
node config/scripts/build-windows-process-tree-relay-addon.mjs --arch=x64
node config/scripts/build-windows-process-tree-relay-addon.mjs --arch=arm64

# 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
Expand All @@ -1244,6 +1258,9 @@ jobs:
ORCA_BUILD_IDENTITY: ${{ steps.tag-classify.outputs.identity }}
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 silently falls back to
# the PowerShell scan on every Windows SSH host.
ORCA_REQUIRE_RELAY_NATIVE_ADDONS: ${{ matrix.platform == 'win' && 'x64,arm64' || '' }}

- name: Gate runtime file-watcher process isolation
if: runner.os == 'Linux'
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/unit-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ jobs:
--exclude=src/main/daemon/node-pty-fd-leak.test.ts \
--exclude=src/main/providers/local-pty-shell-ready-zsh-launch-environment.test.ts \
--exclude=src/main/providers/__tests__/shell-ready-framework-example.test.ts \
--exclude=src/main/pty/omp-shell-wrapper-alias-safety.test.ts \
--exclude=src/main/pty/omp-shell-wrapper.node-pty.test.ts \
--exclude=src/main/shell-startup-feature-channel.test.ts \
--exclude=src/main/terminal-history-fish-session.node-pty.test.ts \
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ docs/**
!docs/reference/ssh-host-key-verification.md
!docs/reference/ssh-reconnect-source-recovery.md
!docs/reference/windows-setup-shell.md
!docs/reference/windows-terminal-shell-selection.md
!docs/reference/worktree-scan-fingerprint.md
!docs/reference/wsl-command-execution.md
!docs/reference/wsl-probe-failure-semantics.md
Expand Down Expand Up @@ -193,3 +194,6 @@ tests/e2e/.cross-version-checkouts/
# IS committed). Also keeps oxfmt/oxlint, which honor this file, from walking
# vendored gems.
/mobile/vendor/

# Generated by config/scripts/sync-anti-slop-plugin.mjs from the pinned oxlint-plugin-anti-slop
.anti-slop-plugin/
6 changes: 5 additions & 1 deletion .oxfmtrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,9 @@
"semi": false,
"printWidth": 100,
"trailingComma": "none",
"ignorePatterns": ["cloud/**", ".github/actions/cloud-sql-rollout-lease/**"]
"ignorePatterns": [
"cloud/**",
".github/actions/cloud-sql-rollout-lease/**",
".anti-slop-plugin/**"
]
}
4 changes: 3 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Design System

All UI work — layout, color, typography, spacing, component selection, UX behavior — must follow [`docs/STYLEGUIDE.md`](./docs/STYLEGUIDE.md). Use the tokens defined in `src/renderer/src/assets/main.css` (the canonical source) and the shadcn primitives in `src/renderer/src/components/ui/`. Don't invent new color values, font sizes, or shadow tiers when a documented one already covers the role. When STYLEGUIDE.md is silent, follow the resolution order in its final section.
All UI work — layout, color, typography, spacing, component selection, UX behavior — must follow [`docs/STYLEGUIDE.md`](./docs/STYLEGUIDE.md). Most of it is linted: `pnpm run check:code-quality:changed` fails on new restyles of a `components/ui/` primitive, raw palette colors, and computed `className` strings; `pnpm lint` fails on any class Tailwind cannot generate. See the Enforcement section of the style guide before suppressing either. Use the tokens defined in `src/renderer/src/assets/main.css` (the canonical source) and the shadcn primitives in `src/renderer/src/components/ui/`. Don't invent new color values, font sizes, or shadow tiers when a documented one already covers the role. When STYLEGUIDE.md is silent, follow the resolution order in its final section.

## Electron UI Validation

Expand Down Expand Up @@ -46,6 +46,7 @@ Avoid type assertions except `as const`. Unavoidable casts need a line-specific
- **Typecheck**: `pnpm tc` (or `tc:node` / `tc:cli` / `tc:web`)
- **Test**: see [Running Tests: Remote Sandbox Only](#running-tests-remote-sandbox-only) — `pnpm test` is blocked on this machine
- **Lint**: `oxlint`, or `pnpm run check:code-quality:changed` for changed files (full `pnpm lint` is slow); format with `pnpm format`
- **Design system**: `pnpm run lint:design-system` for the full renderer report (not a gate); the changed-lines gate above is what CI enforces

# Typed Observations: the Orca Ledger

Expand Down Expand Up @@ -204,6 +205,7 @@ Orca targets macOS, Linux, and Windows. Keep all platform-dependent behavior beh
- **Keyboard shortcuts**: Never hardcode `e.metaKey`. Use a platform check (`navigator.userAgent.includes('Mac')`) to pick `metaKey` on Mac and `ctrlKey` on Linux/Windows. Electron menu accelerators should use `CmdOrCtrl`.
- **Shortcut labels in UI**: Display `⌘` / `⇧` on Mac and `Ctrl+` / `Shift+` on other platforms.
- **File paths**: Use `path.join` or Electron/Node path utilities — never assume `/` or `\`.
- **Windows terminal shells**: `--shell` picks the shell a terminal *is*; `--command` is typed into whatever shell the host spawned, so a shell choice routed through `command` silently becomes a child process. See [`docs/reference/windows-terminal-shell-selection.md`](./docs/reference/windows-terminal-shell-selection.md).
- **Windows setup scripts**: the setup/issue-command runner is a `.cmd` batch file unless the script starts with a `#!` line — never derive that from the user's terminal-shell preference, and never launch a `.cmd` runner with a bare `cmd.exe /c` from a Git Bash pane (MSYS rewrites the `/c`). See [`docs/reference/windows-setup-shell.md`](./docs/reference/windows-setup-shell.md).
- **Windows child processes**: start them through `runProcess`/`spawnProcess` in `src/shared/child-process/` — never `child_process` directly. It pins `windowsHide`, refuses `shell: true`, and encodes `.cmd`/`.bat` arguments so neither `CommandLineToArgvW` nor `cmd.exe` mangles them. A ratchet test fails on any new direct import. Recognised npm/pnpm `.cmd` shims are resolved to their real target so the spawn skips `cmd.exe` entirely; see [`docs/reference/windows-cmd-shim-resolution.md`](./docs/reference/windows-cmd-shim-resolution.md) before adding a shim shape or debugging one.
- **Windows process enumeration**: read the table through `src/main/windows/windows-process-table.ts`, never by forking `powershell.exe`. See [`docs/reference/windows-process-enumeration.md`](./docs/reference/windows-process-enumeration.md).
Expand Down
Loading
Loading