Commit Graph
1896 Commits
Author SHA1 Message Date
OrcaWinandOrcaWin fce98d7d21 test: remove 167 low-value cases and 93 suites (#41057)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-10 23:17:08 -08:00
Neil d47ed1c468 fix(agent-status): skipping a Codex async question clears it on SSH panes too (#41031)
* fix(agent-status): skipping a Codex async question clears it on SSH panes too

An SSH pane's Codex hooks are normalized by orcad on the host, so the
desktop's own hook server had no row to apply the skip keystroke to. The
renderer now sends a remote pane's skip to the owning runtime through a new
terminal.inferCodexQuestionSkip RPC, which applies it to the host's tracker.

* test(e2e): skipping a Codex async question clears a managed SSH terminal's row
2026-11-10 23:07:24 -08:00
Neil 3217e60e84 refactor: give pane conversations a concrete owner and remove redundant wrappers (#41038) 2026-11-10 22:36:36 -08:00
JinjingandClaude b7e0fa8e22 feat(automations): redesign the automation detail overview (#40507)
* feat(automations): redesign the automation detail overview

Group the overview into a run-health band (last run, next run, spend), Schedule and Execution property panels, and a Prompt panel with copy and a fading show-more. Run Now is now the primary action next to Edit; Pause and Delete move into an overflow menu with Delete separated as destructive.

* test(e2e): align prompt disclosure spec with the 8-line clamp

The redesign raised the collapsed prompt clamp from 4 to 8 lines and caps the
prompt at 80ch, so the resize prompt no longer overflowed at 820px. Lengthen it
so it wraps to ~11 lines at 820px and ~6 at 1400px, and assert line-clamp 8.

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-11-10 21:31:18 -08:00
Neil dedec14074 refactor(renderer): group pane layout and terminal input owners (#40989) 2026-11-10 20:09:37 -08:00
Neil 8aa3f9c36e refactor(renderer): group browser owners and typing diagnostics (#40936) 2026-11-10 17:17:59 -08:00
Neil 08bb458da4 Remove the per-repo agent folder trust prompt (#40934)
The first-launch 'Trust <repo> for agents?' modal blocked agent launches
to ask a question that offered no real protection: undecided repos, and
every unattended launch, already pre-trusted. Drop the dialog, the launch
hold and the skipAgentWorkspaceTrust plumbing. Repos default to
pre-trust; the per-repo setting remains as an opt-out.
2026-11-11 00:34:24 +00:00
Neil 1af64194a4 refactor: group renderer agent sessions and runtime modules by owner (#40911)
* refactor: group renderer agent sessions and runtime modules by owner

* fix: carry moved owner paths into refactor ratchets

* test: remove retired empty sleep guard registration
2026-11-10 16:04:03 -08:00
c3662026f5 Fix workspace delete shortcut targeting (#40913)
* Fix workspace delete shortcut targeting

Resolve the keyboard action from the current workspace and execution host,
keep clicked menu actions bound to their rows, and advertise the shortcut
only for the committed workspace copy. Preserve confirmation preferences.

Co-authored-by: Luca Critelli <lucacri@gmail.com>
Co-authored-by: Anton Kuligin <anton.kuligin@notraffic.tech>

* Document isolated deletion test fixture boundaries

* Type the shortcut command test input

---------

Co-authored-by: Luca Critelli <lucacri@gmail.com>
Co-authored-by: Anton Kuligin <anton.kuligin@notraffic.tech>
2026-11-10 15:51:05 -08:00
Neil b5611915f9 refactor(mobile): group usage and shell generation owners (#40783)
* refactor(mobile): group usage and shell generation owners

* refactor(mobile): use direct module types in reset credit adapter
2026-11-10 14:28:58 -08:00
Neil b07b3d318a refactor(renderer): group startup platform and runtime owners (#40777)
* refactor(renderer): group startup platform and runtime owners

* refactor(renderer): reconcile imports and retained validation metadata

* test: clear runtime pairing revisions between repo generation cases
2026-11-10 06:30:52 -08:00
Neil d1466f6017 refactor: finish terminal runtime and typography owner imports (#40761)
* refactor: finish terminal and Mobile defining-owner imports

* fix: retain completion coordinator type binding

* refactor: consolidate direct terminal tree imports

* refactor(renderer): import typography from defining owners
2026-11-10 04:51:57 -08:00
adbccb69a8 fix(terminal): keep remote-viewer clipboard env on command-less creates (#40550)
* fix(terminal): keep remote-viewer clipboard env on command-less creates (#39852)

A paired viewer's plain terminal reaches the host renderer's tab-create
bridge with spawn env (ORCA_REMOTE_VIEWER_CLIPBOARD, PI_CLIPBOARD_OSC52)
but no startup command. The bridge queued pendingStartup only when a
command existed, dropping the env, so the spawned shell never saw the
remote-viewer clipboard marker and copied text stayed on the host
clipboard (#39852).

- Queue the startup whenever the request carries launch material
  (env/envToDelete/launchConfig/resume), not only a command.
- PtyPaneStartup.command becomes optional for env-only startups; spawn
  options already tolerate a missing command.
- Keep the plain-shell pre-bind input hold for startups that plan no
  post-bind work, so an env-only startup types as a plain shell does.

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

* test(e2e): layout oracle marks only panes the user can see

A hidden tab with a queued startup is laid out at opacity 0 so it spawns at
real geometry. The marker check counted it as visible because it has a size,
then waited for output that the hidden-delivery gate correctly withholds.
Paired-client creates now queue spawn env, so their background tabs hit this.

---------

Co-authored-by: Chen <zwq19980411@gmail.com>
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-11-10 03:30:15 -08:00
Neil 7c01847447 refactor(renderer): group appearance and terminal feature owners (#40719)
* refactor(renderer): group appearance and terminal owners and use defining imports

* refactor(renderer): remove redundant later module requests
2026-11-10 02:13:08 -08:00
Neil 2ceaff4869 refactor(renderer): group workspace creation and launch owners (#40688)
* refactor(renderer): group workspace creation and launch owners

* refactor(renderer): combine concrete workspace naming imports
2026-11-10 00:31:11 -08:00
Neil d78a9b1e9a refactor(mobile): organize native chat by feature ownership (#40619)
* refactor(mobile): group native chat modules by feature owner

* refactor(mobile): consolidate concrete owner imports

* test(mobile): preserve pinned release source addresses

* refactor(mobile): import the recorded launch function type directly
2026-11-09 20:18:03 -08:00
Neil 457c602b4f refactor(automations): group feature modules under defining owners (#40605)
* refactor(automations): group authoring, host catalog, listing and run owners

* Preserve protected automation confirmation copy after owner moves
2026-11-09 19:20:58 -08:00
Brennan Benson 55db56d989 Make Settings easier to scan and organize General (#40249)
* Simplify Settings chrome and organize General into focused views

* Preserve search and skill actions across Settings views

* Correct Settings validation leftovers

* Keep skill conflict details visible in compact Settings rows

* Refresh Settings search and protected copy catalogs

* Use Settings design tokens and button variants

* Keep Settings test setup and translation catalogs current

* Keep Settings search metadata independent of display labels

* Build repository search groups only for the selected pane

* Keep pending skill installs and server menu labels accurate

* Use the supported role locator in the skill regression

* Keep absent skill installation actions on their supported path

* Restore the Settings sidebar to its existing appearance

* Restore shared navigation title keys in pane headings

* Preserve the Settings shell entry animation

* Drop unused Voice labels after the main sync

* Preserve main Voice translations and the moved skill module import
2026-11-09 16:12:36 -08:00
Jinwoo Hong 533a31b742 fix(agent-launch): restarted agents keep the launch they ran with (#38998)
* feat(agent-session): keep the permission mode a Claude session reports

Claude names its live permission mode on prompt, tool and Stop hooks. Keep the
root agent's latest value on the provider session, next to effort, so a resume
without a recorded launch can tell whether the session ran in bypass.

Ports the capture from #36359 by Nelef.

* fix(agent-launch): resume an unrecorded launch bare unless it reported bypass

Without a recorded launch, every restart path now resumes with no settings
Arguments, env or permission default; the configured Command still runs. A
session whose root agent last reported bypassPermissions keeps its bypass flag,
so a hand-typed claude --dangerously-skip-permissions keeps it while a bare
hand-typed claude never gains one (#29898).

Account-switch restart used the shared rule only for Claude; it now uses it
for every agent. Thanks to JustinCMR (#37304) for finding the account-switch
and cold-restore gaps.

* fix(terminal): keep the launch recipe of a window-started agent in main

A window spawn hands main its recipe, but main kept only the token and agent,
so restarts that main runs (workspace sleep capture, closed-worker reopen)
found no recipe and resumed bare. Keep it with the launch authority, the same
gate that admits the token.

* fix(orchestration): reopen a closed worker with the recipe it launched with

A closed worker's pane record goes away with its tab, so orchestration send
reopened it bare (#37693). The worker row now keeps the recipe Orca launched
the agent with, keeps it when a later capture of the same launch arrives
without one (main loses it on a daemon reattach), and a reopen prefers it over
a pane record that may hold another launch of the conversation.

Adapted from #37757 by Pr1p, without a new column.

* fix(terminal): keep a slept pane's earlier recipe only for the same launch

A host sleep capture without a recipe reused the pane's earlier record for the
same conversation. That is right after a daemon reattach, when Orca's launch
still runs but main lost its recipe, and wrong for an agent typed into the
shell that resumed the conversation: it never ran that launch.

* fix(agent-session): restore a paired pane with the recipe its host recorded

A client restoring a pane on a paired host sends only its recorded Arguments,
and the host filled the rest from its current settings. A saved restore now
replays the host's own record for that pane, or, with none at all, resumes
bare and keeps a bypass only when this host's hooks saw it reported. History
and other user-chosen resumes keep current settings.

* fix(terminal): replay a saved note only for the launch main still holds

A note belongs to the agent in a pane only while main holds that launch's
token: main admits it at spawn and retires it when the launch command
finishes, and a daemon reattach restores neither. Worker, host sleep and
hook/quit captures now take a note only from that attested launch, and no
longer copy an earlier record's note by agent or conversation match, which a
typed resume in the same shell also satisfies. With no attested launch the
unrecorded rule applies.

Replaces the inferred orcaLaunched / recipeLostPaneKeys flags and drops the
mock-only reopen and fixture-echo worker tests.

* fix(agent-status): take a pane's note from the launch main attests

The window carried a pane's saved note into each new record by agent and
conversation match, so an agent typed into the shell that resumed the same
conversation inherited an earlier launch's bypass. Main now sends the note of
the launch it still holds with each status, and the window records only that,
its own launch registration, or, for a restored replay of the very status a
record was written from, that record's note. /clear and compact keep the note
because main still holds the same launch.

* fix(orchestration): reopen a worker with its own recipe or none

A worker without its own note took the note of whichever pane record held the
same conversation. Its reopen now always passes a complete recipe: its own
note, or the unrecorded rule. The unrecorded bypass is also scoped to Claude,
whose hooks are the ones that report a root agent's permission mode.

* fix(agent-session): restore a paired pane from its source pane, never current settings

A saved restore on a paired host looked up the destination pane, which a Wake
opens as a new tab, and fell back to the host's current settings whenever the
client sent its partial Arguments. The client now names the source pane (to
hosts advertising agent-session.restore-source-pane.v1), and the host replays
its note for that pane or, with none, resumes bare keeping only a bypass its
own hooks saw there. Older hosts keep today's behavior.

* fix(terminal): re-arm a launch across a main restart while its agent still runs

The daemon outlives main, so it now keeps main's admitted launch (token and
note) and drops it when that launch's command finishes. On reattach main
re-arms the launch only when the same agent still runs in the foreground:
nothing can be typed into a daemon PTY while main is down, so a running agent
there is the one the unretired note launched. A shell foreground clears the
daemon's note; an unknown read, including every Windows read, declines.

Older daemons keep no note, so restore declines there as before.

* fix(terminal): the daemon retires a launch note when its command finishes

A launch can finish while main is down, so main's own retirement never sees it and a
hand-typed agent in that pane would later pass the reattach foreground check.

* fix(agent-status): a fresh Claude start never inherits the last process's permission mode

A hand-typed resume of the same conversation may run without the bypass the previous
process had, so only /clear and compact carry the mode forward.

* fix(agent-session): name a restore's source pane in the host's own keys

A mirrored pane's key carries the desktop tab prefix, so the host's exact lookup missed
its saved note.

* fix(terminal): retire a daemon launch note by its token from the one retirement owner

A delayed reattach result or a late retire could clear a newer launch's note. Retires now
name the token they retire, the reattach checks its PTY before clearing, and re-arming the
same launch keeps the daemon's completion scanner.

* fix(agent-status): only the launch owner's statement changes a pane's note

Main now states the attested note, or null for none, on every hook status. An OSC or
display update makes no statement, so after a completed turn it no longer erases an Orca
launch's note; a typed resume still drops it through main's null.

* fix(terminal): an attach leaves alone a launch main already holds

The renderer attaches a pane the CLI just launched before its agent starts, so the
attach saw the shell and retired the new launch's daemon note.

* fix(agent-status): a paired client keeps a pane's note only on its host owner's word

The host's session-tabs frame now says whether the Orca launch it admitted still runs on
the published incarnation, and the client applies that fact whichever writer wins the
status. With an owner's word the conversation no longer decides; an older host that says
nothing keeps the same-conversation rule.

* refactor(agent-status): one decision picks a pane's note for every reader

The live entry, quit capture, provider-session updates, account restart and cold
restore now ask the same owner-aware decision. An owner's none is final and, when it
turns, ends the pane's registry entry and saved note, locally and from a paired host's
frame. Cold restore and account restart take that answer for a live invocation and read
the saved record only when none is live. Inlines single-use wrappers.

* refactor(agent-status): a paired retirement test reaches the cold-restore command; trim comments

Replaces the projection and continuity tests with one transition: host frame retires the
launch, the next OSC keeps no note, and the cold-restore command has no old bypass.

* fix(agent-status): an owner's none retires the pane's matched launch registry entry

* chore: satisfy changed-code gates (type guards, SAFETY notes, fixed test clock)

* fix(agent-launch): a teams launch keeps its note; a legacy leaf id restores without throwing

* refactor(daemon): keep the session launch note on the process base so session.ts stays in budget

* fix(agent-launch): a restarted terminal main can't vouch for keeps main's earlier launch rule

* fix(agent-launch): read the pane's current terminal; a finished launch settles an undecided pane

* fix(agent-launch): undecided and held launches end with their process

A finished command, a fresh launch or a replacement process settles an undecided pane;
a newer attach or finish supersedes a foreground read still in flight; a legacy relay
reattach without an incarnation stays undecided; a held launch applies only to the
process it was recorded for.

* refactor(terminal): watch and arm a created terminal's launch in one call

Keeps terminal-create.ts within the 300-line budget after main's growth.

* refactor(terminal): keep main's launch evidence in one immutable record

Replace the undecided flag, the reattach check map and the re-arm's writes
to main's orchestration launch fields with one launchEvidence object
(unknown, gone for an incarnation, or held with its recipe), owned by
launch-evidence.ts.

- A fresh admitted launch is held; any other fresh process is gone.
- A finished command or confirmed exit is gone, sticky for its process:
  no reattach, legacy or noted, can revive it.
- A replacement retires its predecessor's evidence without deciding the
  newcomer, which may still prove its own launch through a reattach.
- A reattach note is held only after a foreground read sees its agent;
  the evidence object fences that read.
- A gone launch clears its recipe and blocks both refill sites; a
  deliberate sleep snapshot keeps its recipe past the launch it captured.
- launchToken, launchIncarnationId and launchAgent writes match main.

* fix(terminal): keep launch evidence through a first incarnation and sleep snapshots

- Learning a process's first incarnation binds its held or gone evidence
  to it, so a later attach can neither revive a finished launch nor drop
  a running one; a known X->Y replacement is fenced as before and now also
  clears the predecessor's recipe.
- A status from no Orca launch leaves a sleep snapshot of its session for
  the wake and never takes that snapshot's recipe into a live or quit
  record.

* fix(terminal): record a runtime split's fresh shell as running no launch

* chore: rerun CI on main with the typecheck fix
2026-11-09 19:06:43 -05:00
3acd6ede7c fix(automations): reopen a reused automation chat tab in the background (#40271)
* fix(automations): reopen a reused automation chat tab in the background

An automation that reuses its last chat queued the prompt into that
session even after the user closed its tab, but never brought the tab
back. After a reused send is accepted (including a lost or refused reply
recovered from the run receipt), reveal the session and publish its tab
with activate:false so it reappears without taking focus. A publish
failure is logged and never undoes the accepted send.

Extract the reveal + background publish pair into
publishChatTabInBackground and share it with reopenWorkerChat.

Fixes #40260

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>

* test(automations): use the string workspace id in the chat-reuse harness

---------

Co-authored-by: Neil <neil@stably.ai>
2026-11-09 22:45:14 +00:00
OrcaWinandOrcaWin cff5a151fc test: remove low-value CLI, browser and E2E checks (#40466)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-09 11:58:10 -08:00
Neil 9a21a515d3 fix(vm-recipes): hide an in-progress VM checkout in every window, the phone and the jump palette (#40373)
* fix(vm-recipes): hide an in-progress VM checkout in every window, the phone and the jump palette

A VM create's checkout was hidden only in the sidebar of the window that
started the create. Windows now publish their pending VM checkouts to the
main process, which shares every window's set with all windows and
filters the paired phone's host workspace list and workspace context.
The jump palette and the sidebar read the shared set, and a grouped VM
project no longer draws an empty-project placeholder while its create
is pending. A window's set is dropped when it closes, crashes or reloads.

* test(project-groups): reset leaked runtime environment revisions between files
2026-11-09 06:51:21 -08:00
Neil f190139f03 fix(vm-recipes): keep a VM's checkout out of the sidebar until its create finishes (#40355)
A recipe VM create registers the VM's project before its environment
checks run, so the VM's primary checkout showed as a normal workspace
next to the pending row while the checks ran or were paused on a
failure. Hide that checkout in both sidebar list models until the
create adopts it (or makes its worktree). A cancelled or failed create
keeps it hidden while its VM is cleaned up; a VM that could not be
cleaned up is shown again so it can be removed.
2026-11-09 05:36:44 -08:00
Neil ef27841e29 refactor: group agent launch, status, and messaging owners (#40313)
* refactor: group agent launch, status, and messaging owners

* refactor: consolidate direct owner imports

* refactor: import pane ownership directly in status listeners
2026-11-09 04:24:18 -08:00
Neil 0ad972974f test(e2e): give the provisioned-root VM a reachable git remote (#40318)
* test(e2e): give the provisioned-root VM a reachable git remote

VM creates now run the environment checks before creating the workspace
(#40152). The fixture VM's origin pointed at a GitHub URL it cannot push
to, so the git push check failed and the create paused on the build
sheet; the spec then read the VM's primary checkout before it was
adopted. Point the VM checkout at a local bare repo so the checks pass.

* test(e2e): wait for the provisioned root's adoption, not its listing

The VM's primary checkout appears under its branch name once its project
is set up, before the environment checks finish and adoption writes
ephemeralVmCheckoutMode. Poll for the adopted row instead.
2026-11-09 04:04:24 -08:00
Neil 715020e871 refactor: group editor browser document and simulator owners (#40273)
* refactor: group editor browser document and simulator owners

* refactor: update active simulator reliability command links

* refactor: preserve upstream editor and emulator test retirements
2026-11-09 03:44:32 -08:00
Neil 2103352d1b test(vm): pin file saves in a recipe-created workspace, across server restart (#11762) (#40275)
* test(vm): pin file saves in a recipe-created Orca server workspace (#11762)

* test(vm): wait for the save round trip, let the app reconnect itself, edit a plain-text file

* test(vm): say why the recipe save spec needs a longer timeout
2026-11-09 02:53:35 -08:00
Neil ccd4592634 refactor: group renderer workspace ownership and navigation (#40230)
* refactor: group renderer workspace ownership and navigation

* refactor: use the defining WSL rewrite store identifier

* refactor: route new upstream consumers to workspace owners

* refactor: consolidate connection owner test imports

* refactor: preserve upstream review-owner test retirement
2026-11-09 02:38:15 -08:00
Neil 920a83889c refactor: move browser contracts and publication to defining owners (#40209)
* refactor: move atomic publication to its filesystem owner

* refactor: group shared browser definitions by feature

* refactor: bind proxy process and session contracts to defining owners

* refactor: consolidate direct session contract type imports

* refactor: retain atomic publication test timing under moved owner

* fix(benchmark): resolve historical tunnel framing source before loading
2026-11-09 00:45:45 -08:00
Neil 0cb357a83c feat(setup): slim the setup-script import card and fit long scripts in review (#40180)
* feat(setup): slim the setup-script prompt and make long imported scripts collapsible

* fix(setup): require the full imported script on screen before saving

* style(setup): use the ghost button colour for the script toggle

* style(setup): keep the source path readable in the narrow prompt card

* feat(setup): title imports, restore the package-manager card, keep the review dialog inside the viewport

* fix(setup): count every script line, keep the e2e import spec in step with the new copy
2026-11-08 23:22:34 -08:00
OrcaWinandOrcaWin 398052f94e test(e2e): hold split toolbar focus before the grab chord (#40182)
The active terminal refits a frame after the browser splits mount and can
refocus xterm after the spec focused the Reload button, so Ctrl+C reached
the shell instead of arming grab. Refocus until the toolbar keeps focus.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-08 23:01:23 -08:00
Neil 39902f398b refactor: bind browser and remote runtime consumers to concrete owners (#40135)
* refactor: use concrete browser and input owners

* refactor: bind remote runtime callers to concrete transport owners

* Use checked subscription mock argument types

* Type browser lease mock with its subscription contract

* refactor: bind sleeping VM status probe test to socket owner
2026-11-08 21:41:28 -08:00
Neil 803e257954 fix(sidebar): let the divider resize instead of scrolling the workspace list (#40087)
* fix(sidebar): let the divider resize instead of scrolling the workspace list

The 4px scrollbar strip past the seam covered the visible divider pixel, so
grabbing the divider over a scrolling list dragged the scrollbar. Drop the
strip and start the resize handle on the divider; the native scrollbar inside
the sidebar is unchanged.

* fix(sidebar): trim the resize handle's outer reach by 1px
2026-11-08 20:41:06 -08:00
Neil e9f4df2c0f refactor: organize rate-limit providers and remove forwarding modules (#40116)
* refactor: group rate-limit providers under concrete owners

* test: preserve mixed Claude account-switch regression

* refactor: consolidate Antigravity service contract import
2026-11-08 20:29:13 -08:00
Kelvin Amoaba 805ec4ee21 fix(browser): show site favicons on browser tabs running on a remote host (#40049)
* fix(browser): show site favicons on remote host browser tabs

Host-run browser tabs mirrored to a paired client always showed the
globe: the host's session-tab snapshot carried no favicon. Hosts now
publish the active page's icon URL as an optional faviconUrl, capped at
2 KB and dropped when it points at the host's loopback. Headless hosts
pick it up from page-favicon-updated and publish only when it changes;
desktop hosts include it in the existing graph-sync key. Clients keep
their current icon when an older host omits the field.

* fix(browser): publish a remote tab icon on arrival, not on every swap

Read the headless favicon through the agent browser bridge so the
runtime stays free of Electron imports, publish only when a page gains
an icon so animated icons ride later publishes, and drop IPv4-mapped
loopback icon hosts.

* fix(browser): clear a remote tab icon when a cross-origin load starts

A load that fails on the new origin never commits, so clearing only on
did-navigate kept the old site's icon beside the failed URL. Also give
the runtime tests' bridge fakes the new favicon getter.

* test: give the session-tab bridge fakes the favicon getter
2026-11-09 00:59:11 +00:00
OrcaWinandOrcaWin 4eb9606ddb test(notebook): keep polling when the save read lands mid-write (#40031)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-08 16:00:36 -08:00
Neil c50d4cd3e4 refactor: organize browser guest lifecycle owners (#39996)
* refactor: organize browser guest lifecycle owners

* test: resolve cross-version client owners and pre-ticket baseline

* test: record the released terminal registry path
2026-11-08 15:23:09 -08:00
OrcaWinandOrcaWin a49fca7a98 fix(runtime): keep the restored tab selected after a serve restart; update stale paired e2e specs (#39980)
* fix(runtime): keep a restored tab selected after orca serve restarts

Since #38844 a cold rebuild restores the saved tab groups, and a saved
group's null active tab was kept as an explicit "nothing selected". A
headless server never saves its own selection, so after a restart its
workspaces listed every terminal with none selected. Saved groups now
only declare a null selection when the session also saved an active
group; otherwise the restored tab stays selected, as before.

* test(e2e): bring layout-compat and paired-client specs up to current behavior

- old-phone baseline: phone snapshots carry tabGroupLayout since #38844.
- tab composition: drop onto where the active tab sits once a drag
  undocks it; create the server-placed browser page on the server, since
  a phone's create through the desktop is desktop-hosted (#37705); the
  desktop serves its phone the server page it mirrors (#36447).
- project removal: retry the host's "can't answer yet" terminal list and
  wait for a terminal whose shell has spawned.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-08 14:29:52 -08:00
OrcaWinandOrcaWin 9fa526615f fix(browser): validate a guest whose ID is unreadable at dom-ready (#39984)
When dom-ready fired while webview.getWebContentsId() threw, the
registration callback bailed out on the ownership fence (ownsGuest(null)
is always false), so validateAfterResume never ran and the page stayed
unregistered until some unrelated caller happened to read the ID. Fence an
unidentified guest by webview ownership only, so validation retries until
the ID reads.

The recovery spec's registered-page oracle now ignores tab list rows with
loaded: false: since #35563 tab list also reports tab-bar pages that have
no registered guest, so unregistered pages no longer drop out of it.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-08 14:18:40 -08:00
OrcaWinandOrcaWin 961430903c test(e2e): follow setup review dialog, GitLab work-item listing, chat sign-in probe and onboarding trust prompt (#39983)
- setup-script-import: imported setups are saved from the Review setup
  script dialog since #37937.
- github-url-smart-input-transition: the GitLab source lists through
  gitlab:listWorkItems since #32005, so stub that channel.
- structured-chat-tabs-open-close: the Claude catalog probe also sends an
  initialize request for sign-in discovery since #37191.
- golden-core-flows: onboarding launches the chosen agent in the fresh ~
  workspace (#37898), whose first launch asks the per-repo agent folder
  trust question (#38946); answer it before adding a project.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-08 14:18:24 -08:00
OrcaWinandOrcaWin 8a7dcae3b9 test(e2e): update five stale or racy terminal and agent specs (#39982)
- profile-state restart: runNow now returns the saved pending row (#38217)
- codex account switch: click the backdrop clear of the sidebar seam strip (#38288)
- claude sidebar agent view: drop the removed subagent indicator check (#34558)
- IME preedit continuity: refit after changing the font, like font zoom
- agent send picker: bind local fixture panes to a live PTY so reattach keeps them

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-08 14:12:02 -08:00
Neil b5e38ad9c6 refactor: organize agent hook installation and server owners (#39969)
* refactor: organize agent hook installation and server owners

* refactor: align hook mock registries and packaged entries
2026-11-08 13:23:03 -08:00
Neil 0d1220c31f Organize SSH and managed-server modules by concrete owner (#39937)
* refactor(main): organize SSH transport and managed server owners

* Remove orphan deploy readiness fixture and shrink test baselines

* refactor(wsl): import lock records from their defining owner

* refactor(wsl): use the canonical deferred update contract
2026-11-08 12:20:22 -08:00
Neil 26a4db6b4e refactor(skills): group discovery, install, cloud, and transfer owners (#39874)
* refactor(skills): organize installation, discovery, and transfer owners

* chore(skills): reconcile move validation metadata
2026-11-08 07:39:57 -08:00
Neil 19043a3d76 refactor(mobile): organize pairing, session, RPC and host owners (#39846)
* refactor(mobile): give relay and encryption concrete owners

* refactor(mobile): organize session and review feature owners

* refactor(mobile): organize RPC and host ownership

* test(mobile): point render fixtures at concrete owners

* refactor(mobile): use explicit type-only owner imports
2026-11-08 07:19:05 -08:00
OrcaWinandOrcaWin 9f28435ca2 test: hover the grab target before clicking in the split grab e2e (#39868)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-08 07:08:13 -08:00
Neil c10881fa8c refactor(shared): organize execution and automation defining owners (#39776)
* refactor: import journal queue state from defining owners

* refactor(shared): organize execution and automation owners

* fix: retain type imports used by surviving test cases

* refactor: finish work item owners and refresh validation metadata

* test: infer reconnect status fixture type

* test(claude): resolve source files beside same-named directories

* test(runtime): group repository creation mock registrations
2026-11-08 06:46:09 -08:00
Jinwoo Hong 4fabde28b1 feat(cli): one enclosing-workspace rule, --environment local, copyable addresses, and --parent-environment (#39733)
* feat(cli): one enclosing-workspace rule, --environment local, and copyable workspace addresses

current/active and cwd inference now pick the innermost workspace of either kind (worktree or
folder workspace); at equal depth the caller terminal's own workspace wins, otherwise the choice
is refused as ambiguous. --environment local names this machine's own Orca over an ambient
ORCA_ENVIRONMENT or pairing code. worktree ps/show/current print an environment: line and an
address: line (JSON environment, address, addressUnavailable, parent) that always carries its
--environment, and name a parent's environment only when it is verified.

* test: answer the folder catalog read in agent launch cwd tests

* feat(cli): worktree rm refuses current/active and names the selector to pass

Removal needs an explicit workspace, as git worktree remove needs a path. The refusal runs before
rm decides between a worktree and a folder workspace, and reports what current resolves to now
(one selector, the ambiguous choices, or none) in text and as invalid_argument data.

* fix(cli): keep the remote-environment guidance when rm refuses current

* fix(cli): surface folder-catalog failures for omitted targets; no address for a duplicated folder parent

* fix(cli): surface a worktree-list failure for omitted browser and terminal targets too

* test(cli): folder rm refuses current/active before the folder removal path

* fix(cli): refuse a cwd owner whose folder host can't be derived instead of skipping it

* fix(cli): compare cwd owners by filesystem identity, refuse every equal-path tie, surface worktree-list failures

Paths on the caller's own filesystem compare by realpath (reusing resolveRealPathSync), so /tmp
and /private/tmp aliases find the deeper owner in both the folder prefilter and ranking; other
hosts' paths stay lexical. Equal-depth owners with different repo registrations now refuse without
a caller instead of picking by catalog order. An omitted target no longer swallows worktree.list
method_not_found; only the optional folder reads fall back.

* fix(cli): read the realpath helper from shared so the packaged CLI ships it

* refactor(cli): move the catalog row type and unresolved-owner refusal out of the selection/catalog cycle

* fix(cli): resolve every caller-filesystem workspace path, not only basename matches

A workspace registered through a differently named symlink was skipped by the basename gate.
Containment now realpaths cwd and each row on the caller's own filesystem once per command,
shared by the folder prefilter and ranking; folder hosts are derived first so another host's
paths are never resolved locally.

* test: answer the folder catalog read in the ambiguous orchestration-check caller test

* feat(cli): --parent-environment names where a worktree's parent lives

worktree create and worktree set take --parent-environment <local|saved id|name>
next to --parent-worktree. The parent is resolved in that environment only, and
sent to the child as a verified cross-store ref after the child's cross-machine
capability check. Without the flag, the parent stays in the child's environment;
active/current always mean this machine's own Orca.

Preflight failures happen before any change: environment_not_paired,
environment_unavailable, LINEAGE_PARENT_NOT_FOUND / LINEAGE_PARENT_AMBIGUOUS
naming the searched environment, and incompatible_runtime with data.environment
and data.requires.

* fix(cli): parent lookup errors name and list the environment searched

LINEAGE_PARENT_AMBIGUOUS and LINEAGE_PARENT_NOT_FOUND now always carry
data.environment and a listing command for the environment the parent was
looked up in, for parents in another environment and in the child's own. Steps
inherited from the runtime listed the caller's default route instead.

* docs(cli): a local address names the Orca that printed it
2026-11-08 04:08:07 -05:00
OrcaWinandOrcaWin 0da741a22f test: remove 988 low-value tests (#39797)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-08 00:42:37 -08:00
OrcaWinandOrcaWin ee6506714e test: remove 244 low-value tests (#39781)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-08 00:06:49 -08:00