Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
5975 commits
Select commit Hold shift + click to select a range
fa180a9
feat(jira): pick the assignee when creating an issue — Automatic, me,…
Oct 5, 2026
1569e06
Reduce repeated terminal scans and unused Qoder test imports (#25425)
Oct 5, 2026
e2da3a1
fix: prevent IME confirmation from submitting text fields (#25480)
Oct 5, 2026
d173514
Update README downloads badge
Oct 5, 2026
2a68ea9
refactor(terminal): one commit module for terminal topology closes, w…
Oct 5, 2026
8f846d4
fix(native-chat): a Stop binds only the turn it actually stopped (#24…
Oct 5, 2026
ad5aa01
fix(native-chat): a chat's finished-turn alerts come from the host re…
Oct 5, 2026
98171a8
fix(native-chat): never delete chat history on read; a chat Orca can'…
Oct 5, 2026
a68ee67
fix(codex): stop prompting a Codex restart when only its home changed…
Oct 5, 2026
d19e064
Fix legacy worker recovery snapshot timing for rollback safety (#25413)
Oct 5, 2026
f250db5
fix(jira): read a missing or malformed Jira status as disconnected (#…
Oct 5, 2026
761d63a
feat(agent-launch): keep long prompts off the launch line and paste t…
Oct 5, 2026
b354aab
fix(mobile-chat): a failed message's text is added to the draft, and …
Oct 5, 2026
ca2cdc0
feat(native-chat): answer /context in chat view for OpenClaude and OM…
Oct 5, 2026
57fedee
fix(native-chat): the agent's exit ends its record, and an unconfirme…
Oct 5, 2026
d9cc1d0
feat(activity): filters, matching header, row right-click menu, and s…
Oct 5, 2026
c5a1c0e
Add confirmed deletion of nested worktrees (#25668)
Oct 5, 2026
17ecee6
fix(relay): read reconcile's counter units after the cell lock (#25638)
Oct 5, 2026
d518d4a
Retire automatic profile JSON snapshots with safe recovery and downgr…
Oct 5, 2026
56dbf1b
fix(i18n): polish Japanese onboarding checklist copy (#19035)
Oct 5, 2026
a42e586
fix(native-chat): keep a Stop's note with the turn it waited for and …
Oct 5, 2026
e9ed75a
fix(native-chat): mark a chat whose start failed on its tab and works…
Oct 5, 2026
a3bd6a6
fix: restore main's lint and localization checks after the nested-wor…
Oct 5, 2026
f1ed355
feat(relay): drain pace window as a reviewed same-cap input, with dra…
Oct 5, 2026
e817b0e
refactor(native-chat): keep the provider resume handle opaque to shar…
Oct 5, 2026
508419f
test: check structured-chat code for Electron imports even before the…
Oct 5, 2026
7208be6
test(native-chat): cover paired runtime launch compatibility (#25072)
Oct 5, 2026
d791421
Extract provider process supervision and stream reading from Codex (#…
Oct 5, 2026
e2a1ecd
feat(activity): multi-select agent rows with a bulk right-click menu …
Oct 5, 2026
10bea3a
feat(relay): report lane service times, 503 causes, per-site hold p99…
Oct 5, 2026
990b0ed
fix(orchestration): give an OpenCode worker its task only once OpenCo…
Oct 5, 2026
ca883c5
fix(ci): unblock main's static analysis after the nested-worktree del…
Oct 5, 2026
ab91559
feat(relay): one-command director deploy driver (#25642)
Oct 5, 2026
086b06c
fix(test): build the stop-note test's Codex provider handle with code…
Oct 5, 2026
9def4b9
feat(native-chat): publish where each submission was sent and the tur…
Oct 5, 2026
3d7b306
fix(terminal): submit startup commands with Enter on every platform (…
Oct 5, 2026
355e35b
perf(tab-bar): scrolling the tab strip no longer re-renders every tab…
Oct 5, 2026
0e43c4f
fix(ai-vault): resume sessions whose worktree was deleted (#24236)
Oct 5, 2026
1168e0f
fix(ssh): let a placed worktree seed while its host is in conflict (#…
Oct 5, 2026
48f072a
fix(sidebar): remember whether the left sidebar is open across restar…
Oct 5, 2026
e65bbc9
fix(omp): stop the tab spinner sticking after subagents finish (#23662)
Oct 5, 2026
1787585
fix(daemon): bump the terminal daemon protocol to v40 (#25291)
Oct 5, 2026
e43a9f7
fix(test): use the current provider handle shape in the submission-po…
Oct 5, 2026
b01df81
test(ratchet): require src/main/provider-process now that it has land…
Oct 5, 2026
13d94ac
feat(browser): add an eraser to screenshot markup (#24801)
Oct 5, 2026
b6c5f3f
fix(native-chat): a sent image no longer flickers to its "Pasted imag…
Oct 6, 2026
c6827fe
test: drop the duplicate codexProviderHandle import two main fixes bo…
Oct 6, 2026
d3943c6
feat(editor): highlight Quarto and R Markdown files (#17772)
Oct 6, 2026
9f56170
fix(i18n): fix garbled Japanese name suggestion and reversed ja/zh qu…
Oct 6, 2026
135c92e
fix(native-chat): an unsent draft survives a reload or quit (#24905)
Oct 6, 2026
9323443
fix(test): drop the duplicate codexProviderHandle import in the submi…
Oct 6, 2026
41f1103
fix(test): restore the codexProviderHandle import in the submission-p…
Oct 6, 2026
dd39dcb
feat(orchestration): a native chat gets the orchestration pointer a C…
Oct 6, 2026
ea6c9d6
fix(test): restore the codexProviderHandle import the #25078 squash r…
Oct 6, 2026
9756dae
chore(i18n): translate 76 new keys to es/fr/ja/ko/zh (#25719)
Oct 6, 2026
4ccfc16
fix(sidebar): preserve host filters across stale UI updates (#25737)
Oct 6, 2026
8127d94
test(agent-launch): keep the carry control on a prompt that still can…
Oct 6, 2026
a47e0f5
fix(feedback): optimize oversized screenshots without losing detail (…
Oct 6, 2026
08a970a
fix(native-chat): show the message rail from the first user message (…
Oct 6, 2026
d73efcc
Reduce localization audit and relay setup work in CI (#25665)
Oct 6, 2026
1b52be6
fix(claude-accounts): preserve shared MCP OAuth credentials across an…
Oct 6, 2026
a259616
feat(pi): show Pi and OMP background children as rows (#23201)
Oct 6, 2026
6012570
feat(files): reveal Source Control files and terminal file links in t…
Oct 6, 2026
420447e
fix(agent-status): retire a removed worktree's hook-status rows (#23881)
Oct 6, 2026
0e9e273
fix(relay): deploy driver builds the checked commit, prompts on their…
Oct 6, 2026
c7d74b1
feat(relay): give Asia cell c34 a promotion wave so it can become a g…
Oct 6, 2026
9b7c936
fix(dock): clear stale workspace unread counts (#24877)
Oct 6, 2026
059e81a
chore(i18n): use 智能体 for Chinese Agent copy (#25767)
Oct 6, 2026
ccc0bf7
Pause Pullfrog reviews while the CI runner queue recovers (#25760)
Oct 6, 2026
7f25413
Stage long agent launch lines where they are typed, so they arrive wh…
Oct 6, 2026
db078b6
fix(claude): API-key Claude users are told they're not signed in (#25…
Oct 6, 2026
3a03441
refactor(native-chat): structured agents declare their capabilities i…
Oct 6, 2026
3285f82
Share the managed process lifecycle for structured providers (#25204)
Oct 6, 2026
5f7c848
test(cross-version): load releases that import a package main dropped…
Oct 6, 2026
3ee3a41
fix(markdown): strengthen dark table grid lines (#25653)
Oct 6, 2026
bfd1e9c
fix(codex): keep working status when Escape closes search or permissi…
Oct 6, 2026
b58f819
Soften native chat colors and code surfaces (#25651)
Oct 6, 2026
f59194d
Bound file-search inventories and release abandoned Markdown data (#2…
Oct 6, 2026
661372d
Cancel abandoned file searches and prevent stale results (#25370)
Oct 6, 2026
e2ccf52
fix(remote-runtime): a paired terminal accepts input again after its …
Oct 6, 2026
c8ff7e8
Stop repeated recovery of finished workers (#25679)
Oct 6, 2026
fff8718
Improve Quick Open matching, file locations and recent history (#25371)
Oct 6, 2026
54ded3b
fix(relay): commit the cell counter in one round trip; cells boot wit…
Oct 6, 2026
8d2e926
fix(native-chat): ignore the terminal launch command when starting a …
Oct 6, 2026
6c693ed
Show native chat tool calls as plain sentences (#25654)
Oct 6, 2026
dc8b393
Add chat appearance settings: text size, code size, width (#25657)
Oct 6, 2026
c0b07d3
Admit one provider event's journal writes as one queued operation, de…
Oct 6, 2026
ca4e239
Remove low-value test inventories and duplicate fuzz oracles (#25791)
Oct 6, 2026
635e7f5
feat(github-projects): render Board project views as a kanban with dr…
Oct 6, 2026
020cebe
Add standalone Agent Client Protocol client layer (#24990)
Oct 6, 2026
4e64fa9
fix(native-chat): start a Codex chat without waiting on the backgroun…
Oct 6, 2026
f9c8cd4
Reduce redundant test coverage and unnecessary CI waits (#25806)
Oct 6, 2026
d7a9578
Add a shared timeline assembler for structured agent chats (not wired…
Oct 6, 2026
eaaae01
feat(native-chat): record fresh sessions after failed restoration (#2…
Oct 6, 2026
ac3a25c
Wait for Codex's live composer before pasting linked issue drafts (#2…
Oct 6, 2026
3ec030e
Update README downloads badge
Oct 6, 2026
1de3aa4
Fix truncated Unicode branch names in base ref search
Oct 6, 2026
29e6696
fix(codex): never write a Codex config.toml that Codex can't load, an…
Oct 6, 2026
8507111
Document Apple Git ref recovery retirement condition
Oct 6, 2026
6a9ba9d
Keep remote worktree creation from navigating paired clients (#25793)
Oct 6, 2026
41f293c
fix(notifications): replay completion sounds reliably (#15940)
Oct 6, 2026
c4ea14c
Show a tool call you stopped as interrupted, not failed (#25181)
Oct 6, 2026
9905765
feat(native-chat): open structured chat's wire and stored records to …
Oct 6, 2026
a2f197f
Refresh visible reviews automatically and stop settled merged polling…
Oct 6, 2026
0bcd49c
Let ACP connections own their agent processes (#25810)
Oct 6, 2026
634c437
Fix premature Claude automation completion and inherited CI failures …
Oct 6, 2026
f6f96db
Build SSH hostile-host Linux slots independently (#25821)
Oct 6, 2026
13ea359
Stop expensive checks when an unmerged PR closes (#25829)
Oct 6, 2026
670c59d
Translate ACP traffic into shared timeline events (#25090)
Oct 6, 2026
ee91720
fix(native-chat): a chat you return to drops background tasks that fi…
Oct 6, 2026
4de9f9f
Move orchestration capabilities out of protocol version registry (#25…
Oct 6, 2026
d9cf07d
Fix pinned workspace reveal expanding other hosts (#25836)
Oct 6, 2026
768c1ea
Add confirmed conversation rewind from structured chat messages (#19338)
Oct 6, 2026
5b8a982
Fix private Linear images in task descriptions (#25849)
Oct 6, 2026
3ec38b8
Run Vitest on Bun with Node runtime contracts (#25840)
Oct 6, 2026
b752131
Add a Chat settings page for structured native chat (#25685)
Oct 6, 2026
5cf3585
fix(native-chat): keep a message accepted before a quit or crash as a…
Oct 6, 2026
7faa9f7
fix(native-chat): reasoning rows with a real open/finished state, and…
Oct 6, 2026
cad8ea4
fix(tabs): stop tab and close tooltips firing while grazing the strip…
Oct 6, 2026
842c6c6
fix(jira): tolerate malformed nested Jira status fields (#25656)
Oct 6, 2026
ccab2a3
fix(native-chat): a long reply keeps its Working bar and Stop after a…
Oct 6, 2026
468e4e1
fix(native-chat): a prompt card owns the chat input until its answer …
Oct 6, 2026
f27ef42
fix(runtime): build the host terminal model when a phone opens an idl…
Oct 6, 2026
8d049b5
fix(codex): approve Orca's hook in managed Codex homes with Codex's o…
Oct 6, 2026
128d154
Fix Codex chat creation after its own model listing fails (#25754)
Oct 6, 2026
e63e4f8
Update README downloads badge
Oct 6, 2026
defd85a
feat(floating-workspace): render the floating panel through the share…
Oct 6, 2026
07981bd
fix(native-chat): chat copy that promised a retry, an update, or a co…
Oct 6, 2026
61c9a3a
test(mobile): split the turn-disclosure test under the 800-line test …
Oct 6, 2026
3268760
Add chat contrast and "Match terminal interface" (#25659)
Oct 6, 2026
ab63890
fix(native-chat): start Windows chats without reading process creatio…
Oct 6, 2026
975e732
feat(native-chat): a solid, fading Jump to latest (#25759)
Oct 6, 2026
19661df
fix: stop Claude and agent helper processes when Orca quits or crashe…
Oct 6, 2026
b922342
feat(native-chat): the chat reads "Stopping…" from your Stop until th…
Oct 6, 2026
4c35516
fix(ci): restore main's typecheck and lint after #25751 and #24369 (#…
Oct 6, 2026
81a1968
feat(native-chat): attach several files from one picker selection (#2…
Oct 6, 2026
a0a7535
fix(native-chat): say each chat outcome once and drop internal-only s…
Oct 6, 2026
2f001fe
fix(remote-browser): host client browser pages again when a paired ho…
Oct 6, 2026
6a71732
Keep sidebar section collapse independent across execution hosts (#25…
Oct 6, 2026
ac8ea9f
fix(codex): write Orca's hook into ~/.codex only when something chang…
Oct 6, 2026
9e8a3a5
fix(repos): stop reporting clones that never ran as successful (#23770)
Oct 6, 2026
83cf7cf
perf(ci): compile release JavaScript once for all packaging hosts (#2…
Oct 6, 2026
58b4633
refactor(codex): remove code the ~/.codex hook rework left unused (#2…
Oct 6, 2026
53edf8e
fix: recover deleted Active Server defaults and preserve editor hosts…
Oct 6, 2026
7e52bed
fix(editor): recover PDF previews after failed refreshes
Oct 6, 2026
d6b155d
Fix Claude's stuck spinner after Escape cancellation (#25846)
Oct 6, 2026
40f0319
fix(native-chat): fingerprint the consumed transcript boundary (#25965)
Oct 6, 2026
f7c542c
Keep profile saving alive after a stalled main loop (#25318)
Oct 6, 2026
ce4c99a
fix(terminal): keep a pane closed just before quit from coming back o…
Oct 6, 2026
0a26f3e
fix(native-chat): honor saved agent Command and Arguments (#25721)
Oct 6, 2026
e1e9d1c
feat(agent-launch): host-assigned caller identity and a launch record…
Oct 6, 2026
28ed544
Fix send picker reveal under collapsed hosts and parents (#25950)
Oct 6, 2026
e813fa5
feat(native-chat): keep a message a Stop took back on screen, with on…
Oct 6, 2026
6aa12c3
Name native Claude and Codex chats after their first message (#25724)
Oct 6, 2026
51062e6
fix(test): pass resolveLaunchArgs in the record store slot test so ma…
Oct 6, 2026
cc60067
fix(test): pass resolveLaunchArgs in the Codex stopped-send-order tes…
Oct 6, 2026
c893048
feat(native-chat): show which agent a chat message is from, and open …
Oct 6, 2026
72b8411
test(e2e): terminal layout parity check against main (#25681)
Oct 6, 2026
6352ff3
Run nested workspace deletion in the background (#25975)
Oct 6, 2026
d8c871a
Speed up unit tests with cross-runtime duration scheduling (#25967)
Oct 6, 2026
fa42e57
fix(gitlab): select SSH workspace host for merge request and issue wr…
Oct 6, 2026
add5344
fix(browser): detect Comet in its Windows vendor directory (#25983)
Oct 6, 2026
7bc9ff9
fix(grok): add Grok 4.7 to the fallback model catalog (#25976)
Oct 6, 2026
1eeb8f3
fix(test): drop the duplicate resolveLaunchArgs that two merges both …
Oct 6, 2026
2137295
fix(git): use branch-safe author names as username fallback (#25984)
Oct 6, 2026
deb7374
Simplify reveal and test fixture cleanup (#25978)
Oct 6, 2026
5345ba3
Fix ownership for terminal and chat file drops (STA-6940, PR 1/6) (#2…
Oct 6, 2026
31f1035
fix(orchestration): serve a /clear'd native-chat worker through the s…
Oct 6, 2026
53b9ccb
refactor(terminal): add in-place pane layout geometry apply (unused) …
Oct 6, 2026
35e173a
fix(native-chat): alert when a structured chat asks for approval or i…
Oct 6, 2026
f6448a1
fix(native-chat): say which retry a Claude retry is on and what it la…
Oct 6, 2026
e717ea6
feat(native-chat): copy chat images from the right-click menu (#24161)
Oct 6, 2026
faed899
fix(ci): run three new SQLite-backed tests in the Node runtime projec…
Oct 6, 2026
86d03ff
fix(native-chat): sending brings the latest into view and follows the…
Oct 6, 2026
61bcca9
fix: stop Codex and OpenCode helper servers when Orca quits or crashe…
Oct 7, 2026
323f312
refactor(terminal): mark layout updates from user gestures (#25680)
Oct 7, 2026
3308ff8
Bound YAML merge conversion and close SQLite routing review gaps (#25…
Oct 7, 2026
9c6702b
test(codex): guard that turning hooks off wins over an in-flight turn…
Oct 7, 2026
c9f4cd7
fix(editor): close stale duplicate documents safely
Oct 5, 2026
91bb636
test(editor): align model and cursor custody fixtures with owner-clos…
Oct 5, 2026
8bd567a
fix(editor): protect document backing files and complete close cleanup
Oct 6, 2026
31d8574
fix(editor): retain placeholders for drafts during bulk close
Oct 6, 2026
983098d
test(codex): synchronize fake clock with forced process close
Oct 6, 2026
0c32e80
test(codex): reuse unproven close fixture sequence
Oct 6, 2026
14bae2e
Route mirrored editor closes through their captured runtime owner
Oct 6, 2026
1040f67
Keep orchestration SQLite fixtures in the Node test runtime
Oct 6, 2026
f052085
Keep mobile restore SQLite fixture in the Node test runtime
Oct 7, 2026
66c775f
refactor(terminal): project main's terminal layout after each save (n…
Oct 7, 2026
00e3027
feat(agent-launch): show an agent's tab at once, where the caller ask…
Oct 7, 2026
37ff387
Run combined localization catalog verification on Bun (#25999)
Oct 7, 2026
2d08b3a
Speed up expensive test fixtures (23–82% less time) (#26000)
Oct 7, 2026
c0273b1
test(e2e): move the Source Control reveal golden into its own spec so…
Oct 7, 2026
3fb72d1
Run Node event-loop measurement after ordinary test suites (#26015)
Oct 7, 2026
0c96550
fix(native-chat): queued messages carry on in order after any turn, a…
Oct 7, 2026
cdd0b7a
fix(native-chat): stop flashing a reconnecting line on a stream drop …
Oct 7, 2026
825d7bd
test(vitest): run agent-launch-instant-tab in the SQLite runtime proj…
Oct 7, 2026
9fdd90f
feat(orchestration): a native chat can be a dispatch worker, like a t…
Oct 7, 2026
b3b6c5d
Give native chat names one source for tabs, sidebar and AI Vault (lis…
Oct 7, 2026
7a59aa3
fix(worktrees): decide setup before git worktree add on the host's cr…
Oct 7, 2026
0bdcaf3
fix(claude): start a Claude chat with its saved options and send the …
Oct 7, 2026
5b1bb78
[STA-6940] Prepare file drops for element owners (PR 2 of 6) (#25748)
Oct 7, 2026
923ef7c
fix(native-chat): refuse a Command that can't run instead of silently…
Oct 7, 2026
70c6876
fix(rovo): detect and launch Rovo Dev through acli (#25981)
Oct 7, 2026
7c9c3d4
fix(lint): bring structured-agent-session-host back under max-lines (…
Oct 7, 2026
d3e1494
test: bound memory used by the runtime Electron audit (#26049)
Oct 7, 2026
55c86ce
refactor(terminal): report breaches of the two layout invariants; add…
Oct 7, 2026
dff65d5
feat(claude): prepare account profiles and shared history (Step 1 of …
Oct 7, 2026
bfcbcfd
refactor(terminal): move a dragged-out pane in main before the window…
Oct 7, 2026
9d8e363
chore(relay): move Asia cell c34 to the general same-cap lists after …
Oct 7, 2026
d1fe11c
refactor(terminal): carry pane placement on terminal start, report-on…
Oct 7, 2026
76d480f
Fix unsafe test fixtures and the Bun version pin (#26051)
Oct 7, 2026
7f83e0a
fix(serve): keep every persisted terminal on the phone after serve re…
Oct 7, 2026
8464b15
Claude account profiles: dormant routing and consumers (Step 2 of 4) …
Oct 7, 2026
2f49377
feat(native-chat): Grok as a structured chat over the Agent Client Pr…
Oct 7, 2026
64bb937
Claude account profiles: dormant WSL guest setup (Step 3 of 4) (#24384)
Oct 7, 2026
358e4f9
fix(claude): share account history on Windows with junctions and a sa…
Oct 7, 2026
988f87e
fix(native-chat): move the attachment failure words to their own modu…
Oct 7, 2026
d0b0f13
fix(native-chat): hold a queued message until the turn ahead opens (f…
Oct 7, 2026
6bc5291
fix(orchestration): word the worker brief for a chat worker (#26036)
Oct 7, 2026
acea59c
refactor(native-chat): remove the records-file and per-chat journal i…
Oct 7, 2026
0acf039
Keep native contracts on Node and wait for Git upgrade completion (#2…
Oct 7, 2026
eaceac0
feat(native-chat): searchable model picker (#26011)
Oct 7, 2026
8f42451
feat(native-chat): suggest files on @ and name the triggers (#26017)
Oct 7, 2026
f31d7a4
fix(acp): fail the journal open through AgentSessionJournal.open in t…
Oct 7, 2026
a3ecee0
feat(native-chat): one notice card above the composer for the chat's …
Oct 7, 2026
98e5f5c
Update README downloads badge
Oct 7, 2026
c8dcffc
fix(native-chat): pass the @-mention file props in the composer resum…
Oct 7, 2026
67dc092
fix(windows): keep generated skills and snapshots LF (#25972)
Oct 7, 2026
4077fb4
fix(ci): actually exclude Electron probes from the headless node-serv…
Oct 7, 2026
b6f3428
perf(tests): reuse Vitest transforms between test runs (#26095)
Oct 7, 2026
b062278
fix(native-chat): let code blocks grow to their full height (#26021)
Oct 7, 2026
3427450
fix(agent-launch): a phone's launch leaves the desktop window where i…
Oct 7, 2026
e5ade4b
fix(worktrees): when the host can't fetch a remote base, create from …
Oct 7, 2026
385fe8a
perf(tests): avoid repeated persistence imports in automation fixture…
Oct 7, 2026
47f4d3f
feat(agent-launch): the desktop AI buttons start their agent through …
Oct 7, 2026
e6c298e
fix(native-chat): a Stop Codex took settles the message whose turn ne…
Oct 7, 2026
535c83a
refactor(composer): delete the full-create path no caller reaches (#2…
Oct 7, 2026
25e0a29
feat: stream desktop audio and video previews with native controls (#…
Oct 7, 2026
6fd0918
Stop pane migration fixture hooks before closing stores (#26131)
Oct 7, 2026
d58ea0c
Advance mocked scheduler clocks without real sleeps (#26135)
Oct 7, 2026
e6bcc5a
Keep draft reload tests on the existing cache module (#26145)
Oct 7, 2026
81ba5c3
test: reuse scratch cells in terminal replay oracle scans (#26162)
Oct 7, 2026
5b0d387
test: avoid Store imports in terminal session fixtures (#26166)
Oct 7, 2026
5cafefe
Phase 3: every SSH host runs a managed Orca server (orcad), replacing…
Oct 7, 2026
520033b
fix(native-chat): fold thoughts and tool calls between replies into o…
Oct 7, 2026
2584ed9
feat: play video and music files in mobile previews (#26148)
Oct 7, 2026
e4da27e
perf(tests): reuse the first UI-state store constructor per case (#26…
Oct 7, 2026
b8c9671
test(ssh): isolate permission probes from real PID reuse (#26190)
Oct 7, 2026
2dc98c9
perf(tests): reuse composer decisions without loading the hook (#26179)
Oct 7, 2026
5cfcc85
fix: avoid restoring empty Claude Keychain snapshots
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
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
107 changes: 99 additions & 8 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,12 +1,103 @@
/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
# 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
# .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

# Generated ACP schemas are checked byte-for-byte against formatted output.
/src/main/acp/generated/*.generated.ts linguist-generated=true text eol=lf
# Generated skill bundle artifacts are verified byte-for-byte against fresh output.
/resources/skills/*.json linguist-generated=true text eol=lf
# Vitest writes snapshots with LF, so checkout bytes must match on every host.
**/__snapshots__/*.snap text eol=lf
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
26 changes: 17 additions & 9 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,21 @@ Thanks for contributing to Orca.

## Local Setup

Install Node 24, pnpm, and the Bun version in [`config/.bun-version`](../config/.bun-version).
`pnpm test` runs Vitest on Bun, with Node workers for runtime contracts such as SQLite,
native PTYs, socket liveness, and V8 memory behavior. `pnpm test:node` runs the same suites
entirely on Node. Builds and dependency installation still use Node and pnpm.

```bash
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 +62,20 @@ 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
- if you are an outside contributor, link the issue your PR addresses
- 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 or interaction change, write `N/A` and briefly explain 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 +123,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