* fix(agents): direct work-item and checks-fix launches quote for the execution host
GitHub Project Start, PR checks Fix and the source-control/checks preflights
resolved their launch platform from the client OS whenever the repo had no SSH
connection, so a Windows client starting work on a paired Linux Orca server sent
a PowerShell-quoted --prefill to bash. They now read the execution-host facts
#27259 introduced (server-reported OS, SSH-reported OS, WSL), and the
path-shape resolver is removed so one helper decides.
* fix(agents): resolve direct-launch and preflight platforms from the repo owner
Review follow-up: a WSL worktree on a paired Windows server quotes for Linux,
the owner-row fixture reports its server OS, and the source-control preflights
read the repo owner rather than the focus-defaulted worktree route.
* fix(agents): preflight platform honours a worktree's own host
Review follow-up: a per-worktree host outranks the repo owner, the host-platform
test's mutable client platform is typed, and the source-control panel fixture
carries the host slices.
* fix(agents): a server-projected SSH worktree reads its server's SSH state
Review follow-up: the preflight resolver keeps the runtime owner for nested SSH
worktrees instead of reading this client's own SSH connections.
* fix(agents): cmd.exe pastes a multi-line draft instead of prefilling it
Review follow-up: now that direct launches pass the local Windows shell, a
multi-line --prefill under cmd.exe would submit at its first newline.
* fix(agents): direct launches quote for the shell their tab spawns
A project's Windows runtime can override the terminal setting (WSL setting,
Windows runtime spawns PowerShell), so resolve the tab's effective shell before
quoting. The cmd.exe parity row now expects cmd quoting.
* One pane-commit path for main's splits, a late-mounted split recorded again, and one fresh-pane exit rule (dark, build switch off by default)
* Runtime panes write only touched records in the layout-owner build; main keeps a split the window already recorded
* Admission patch that finds no change writes nothing, as layout.apply
The test let a child exit on a 1 s timer and then required kill(pid, 0) to
report ESRCH. On Linux the teardown wait rightly accepts an unreaped zombie,
which kill(pid, 0) still reports as present, so the assertion raced Node's reap.
The child now exits only when told, and the test asserts teardown is still
pending while it lives and resolves once it exits.
* Number layout frames so a layout command's reply names the frame holding its effect (dark, build switch off by default)
* Report every frame's position, test the reply's frame end to end
* Rewrap sendLayoutApply's doc comment
* test: share mobile presence and subscription runtime startup
* test: route mobile reliability gate through retained suite
---------
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* Route the remaining window pane-tree writers through main (dark, build switch off by default)
* E1b review fixes: valid pane ids, keep a mounted split, automatic closes skip the user mark, sole-pane exit guard
The fake Claude wrote .orca-sign-in-browser.link directly, so the link
poller could read it between create and write, see an empty link, and end
the sign-in. Write a temp file and rename it into place, as the real
stand-in script does. Flake introduced with the tests in #29566.
* test(orcad): wait for an idle-retiring daemon before deleting the serve-parity profile
A terminal daemon that loses its last client deletes its pid record before it
exits, so teardown that found daemons only through pid records skipped it and
raced its open files (EBUSY on Windows ARM). Record the pid before stopping
orcad and require that process's exit.
* test(orcad): record profile daemons before stopping orcad in launcher and stop-request tests
* test(orcad): wait for the daemon's child processes before deleting its profile on Windows
The terminal daemon runs with the profile as its cwd and its children inherit it,
so a child that outlives the daemon keeps the profile directory busy (EBUSY on
rmdir). Record the daemon's process tree before shutdown and require each
recorded child's exit, naming any survivor at the deadline.
* test(orcad): keep the real Windows process table out of the teardown unit tests
The web client positions a retained pane host from a measured tab-group body,
but the pane mounted (and fit xterm) a render before that measurement, at the
32px placeholder box, then refit when the measurement landed. Mount the pane
only after the first read.
FitAddon also divides by xterm's css cell, which is the rounded canvas width
over the current cols, so the same box proposed 51 cols from a 75-col replay
and 52 from a 52-col pane: a revealed pane resized twice. Fit with the
grid-independent device cell instead.
* Open into a new split in one layout command (dark, build switch off by default)
Main makes the window's new split group and its first tab (terminal, editor
or browser) in one apply, so main never refuses the open for a group it lacks
and never stores an empty group. The window derives the split from its own
group tree in the three existing switch-point recorders.
Co-Authored-By: Claude <noreply@anthropic.com>
* Open beside an emptied root split, and into a group main already holds
Co-Authored-By: Claude <noreply@anthropic.com>
* Describe both openInNewGroup fallbacks in its doc comment
Co-Authored-By: Claude <noreply@anthropic.com>
* Test: no split is read back beside a sibling that is itself split
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* fix(ssh): reopening a tab slept from a paired desktop resumes its agent on the managed host
A paired client's worktree sleep stops the host's PTYs, but the resume
record its renderer writes never reaches the host, and the host is what
answers the tab open. Capture the record on the host from its own hook
store before the stop, applying the shared holder rule (an agent the
hook store proved exited leaves no record).
* fix(ssh): keep the launch recipe and record acknowledged stops when inventory fails
* fix(ssh): only a proven agent exit retires a pane's earlier sleep record
* fix(ssh): stamp the captured record's SSH host and keep a saved launch recipe
* fix(ssh): read the session id after the presence probe that may outlast it
* fix(agents): a resume reuses only its launch's recorded args, never permission-widening defaults
Resuming a session started as a hand-typed `claude` filled the missing
launch recipe from settings defaults, which carry the permission bypass.
Host tab-open resume, window cold restore and worktree wake now share
one rule: the recorded recipe, or none.
* fix(ssh): a WSL relay tag on a captured record is local, not another host
* fix(ssh): a capture retires when the hook store names another agent in the pane
* Refuse a chat create whose close came first, behind the layout-owner switch
With ORCA_LAYOUT_OWNER=main, main remembers a close that reaches it before
the chat's create and refuses that create, or closes the chat as it lands.
The window then tells this machine's host about a cancel instead of
keeping a cancel tombstone; a host it cannot tell still gets the
tombstone. Paired hosts keep the tombstones, whose fence module moves to
lib/launch-cancel-tombstones-compat/.
* Close a chat whose create a cancel beat, on any create outcome
The local cancel now retires the chat on main (close and host-tab close),
so a create that landed first leaves no tab behind; a tab_not_found answer
means the create had not landed. Main closes the chat for any create
answer once a close was noted, including a refusal or a throw past commit,
and publishes no tab for it. The tombstone fallback notifies listeners.
* Keep the switched-off create path byte-identical
* Log, not throw, a failed close of a chat closed before create
* Run the close-before-create test in the Node SQLite project
* fix(agents): a resumed agent's chat is readable on the phone before its first new turn (#10923)
* fix(agents): skip a dropped Codex resume and keep the seeded identity across restart
* fix(agents): seed resume identity before the spawn's first await and keep it through terminal evidence
* fix(agents): seed after the spawn commits, and name the session on host-built resumes
* fix(terminal): tell panes their daemon died at once and say when typed input was lost
* fix(terminal): use the info toast the terminal suites already stub
A symlink to a directory was listed as a file on SSH and managed hosts, so
projects behind a linked path could not be reached. Follow links when
classifying entries; broken links and loops stay files.
Co-authored-by: Gideon <jjin6573@naver.com>
* Record a restored editor tab's move to its owning workspace through main (dark, build switch off by default)
* Refuse non-editor and duplicate moves; route the move by workspace
* Type the move routing test's command
* fix(projects): adding a project through a symlink alias reuses the existing project
On a managed host, adding repo-link (-> repo) created a second project for the
same checkout while re-adding repo was deduped. Compare the real path, resolved
on the host that owns the files, so an alias finds the tracked project; distinct
checkouts keep distinct real paths and stay separate. Local folder workspaces
get the same check.
* test: run fixture git through process-host
* fix: classify integration credential moves on their owner host
* test: install renderer API fixtures for terminal close paths
* test: restore IPC harness API and listener ownership contracts
* test: avoid unused RPC catalog setup in authorization suite
---------
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
#29625 statically imported legacy-relay-bridge-panes, which subscribes to the
bridge (and calls listPanes) at load, so every useIpcEvents test whose
window.api mock lacks it threw at import.
Co-authored-by: Claude <noreply@anthropic.com>