Commit Graph
16002 Commits
Author SHA1 Message Date
72b549a8fd Keep terminal scroll position on input (#30889)
* feat(terminal): add a setting to keep scroll position on input

Typing or pasting in a scrolled-up pane can keep the current viewport.
Settings > Terminal Interaction now has Scroll to Bottom on Input, on by
default, mapped to xterm's scrollOnUserInput.

* feat(terminal): translate the scroll on input setting

Add the label, description and search keywords to every locale catalog so
the setting does not fall back to English.

* refactor(settings): move the scroll on input type out of global settings

The field took global-settings-types.ts past the 300 line lint limit. Keep it
in a small settings type composed into GlobalSettingsBase, as the other
feature settings are.

* fix(settings): match the scroll on input row on localized keywords

The row passed English keywords to SearchableSetting, so a translated
query such as "einrasten" found the terminal pane but hid the row. Move
the entry to its own catalog getter and pass it to the row, so both use
the same localized keywords.

* test(settings): type the i18n mock without a cast

The changed-code quality gate rejects the type assertion.

* fix(settings): tighten scroll on input copy and add settings fixture

Shorten the Scroll to Bottom on Input description so it fits on one line,
widen the Terminal Interaction subtitle to cover scrolling, and add a
component fixture for the section.

---------

Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-authored-by: Neil <neil@stably.ai>
2026-11-03 14:00:43 -08:00
Neil f3c65cd556 fix(deps): update Electron to 43.8.6 and resolve open security advisories (#37916)
- Electron 43.8.4 -> 43.8.6: upstream Chromium/V8/ANGLE/PDFium/Skia/WebRTC
  security backports. Drops the now-unneeded minimumReleaseAge exclusion.
- @hono/node-server 2.1.0 -> 2.1.5 (GHSA-rmxm-3fg6-px4f), lockfile only.
- mobile node-forge 1.4.0 -> 1.4.2: fixes 10 advisories (5 high) and the
  previously patched GHSA-86w9-cpqp-85rv, so the local patch and its audit
  exception are removed. The regression test still passes on 1.4.2.
2026-11-03 13:52:12 -08:00
Kelvin Amoaba d2f874dbb5 fix(terminal): rename link popover's "Open in this group" to "Open in new tab" (#37920) 2026-11-03 21:42:47 +00:00
Brennan Benson 93fbb0e740 Dismiss native chat link previews when opening links (#37911)
* Dismiss native chat link previews when opening links

* Keep link preview dismissal scoped to link activation
2026-11-03 13:36:00 -08:00
Brennan Benson b029fb61ab Keep GitHub Tasks source changes consistent (#37387)
Keep the GitHub Tasks source picker, rows, totals, searches and issue creation tied to the selected project, host and source. Ignore outdated replies and wait for source preference saves before creating an issue. Preserve support for older paired servers.

Tracked in #8726. Tracked in STA-1815.
2026-11-03 13:26:23 -08:00
Brennan Benson ac234bffcc Show orchestration message content without the agent envelope (#37891)
* Show orchestration message content without the agent envelope

* fix: retain orchestration content through journal storage

* test: preserve large orchestration queue capacity

* test: inspect phone card text as a string

* Keep mobile mail fixture independent of desktop runtime

* Separate browser mail fixtures from formatter integration fixtures
2026-11-03 13:22:30 -08:00
Jinjing 65687d9ecf Add chat width settings to pane headers (#37753)
* feat: add chat width settings after pane close button

* Translate chat settings label

* Fix chat width options import and verify settings placement
2026-11-03 13:15:19 -08:00
Kelvin Amoaba 7f885c19a6 fix(skills): rename computer use to orca-computer-use (#37659)
* fix(skills): rename computer use to orca-computer-use

* test(skills): resolve rename fixture after main cleanup
2026-11-03 21:05:37 +00:00
Neil f758771364 refactor: group browser lifecycle and extension implementation owners (#37910) 2026-11-03 13:04:11 -08:00
0a1e420212 feat(editor): add Insert Final Newline on save (#37786)
* feat(editor): insert final newline on save

Based on the community contribution in #33567 by @johnie.

Co-authored-by: Johnie Hjelm <864992+johnie@users.noreply.github.com>

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: credit community final-newline contribution

Co-authored-by: Johnie Hjelm <864992+johnie@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(editor): exclude CSV previews from clean saves

Restore the final-newline setting imports after the upstream settings refactor.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(editor): skip unnecessary clean saves

Only run the final-newline clean-save fallback when text needs a newline, while preserving empty and terminated drafts.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(editor): preserve pending edits on keyboard save

Use current tab state and retain loaded fallback text when pending edits have not produced a draft yet.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Johnie Hjelm <864992+johnie@users.noreply.github.com>
2026-11-03 12:53:26 -08:00
Jinjing e1dfc022bd improve app loading efficiency (#37877)
* improve app loading efficiency

* Preserve diagnostic cooldown during worktree fallback

* Fix attribution diagnostic cooldown expiry

Simplify persisted token usage state to the current snapshot schema
and verify retries within a process and after restart.
2026-11-03 12:45:42 -08:00
Neil ec3a707868 refactor(browser): group routing and client-host owners (#37872) 2026-11-03 12:28:16 -08:00
Jinjing b32f6b0380 Keep notification cards anchored above the status bar (#37884) 2026-11-03 11:45:58 -08:00
OrcaWinandOrcaWin 6b2216d7c5 test: remove 63 low-value test declarations (#37888)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-03 11:43:28 -08:00
OrcaWinandOrcaWin bd5110671c test: remove 74 low-value test declarations (#37887)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-03 11:33:25 -08:00
OrcaWinandOrcaWin 106f1376e9 test: remove 37 low-value test declarations (#37885)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-03 11:22:34 -08:00
OrcaWinandOrcaWin f0a02936ac test: remove 96 low-value test declarations (#37882)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-03 11:19:42 -08:00
OrcaWin 29079b567f test: remove 151 low-value test declarations (#37870)
* test: remove 151 low-value test declarations

* test: prune obsolete wall-clock test exemptions
2026-11-03 11:07:43 -08:00
Jinjing 00bfd482b2 Fix AI token translations (#37876) 2026-11-03 11:00:04 -08:00
Brennan Benson 3a85a10207 Honor configured effort when no chat effort was chosen (#37797)
* Honor literal native chat effort input

* Keep host effort policy out of accepted input

* Preserve reported effort in display without selecting input
2026-11-03 10:53:53 -08:00
Brennan BensonandClaude Opus 5.5 d1d4ac3714 Stop retrying final native agent startup refusals (#37213)
* Stop retrying final native agent startup refusals

* Retire startup opens after exit and keep final answers across exit orders

- A start flight cancels its outstanding provider open on every ended path; a direct attach keeps the child-bound abort.
- The post-exit answer join is bounded by the remaining startup ceiling.
- An elapsed initialize deadline keeps its words when the exit wins the race.
- Codex cloud config temporary declarations retry on thread/resume as on thread/start.
- A Claude exit before acquisition publishes waits briefly for initialize's answer, so a rejected initialize stays final.
- The Claude startup stdout observer parses only failed root results, within the shared line budget, and detaches once it has one.

* Keep saving the last turn when a Claude process exits after startup

The exit path skipped saving the resume cursor whenever Orca had not
dispatched a message, but turns can settle without an Orca dispatch and an
already-started idle session still owns its exit save. Only a start that
died before initialize answered and before any turn now skips the save and
gets the short cleanup bound. A failed result captured before the first send
counts as a startup failure only when no turn ran in that process.

* Merge duplicate test imports

* Bound resumed Claude starts that exit during catch-up and keep untyped refusals final

Exit-time cursor writes and the short close bound now key on the host-awaited
open actually returning, so a resume that exits while transcript catch-up is
pending publishes ended at once instead of waiting on a cursor write. The
startup observer no longer reads an answer from an oversized line's prefix.
A typed acquisition refusal without a dedicated failure kind keeps its
refusal marker, so an exit-only start stays final.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test: pin the fake clock in the resumed-exit start test

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test: bound startup answer parsing by candidates at N and 10N records

Drive the startup observer through the shared framer at 100 and 1000
irrelevant hook and assistant records, and assert that only the failed
root result is parsed, one capture happens, the data listener retires,
and no parse follows capture or finish, with identical counts at both
populations.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test: shape startup fixtures like the real providers

Held opens in the launch test now reject when their child exits, as a
real connection does, and the temporary open failures use the provider's
actual overload envelope. Also fixes the test-only type errors CI found.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test: use the real Codex canonical-filename refusal wire capture

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(claude): align merged startup tests with answer-wins and final generic results

An exit with no stderr leaves the start to Claude's buffered result, so that result is the start's one failure. A generic startup failure result is final after one start; only an unanswered exit retries, and the recovery case now recovers from such an exit.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(claude): let a final initialize answer outrank a physical exit reported fault-first

The connection reports one physical root exit through onFault and then
onExit. It now marks that error as an observed exit before either
callback, and acquisition's onFault leaves a proven exit to onExit's
bounded initialize join, so a final initialize rejection that arrives
just after the exit owns the start instead of a retryable bare exit.
Typed refusals, live-root faults and processless spawn faults still end
the start at once.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(claude): await a macrotask instead of real time in the exit-answer start test

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(claude): replace casts in the exit-answer start test with an annotation and guard

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(agent-session): let each adapter decide a failed start, and give the start one owner

A start that the agent refused could still be replayed: the host joined a
child's exit with its open's error and rebuilt the meaning from provider error
classes, and an answer written just before exit could lose to the exit itself.

Each adapter now answers its own acquire, open and required startup reads with
one typed result (final, or safe to run once more), keeping a final answer
beneath the exit proofs cleanup adds. Transports keep reading answers already
written after the agent stops reading or exits, within the existing one-second
drain, and only a drained exit of the agent's own process counts as unanswered.

The child's open is the single owner of the start's outcome: it awaits the
adapter's result and required settlement, records the verdict once, writes a
direct attach's failure row, and stops the child. The start flight reads that
verdict instead of joining exit and open. A start whose adapter gives no outcome
within five seconds of its own process exit fails through a timer that no
bookkeeping can hold, and the original start deadline stays in force until the
start is decided.

Tracked in STA-12982.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(agent-session): bound a failed start's lifetime and keep Orca's own refusals final

- A start's ending is kept only while its owner can read it: admitted when the
  acquisition starts, retired when the owner finishes, the acquisition fails, or
  the session is released or closed. An exit after ready records nothing.
- Codex takes its own exit as the start's wake from the moment the process is
  seen, before spawn bookkeeping, and a failed acquire keeps that exit as cause.
- Once the handle or rewind write began, an unanswered death no longer decides
  the start: the write's refusal stays final, and the exit grace bounds the wait.
- Stop, the deadline and the exit grace release the start's callers at once; the
  failure row is queued first but never awaited by them.
- An ACP connection Orca closed before the exit keeps that cause, so cleanup's
  exit is not read as the agent ending unanswered.
- A request deadline keeps its words when an exit is seen around it.
- A direct attach whose exit settled first keeps the exit's words.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(agent-session): let a start's owner, not its live route, keep and retire its ending

Exit acknowledgment drops a session's route while the start's owner may
still be reading how its acquisition ended, so the router now reaches the
adapters by exact generation for both the read and the retirement. Claude
admits its acquisition before publication can observe an exit.

An ACP start Orca refused before the agent exited now fails with that
original refusal as the adapter's final verdict, through every cleanup
wrapper, instead of a generic closed-while-starting error.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(agent-session): give the worker retry fake the Codex adapter's typed start verdict

The host now reads only the adapter's verdict on a failed start, so the
fake open rejects with the verdict the Codex adapter returns for its
declared overload instead of the raw request error.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(agent-session): let Claude's own exit record decide a start the SDK reports as exited

A Claude CLI missing from the launch PATH makes the supervisor exit 127 with the spawn error on
stderr. The SDK rejects initialize with only "process exited with code 127", and the start took
that report as its cause, so the missing CLI was lost: the chat said Claude stopped before it
finished starting and the start was retried as an unanswered exit. The SDK's exit report is no
answer; the start now reads Orca's own record of that exit, which carries the missing CLI.

Also brings two ACP tests in line with the typed start verdict (a signed-out open rejects with
the adapter's notSignedIn verdict) and the bounded drain after the agent stops reading.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* perf(agent-session): stop parsing Claude's startup output once its failure is captured, and pin start and drain work at N and 10N

A failed root result captured mid-chunk still let the rest of that chunk be framed and parsed;
nothing reads those records once the start has its answer. The observer now accepts no further
line once it has captured the failure, and drops what that chunk left in its framing state.

Two contract tests drive the production start owner and transports at N and 10N:
- starts through the host, router and Codex adapter (ready, final refusal, safe replay, deadline
  expiry): each start's owner, abort handles, tracked attempt, flight, buffered exits, adapter
  receipts, root-exit subscription and deadline timer return to baseline, a waiting start holds
  a fixed set, and spawns, opens, router reads and retirements, timers and failure rows grow
  exactly linearly;
- ACP, JSON-lines and Codex connections with a pending call, answered at exit or abandoned after
  the agent stops reading (with duplicate terminal signals): each call settles once, each output
  drain finishes once and leaves no listener or timer;
- an ACP start refused at sign-in keeps its own first cause and leaves no receipt or child.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(agent-session): decide a failed start once from everything its adapter saw

A failed start was decided from whichever error reached the decision first, so a later or
poorer report could replace the one that explained it: the SDK's exit report hid the missing
CLI Orca's own exit record carried, and an output drain let a load deadline give way to an
unanswered exit. One shared rule now weighs every observation an adapter kept. The start may
run again only if every observation allows it, and the most specific one explains it: what the
user can act on, then a request deadline, then the agent's answer, then Orca's record of its
exit, then an SDK's report of that exit. Claude, Codex and Pi pass their exit records alongside
the operation's error instead of choosing between them.

An ACP agent that exited while its output drained no longer gets a replacement session after
its load fails. JSON-lines output that reports both its end and its close now starts one wait,
so the agent's exit can always cancel it.

Contracts at N and 10N: JSON-lines output ending while its root lives, real Claude and Pi
adapters retiring every start's receipt, and a user Stop whose cleanup is held then released.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(acp): keep a missed saved-session load deadline instead of opening a replacement

A live agent that let session/load run past its deadline fell through to the
takeover path, and the replacement session/new answer then replaced the
deadline the user had to see. The takeover predicate now propagates any
provider request deadline unchanged, read through the existing typed timeout.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-03 10:53:21 -08:00
Brennan Benson 9779d6e91e Pick Model and Effort for Source Control text actions (#37205)
Use the shared agent picker for Source Control text actions, with Model and Effort choices while preserving Custom command, Arguments, inherited defaults and Save/Discard behavior.

Reviewed on bbdb46a369cc872ae6cbb7c4b65dc5968e21fcba; final CI passed and brennan-ready returned READY.
2026-11-03 10:50:20 -08:00
Jinjing 4b655c9bbc Reduce logging data size (#37751)
* Reduce logging data volume

* Remove volume control notes

* Trim redundant sampling assertions
2026-11-03 10:42:26 -08:00
Kelvin Amoaba 14819eb8c0 fix(chat): isolate sends from terminal drafts (#37774)
* fix(chat): isolate sends from terminal drafts

* test(chat): expect replacement clear for resume commands

* test(chat): refresh draft-clear RPC recordings
2026-11-03 18:28:10 +00:00
Kelvin Amoaba 2b2d4aeff8 fix(runtime): revoke forked keys with their pairing (#37771)
* fix(runtime): revoke forked keys with their pairing

Fixes #37749

* test(runtime): fix revocation fixture expiration
2026-11-03 18:25:39 +00:00
Neil 865b9544ae refactor(ipc): group feature handlers and resource owners (#37823) 2026-11-03 10:24:48 -08:00
OrcaWin a38acbe354 test: remove 64 low-value test declarations (#37863) 2026-11-03 10:08:03 -08:00
Kelvin Amoaba a036446311 fix(terminal): pipeline ordered mobile input (#37738)
* fix(terminal): pipeline ordered mobile input

Keep unary delivery for desktop relays while the existing host ledger
orders complete sends under a capability-gated, bounded input session.

* fix(terminal): charge retained raw input controls

The dispatcher retains original control values while strict sends wait.
Reserve their bytes before normalizing execution controls.

* test(terminal): align input fixtures and paste recordings
2026-11-03 18:02:15 +00:00
Kelvin Amoaba fadc93c794 fix(mobile): stream desktop-hosted server browser tabs (#37705)
* fix(mobile): stream desktop-hosted server browser tabs

* test(mobile): record paired desktop browser interactions

* fix(mobile): type browser relay settings and test adapters

* fix(browser): avoid redundant retained paint mutations

* fix(browser): keep retained viewer state free of React
2026-11-03 18:01:42 +00:00
Kelvin Amoaba edd76b28a9 fix(terminal): retain agent identity across daemon deaths (#37703)
A restored agent can stay quiet until its next turn; keep the pane's
resume identity until replacement or confirmed exit.
2026-11-03 18:01:24 +00:00
OrcaWin 31fb68b669 test: remove 47 low-value test declarations (#37860) 2026-11-03 09:56:05 -08:00
OrcaWin 783722049a test: remove 39 low-value test declarations (#37857) 2026-11-03 09:40:16 -08:00
OrcaWin 39d02ae0bc test: remove 49 low-value test declarations (#37856) 2026-11-03 09:25:28 -08:00
OrcaWin e7542a3ca1 test: remove 52 low-value test declarations (#37854) 2026-11-03 09:07:13 -08:00
OrcaWin e95b0ca056 test: remove 58 low-value test declarations (#37853) 2026-11-03 08:53:10 -08:00
OrcaWin f9f825aa1a test: remove 71 low-value test declarations (#37851) 2026-11-03 08:40:30 -08:00
OrcaWin a29d2e3f7f test: remove 68 low-value test declarations (#37847) 2026-11-03 08:16:05 -08:00
OrcaWin 7146038cd3 test: remove 54 low-value test declarations (#37841)
* test: remove 55 low-value checks across 15 whole suites

* test: retain persisted usage mapping boundary coverage
2026-11-03 08:00:32 -08:00
OrcaWin 0a1340bf40 test: remove 83 low-value checks across 30 whole suites (#37835) 2026-11-03 07:23:57 -08:00
OrcaWin f63a887ab9 test: remove 73 low-value main-process tests (#37830)
* test: remove 47 low-value main-process test registrations

* test: remove 10 further low-value main-process checks

* test: remove 16 low-value main-process test registrations

* test: retire deleted ZCode suite from transcript contract command
2026-11-03 06:58:16 -08:00
OrcaWinandNeil c0cb95d62e test: remove 131 low-value harness, main, and renderer tests (#37825)
* test: remove 20 low-value harness and client tests

* test: retire fake-agent and layout-oracle self-tests

* test: retire source route for removed usage smoke

* test: include 21 further low-value tests and remove unused fixture helper

---------

Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-11-03 06:29:47 -08:00
OrcaWin 747acba743 test: remove 46 low-value client and benchmark tests (#37818)
* test: remove 16 low-value behavior and UI tests

* test: remove 30 low-value client and benchmark tests

* test: prune timeout ratchet after test removal

* test: correct remaining split benchmark coverage claims
2026-11-03 06:07:13 -08:00
Neil 11baf7a82e refactor(settings): group agent, account and repository owners (#37817) 2026-11-03 05:11:02 -08:00
OrcaWin 6c1a82bbd8 test: remove 30 low-value web and compatibility tests (#37814)
* test: remove 30 low-value web and compatibility tests

* test: retire obsolete browser schema evidence from active gate
2026-11-03 04:47:31 -08:00
Neil 76472f27ce refactor(settings): group runtime and host owners (#37804) 2026-11-03 04:19:35 -08:00
OrcaWin e7cfc54208 test: remove 18 low-value renderer and web tests (#37809) 2026-11-03 04:18:12 -08:00
OrcaWin c2257e33a0 test: remove 20 low-value renderer store tests (#37800) 2026-11-03 04:04:11 -08:00
OrcaWin 41f0841142 test: remove 114 low-value shared and main tests (#37794) 2026-11-03 03:50:05 -08:00
Neil fced292c55 refactor(settings): group presentation and form-control owners (#37796) 2026-11-03 03:42:05 -08:00
OrcaWin 4e3ee00eda test: remove 167 low-value shared agent tests (#37791) 2026-11-03 03:24:09 -08:00