Commit Graph
16479 Commits
Author SHA1 Message Date
Neilandinnocarpe 89ac8f2ac1 fix(kimi): deliver Kimi's first prompt on Windows and after it is ready (#33581)
Co-authored-by: innocarpe <2222333+innocarpe@users.noreply.github.com>
2026-10-25 19:39:36 -07:00
Neil ca064cc67e fix: preserve native chat targets when reopening context menu (#33725) 2026-10-25 19:32:18 -07:00
NeilandBluesYoung-web bb47718fbe fix(mimo): keep MiMo's login and sessions by injecting the status plugin via MIMOCODE_CONFIG_DIR (#33668)
Co-authored-by: BluesYoung-web <55608642+BluesYoung-web@users.noreply.github.com>
2026-10-25 19:22:12 -07:00
OrcaWinandOrcaWin 1ff73e808d feat(claude): navigate and track subagent views from sidebar (#33322)
* feat(claude): open subagent views from sidebar rows

* test(claude): type mod session events for CI lint

* test(claude): preserve sidebar preference types

* fix(claude): localize subagent navigation notices

* fix(claude): refresh managed mods asynchronously

* fix(claude): track the viewed agent and honor parent selection

* test(rpc): include Claude view observations in terminal manifest

* fix(claude): preserve bindings and isolate optional view setup

* fix(claude): scope subagent mods and avoid redundant shortcut input

* fix(claude): reconcile navigation setup outside PTY spawns

* fix(i18n): include Claude navigation search terms in runtime catalog

* fix(claude): keep terminal spawns independent of navigation setup

* test(claude): use fixed clocks for navigation coverage

* test(claude): isolate navigation cleanup from startup fixtures

* fix(claude): clean cached shell configs without probing

* docs(claude): describe cached config cleanup limitation

* fix(i18n): preserve navigation search localization after rebase

* feat(claude): enable sidebar subagent navigation by default

* test(claude): update WSL fixtures for automatic navigation

* docs(claude): remove subagent navigation readme

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-25 18:53:42 -07:00
OrcaWinandOrcaWin 5de74e632b test: remove low-value suites and copied test oracles (#33708)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-25 18:28:44 -07:00
Neil b23e456a64 fix(sidebar): list a workspace's newest linked reviews first in the hover card (#33699)
* fix(sidebar): list a workspace's newest linked reviews first in the hover card

* fix(sidebar): order linked items newest-first for every surface that lists them
2026-10-25 18:23:46 -07:00
OrcaWinandOrcaWin 429779215a test: remove redundant cases and strengthen audit assertions (#33686)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-25 18:23:05 -07:00
Neil d08f3f9d97 fix(ssh): name a Windows host that's too old or can't unpack Orca's runtime (#33682)
Setup on Windows Server 2012 R2 and on Windows hosts with neither
System32\tar.exe nor Expand-Archive ended in the generic "Orca couldn't
start its server on this host. Try connecting again.", which no retry
fixes. The runtime probe that already runs before staging now also reads
the Windows build and checks for an extractor, read-only, and refuses
before anything is staged or uploaded. The refusal travels the existing
orcad_unavailable reason plumbing to the host card and the ssh:connect
error, and is rechecked on every connect like a noexec home.

Fixes #33574

Reported-by: HKLHaoBin
2026-10-25 18:18:06 -07:00
Neil 295530df2e fix(ssh): a migrated host's old session no longer brings closed tabs back on restart (#33702)
* fix(ssh): a migrated host's old session no longer brings closed tabs back on restart (#33539)

After an SSH host moved to a managed server, main hides its retained source
repos but still listed its frozen session partition. The window adopted that
partition at startup, and agent tabs the user had closed on the server came
back on every restart. The partition census now hides that partition exactly
when its repos are hidden; the stored rows stay for downgraded clients.

* test(ssh): pin that an uncommitted move keeps its session listed
2026-10-25 18:16:31 -07:00
OrcaWinandOrcaWin c6f8d70827 test: strengthen Git and session assertions; remove copied pathspec replay (#33669)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-25 18:14:16 -07:00
Brennan Benson 2b62af79c3 Picking the all-agents permission keeps agents set separately (#33018)
* Keep the permission pill inside the Arguments box

* Share the Settings permission menu and commit Arguments on field exit

* Honor changed permission choices and acknowledged host picks in reset notices

* Show acknowledged permission resets with scoped Undo

* Consume removed permission recipes in the Arguments draft

* Keep reset notices separate from the inline permission field

* Show reset choices and Undo after a global permission pick

* Use Textarea variant for composite arguments field

* Fix permission test query typing and sync English runtime catalog

* Keep permission reset Undo beside the toast title

* Add permission reset localization base keys

* Complete host settings bookkeeping transport mock

* Flow arguments beneath the permission chip

* Keep composite argument typography in Textarea variant

* Share native scrolling between permission chip and arguments

* Place all-agents permission menu beside its label

* Preserve permission menu width while settings load

* Keep explicit agent permissions when changing the global default

* Use acknowledged settings for local permission notice actions

* Apply local permission notice actions at the settings owner

* test: give settings runtime mock a portable type

* test: place settings fixtures in the recognized fixture directory

* fix: update populated permission notices without dismissal

* Toast says agents still use their own permission setting
2026-10-25 18:07:49 -07:00
Neil 5dfaee07b1 fix(ci): localize the chat font family search keywords (#33715)
#33687 added English-only search keywords and a code sample to the chat font
setting, which fails main's localization coverage check.
2026-10-25 17:54:29 -07:00
Brennan Benson 4833b736f7 fix(native-chat): preserve Claude approval choices across model changes (#30914)
* fix(native-chat): a Claude chat saved as Approve for me keeps it when Orca can't read its model list

A chat's auto mode dropped to Ask whenever the saved model list was missing
or couldn't name the chat's model (another account home, first start in a
folder, an unlisted model id), so a resumed chat launched asking for approval.
Auto now drops to Ask only when the list shows the model without it; Claude
itself starts a model that can't run auto in its default mode.

Tracked in STA-10953.

* fix(native-chat): a model list from a CLI older than auto mode still reads as Ask

A CLI that marks no model with auto support predates the auto value (2.1.71)
and would refuse --permission-mode auto, so its listing is evidence, not a gap.

Tracked in STA-10953.

* docs(chat): correct auto support reporting version

* test(chat): type saved launch option cases

* Honor requested chat permissions across model changes

* Match outgrown child fixture to journal null contract

* fix(native-chat): preserve admitted input and current mail choices

* perf(native-chat): derive wake debt and held sends once per retirement decision

The retirement check derived wake debt (a child-work projection and a scan
for the newest turn) before asking whether open work had already decided
the outcome, and its admitted-input fallback rebuilt the provider's held-send
set once per unanswered submission, O(S x W) per decision.

Open work is now read first and wake debt only where it picks the outcome or
the refusal reason. Current work gains one batch query that reads the held
set and the handover set once, sharing the single holds rule with the
per-send reader. Outcomes and refusal reasons are unchanged.

Adds N/10N operation-count contracts on the real Claude host rig: two
retirement checks per ordinary send, each one pass over history, with a
control that the second sees a sign-out reported between them; no wake debt
mid-turn; one held-set read per refusal in a queued model-change burst.

* Keep active Claude input on its turn choices

* Fix chat admission type imports and cover turn-scan costs

* Preserve root lifecycle delivery under journal pressure

* test: construct Codex mail fixture with its source

* test: expect root retention metadata in Claude turn timing

* test: cover captured Claude full-ID Auto launch

* test(native-chat): explain queued-send test timeout

* test: supply explicit mailbox working policy
2026-10-25 17:53:19 -07:00
Jinwoo Hong bd2f46359d fix(daemon): roll the daemon-side terminal fixes since v1.4.240 into a fresh v52 daemon (#33705) 2026-10-25 20:36:10 -04:00
Jinjing 405ce9bcc9 Stabilize notification dispatch tests with fixed timestamps (#33698) 2026-10-25 17:30:25 -07:00
Neil 8ee2f09089 fix(orcad): drive Android emulators from headless orca serve hosts (#33701)
* fix(orcad): drive Android emulators from headless orca serve hosts

orcad never installed an EmulatorBridge, so every `orca emulator` verb
failed with emulator_no_active once headless serve moved to orcad. The
emulator modules now read host paths and HTTP through the host ports
instead of importing Electron, and orcad installs the bridge and stops its
managed sessions on shutdown like the desktop does.

Fixes #33650

* fix(orcad): bound emulator teardown inside the shutdown deadline

* fix(orcad): keep idle exit from stopping Orca-started emulators; update emulator skill scope

* fix(orcad): count only still-running Orca-started emulators as idle-exit work

* fix(emulator): prune managed sessions only on a successful adb census

* fix(emulator): release a pruned device's stream and never prune a record reattached mid-census
2026-10-25 17:28:06 -07:00
Neil 79a63f3d9d fix(orcad): bundle jsonc-parser's ESM build into the shipped CLI (#33700)
The headless CLI bundle resolved jsonc-parser to its UMD build, whose
relative requires fail beside the single-file bundle, so
`orca agent hooks status|on|off` crashed with "Cannot find module
'./impl/format'". Every orcad bundle now shares one plugin list, and the
build refuses any bundled UMD module.

Fixes #33592
2026-10-25 17:27:56 -07:00
c0a51bcd88 fix(ssh): don't refuse a host's move over a pane that saved no terminal history (#33681)
* fix(ssh): don't refuse a host's move over a pane that saved no terminal history

A pane with an empty inline buffer, a deleted snapshot, or a zero-byte
snapshot has no history to lose, but the move's projection filed it
under "saved terminal history Orca could not read" and refused the whole
host. Tell absent snapshots apart from unreadable ones and move the
former without history; unreadable history still blocks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(ssh): keep looking in the fallback root when a scrollback snapshot is empty

A zero-byte snapshot in the primary root returned 'absent' without checking
the fallback root, so a pane whose history lived there moved without it.
Also check ENOENT inline rather than importing a window staging helper.

* test(e2e): seed unreadable relay scrollback as an over-limit snapshot

A missing snapshot file now means the pane saved no history, so the
leave-behind spec needs history that exists but cannot be read.

---------

Co-authored-by: Younghwan Chae <chyohw97@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 17:27:13 -07:00
Jinjing 478ad9109c Add custom font family setting for native chat (#33687)
* Add custom font family setting for native chat

* Preserve custom chat fonts in autocomplete

* Preserve IME composition in font autocomplete
2026-10-25 17:26:24 -07:00
Neil 5cf4805682 fix(link-actions): dismiss the link chooser when an outside click stops propagation (#33679)
* fix(link-actions): dismiss the link chooser when an outside click stops propagation

* test(link-actions): wait for Radix to arm before the outside click
2026-10-25 17:21:21 -07:00
NeilandKyou12138 1b58be9ddc fix(ssh): retry over system ssh when ssh2 shares no algorithm with the host (#33680)
* fix(ssh): retry over system ssh when ssh2 shares no algorithm with the host

ssh2 supports fewer algorithms than OpenSSH. A host that offers only
certificate host keys (or only kex/cipher choices ssh2 lacks) fails the
handshake with "Handshake failed: no matching ...", even though the
system ssh binary connects fine. Treat any such negotiation failure as a
client capability gap: probe system ssh once, and if that also fails,
report its error, since ssh2 can never reach the host.

Fixes #33582

Co-authored-by: Kyou12138 <kyou12138@gmail.com>

* fix(ssh): keep hosts pinned in Orca's key store on ssh2 after a negotiation failure

System OpenSSH never reads Orca's own host key store, so an on-path
impostor could advertise algorithms ssh2 lacks to steer a pinned host
onto system ssh and around its pin. Only fall back when Orca has no
stored key for the endpoint.

Co-authored-by: Kyou12138 <kyou12138@gmail.com>

* fix(ssh): only the current attempt records an Orca host key pin

A superseded attempt that finished its trust read late could overwrite
the current attempt's pin marker, letting a negotiation failure on a
pinned host fall back to system ssh.

---------

Co-authored-by: Kyou12138 <kyou12138@gmail.com>
2026-10-25 17:19:09 -07:00
Brennan Benson bfc633af8f Offer to resume chats after managed server updates (#28978)
* Guard managed server restarts with host work reservations

* Protect legacy server update requests with host admission

* Reserve chat-safe restarts in SSH and WSL server updates

* Keep activation host fixtures within the module line limit

* fix(orcad): preserve session queue timing during admission

* Explain chat-safe update deferrals and superseded restarts

* Clarify managed server Force upgrades and retry instructions

* Separate chat entry delegates from conversation creation

* Report child work through main's child evidence in the restart drain test

* Drive main's snapshot-room tests through the restart reservation

Main's room tests deployed over a serving incumbent with a census that has no
chat work count and no restart admission, so the update deferred before the
room probe ran. Give them the same idle census and slot admission as the other
activation tests, and pin the probe before the reservation instead of before the
recount it replaced.

* fix(native-chat): an update keeps waiting on a chat start after its conversation is closed

The restart check counted a start only while its conversation stayed open,
so an idle close during a stalled start let a managed update through.
Every tracked attach, create, start and open now counts as restart work
in the same tracker that counts the session queue.

* fix(native-chat): keep the structured session view within its line limit once formatted

Main's copy sat at 400 lines only because one line was left unformatted; the
merge's formatter pushed it to 401. Inlining the one-use question list keeps it
at 400 with identical behavior.

* fix(orcad): a recovery stop request stops the server; only an older client's empty request waits for idle

Stopping a slot and restarting it for an older client's update were both an empty
.orcad-stop-request file, so routing that file through restart admission let a
crash recovery, stranded-setup release or rejected-candidate rollback leave the
server running. New clients now write "stop-now" into the request (renamed in
whole), which stops at once as before; an empty or unrecognized request takes the
chat-safe restart, and a deferred restart logs why. Also gives the restart
admission activation fixtures the now-required recount.

* docs(orcad): say a directory at the stop-request path is refused, not restarted

* docs(orcad): the plain stop request's comment states both of its meanings

* style: format the restart admission files for the format check

* test(wsl): count the incumbent's recount bridge after the reservation's

* fix(orcad): a Windows stop request retries its rename while antivirus holds the new file

Renaming the just-written stop-now request can briefly fail with EPERM, EACCES
or EBUSY on Windows; the stop now retries those with the same bounded delays as
record-publish instead of answering SIGNAL_FAILED and leaving the server up.

* test(orcad): a real Windows host stops on the slot's stop-now request and relaunches

* test(orcad): recovery stops a real server whose restart admission refuses

* test(orcad): the recovery-stop cell tunnels over the cell's SSH connection

* test(orcad): the recovery-stop cell names itself in the CI log

* fix(settings): a deferred WSL update shows its full reason below the row

* test(orcad): fixtures pass releaseIncumbentAdmission; the census test calls its own method

* test(orcad): the capable-server census in the fence test reports idle chat work

* Record server chat restart offers and desktop creation history

* Offer interrupted chat recovery per managed runtime

* Ship the remote chat resume action labels in the runtime catalog

* Update removal contracts for desktop chat history cleanup

* Scope remote chat recovery to each server occurrence

* Preserve recovery choices and uncertain continuation outcomes

* fix: preserve uncertain restart action outcomes

* Fix restart recovery CI imports and fixtures

* test: align resume assertions with unconfirmed outcomes

* test: bound restart recovery work across scaled populations

* fix(native-chat): title the remote resume dialog with the restart

The dialog can appear out of nowhere when another desktop updates a shared
server, so its title now says what happened: "<machine> restarted".
2026-10-25 17:15:55 -07:00
Neil 3ffe2af9fa fix(terminal): preserve intact replay escape tails across fit deadlines (#33677) 2026-10-25 17:14:36 -07:00
Neil 2209d55b9d fix(terminal): give the window and main's copy the daemon's ConPTY resize rule (#33584)
* fix(terminal): give the window and main's copy the daemon's ConPTY resize rule

Every PTY a Windows machine owns is ConPTY, WSL shells included, and ConPTY
repaints its own grid after a resize. The window applied xterm's ConPTY
model only to native (non-WSL) panes, and main's copy for reveals and phones
never did, so growing either pulled history into ConPTY's grid. Decide
windowsPty from the PTY's owner backend everywhere, keeping the native-only
cursor, CJK and keyboard workarounds behind isLocalNativeWindowsConpty.

* fix(terminal): keep main's copy of an SSH relay PTY off the ConPTY model before its record exists

Main's copy is built on the first byte, and a restored or adopted relay PTY
can stream before its record carries a connection id.
2026-10-25 17:11:57 -07:00
Jinwoo Hong a5f7da4928 revert(daemon): ship official Node in the macOS terminal host again, keep stall telemetry (#33688)
Reverts #29133 except its daemon async-I/O stall telemetry, so we can measure how often stalls happen on official Node before committing to a patched runtime. The macOS terminal host goes back to the official Node 24.22.1 download and the daemon protocol back to v51; no release or hourly build published v52.
2026-10-25 20:07:30 -04:00
Brennan Benson 5a4dd30048 fix(ci): repair main's line limits and a stale test import (#33675)
* test(native-chat): split startup report coverage below line limit

* test(native-chat): keep startup status reads synchronous

* refactor(native-chat): move status child fields below line limit

* test(native-chat): annotate exported startup mock types

* test(chat-rename): import launch persistence from its current path
2026-10-25 19:53:28 -04:00
Jinjing d37c04c82c Fix notification bell layout (#33683)
* Fix notification bell layout and isolate Vite tsconfig resolution

* Move Vite tsconfig fix out of notification bell PR
2026-10-25 16:45:52 -07:00
Jinjing ddd55a44d4 Bound cwd permission probes during terminal session creation (#33643)
* Bound cwd permission probes and share pending enumerations

* Skip non-macOS cwd permission probes during session creation

- Prevent stalled network paths from consuming filesystem workers
2026-10-25 16:33:35 -07:00
Brennan Benson 3aec926fe5 Chat renames are saved as the chat's name, so Session History shows them after the tab closes (#31602)
* Chat renames are saved as the chat's name, so Session History shows them after the tab closes

Renaming a native chat tab only changed that window's tab. Session History, phones and other windows read the host's saved name, so the rename vanished from History once the tab closed or Orca restarted.

A rename now goes to the host that owns the chat (agentSession.rename) and is saved as the chat's one name, the field History, tabs, sidebars and phones already read. The record remembers that the user chose it, so automatic naming never replaces it. A window's pre-upgrade tab rename is uploaded once and only fills a name Orca chose. Hosts without the new capability keep the old tab-only rename. Every native agent's History row now shows the chat's name once it has one.

* Keep saved chat names consistent across readers and reconnects

* Carry qualified chat names into cached readers

* Reuse the history recorder context across platforms

* Use recorded chat ownership for legacy name transfer

* Transfer legacy chat names only from known catalog ownership

* Correct recorder path matching and History subscription order

* Require complete evidence for bridged parity exclusions

* Preserve sparse array lengths in complete recording comparisons

* Initialize History observation before loading workspace context

* Integrate measured History recordings and scoped parity evidence

* fix chat naming retries and certify both replay modes

* fix ambiguous chat rename labels after navigation

* preserve chat rename intent across tab updates

* type dashboard snapshot fixtures without assertions

* fix: align chat name observation with store contracts

* test: update chat name consumer fixtures

* test: distinguish sender naming metadata from status

* Preserve saved Activity chat names across tab focus

* Clarify Activity tab projection identity

* Remove package-manager lockfile churn from main merge

* fix(runtime): validate tab property edits before saving chat names

* fix: refresh History ownership after conversation clear

* fix: commit History request identity before refresh effects

* Fix History scan scope typing and integration test placement

* test: cover saved chat name reader contracts

* test: make chat naming fixtures deterministic
2026-10-25 16:20:29 -07:00
NeilandFrank Bernhardt cffb527b82 fix(usage): show a Claude Enterprise seat's monthly spend cap when it has no 5h/weekly window (#33655)
Claude Enterprise seats (null 5h/weekly windows, limit in spend/extra_usage) now show their spend cap as a monthly usage bar in the status bar chip, tooltip and account switcher instead of an empty meter.

Fixes #31061
Supersedes #31065

Co-authored-by: Frank Bernhardt <275327+frank-bee@users.noreply.github.com>
2026-10-25 16:10:01 -07:00
553cbffb5a fix(antigravity): keep the selected account after agy refreshes its token (#33656)
After agy silently refreshes its Google token (the new credential has no id_token), Orca still matches the saved Antigravity account by auth method + refresh token instead of refusing the launch with "native Antigravity account changed"; the vault accepts such refreshed snapshots while still rejecting one whose id_token names a different account.

Fixes #31579
Supersedes #33204

Co-authored-by: biojuho <258838639+biojuho@users.noreply.github.com>
Co-authored-by: Manan <100475418+thefrikidude@users.noreply.github.com>
2026-10-25 16:09:45 -07:00
NeilandDongho Lee 12cc6c5fff fix(kiro): report status on Kiro's V3 engine, including the built-in default agent (#33660)
Kiro's V3 engine (default from Kiro CLI 3.0) now reports status in Orca: Orca installs a global hooks file under KIRO_HOME/hooks (covering the built-in default agent, local and remote, never overwriting user files) and recognizes V3's PascalCase hook events.

Fixes #31577
Supersedes #24937

Co-authored-by: Dongho Lee <126236161+LDH1103@users.noreply.github.com>
2026-10-25 16:07:05 -07:00
Neil d9a7aa89c8 ci(wsl): rerun a WSL2 lane job once when its hosted runner freezes (#33532)
* ci(wsl): rerun a WSL2 lane job once when its hosted runner freezes

* ci(wsl): pin the retry to the lane workflow and keep a 30 min job cap
2026-10-25 16:06:20 -07:00
Neil f94b15ec85 fix(cli): a sandbox that denies chmod no longer breaks reading Orca's state files (#20937) (#33662)
Orca CLI commands inside a sandbox that blocks chmod (e.g. Claude Code's Bash sandbox) no longer fail with a misleading "file is invalid": the pre-read hardening of existing secure files ignores EPERM/EACCES/EROFS; writers still create files 0600.

Fixes #20937
2026-10-25 16:05:58 -07:00
Brennan Benson 23798eff7c Let chats follow the agent permission setting (#32334)
* feat(agents): store each agent's permission itself instead of typing flags into Arguments

Terminals and new chats read one stored choice per agent (Use the agent's own
settings, Ask for approval, Accept edits, Approve for me, Full access). Orca adds
the flag at launch; Arguments hold only the user's own text. A one-time move
lifts Orca's flags out of saved Arguments. Older clients still see and write
the flag as part of Arguments; the host translates.

* fix(agents): say the all-agents switch resets agents set separately; keep primitives unstyled

* test(agents): the one-time move returns every launch-profile field

* Fix permission carrier ownership and surface-specific defaults

* Preserve uncertain permission operands and name the option inventory

* Check env entries without indexing typed agent maps

* Combine Chat permission capability imports

* Use folder execution-host platform for permission environment

* Preserve launch map replacement and acknowledge permission saves

* Keep permission feedback fallbacks statically discoverable

* Provide preload platform to Agents settings render tests

* Preserve Gemini approval arguments under Full access

* fix(settings): retain complete environment edits through save outcomes

* fix(settings): narrow local failure scope and preserve host messages

* fix(settings): retire argument drafts after acknowledged saves

* fix(settings): keep Goose environment editable after reset

* fix(settings): show resolved arguments for legacy hosts

* Preserve pending environment resets and bound launch settings work

* Use agent permission choices for new chats

* Let Claude resolve chat permissions from its own settings

* Keep optional settings fallback in repository metadata reads

* Consolidate permission report imports

* Update permission choice contracts for own settings

* Read repository visibility defaults through the raw settings fixtures

* Match existing translated Agents settings labels

* Update readback and legacy host test expectations

* Align Chat behavior tests with host permission capability

* Fix permission compatibility and host-owned descriptions

* Prepare whole Environment edits and retire unchanged drafts

* Handle null explicitly in permission report decoder

* Keep Environment settings transitions in an acyclic module

* Update raw settings reader test fixtures

* Place test fixture safety notes on assertion starts

* test: pin permission settings work and recovery contracts

* test: type permission settings work fixtures

* test: cover migrated permission inputs and captured CLI grammar

* Publish permission reports and reuse host capability state

* Combine mobile option state React imports

* Honor mobile status feed capability for permission reports

* test: preserve typed permissions in WSL Claude restarts

* Correct permission report child and fixture type contracts

* Delegate older-host chats to explicitly selected own settings

* Avoid rebuilding live ACP option catalogs

* test(chat): place cross-boundary permission contracts in integration project

* Preserve existing chat capability gates and complete report test fixtures

* fix(chat): preserve newer Claude startup permission reports

* test(chat): clarify startup report fixture provenance

* Show reported permission modes in chat menus

* Keep reported permissions available after chat mode picks

* Remove obsolete guard from concrete permission selection

* Report the installed approval policy for ACP chat menus

* test: keep accepted mobile mutation fixture on current fence

* test: cover installed ACP approval report for own chats

* test: align capability scaling contract with concrete permission menus

* Ship required permission help in English runtime catalog

* Adapt permission persistence test to shared menu
2026-10-25 16:00:15 -07:00
Kelvin Amoaba 1b0e56e385 feat(browser): make Orca shortcuts, split focus and mouse back/forward work inside pages (#31859) 2026-10-25 22:57:53 +00:00
NeilandASH b7a6570e04 fix(accounts): an account-switch restart resumes Claude in the folder it was started in (#33659)
Claude account-switch restarts now pass the folder the restarted shell opens in (tab start folder, else workspace), so #33527's `cd <start folder> &&` resume prefix applies and a session started in a subfolder resumes there. Codex account restarts benefit the same way.

Refs #31545
Supersedes #32033

Co-authored-by: ASH <7201776+asunghong@users.noreply.github.com>
2026-10-25 15:57:08 -07:00
Jinwoo Hong 47ed6e1154 fix(orchestration): wake an agent for new mail even while it still holds an unacknowledged batch (#33639)
Fixes STA-11980
Fixes STA-11631
Supersedes #29006
2026-10-25 18:38:34 -04:00
Neil 9639426abe fix(agent-status): an Antigravity subagent finishing no longer ends its parent's turn (#33645)
Antigravity automations no longer complete (and close their tab) when an in-process invoke_subagent subagent reports back: once a conversation launches subagents, hooks from other conversations without user input are ignored until the parent's own fully idle Stop; a user-started conversation (carrying lastUserInput) clears the marker so a relaunched agy still gets status.

Fixes #17650
2026-10-25 15:33:23 -07:00
NeilandPandu dwi Putra 7e8bf3db47 fix(acp): OMP models other than the running one keep a remembered effort in new chats (#33646)
OMP native chats keep a remembered or explicit effort on models other than OMP's current one: for dialects that clamp unlisted efforts themselves (OMP only, via clampsUnlistedEffort), non-current models' efforts are recorded as unknown instead of "admits none"; catalog merges keep an older explicit empty list. OpenCode keeps main's behaviour.

Fixes #31995
Supersedes #31998

Co-authored-by: Pandu dwi Putra <218730385+pandudpn@users.noreply.github.com>
2026-10-25 15:31:43 -07:00
Neil c6769fc9be chore: post-merge cleanup for agent integration fixes (#33644)
Post-merge cleanup after the agent-integration fixes: remove the unreachable Windows hook-script stdin drain epilogue; Windows statusline exits instead of draining outside an Orca pane; Codex CLI fork uses the \\?\-aware rollout path; WSL browser-network relay falls back to orcad's pinned Node (shared launcher revision stamp); stranded sleep records only drop for their own worktree; renames (hidden probe cwd, local Windows ConPTY helper).
2026-10-25 15:30:00 -07:00
OrcaWinandOrcaWin f53e7b016a test: strengthen filesystem and settings coverage; remove redundant cases (#33652)
* test: strengthen filesystem and settings coverage; remove redundant cases

* test: prune removed cancellation wait from ratchet baseline

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-25 15:29:04 -07:00
Jinjing c77c3fe3e3 Stabilize sidebar activity toggle placement (#33648) 2026-10-25 15:22:23 -07:00
Brennan Benson 395270ff13 Retry failed agent starts before rejecting your message (#33045)
* Keep the Pi fixture exit observer

* Record failed owned opening before the first message

* Abort a matching provider open when its child exits

* Cover provider exit during an unanswered host open

* Cover explicit failure facts on a host-stopped child

* Capture message choices per accepted send and preserve picker state

* Apply accepted Claude message choices at prompt handover

* Apply captured message choices at provider dispatch

* Bind native chat choices to accepted message dispatch

* Reset Codex turn choices for each captured message

* Resolve Codex message defaults from native facts

* Align message choice and Pi default fixtures with provider dispatch

* Align option fixtures with saved message choices

* Match Codex message choices to the active turn origin

* fix: let pending commands reach handover refusal

* Abort pre-prompt message choice writes with host-owned wait

* Verify message choices through provider input boundaries

* Keep legacy mobile test hosts explicit about message choices

* Align Stop close causes and request-note fixtures

* test: align ACP Stop note fixtures with settled behavior

* Verify close intent reaches the native adapter

* Record the Stop request before waiting for interruption

* Keep Stop cleanup independent of request-note persistence

* Keep startup waits cancellable and preserve operation order

* Derive Codex startup exits from host phase

* Open Codex protocol in background-task test fixtures

* Keep ACP startup ownership until handshake completes

* Run ACP opening catalog fixtures with Node SQLite

* Verify saved ACP picks without live option writes

* Keep ACP catalog bookkeeping from failing an options read

* Restore signed-out restart and fail Pi startup faults

* Run Pi opening catalog fixtures with Node SQLite

* Preserve message choices across cold clients and kept cards

* Remove the unused provider option restore ledger

* Clarify launch choices and legacy option hydration

* Remove remaining restore-ledger forwarding and assertions

* Remove unused ACP and Pi restore bookkeeping

* Report late Codex exits and keep card Cancel notes scoped

* Remove the Pi close wrapper left by unused cause plumbing

* Update Stop tests for the simplified close contract and Node journals

* Update remaining close and interrupt assertions after cause removal

* Keep live choices and delivery order while agents start

* Drop retired startup revision from Codex opening

* Keep live-option cancellation until message choices and clarify catalog reads

* Hold ACP option replies in live-write cancellation regressions

* Remove retired Pi startup revision and match saved-pick behavior

* Check running choices and retained rewind messages after delivery integration

* Use observed root exit in Codex close reports

* Apply startup picks and let parked messages release operations [skip ci]

* Remove unused Codex opening report field [skip ci]

* Keep ACP restoration facts local to the provider [skip ci]

* Apply Pi startup picks after readiness and remove unused open facts [skip ci]

* Cover goal changes during the held Codex message wait [skip ci]

* Save a waiting startup pick after Stop ends its opening [skip ci]

* Save choices when startup ends or a replacement is still opening

* Check saved choices separately from Claude startup reports

* Release scripted Codex startup before awaiting queued picks

* Check the saved picker selection in per-message choice fixtures

* Exercise current choices and eager client capabilities in runtime fixtures

* Keep accepted Stop requests in runtime settlement assertions

* Reuse runtime fixture reads and type the fake connection directly

* Type the Codex child-proof fixture connection directly

* Align startup fixtures and preserve observed Claude exits

* Honor queued send authorization in Claude runtime fixtures

* Open Codex protocol sessions before Stop fixture dispatch

* Wait for the opened Codex child before runtime notifications

* Keep repeated permission picks usable and align Codex fixtures

* Validate pending picks against the live option state

* Order startup picks before later messages and retain flow regressions

* Keep reviewed lifecycle contracts while pruning duplicate tests

* Save picks after a proven exit without requiring a child

* Type the startup reply fixture against the Claude control contract

* Keep Codex startup flow contracts and remove overlapping adapter tests

* Restore the committed dependency lockfile after test tooling

* Keep startup recovery flows and remove duplicate Pi handshake cases

* Cover both Pi startup choices in the delivery flow

* Match the Pi prompt entry recorded by the scripted wire

* Honor the before-input callback in the startup reply fixture

* Keep message choice flows and remove overlapping selector tests

* Retain Stop flows and remove repeated reducer and adapter cases

* Keep Stop note writes independent of full session context

* Keep startup option menus independent and show the saved choice

* Exercise startup picks across real menus and the runtime

* Match startup picker fixture to saved message choices

* Keep saved effort visible when picking a model during startup

* Include the running-turn scope in repeated Stop fixture

* Use the current attach contract in import fixtures

* Keep the Codex journal translator within its line limit

* Match ACP startup fixtures to saved picks and late Stop behavior

* Check startup effort after saved picker choices are acknowledged

* Complete Stop target types and keep the effort regression concise

* Use requested picker values in the effort regression acknowledgement

* Exercise Stop receipt replay across a resumed provider child

* Require owned provider spawn and one host-awaited open (from #28055)

* Restore the live checks the startup cleanup's deleted tests pinned

One assertion each, in the surviving suites: a stale-generation exit is
ignored, a failed create lets its sink go, a readback before open is saved,
an idle stop that fails is retried, a no-pick Pi start teaches its default,
an older client's pre-spawn failure and packed answer, an undrivable chat
stays readable, the resting slash menu stays on its own host, the main agent
reads apart from subagents, restore publishes status, naming runs off the
host's status feed, and a throwing logger never reaches the operation.

Also corrects the reliability gate note that claimed the send-idempotency
suite replaced the refusal-retry tests.

* Read a rewind in doubt outside the chat's serialize and apply it in the commit

The started settle and the attach's ready-child path read the provider's
history first, then apply what it proves in a short commit that re-checks
the rewind it read.

* Accept messages while the agent starts: run the start outside the chat's serialize

The chat's serialize was both where a send was admitted and where its agent
started, so every slow step of a start (closing-child join, lease
reconcile, recovery probes, resolvers, history read, spawn, sink drain,
provider dispatch) held every later send.

A start now registers in one short step before its first wait: its abort
controller (which Stop, close and quit already reach outside the lock),
its startup clock (the 10-minute ceiling now counts from here) and quit's
drain. Every wait after runs outside the lock, raced with that signal, and
every write is a commit that first re-checks the start is still the
session's. A start that loses the check is late: its spawn is closed
through the post-acquisition failure path and nothing is handed to it.

- The delivery loop's prepare returns a start handle; the loop awaits the
  start outside, then re-prepares. Handover writes the pending row and
  begins the dispatch abort handle in one commit, calls the provider
  outside after re-checking the child, and resolves in a second commit.
- Ready operations claim a start instead of running one in their step.
- A client attach runs the same steps under one serialize, as before.
- An exit reported between spawn and publish is held for the publish
  commit, which ends the child it indexes.
- An unproven close still fails only what was queued when its start was
  asked for.

* Test that a send is accepted at every wait an agent start makes

One whole-flow test holds the start at each wait in turn (closing-child
join, reconcile probe, recovery re-probe, resolver, spawn, sink drain,
open, started recovery, pending row, provider call): a second send is
accepted at once, a Stop is recorded without waiting and nothing reaches
the provider, and what was sent goes to the published child once, in
order. Also quit before spawn, concurrent sends, a lease left recovering,
and an idle sweep racing a send.

* Bound each startup step on its own and drop the startup silence rule

A start no longer ends after 60 s without output: output is not protocol
progress. Each protocol step now has its own bound where its handshake
lives, and one 10-minute ceiling from registration stays as the outer bound.

- Codex: initialize 15 s and thread start/resume on the connection's 30 s
  default again, instead of the startup ceiling.
- ACP: initialize 60 s, authenticate 120 s, session new/load/resume/fork
  300 s; turns stay unbounded and option writes keep their caller's bound.
- Claude: the initialize answer has a 60 s bound; past it the open fails
  with the ordinary startup-failure words and the host ends the child.
- The onOutput plumbing that only fed the silence rule is removed.

* Count Pi ready once it reports its state

Pi's start no longer waits for its model listing and slash commands.
The open returns after get_state and the unknown-provider check; the
listing then arrives as an options report (with the catalog listing the
start resolved) and the commands as a later publish. An empty model list
no longer fails the start as signed out: a signed-out Pi runs the unknown
provider, which still fails it, and a prompt it cannot run is refused
with the sign-in words by the existing prompt path.

get_state keeps the connection's 30 s request bound instead of the
startup ceiling.

* Test that model and effort picked while a chat is created ride its first message

A slow host's create reply arrives after the user picked a model and effort. The picker's view
layers the launch's held picks over its seed and the host's saved selection, and every send
carries what the picker shows, so the first message carries the picks whether the host's status
names its selection or not, and while the last pick is still on its way to the host.

* Start a phone's new empty chat on its first message

The phone's new chat is an agent.launch with no prompt, which always created the chat with its
agent started, while desktop chats start on the first message. The phone now advertises the
create-without-start capability, and a launch with no prompt from a caller advertising it creates
the chat at rest, keyed in the ledger by its create intent as a client's create is. Launches with
a prompt, the CLI (which advertises nothing), orchestration workers and ensure still start at once;
an older host ignores the capability and stays eager.

* Take main's lockfile; the branch changes no dependencies

* Restore main's exact text in files the merge only reformatted

The pre-commit formatter rewrote 37 of main's files staged by the merge, though this branch never changed them, pushing two past the line limit. Committed without the hook because the hook would reformat main's text again; CI lints the result.

* Fit the startup tests to the owned-spawn, host-awaited-open contract

Test doubles gain the mandatory open and an acquisition generation, the
removed started event gives way to the rig's proveStart, and two literal
types are tightened for CI's typecheck. A Stop during a held start writes
no host note on this branch: the taken-back send draws its own
stopped-before-start row, which the startup-attempt test now asserts.

* Fit the remaining CI checks to the startup limits and current releases

- Run agent-launch-at-rest.test.ts in the SQLite Node runtime project.
- Pin the send-options cross-version case to v1.4.228, the first published release with agent-session.send-options.v1; v1.4.226 was never pushed.
- Load the baseline's isStructuredTab from src/shared (moved in v1.4.228), falling back to the renderer path for older baselines.
- End the never-proven start with a short startup ceiling: the silence limit it relied on is gone, and the ceiling counts from registration.

* Read the option stamp from the chat's one host-execution selection

* fix: preserve startup authority and accepted agent choices

* Retain dispatch authority and reconcile accepted options

* fix(native-chat): preserve accepted choices and cancellation authority

* Restore established client selection flow

* Preserve provider output observation and typed startup fixtures

* fix: preserve initial Claude launch choices and effort readback

* test: complete Claude catalog session fixture

* Preserve incoming main files after merge formatting

* Preserve compact handover through startup merge

* Type instant startup fixtures before their open is supplied

* Keep browser sign-in under its existing expiry owner

* Finish the main merge: retired-model display, start rewind cut, new tests

A model the Claude CLI retired is reported again, so the picker shows what the child runs and the
next send moves the chat off it. The start reads a rewind in doubt against the handle it answered
with, the record its commit then applies to. Main's tests follow the start's open: the admission
fixture holds a real turn, and a sign-in close during setup fails the open.

* Type the start's rewind record as the store returns it

* Type the Sleep test's held open as the provider open it replaces

* Sleep counts a chat stopped once the start it aborted leaves it at rest

A start runs outside the chat's lane, so Sleep's step can run before the start it aborted has
settled; it then re-reads the chat once that start is done, instead of reporting it unverified.

* Keep Sleep's start-abort bookkeeping beside the rest of Sleep's stop

* Keep the listed background Stop lifetime cases

The two #29905 cases lived in the turns test this branch removed. They pin that a listed Stop never ends a helper lifetime it did not capture: a same-id restart during acceptance, or a refused helper that appears mid Stop-all, which must not close the agent.

* Reconcile test registries and queued provider work accessor

* Update CI scope fixtures after removed connection test

* Bound native chat Stop protocol steps and omit empty startup feedback

* Supply current session fence in empty-start Stop test

* Align goal cancellation test with accepted-message feedback

* test(native-chat): cover distinct repeated Stop through Codex adapter

* WIP: own agent start attempts through readiness

* WIP: exercise complete start retries and final settlement

* test: pin startup failure settlement ownership

* fix: keep startup failure settlement with its requester

* fix: keep startup journal faults final

* Keep startup host wiring within the file limit

* Keep the adapter contract within the file limit

* Align startup retry callers with current host contracts

* Exercise startup exhaustion and requester ownership in existing flows

* Make requester failure row ordering explicit in the fixture

* chore: remove unrelated renderer changes

* fix: honor cancellation during final startup settlement

* test: keep startup failure readers within their projects

* fix: retain each physical startup child once

* test: use valid startup fences and publication boundaries

* test: align startup parity and retained child fixtures

* test: bound startup corpus within saved handle capacity

* test: cover startup classification with recorded protocol rejections

* test(native-chat): mark the fake-timer backoff bridge as a deliberate timer use

* test(native-chat): put the timer-rule exception on its own line
2026-10-25 15:20:51 -07:00
Kelvin Amoaba eb499478da feat(browser): show agent browsing live, with a jump to the page from chat (#33075) 2026-10-25 22:15:00 +00:00
Neil 3b8e872c45 fix(codex): show HTTP usage while Codex's session index is stuck rebuilding (#33636)
Codex usage keeps showing while a native Codex home's state-db backfill is pending (the HTTP usage path only reads auth.json), and a background index rebuild that gives up is now remembered and reported with an actionable message instead of "rebuilding" forever.

Fixes #15741
2026-10-25 15:11:33 -07:00
Jinwoo Hong 28de913868 test(connectors): drive a connector conversation end to end on a headless serve host (#33613)
Adds an end-to-end test that boots an isolated headless serve host and drives the orca connector CLI against a scripted Claude. Runs in the existing PR e2e job only when connector code changes.
2026-10-25 18:07:30 -04:00
Neil 47d1b31027 refactor(mobile): group native chat send and stream state (#33640)
* refactor(mobile): group native chat send and stream state

* refactor(mobile): use concrete type namespaces in send fixtures
2026-10-25 14:59:51 -07:00
OrcaWinandOrcaWin 3fbf89bb4e test: strengthen watcher and mobile async assertions (#33641)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-25 14:49:49 -07:00
Brennan Benson 883b768bc7 A chat never starts writing a conversation a terminal is still writing, and restored panes respect open chats (#30930)
* fix(native-chat): one ownership index with link roles, and a chat refuses to start while a terminal writes its conversation

Each chat link now carries its role (head or earlier) and key; Session History names
the chat continuing a conversation first, duplicate adoption checks only head links in
both the pre-commit check and the store transaction, and terminal resumes stay refused
exactly as before. The terminal-writer check now also runs inside acquireOwner before
the spawn, refusing with the typed pre-spawn reason conversationOpenInTerminal.

* fix(native-chat): hold a terminal start Orca issues until its terminal reports it

An in-memory registry of managed terminal starts per conversation, registered in the
same step as the resume admission (terminal.send with a resume command, createTerminal
with a command), bound to the PTY execution that runs it, and ended only when that
terminal's hooks report the conversation or the execution is gone. A chat's agent
start refuses while an entry may hold its conversation.

* fix(terminal): an automatic pane restore never resumes a conversation an open chat continues

Resume recipes built from a pane's saved facts (cold restore, deferred and late reattach,
sleeping wake, host mobile materialization) carry resumeOrigin 'saved'. The execution host
decides before any command is issued: while an open chat continues the conversation, or a
chat may be writing it, the pane starts its plain shell with the started-fresh notice and
its saved claim is forgotten; with unreadable records only a saved restore is refused and
its record kept. An admitted resume registers its managed start in the same step, so the
chat's agent start refuses until the terminal reports it or exits. Clearing the last saved
record now reaches disk.

* Fix saved terminal resume ownership and effective launch results

* Preserve conversation case and clear refused cold restore identity

* fix: publish effective terminal launch results on attachment

* fix: preserve terminal launch callback and candidate ownership

* fix: keep existing terminal attachments observational

* fix: consolidate terminal launch imports

* test: document snapshot runtime fixture boundary

* fix: preserve terminal launch identity types

* fix: accept reattach payload policy sessions

* fix: preserve terminal result validation contracts

* refactor: separate terminal create contract

* test: document partial terminal runtime fixtures

* test: align sleeping resume store fixture

* Fix terminal create type contracts

* fix: return the terminal main started to its waiting view

* fix: register reattached terminals before publishing their handles

* Check unavailable-resume test fixture types

* Complete sidebar resume test store fixture

* test: bound saved resume ownership and refusal work

* Settle refused saved resume claims from actual launch results

* Fix saved resume test type contracts

* test(e2e): capture exact terminal parking diagnostics

* test: verify parked terminal with fresh host inventory

* Consolidate agent session imports in remote terminal transport

* Clarify terminal conversation refusal guidance

* Admit note-only saved conversations without hiding live writers

* Retain terminal writer proofs through final admission
2026-10-25 14:39:05 -07:00