Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
5264 commits
Select commit Hold shift + click to select a range
9b46c3f
fix(terminal): let unselected Cmd+C reach apps that own their selecti…
Sep 28, 2026
1f6f852
feat(terminal): add Reset Terminal that clears leftover input modes o…
Sep 28, 2026
fe7e13d
test(claude): expect typed cancellation in queued-send settlements (#…
Sep 28, 2026
55aea85
fix(ci): repair terminal link handling and E2E recovery fixtures (#23…
Sep 28, 2026
409462a
fix(status-bar): fold agents into +N before status labels go icon-onl…
Sep 28, 2026
fe34acd
fix(mobile): truncate oversize markdown reads instead of failing them…
Sep 28, 2026
0f52bb8
perf(ci): use four ARM test workers and remove repeated compilation (…
Sep 28, 2026
0ceb3fa
test(e2e): give wheel probes a running TUI fixture (#23691)
Sep 28, 2026
1a0ff42
test: finish sidebar lazy imports before teardown (#23694)
Sep 28, 2026
dbc4e21
fix(sidebar): move agent child disclosure to the right (#23577)
Sep 28, 2026
29c7d5d
fix(mobile): start AI-button agents through agent.launch, never a bar…
Sep 28, 2026
8c61a5d
fix(windows): require signed release binaries and identify CLI launch…
Sep 28, 2026
e87772b
test: retire a dormant worker through host-owned status (#23686)
Sep 28, 2026
b482b4d
test: measure pointer gestures on the isolated visible display (#23678)
Sep 28, 2026
813aff8
fix(opencode): stop OpenCode 2 loading a stale plugin from the retire…
Sep 28, 2026
153d3fd
feat(native-chat): Codex sessions write their subagents into the host…
Sep 28, 2026
a880c88
test(browser): check grab scope through responsive chrome (#23709)
Sep 28, 2026
2ca4ecb
feat(orchestration): let a structured chat run orchestration as itsel…
Sep 28, 2026
c5330d0
fix(native-chat): stop killing processes that only inherited a chat's…
Sep 28, 2026
e8e144b
fix(native-chat): a subagent's words are presented as that subagent's…
Sep 28, 2026
e794012
fix(tab-group): measure fallback pane geometry once per tab group, on…
Sep 28, 2026
9b11b1d
fix(agent-hooks): compare status rows structurally instead of seriali…
Sep 28, 2026
64569a8
fix(ssh): don't overwrite remote agent config after a failed read (#2…
Sep 28, 2026
2af897d
fix(codex): the provider supervisor outlives its provider group when …
Sep 28, 2026
d68eee3
fix(runtime): retire an exited terminal before its stream end (#23492)
Sep 28, 2026
d0db35c
fix(terminal): preserve typing while a remote pane reattaches (#23701)
Sep 28, 2026
2aed2cf
fix(terminal): reveal splits while the source pane binds (#23692)
Sep 28, 2026
4b622e1
fix(runtime): reopen the quiet-foreground tui-idle lane for agents wi…
Sep 28, 2026
64dbe87
test(terminal): wait for decoy panes before host parking (#23729)
Sep 28, 2026
8bb78f0
test(browser): create probe body before starting frame requests (#23730)
Sep 29, 2026
bd5dca4
fix(editor): preserve combined diff scroll on line focus (#23735)
Sep 29, 2026
d606be3
test: wait for remote terminal grid convergence after reveal (#23738)
Sep 29, 2026
da48d98
fix: bound combined diff editors and scope chat style invalidation (#…
Sep 29, 2026
ccdb324
Add CodeBuddy as a built-in coding agent (#23740)
Sep 29, 2026
28942ee
test(mobile): repin the RPC recording corpus to main after #22762 (#2…
Sep 29, 2026
ec9f35e
perf(ci): plan the unit shards before the static-analysis gate instea…
Sep 29, 2026
a134d12
feat(mobile): tell users when a newer app binary is installable (#23755)
Sep 29, 2026
85ad292
fix(status-bar): re-measure collapsing levels when only the collapsed…
Sep 29, 2026
a5ce825
Agent launches carry the surface that started them (#23697)
Sep 29, 2026
94b5a7d
fix(native-chat): only Codex's turn completion ends a Codex turn (#23…
Sep 29, 2026
b283a09
fix(native-chat): stop flashing "still starting" on every chat launch…
Sep 29, 2026
2dc2693
fix(native-chat): a turn a proven crash cut short reads interrupted (…
Sep 29, 2026
b4c19f1
fix(claude): run structured Claude under the POSIX provider superviso…
Sep 29, 2026
b776e9a
fix(browser): give a tab's identity one owner so viewport presets sto…
Sep 29, 2026
3976ad4
perf(test): remove obsolete structural snapshots (#23777)
Sep 29, 2026
2ae7c00
fix(opencode): keep OpenCode 2 panes Working across plugin reloads (#…
Sep 29, 2026
e899809
fix(mobile): unsubscribe session tabs by request on the direct connec…
Sep 29, 2026
c5fc0c6
fix(ci): keep a squash-merged RPC recording pin reachable through its…
Sep 29, 2026
50a8ef1
fix(native-chat): keep a turn's bar on the prompt that opened it (#23…
Sep 29, 2026
c30c8f9
fix(native-chat): a message Claude folds into its running turn no lon…
Sep 29, 2026
c8af48d
fix(runtime): settle a quiet Codex composer as ready on every version…
Sep 29, 2026
18bd9cb
test(status-bar): cover re-probing a roomier level after the tightest…
Sep 29, 2026
7445fea
fix(terminal): only diagnose disk exhaustion from capacity errors
Sep 29, 2026
2ea3fb1
perf(ci): take advisory unit-selection evidence off the gate (#23776)
Sep 29, 2026
f6324f2
chore(ci): stop auto-filing community PRs onto the project board (#23…
Sep 29, 2026
ceffecf
fix(setup): remove wait-for-setup helper text (#23799)
Sep 29, 2026
643f93f
fix(native-chat): drop the Codex error path #23682 removed (#23801)
Sep 29, 2026
2d358df
fix(i18n): prune the wait-for-setup help copy #23799 removed (#23802)
Sep 29, 2026
25d9c57
fix(native-chat): keep a child turn settling on an error Codex will n…
Sep 29, 2026
5560e53
Update README downloads badge
Sep 29, 2026
f8f656c
perf(ci): spend fewer concurrency slots per pull request (#23810)
Sep 29, 2026
33f661b
fix(native-chat): an empty workspace opens the default agent as a cha…
Sep 29, 2026
f4829f0
fix(renderer): stop the modal toast rule from freezing large diffs (#…
Sep 29, 2026
b8a7daf
fix(codex): guard the daemon socket in the home a resumed Codex pane …
Sep 29, 2026
b7e3bbf
fix(browser): restore hover after leaving a mobile viewport preset (#…
Sep 29, 2026
357a2fe
fix(native-chat): group chat rows by the turn that produced them (#23…
Sep 29, 2026
bd13305
refactor(sidebar): one subagent row for CLI and structured children, …
Sep 29, 2026
b6c2de9
fix(codex): index a new account home before bridging history into it …
Sep 29, 2026
bb91e39
test(native-chat): main's Codex child tests expect a turn to end on i…
Sep 29, 2026
36c473e
fix(runtime): wait out Codex 0.157's startup screen, and stop at Code…
Sep 29, 2026
e1362ad
fix(terminal): stop inline-image decoders exhausting the renderer's w…
Sep 29, 2026
6e1b7e7
test: remove junk tests that assert source text instead of behavior (…
Sep 29, 2026
4da485c
fix(native-chat): render the terminal-backed chat through the structu…
Sep 29, 2026
c49388c
fix(native-chat): Stop is there from the moment a message is sent (#2…
Sep 29, 2026
31012ae
test: remove assertion-free probes, copied inventories and export-sha…
Sep 29, 2026
3c1af16
perf(usage): persist a scan's analytics session IDs in one write (#23…
Sep 29, 2026
9420d49
fix(terminal): run Codex in Orca terminals without the shared backgro…
Sep 29, 2026
c1628b4
feat(orchestration): deliver worker results to a structured chat coor…
Sep 29, 2026
8f4a740
fix(daemon): roll Codex no-daemon shell launch into a fresh v37 daemo…
Sep 29, 2026
62e3a5a
fix(codex): turning Codex off per agent keeps its hook entry off (#23…
Sep 29, 2026
a5c7dd9
Update README downloads badge
Sep 29, 2026
b18434b
feat(explorer): scope file trees to sparse checkout directories (#18750)
Sep 29, 2026
f442b16
fix(editor): follow system light and dark while the editor tab stays …
Sep 29, 2026
d60f999
fix(native-chat): turn facts come from the turn record, and /compact …
Sep 29, 2026
18327d9
fix(claude): a queued message Claude withdrew is settled from Claude'…
Sep 29, 2026
ff59e2c
fix(codex): log a late reply to a timed-out request instead of showin…
Sep 29, 2026
c2517a4
fix(terminal): removing a workspace prunes that workspace's close rec…
Sep 29, 2026
d4530a8
feat(native-chat): resuming interrupted chats runs in the status bar …
Sep 29, 2026
5c59a2d
fix(native-chat): a failed turn ends on its error instead of folding …
Sep 29, 2026
2807332
refactor(shared): bring constants.ts back under the max-lines limit (…
Sep 29, 2026
0fd098e
fix(browser): a tab's phone identity follows the viewport actually ap…
Sep 29, 2026
4ebec19
fix(browser): a crashed page no longer crashes Orca when its viewport…
Sep 29, 2026
134a220
fix(native-chat): an unfinished /clear or refused Codex rewind no lon…
Sep 29, 2026
29c49ae
feat(native-chat): hold mid-turn messages in a host-owned queue (#23726)
Sep 29, 2026
70475e0
test: stop testing private internals through exports no caller needs …
Sep 29, 2026
c634432
fix(mobile): count opening a cached page generation as use; cache six…
Sep 29, 2026
2d31941
fix(mobile): the update-mobile wall opens the exact release (#23789)
Sep 29, 2026
21d4ae9
feat(agents): pre-trust the folder wherever Orca starts an agent (#23…
Sep 29, 2026
a57863b
fix(native-chat): the draft queue follows #23524's /clear: an unfinis…
Sep 29, 2026
2a001b4
fix(mobile): stop a closing phone stream from ending the terminal or …
Sep 29, 2026
6194a7a
test: drop private-internal and boundary-census tests with behavioral…
Sep 29, 2026
4855cdd
test: retire private-predicate duplicates in the renderer (#23945)
Sep 29, 2026
59b746f
feat(native-chat): one structured-chat journal database per host, own…
Sep 29, 2026
bb667a3
test: retire the last private-predicate duplicates in the leaked-inte…
Sep 30, 2026
fed1eca
test: stop restating internal tuning constants, keep the ones that ar…
Sep 30, 2026
69b1e40
fix(codex): say a full Stop wait can overrun quit's eviction budget, …
Sep 30, 2026
9f43115
fix(codex): trust the worktree Codex starts in, not a guessed repo ro…
Sep 30, 2026
7980ab9
test: remove mock echoes and duplicate contracts that only reading fi…
Sep 30, 2026
7f8ca49
fix(codex): start short-lived Codex app-servers on Windows without cm…
Sep 30, 2026
7fb3b90
test: retire browser and cookie-import cases their siblings already o…
Sep 30, 2026
1aa9437
fix(codex): a Codex Stop is the interrupt alone, so it no longer says…
Sep 30, 2026
f094587
test(claude): run the real Claude CLI tests only when opted in (#23702)
Sep 30, 2026
aa68003
test: retire renderer pane and completion-cadence cases siblings alre…
Sep 30, 2026
26bb7c2
fix(terminal): run Orca's cmd.exe, path-named and setup-gated Codex l…
Sep 30, 2026
cd63c99
test: retire cases whose predicates never read the varied input (#23965)
Sep 30, 2026
8a38a7a
feat(mobile): mid-turn messages wait as cards above the phone compose…
Sep 30, 2026
a0abcb6
feat(settings): let Codex terminals opt back into Codex's shared serv…
Sep 30, 2026
9be71d0
test: retire native-chat cases their fixtures or predicates neutraliz…
Sep 30, 2026
59ef748
fix(terminal): the terminal's owner answers colour queries for the te…
Sep 30, 2026
9b52661
fix(claude): a Stop naming the running turn acts at once, and a Stop …
Sep 30, 2026
6b36a2c
feat(native-chat): mid-turn messages wait as editable cards above the…
Sep 30, 2026
ad2e1b5
fix(terminal): restore the mouse format with mouse tracking, so phone…
Sep 30, 2026
2aad275
test: delete a suite that tested only itself, and trim browser-pane d…
Sep 30, 2026
fb67d5d
fix(runtime): stop a busy Codex 0.150-0.157 pane reading as tui-idle …
Sep 30, 2026
3b45836
Show skip reasons in terminal drop upload reports (#23951)
Sep 30, 2026
45c63a6
test: delete the source-grep tests an earlier detector's regex missed…
Sep 30, 2026
33351b0
test: retire hook and installer cases whose guards or arithmetic cann…
Sep 30, 2026
fb52c06
fix(terminal): release xterm's DEC 2026 render hold instead of waitin…
Sep 30, 2026
0978474
Set iceCandidatePoolSize to 0 in WebRTC egress probe (#23991)
Sep 30, 2026
34d6041
test: retire ai-vault cases whose inputs the scanner never reads (#23…
Sep 30, 2026
80786dd
fix(onboarding): build the agent step around skills, not CLI registra…
Sep 30, 2026
9803967
test: retire codex cases whose setup is inert or whose name outruns i…
Sep 30, 2026
91ab51b
fix(terminal): attach dropped images whose filenames need escaping (#…
Sep 30, 2026
bb874f6
test: retire cli cases that re-run a contract the sibling already own…
Sep 30, 2026
b7209b5
perf(git): relist only the repo whose worktrees changed, and stop blo…
Sep 30, 2026
dcaef9d
test: retire relay, preload and shared cases that re-prove an owned c…
Sep 30, 2026
b29947d
fix(secrets): stop telling Linux users to install a keyring they alre…
Sep 30, 2026
2d85fdc
test: retire src/main cases that replay a contract their owner alread…
Sep 30, 2026
f7025d8
fix(push): give the push gateway six database connections per instanc…
Sep 30, 2026
e594cb0
test(mobile): record RPC goldens without a pinned commit, and check r…
Sep 30, 2026
d414033
fix(packaging): stop shipping the relay bundles inside app.asar (#24027)
Sep 30, 2026
c3183a4
test(e2e): let the completed-worker fake Codex answer the --help prob…
Sep 30, 2026
75040eb
test: open, seed and read the agent-session record store through one …
Sep 30, 2026
5211098
fix(push): run twelve delivery drains instead of four (#24038)
Sep 30, 2026
71ac7cb
Fix typo in PR template about issue linking
Sep 30, 2026
21124db
refactor(native-chat): a subagent's rows live in its own section, not…
Sep 30, 2026
f406874
fix(claude): a restarted provider continues the subagent roster earli…
Sep 30, 2026
8b01590
fix(editor): keep saved untitled notes when their tab closes (#23768)
Sep 30, 2026
9cdbeba
fix(tab-bar): keep the active tab visible when the tab strip scrolls …
Sep 30, 2026
e8e09ee
fix(push): size the claim-attempt budget from the drain count (#24040)
Sep 30, 2026
5b3366f
test: unit tests can no longer write a developer's real agent or Orca…
Sep 30, 2026
c7218f2
test: retire src/main/runtime cases that re-prove an owned contract (…
Sep 30, 2026
444e0b1
fix(codex): recognise Codex's quoted spellings in config.toml, and re…
Sep 30, 2026
f33f309
docs(wechat): point community QR code at group 11 (#24050)
Sep 30, 2026
fceca5c
fix(sidebar): an agent's row stays while it runs, whatever its tab ti…
Sep 30, 2026
ca7c14d
fix(mobile): start + menu, quick command and diff-note agents through…
Sep 30, 2026
7afa4ee
test(e2e): read the tab strip's dock samples through a typed window f…
Sep 30, 2026
5b93c62
Fix Chat UI paste intake and pane routing (#23784)
Sep 30, 2026
707d3dc
fix(chat): decode Claude pastes and report terminal delivery uncertai…
Sep 30, 2026
59c05d3
fix(rate-limits): stop driving a hidden Codex TUI to read usage (#23806)
Sep 30, 2026
75719bd
fix(terminal): keep the mouse report format in desktop pane snapshots…
Sep 30, 2026
d68a5be
fix(claude): run Windows hooks without shell operators (#23944)
Sep 30, 2026
f37a849
test: retire renderer cases whose input cannot reach the behavior the…
Sep 30, 2026
f4092c0
fix(runtime): treat Hermes session start as idle, not a running turn …
Sep 30, 2026
b99462a
test: retire mobile, cloud, config and e2e cases their input cannot r…
Sep 30, 2026
5fa290f
feat(secrets): warn in Settings when a credential is stored unencrypt…
Sep 30, 2026
23a874a
fix(secrets): seal credentials on Linux desktops Chromium cannot dete…
Sep 30, 2026
cef66fb
test: retire long-tail cases whose input cannot reach the behavior th…
Sep 30, 2026
d2dbe2c
fix(windows): replace the managed CLI launcher with a native one (#24…
Sep 30, 2026
a781a60
test: retire duplicate cases that replay an owner across a re-export …
Sep 30, 2026
db73d28
test: retire backlog cases that assert a shim, a literal, or an unrea…
Sep 30, 2026
0c4b336
test: close the disclosed reading gap in agent-hooks, claude and stor…
Sep 30, 2026
85f8d6b
test: retire long-tail cases whose assertion is decided by the test i…
Sep 30, 2026
1f8159c
test: retire cases whose named dimension the production signature can…
Sep 30, 2026
8cc2854
Update README downloads badge
Sep 30, 2026
fa3710d
test: retire cases whose fixture decides the outcome it asserts (#24144)
Sep 30, 2026
d74388f
test: retire cases subsumed by an honestly-named neighbour (#24150)
Sep 30, 2026
e038704
fix(orchestration): accept worker reports without the dispatch capabi…
Sep 30, 2026
46d6b76
fix(orchestration): retry worker_done while the Orca runtime is brief…
Sep 30, 2026
9afd110
fix(orchestration): stop minting and printing the dispatch capability…
Sep 30, 2026
3047353
fix(orchestration): worker-abandon settles a stuck worker and records…
Sep 30, 2026
cb36344
feat(native-chat): register Codex default-mode helpers as subagents (…
Sep 30, 2026
ba39c6d
fix(native-chat): a failed startup chat-lease save no longer puts the…
Sep 30, 2026
373d951
fix(editor): highlight shell startup dotfiles (#24066)
Sep 30, 2026
2caa79e
fix(source-control): drop reasoning model think blocks from generated…
Sep 30, 2026
cfe4c63
fix(mobile): publish the Android APK's size and checksum with the rel…
Sep 30, 2026
95e8725
fix(claude): stop Orca making a WSL user's ~/.claude.json world-reada…
Sep 30, 2026
ed462b2
fix(relay): re-place hosts off a draining cell without locking its ro…
Sep 30, 2026
007b7c0
fix(claude): end a message Claude started but never confirmed, and ke…
Sep 30, 2026
7cae036
fix(native-chat): a failed Codex turn shows its error, not a raw thre…
Sep 30, 2026
afa81dc
fix(native-chat): chat failure messages appear in the app's language …
Sep 30, 2026
2be67ce
fix(source-control): show git history commit times to the second (#23…
Sep 30, 2026
cfa43e7
fix(codex): opening a terminal no longer strips Codex hooks from the …
Sep 30, 2026
5cda0f4
refactor(native-chat): keep agent-session records in the chat journal…
Sep 30, 2026
84f58a1
fix(relay): refuse a redial at once while the host's own release hold…
Sep 30, 2026
24edf0f
fix(agent-status): a turn a crash cut off reads Interrupted, an unpro…
Sep 30, 2026
b4b708c
fix(native-chat): a Codex stream retry is one warning row that update…
Sep 30, 2026
8dab53f
fix(worktrees): a finished create no longer pulls you off the workspa…
Sep 30, 2026
3727100
fix(opencode): report OpenCode 2 status from each pane's own TUI (#23…
Sep 30, 2026
b594898
test: stop main failing on three tests the store and close-cause chan…
Sep 30, 2026
6f2a7d0
fix(worktrees): let git delete removed checkouts so chat sends never …
Sep 30, 2026
3ab3c92
fix(native-chat): the working line shows only what the agent is doing…
Sep 30, 2026
6729f1b
fix(notes): send AI notes to open structured chat sessions (#24221)
Oct 1, 2026
2ab179c
fix(emulator): take serve-sim 0.1.47 so the iOS simulator works on Xc…
Oct 1, 2026
2454030
fix(agent-status): preserve hook presence when process checks cannot …
Oct 1, 2026
0b79720
feat(native-chat): the chat strip and the sidebar read the host's chi…
Oct 1, 2026
12b8ef8
fix(worktree): update local main safely, once per branch, alongside t…
Oct 1, 2026
1b0ee96
fix(browser): stop the first browser command on a new Windows tab han…
Oct 1, 2026
7c11946
fix(relay): define restart-safe by the cell runtime, and refuse waves…
Oct 1, 2026
a76a0bc
fix(rate-limits): read real Antigravity quota from the agy CLI, not t…
Oct 1, 2026
78daf71
fix(status-bar): show Antigravity's model-group pools instead of an e…
Oct 1, 2026
a4606cc
fix(cli): orca file open no longer moves your view unless you pass --…
Oct 1, 2026
daf63e6
fix(runtime): read Antigravity, Cline and Prime Agent readiness from …
Oct 1, 2026
cb11a9f
Improve scroll indicator visibility with larger sizes and opacity (#2…
Oct 1, 2026
c0ac2b1
feat(browser): add a rebindable shortcut for Annotate page element (#…
Oct 1, 2026
e9ec631
fix(mobile): hold-to-dictate, repeat keys and the browser long-press …
Oct 1, 2026
069eaf5
fix(mobile): iOS shell keeps WebKit text interaction on so page field…
Oct 1, 2026
1762a13
feat(mobile): slide the page's host stack on push and Back (#24268)
Oct 1, 2026
e10b835
fix(editor): honor the Markdown Review Notes setting (#24057)
Oct 1, 2026
be57580
fix(codex): steer a mid-turn send into the running turn by name (#21062)
Oct 1, 2026
07e9fdf
fix(native-chat): a message the chat said was not sent is never sent …
Oct 1, 2026
3fe4b18
fix(ai-vault): require node:sqlite backup support in remote SQLite pr…
Oct 1, 2026
7e5950c
fix(ssh): keep keystrokes typed while a restored SSH terminal reattac…
Oct 1, 2026
3135fbb
feat(runtime): pin the Node 24.21.0 server runtime with an offline CI…
Oct 1, 2026
ebc479b
fix(native-chat): /clear starts nothing; the new chat's first message…
Oct 1, 2026
a8a434d
fix(native-chat): a resting chat lists its model the way the running …
Oct 1, 2026
49a83de
refactor(orcad): make profile backup and preflight runtime-neutral (#…
Oct 1, 2026
2a83c95
ci(daemon): gate PRs on daemon protocol crossing from the newest rele…
Oct 1, 2026
a37e502
test(native-chat): cancel the journal import test's tick before teard…
Oct 1, 2026
b245b3e
feat(sidebar): let the host pill be turned off per card (#24299)
Oct 1, 2026
4bd55c0
fix(claude): a Stop ends Claude's process, and the next message resum…
Oct 1, 2026
d4ae6a9
Update README downloads badge
Oct 1, 2026
d2dfc79
ci(daemon): runtime-launcher protocol ratchet and Node slot marker (#…
Oct 1, 2026
3e5c8d9
feat(relay): declare Asia cell c31 at the c30 shape (#24310)
Oct 1, 2026
6593d7d
feat(orcad): run orcad on the pinned Node instead of Bun (#24110)
Oct 1, 2026
94f6c53
fix(relay): gate the Asia canary on Asia-targeted region fallbacks on…
Oct 1, 2026
6b8ca27
chore(relay): move Asia cell c31 to the general same-cap lists after …
Oct 1, 2026
8c2cd7d
feat(ai-vault): read remote OpenCode history with the pinned Node; re…
Oct 1, 2026
9ddcc9b
fix(ssh): collect relay versions only when provably exited; runtimes/…
Oct 1, 2026
ddd4927
build(orcad): server node-pty slots at glibc 2.28, plus a glibc 2.17 …
Oct 1, 2026
a560137
feat(ssh): opt-in SSH relay on the pinned Node with prebuilt addons (…
Oct 1, 2026
3a6148e
refactor(native-chat): move the provider-exit proof out of structured…
Oct 1, 2026
53fd2de
feat(ssh): relay runtime fallback ladder, telemetry and host runtime …
Oct 1, 2026
9ed7b39
fix(relay): run the same-cap headroom gate in the modes the job actua…
Oct 1, 2026
67014c8
feat(ssh): pinned-Node relay on Windows SSH hosts (#24135)
Oct 1, 2026
bd90da7
ci: share PR planning setup and reuse the static native cache (#24329)
Oct 1, 2026
38cb4a0
feat(ssh): runtime-store GC in production and exec-stdin upload fallb…
Oct 1, 2026
5f728f7
fix(relay): let a draining cell pass restart-safe through refused red…
Oct 1, 2026
89f9766
fix(web): drop the macOS traffic-light inset from the paired web client
Oct 1, 2026
d34dabb
fix(web): drive the traffic-light width and pad from one paired-web read
Oct 1, 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
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
94 changes: 86 additions & 8 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,12 +1,90 @@
/config/scripts/create-draft-release.mjs text eol=lf
/config/scripts/orca-dev.mjs text eol=lf
/config/scripts/latest-stable-release.mjs text eol=lf
/config/scripts/publish-complete-draft-releases.mjs text eol=lf
/config/scripts/release-rc-history.mjs text eol=lf
/config/scripts/run-internal-dev-setup.mjs text eol=lf
/config/scripts/verify-cli-bin.mjs text eol=lf
/config/scripts/verify-release-required-assets.mjs text eol=lf
# A shebang plus CRLF makes vite's SSR transform emit a literal `#!` mid-module,
# so any suite importing the script dies at load with a SyntaxError. Pin the whole
# directory rather than the scripts that happen to have a test today.
/config/scripts/**/*.mjs text eol=lf
/skill-guides/*.md text eol=lf
/skill-stubs/*.md text eol=lf
/skill-stubs/_shared/*.md text eol=lf
/skills/*/SKILL.md text eol=lf
/src/cli/bundled-skill-guides.ts 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
# .version, which names the immutable remote install dir. A CRLF checkout makes a
# Windows-built client disagree with a mac/Linux-built one on the same release,
# so one host ends up with two relay trees (#17886 review).
/config/relay-assets/** text eol=lf
# Pin the bytes so a patch reads and diffs identically on every host. It is NOT
# what makes the hash right: pnpm hashes a patch LF-normalized, so a CRLF checkout
# cannot change it. Believing otherwise put a hand-computed raw digest in the
# lockfile twice and broke every install (#17886).
# These files are stored LF, which is not always the encoding they were written
# against -- @vscode/windows-process-tree ships CRLF sources -- so any code that
# runs `git apply` on one must force `-c core.autocrlf=input` rather than trust
# the host's setting. See config/scripts/windows-process-tree-gyp-rebuild.mjs.
/config/patches/*.patch -text
# Same reason, and pnpm parses these too: a CRLF checkout makes the mobile
# patches unparseable, so Windows packaging dies on ERR_PNPM_INVALID_PATCH.
/mobile/patches/*.patch -text
# The xterm bundle hunks also make a diff nobody can read; review the hand-written
# source patch under xterm-src/ instead. The sibling patches stay diffable.
/config/patches/@xterm__xterm@*.patch -diff
/config/patches/xterm-src/*.patch text eol=lf
# pnpm parses these unified diffs during Windows installs; keep checkout bytes stable.
/mobile/patches/*.patch -text
# Generated wrapper fixtures: collapse them in the PR diff so they stop drowning
# the reviewable change, and pin LF because they are compared byte-for-byte.
# Not -diff: the shell diff is the review surface when a wrapper does change.
/src/main/__fixtures__/shell-wrapper-snapshots/*.txt linguist-generated=true text eol=lf
# Captured agent PTY transcripts. -text, not `text eol=lf` like the wrapper snapshots above:
# these carry real CR and CRLF bytes as the terminal emitted them, and line-ending
# normalisation on a Windows checkout would rewrite the evidence the fixture exists to be.
/src/main/runtime/__fixtures__/*.txt -text
/src/main/daemon/__fixtures__/pty-transcripts/*.txt -text
# Generated runtime English subset: compared byte-for-byte by
# verify:localization-runtime-catalog, so a CRLF checkout would fail the gate.
/src/renderer/src/i18n/en-runtime-required.json linguist-generated=true text eol=lf
# Generated method->params catalog: compared byte-for-byte by
# verify:rpc-params-catalog, so a CRLF checkout would fail the gate.
/src/shared/rpc-contract/rpc-params-catalog.generated.ts linguist-generated=true text eol=lf
# Mobile RPC recording goldens: replay requires the file text to equal what rpc:record writes
# (LF), so a CRLF checkout would fail every golden.
/mobile/rpc-foundation/goldens/*.json text eol=lf
# Mobile web page source. Every text byte here is hashed into an asset digest and from
# there into buildId, so a CRLF Windows checkout would ship a different bundle id for
# identical source (91af2897 vs 9d78435e, measured on the bundle this replaced).
/mobile/src/** text eol=lf
/mobile/app/** text eol=lf
/mobile/web-entry/** text eol=lf
# The blanket pin above would mark a future binary as text; exempt the asset types an
# RN page actually carries.
/mobile/src/**/*.png -text
/mobile/src/**/*.jpg -text
/mobile/src/**/*.jpeg -text
/mobile/src/**/*.gif -text
/mobile/src/**/*.ico -text
/mobile/src/**/*.webp -text
/mobile/src/**/*.ttf -text
/mobile/src/**/*.otf -text
/mobile/src/**/*.woff -text
/mobile/src/**/*.woff2 -text
/mobile/app/**/*.png -text
/mobile/app/**/*.jpg -text
/mobile/app/**/*.jpeg -text
/mobile/app/**/*.gif -text
/mobile/app/**/*.ico -text
/mobile/app/**/*.webp -text
/mobile/app/**/*.ttf -text
/mobile/app/**/*.otf -text
/mobile/app/**/*.woff -text
/mobile/app/**/*.woff2 -text
/mobile/web-entry/**/*.png -text
/mobile/web-entry/**/*.jpg -text
/mobile/web-entry/**/*.jpeg -text
/mobile/web-entry/**/*.gif -text
/mobile/web-entry/**/*.ico -text
/mobile/web-entry/**/*.webp -text
/mobile/web-entry/**/*.ttf -text
/mobile/web-entry/**/*.otf -text
/mobile/web-entry/**/*.woff -text
/mobile/web-entry/**/*.woff2 -text
10 changes: 10 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Product source remains owned by its normal reviewers; localization inputs need focused review.
/src/renderer/src/i18n/locales/ @brennanb2025
/config/scripts/*localization*.mjs @brennanb2025
/config/scripts/*locale*.mjs @brennanb2025
/config/i18next.config.ts @brennanb2025

# The relay's deploy and operate surface: workspace, workflows, and the rollout lease action.
/cloud/ @Jinwoo-H
/.github/workflows/cloud-*.yml @Jinwoo-H
/.github/actions/cloud-sql-rollout-lease/ @Jinwoo-H
20 changes: 11 additions & 9 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ pnpm install
pnpm dev
```

Ordinary installs include native optional dependencies for the current OS and CPU only.
Before a cross-architecture build (including `pnpm build:mac`, which produces both x64 and
arm64 artifacts by default), run `pnpm install:release` to add the other CPU's variants.
See [the install policy](../docs/reference/pnpm-install-policy.md).

## Branch Naming

Use a clear, descriptive branch name that reflects the change.
Expand Down Expand Up @@ -52,21 +57,19 @@ If your change affects UI or interaction behavior, verify it on the platforms it

Project-owned type declarations belong in `.ts` files. `.d.ts` is reserved for ambient shims (e.g., `env.d.ts`, `vite/client.d.ts`). TypeScript's `skipLibCheck: true` setting applies globally, including to our own `.d.ts` files, which means any unresolved type reference in a `.d.ts` silently becomes `any` at its call sites. Write your types in `.ts` files so the compiler actually checks them.

CI enforces this for `src/preload/` and `src/shared/` — see `docs/preload-typecheck-hole.md`.
CI enforces this for `src/preload/` and `src/shared/`.

## Pull Requests

Each pull request should:
Each pull request should follow [`.github/pull_request_template.md`](./pull_request_template.md). In particular:

- explain the user-visible change
- stay focused on a single topic when possible
- include screenshots or screen recordings for new UI or behavior changes
- open with an ELI5 of the change (plain language paragraph; the PR title is the one-liner)
- explain what changed and why, and stay focused on a single topic when possible
- for any UI or interaction change, attach **before and after** screenshots (or short videos); if there is no visual change, say `No visual change` and why
- include high-quality tests when behavior changes or bug fixes warrant them
- include a brief code review summary from your AI coding agent that explicitly checks cross-platform compatibility, SSH/remote/local compatibility, supported agent and integration compatibility, performance risk, UI quality when applicable, and basic security risk
- mention any platform-specific, remote/SSH-specific, agent-specific, integration-specific, or git-provider-specific behavior and testing notes
- **Include your X (Twitter) handle!** We love giving shoutouts to our contributors when we merge features on [@orca_build](https://x.com/orca_build).

If there is no visual change, say that explicitly in the PR description.
- **Include your X (Twitter) handle** in the PR template Author section — we shout out contributors when we merge features on [@orca_build](https://x.com/orca_build).

## Release Process

Expand Down Expand Up @@ -114,7 +117,6 @@ All stable kinds (`patch`, `minor`, `major`) are computed off the latest _stable

The scheduled 2x/day RC cron in [`release-rc.yml`](../../actions/workflows/release-rc.yml) is independent and continues to run automatically from `main`.


## Release Channels

The public Homebrew cask tracks stable desktop releases:
Expand Down
2 changes: 2 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ body:
value: |
Use this form for Orca bugs. Include enough detail for someone else to reproduce the issue.

Please write your issue in English.

- type: dropdown
id: os
attributes:
Expand Down
2 changes: 2 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ body:
value: |
Use this form for new features or workflow improvements.

Please write your issue in English.

- type: textarea
id: problem
attributes:
Expand Down
5 changes: 5 additions & 0 deletions .github/ISSUE_TEMPLATE/other.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@ name: Other
description: Report another Orca issue type
title: '[Other]: '
body:
- type: markdown
attributes:
value: |
Please write your issue in English.

- type: textarea
id: details
attributes:
Expand Down
152 changes: 152 additions & 0 deletions .github/actions/cloud-sql-rollout-lease/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
# Cloud SQL rollout lease

A compare-and-swap lease on one Cloud Storage object, used to serialize Cloud SQL
**connection-budget** rollouts across two repositories.

`concurrency.group: production-cloud-sql-rollout` only serializes runs inside a single repository.
Once the relay workflows live in `stablyai/orca` and the app workflows stay in
`stablyai/orca-cloud`, there are two independent queues pointed at one shared Cloud SQL instance.
`relay-cloud-sql-connection-budget.mjs` computes `rolloutOverlap` as a `Math.max` over the relay
director, api, auth and relay-cell candidates, which is only sound when exactly one rollout is in
flight. This lease is what keeps that assumption true. Keep the per-repo concurrency groups **and**
the lease; they solve different halves of the problem.

## What it protects

No workflow runs a Cloud SQL schema migration. Every locked workflow either deploys a Cloud Run
revision or applies a GCE instance template against the shared instance, so the lease must cover
**all rollouts**, not just migrations.

## Usage

The lease step must run **after** `google-github-actions/setup-gcloud`, and after
`actions/checkout` — `uses: ./.github/actions/...` resolves against the checked-out workspace.
It belongs in the first job of the workflow that holds a GCP credential, which is not always the
gate job: `deploy-relay-production-same-cap`'s gate runs no `gcloud`, so its first acquire happens
in the first cell job.

```yaml
- uses: google-github-actions/auth@v2
with: { workload_identity_provider: ..., service_account: ... }
- uses: google-github-actions/setup-gcloud@v2
- uses: ./.github/actions/cloud-sql-rollout-lease
with:
bucket: onorca-cloud-terraform-state
object: terraform/state/cloud-sql-rollout/production.lock
```
Buckets and objects in use:
| Environment | Bucket | Object |
| ----------- | -------------------------------------- | --------------------------------------------------- |
| production | `onorca-cloud-terraform-state` | `terraform/state/cloud-sql-rollout/production.lock` |
| staging | `onorca-cloud-staging-terraform-state` | `terraform/state/cloud-sql-rollout/staging.lock` |

Workflows that serve both environments (`deploy-relay-asia-topology`,
`operate-relay-asia-admission`) select the pair with an `inputs.environment == 'production'`
ternary on both `bucket` and `object`. `deploy-staging` keeps its own `deploy-artifacts-staging`
concurrency group but takes the staging lease, because it rolls the staging API revision.

The object sits beside `terraform/state/relay-fence-broker/<env>.lock`. The IAM grant names both the
relay and app service accounts, so it is a **foundation-root** resource: `roles/storage.objectAdmin`
conditioned on the `terraform/state/cloud-sql-rollout/` prefix, **plus** an unconditioned
`roles/storage.legacyBucketReader`. Without the second role the generation-matched write fails in a
way that looks like a permissions flake.

## One lease per run, not per job

`deploy-relay-production-capacity` calls its reusable job six times and
`deploy-relay-production-same-cap` four times. Each call is a separate job on a separate runner, so
a naive per-job acquire/release would leave the object free between waves — for runs that have taken
up to 85 minutes.

The lease is therefore keyed to the **run**, not the job. `holder-key` defaults to
`${{ github.repository }}/${{ github.run_id }}`, and a job that finds its own holder key on a live
lease **re-enters** it: the record is refreshed, not rejected. Every job in the chain acquires; only
the last one releases.

```yaml
jobs:
gate:
steps:
- uses: ./.github/actions/cloud-sql-rollout-lease
with: { bucket: ..., object: ..., release: 'false' } # intermediate
wave-1: # ... release: 'false' on every wave job
release_lease:
needs: [gate, wave-1, wave-2, wave-3, wave-4]
if: always()
steps:
- uses: google-github-actions/auth@v2
- uses: google-github-actions/setup-gcloud@v2
- uses: ./.github/actions/cloud-sql-rollout-lease
with: { bucket: ..., object: ..., release: 'true' } # final
```

`release: 'false'` still acquires and still runs its `post` step; `post` only skips the delete. A
single-job workflow leaves `release` at its `true` default and needs no extra job. So does a
workflow whose several jobs can never hold the lease at once: `prove-relay-staging-capacity`'s two
lease-holding jobs are guarded by complementary `inputs.mode` conditions, and the contract test
checks that exclusivity rather than assuming it.
If the final job never runs (runner killed, run cancelled hard), the lease expires on its TTL.
## Timing
- **TTL 35 minutes**, matching `apps/relay-fence-broker/src/mutation-lease.ts`.
- **Renewal every 5 minutes.** `main` spawns a detached background Node process that rewrites
`expires_at` on the same generation-matched path; `post` kills it by pid read back from
`$GITHUB_STATE`. The renewer stops on its own the moment the object stops being ours, and has a
six-hour backstop in case `post` never runs. Its log is written to
`$RUNNER_TEMP/cloud-sql-rollout-lease-renewer.log` and echoed by `post`.
- Renewal is mandatory, not optional: capacity runs have taken 85 minutes, well past any sane TTL.
## Failure behaviour
| Situation | Behaviour |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| Object absent | Acquire with `ifGenerationMatch: 0`. |
| Live lease, our own holder key | Re-enter. Refresh `expires_at`, keep `acquired_at`. Never fails. |
| Live lease, another holder | **Fail the job immediately**, printing the holder's repository, workflow and run URL. Never queues, never steals. |
| Expired lease | Take over with the observed generation and emit `::warning::` naming the stale holder. |
| `412` on write | Someone raced us. Fail as a conflict. |
| Bucket unreachable, `403`, `5xx` | **Fail closed.** |
| Record present but unparseable | **Fail closed.** A record we cannot read is never treated as free; an operator must inspect and delete it. |
| Release finds a foreign holder | Warn and leave it alone. Our lease had already expired. |
| Release fails | Warn only. `post` never fails a job over a release; the TTL bounds the damage. |

## Why `monitor-relay-production` must not use this

`monitor-relay-production` is in the `production-cloud-sql-rollout` concurrency group but is
**read-only**: its identity holds only monitoring, logging, Cloud SQL and compute _viewer_ roles,
and it runs `gcloud sql instances describe`, never a mutation. It consumes no connection budget.
Putting it on the durable lease would let a monitoring run block a real rollout, and a rollout block
monitoring exactly when an operator most needs it. Keep its same-repo concurrency group; keep it off
the lease. The lock census contract test records it in the not-a-candidate map with this reason.

## Token acquisition

`gcloud auth print-access-token`, not a hand-rolled exchange of the `external_account` credentials
file. Every consuming workflow already runs `setup-gcloud`, gcloud already handles every ADC flavour
including the service-account impersonation leg, and this action must stay zero-dependency because
it is duplicated by hand into the public repo. The GCE metadata server that
`apps/relay-fence-broker/src/google-metadata.ts` uses does **not** exist on GitHub or Blacksmith
runners; only the compare-and-swap algorithm is shared with the fence broker.

## Duplication

This directory is copied verbatim into `stablyai/orca`. It has no `package.json`, no
`node_modules`, and imports nothing outside itself — `action-contract.test.mjs` enforces all three.
Cross-repo consumption via `uses: stablyai/orca/.github/actions/...@<sha>` was rejected: it would
put public-repo code inside private app deploys that hold a production credential, and neither
repository protects `main` today.

## Tests

```
node --test .github/actions/cloud-sql-rollout-lease/
```
`storage-lease.test.mjs` drives the real compare-and-swap path against an in-memory Cloud Storage
fake that enforces generations. No network.
Loading