Commit Graph
17333 Commits
Author SHA1 Message Date
OrcaWinandOrcaWin bc80bc59fb fix: retire extension iframe event listeners with native frame (#35011)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 08:42:02 -07:00
NeilandClaude 2657567db0 feat(wsl): stop an idle WSL hook relay so its distro can stop (#35173)
* feat(wsl): stop an idle WSL hook relay so its distro can stop

Once no bridge terminal is left in a distro, the hook relay was the only thing keeping the
distro (and the WSL VM's memory) running, for as long as Orca ran. After 5 minutes with no
bridge terminal and no hook traffic the relay now stops, detached first so recovery never
restarts it, and its config is parked; the next terminal or agent in that distro starts it
again. Nothing new starts a relay, so nothing boots a distro.

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

* fix(wsl): a WSL terminal of unreported distro keeps every hook relay

Review of #35173: a WSL shell whose spawn reported no distro (an older daemon) still uses the
default distro's relay, so it now counts as presence for every distro rather than none.

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

* fix(wsl): a hook relay stays while the daemon still runs a bridge session in its distro

Review of #35173: after a relaunch, a hidden worktree's or headless tab's bridge session is live
in the terminal daemon though no pane in this run noted it, and orchestration, automations or
mobile may wake its agent. Before an idle stop the relay now asks the daemon's own session
inventory; a live session there, or an inventory it can't vouch for, keeps the relay.

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-28 08:38:11 -07:00
OrcaWinandm4air 188b4976b0 perf(sidebar): switch workspaces on mouse press instead of click (#34594)
* perf(sidebar): switch workspaces on mouse press instead of click

A plain primary mouse press on a sidebar workspace row now activates it; the click that
ends the same press is skipped. The ~80-120 ms a press is held before release hides the
switch, so the new workspace is usually painted before the button comes up.

Modified presses, touch and pen, nested controls, rows inside a multi-selection, kanban
cards and keyboard-forwarded clicks keep click activation.

* test(sidebar): drop wall-clock cache stub from press activation test

* fix(sidebar): keep press activation off drags that wake, resume or close the board

A press-activated switch now keeps focus in the new terminal: the press's native mousedown
no longer moves it to the workspace list. Presses fall back to click activation when the
target would be woken (sleeping workspace or agent session, slept VM, disconnected SSH),
outside the terminal view, on selectable text, and while the workspace board is open, so a
row dragged onto the board no longer closes it. The skip-the-next-click flag now ends with
its gesture instead of surviving a drag-suppressed click.

* fix(sidebar): keep press activation off hosts a focus could boot

Switching workspaces focuses the row's host: a stopped WSL distro boots on focus and a recipe
VM resumes on activation, both before a press is known to be a drag. A press now activates only
on a proven-ready host (local, an SSH target, a WSL host reporting ready, a connected paired
runtime), resolved from the row's own host so folder workspaces and host twins match; recipe-VM
targets and unknown hosts keep click activation.

* fix(sidebar): activate on press only for local workspaces

Remote hosts can connect, boot or resume when their workspace gains focus, and the
focus subscribers resolve a workspace by bare id, so a twin or an SSH folder row could
still reach a remote host from a press that becomes a drag. Press activation now needs
the row's own host and the id's owning host to both be local; every SSH, WSL, runtime
and VM workspace keeps click activation.

* fix(sidebar): keep click activation while a text field has focus or a terminal would respawn

* fix(sidebar): keep click activation for workspaces without a running terminal; leave focus to the list when the press moved none

* fix(sidebar): keep a multi-selected folder row's press for the group drag

* fix(sidebar): drop the pre-press focus reference when the gesture ends

* fix(sidebar): keep click activation while a menu or dialog is open

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-28 08:36:12 -07:00
OrcaWinandOrcaWin df98fceae1 fix(extensions): release retired user gesture signals (#35076)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 08:30:08 -07:00
OrcaWinandOrcaWin 80f47e7dd5 Retire WebAuthn account choosers with their requesting documents (#35132)
* fix(browser): retire passkey account requests with their documents

* test(browser): fold passkey document-retirement coverage into the picker suite

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 08:28:21 -07:00
Neil 97c2c899c4 fix(session): a managed host's old SSH tabs no longer replace its workspace on reload (#34901)
* fix(session): a managed host's old SSH rows no longer replace its runtime workspace on reload

On a desktop that still catalogs a host's pre-managed-server SSH repo, startup
adoption let the old ssh: partition supersede the runtime partition's rows for
the same workspace. Its editor tabs and split were dropped, and stale closed
tabs came back on every reload. Workspaces a runtime partition holds are now
foreign to SSH adoption; the SSH rows stay parked in their own partition.

Moves the SSH partition catalog attribution into its own module unchanged
apart from the runtime-owner check, to stay under the file line limit.

Fixes #34376
Fixes #34416

* fix(session): only an SSH host's own server supersedes its old SSH rows

Treating every runtime-held workspace as foreign to SSH adoption broke the
contested gap-fill for unrelated hosts that share a bare workspace id. Limit it
to the managed or SSH-tunnelled server running on that same SSH host, which
startup now learns from the runtime environment list.
2026-10-28 08:25:16 -07:00
berceandNeil db138baac0 fix(worktrees): expand a leading ~ in the worktree location (#35032)
A workspaceDir of "~/..." was never expanded, so it resolved relative to
each repo and worktrees were created under <repo>/~. Expand a leading ~
when settings are loaded and on every settings write, and share the
expansion with the floating-workspace path resolver.

Co-authored-by: Neil <neil@stably.ai>
2026-10-28 08:21:24 -07:00
OrcaWinandOrcaWin 4d8071abb4 perf(markdown): coalesce draft version hashing with publication (#35107)
* perf(markdown): coalesce draft version hashing with publication

* test(markdown): assert draft projection contents and drop test-local baseline

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 08:12:18 -07:00
OrcaWinandOrcaWin 631d84d0af fix(browser): avoid loading sessions during cold partition cleanup (#35045)
* fix(browser): avoid loading sessions during cold partition cleanup

* test(browser): cover cold orphan cleanup with one representative case

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 08:11:30 -07:00
OrcaWinandOrcaWin 7b2996dc84 perf(github): look up refresh renderer owners by ID (#35015)
* Use targeted owner lookups for PR refresh visibility

* test(github): update document lifetime native lookup mock

* test(github): collapse PR refresh owner lookup matrix into one guard

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 08:08:17 -07:00
Neil e9515b576b chore(wsl): log what a Sleep's folder read saw for each terminal (#35150)
* chore(wsl): log what a Sleep's folder read saw for each pane

* test(wsl): a bridge pane keeps its Sleep folder across reloads and relaunches
2026-10-28 08:07:17 -07:00
OrcaWinandOrcaWin 073de96581 fix(browser): retire queued extension download starts (#35047)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 08:05:45 -07:00
OrcaWinandOrcaWin 821ff9a9b7 fix: retire extension frame listeners on document replacement (#34942)
* fix: retire extension frame listeners with their document

* fix: snapshot extension owner before native destruction

* refactor(extensions): keep listener registry within its line budget

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 08:02:46 -07:00
Vyacheslav ScherbininandNeil b654c3454a fix(persistence): stop rewriting migrated Compact profiles on every load (#34736)
The legacy Compact card-property migration returned the Compact preset even
when the stored list already was a current Compact preset, so every clean
reload of a Compact profile scheduled a full profile write. Treat both the
raw ['status'] and the normalized ['status', 'unread'] form (persisted by any
UI write) as already migrated.

Fixes #34828

Co-authored-by: Neil <neil@stably.ai>
2026-10-28 08:00:38 -07:00
Neil 808aaee3f6 fix(wsl): hide the sidebar setup-script card while the repo's distro is stopped (#35163)
A background hooks:check refused for a stopped WSL distro now says so (unavailable:
'wsl-distro-stopped'). The setup-script prompt maps it to a distro-stopped state: the card hides
instead of showing 'Couldn't verify…' with a Retry that cannot succeed, and focus re-inspects, so
the card returns once the distro runs. An unverifiable distro stays a retryable error.
2026-10-28 07:59:54 -07:00
OrcaWinandOrcaWin 737f397413 fix(terminal): retire reveal requests with their renderer (#35030)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 07:58:20 -07:00
OrcaWinandOrcaWin 32a62c8e1d Scope SSH partition release waits to their target (#35024)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 07:57:30 -07:00
OrcaWinandOrcaWin 6981f34e46 fix: release extension install prompts on renderer reload (#34931)
* fix: cancel extension prompts on renderer navigation

* test(extensions): break circular prompt fixture inference

* test(extensions): drop vacuous same-document prompt navigation test

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 07:56:23 -07:00
Neil 4ee621e89f fix(wsl): never boot a terminated distro off a list taken while it was still stopping (#35143)
* fix(wsl): never boot a terminated distro off a list taken while it was still stopping

WSL keeps listing a distro for a moment while it stops. A bridge pane's exit now marks its distro
as possibly stopped, its host-loss verdict and boot-id reread only count a running list started
after that settles, and deferred background work (file watcher and hook relay restarts, history
cleanup, CLI repair) is drained only by a settled list. Before, a bridge exit's own list could
read 'running' mid-stop and lead to a boot-id exec, and any confirmed list probed mid-stop
drained deferred restarts that spawn wsl.exe, booting the distro the user had just terminated.

* fix(wsl): gate the hook-relay restart and setup-script inspection on a settled running read

- A deferred hook-relay restart re-reads a settled running list right before spawning the relay
  (wsl.exe), and waits again if the distro stopped; a drained deferral is only a hint.
- Setup-script import-candidate inspection (sidebar prompt, runtime RPC) opens nothing under
  \\\\wsl.localhost while the distro is stopped or unverifiable: those UNC opens booted it about 2 s
  after each terminate on the awin verify.

* fix(wsl): close a pane's clean exit at once, and settle the guest-process fast path

- A bridge pane's code-0 exit is the user's own (a terminate gives -1): it now closes at once,
  with no stop mark, settle wait or running-list read. Non-zero exits keep the E9 discipline.
- readWslGuestPaneProcesses' fast path for a live pane (Sleep, quit) trusts the cached running
  list only when it was probed after any stop of the distro settled.
- When a mid-stop list skipped deferred work, one unref'd probe just past the settle drains it,
  instead of waiting on an unrelated probe.

* fix(wsl): mark a clean bridge exit as a possible stop, and fix the exit check test's probe timing

A code-0 bridge exit still closes at once, but now also marks its distro as possibly stopped, so
an in-guest poweroff or wsl --shutdown that exits 0 cannot leave background reads trusting an old
running list. The coalesced-probe test waits for the probe, which now starts after the settle
anchor, before answering it.
2026-10-28 07:56:04 -07:00
OrcaWinandOrcaWin 24b738aba2 fix(plugins): preserve successor panels after stale loads (#35021)
* fix: preserve successor plugin panels after renderer loss

* test(plugins): drop redundant panel lifetime control test

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 07:52:25 -07:00
OrcaWinandOrcaWin bafe4d5c05 perf(electron): target persisted UI broadcasts to main renderer (#34915)
* perf(electron): target persisted UI broadcasts to main renderer

* test(ui): use a supported top-level view in broadcast regression

* test(ui): collapse UI broadcast routing tests into one wiring check

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 07:46:47 -07:00
Neil c58591e56d fix(wsl): refuse render-driven hook checks on a stopped distro instead of booting it (#35155)
hooks:check takes an optional background flag. The sidebar setup-script prompt and the setup
guide's progress probe, which run on render, pass it: on a stopped or unverifiable WSL distro
the check answers status 'error' without opening orca.yaml over \\\\wsl.localhost, which would boot
the distro. Launch preflight and settings, user acts that start the distro anyway, are unchanged.
2026-10-28 07:33:15 -07:00
Blue DaydreamingandNeil 51d25013f1 fix(typecheck): report Bun version probe timeouts (#33762)
When the pinned Bun binary is installed but its version probe times out,
required typecheck callers (repo typecheck, CLI build, E2E and mobile
typecheck) now report the timeout with the executable path and budget
instead of claiming Bun is missing. Each caller suggests its own compiler
fallback. Optional Bun consumers keep returning null and falling back.

Fixes #33707

Co-authored-by: Neil <neil@stably.ai>
2026-10-28 07:18:52 -07:00
Henry SuandNeil fce8b13d7f fix(orchestration): reject invalid legacy takeover before attestation (#34284)
run-use --takeover-legacy on an ordinary (non-legacy, non-adopted) Run
hit the takeover authority gate first and told the caller to repair
terminal authentication, even though the flag can never apply there.
Only require takeover authority when the target is legacy, missing, or
the adopted Run, so ordinary Runs reach bindRun, which keeps the caller
and worker fences and rejects the flag before any binding changes.

Fixes #30779

Co-authored-by: Neil <neil@stably.ai>
2026-10-28 07:18:43 -07:00
Neil 77048d55d5 fix(wsl): a bridge pane keeps its folder when its distro stops while Orca is quit (#35141)
* fix(wsl): keep a bridge pane's shell folder when its distro stops while Orca is quit

* refactor(wsl): quit folder budget as an instance field
2026-10-28 07:15:37 -07:00
Blue DaydreamingandNeil 59843d8ad3 fix(scripts): keep changed-line checks scoped to exact filenames (#34786)
Pass --literal-pathspecs to the per-file diff in collectAddedLineRanges so
filenames containing glob characters (e.g. `[ab].tsx`) match only
themselves instead of also pulling in other files' hunks (e.g. `a.tsx`).
Covers both edits and renames with real-Git regression tests.

Fixes #34784

Co-authored-by: Neil <neil@stably.ai>
2026-10-28 07:13:24 -07:00
NeilandClaude 2a3fc8372b perf(terminal): a clean WSL bridge exit skips the boot-id read (#35138)
On awin a wsl --terminate exited each bridge pane with -1, while exit and exit 0 gave 0, so a
terminate never yields 0. A clean exit keeps today's verdict without the extra wsl.exe spawn.

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-28 07:10:03 -07:00
BingZ f5ee5b4984 fix(emulator): attach the exactly named iOS simulator before partial matches (#34884)
resolveSimulatorUdid matched the first device whose name contained the
requested name, so asking for "iPhone 17" could attach an earlier
"iPhone 17e". Prefer a case-insensitive exact name match first, then fall
back to the existing substring/UDID match.
2026-10-28 07:07:56 -07:00
Blue Daydreaming 0b604956ec fix(scripts): preserve complete HTML src/href URLs in README link checks (#34817)
Only srcset is a comma-separated candidate list; src and href hold one URL.
Splitting them invented missing targets for paths containing commas or
spaces and could pass a missing target whose fragments were tracked.

Fixes #34815
2026-10-28 07:07:46 -07:00
OrcaWinandm4air a6fdeda541 perf(terminal): release hidden WebGL canvases' drawing buffers (#34309)
* perf(terminal): release hidden WebGL canvases' drawing buffers

Chromium keeps a display:none WebGL canvas's drawing buffers alive (on macOS
a back buffer plus up to four pooled full-size surfaces). Hidden terminal
tabs and retained worktrees therefore held ~80 MB of GPU memory each until
they were parked. Collapse the canvas backing store while it has no layout
box and keep the context; xterm's device-pixel observer restores the size
and redraws synchronously on reveal.

7 terminal tabs, 1920x1050@2x: GPU process 670-760 MB -> 350-408 MB.

* perf(terminal): free hidden canvases only after 30s and never for suspended worktrees

Reallocating the backing on reveal cost about one frame. Delaying the release keeps rapid
switching allocation-free, and worktree-suspended panes keep their backing so worktree
switches match main. A MutationObserver re-checks a canvas that xterm resizes while hidden.

* fix(terminal): restore released WebGL canvases before the reveal frame paints

- Reveal restore reallocates at the current DPR and draws past xterm's paused
  renderer inside the ResizeObserver callback, so the first painted frame has
  content; also covers engines without devicePixelContentBoxSize.
- DPR repair reports released canvases as 'released' (current) instead of
  'deferred', so window-resize recovery stops retrying them.
- Veto release for panes of a hidden worktree surface (marked from
  isWorktreeActive) instead of webglAttachmentDeferred, which a hidden
  prewarm clears.
- Schedule release for canvases attached or regrown while already boxless;
  a zero-size element gets no initial ResizeObserver entry.
- Clear the timer through the canvas's own window.

* test(terminal): guard hidden WebGL canvas release and reveal restore

* perf(terminal): restore a released WebGL canvas at its exact device size without a full resize

Set the backing to the reveal entry's device-pixel size (xterm's own fallback
size where that box is unavailable) and draw once, instead of handleResize:
xterm's device-pixel observer then finds nothing to resize, which removes a
second reallocation and redraw from the reveal. A DPR change while hidden
still takes the full resize path.

* fix(terminal): paint a revealed released canvas through a held synchronized-output frame

A released canvas has no last coherent frame to keep, so when a TUI holds DEC
2026 at reveal, the buffered refresh left it blank for up to xterm's 1s
watchdog. Use forceFullViewportPresent, which draws the current buffer once
directly; the TUI's sync end still presents its finished frame normally.

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-28 06:59:27 -07:00
Samuel VilaandNeil 3fd928373c fix(source-control): flag failed git status reads instead of showing a clean workspace (#28079)
When git status failed (e.g. a corrupted index), the read returned an empty
result and Source Control said the workspace was clean. getStatus now carries
Git's error as an optional readError; the store keeps the last known entries
and conflicts while it is set, and the panel shows a status-read banner with
Git's message and Retry instead of the clean empty state. The Retry logic is
shared with the too-many-changes banner, and the per-worktree error is cleaned
up on teardown and migrated on worktree rename.

Fixes #28033

Co-authored-by: Neil <neil@stably.ai>
2026-10-28 06:56:38 -07:00
NeilandClaude 5e1c26c0a8 fix(terminal): a seen distro stop drops its cached boot id, and the relaunch test waits on the reap (#35133)
Follow-up to #35050 review: a pane spawned after a running list saw its distro stop, but before
any bridge exit reached the adapter, could take the old boot's id. The identity now drops the
distro's cache on a stop observation, listening only while bridge panes live. The relaunch
suite waits on the daemon reaping the session rather than assuming it is synchronous.

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-28 06:53:22 -07:00
Neil a7d9a10e4a feat(files): page a remote server's big folders in the explorer (#35115)
* feat(files): page a remote server's big folders in the explorer

* fix(files): list a remote folder whole unless the host refuses it as too large, then page it

* fix(files): page a remote folder after a cursor entry, not at an offset

* fix(files): release expired folder listings, share one in-flight listing, keep an oversized one alone

* fix(files): cap and time out cached folder listings, bound the cursor name, match id: selectors
2026-10-28 06:51:12 -07:00
OrcaWinandOrcaWin aab2254596 test: remove 53 low-value emulator, parser and cursor cases (#34830)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 06:42:53 -07:00
Neil 7f543df3e5 fix(startup): don't quit when a helper window closes before the main window opens (#35120)
On Windows/Linux, window-all-closed quit unconditionally. A hidden browser
extension native page (content-script restore) destroyed before the first
main window existed emitted window-all-closed and quit the app mid-startup.
Gate the quit policy on the main window having opened at least once.

Fixes #34911
2026-10-28 06:35:05 -07:00
OrcaWinandOrcaWin 149ec5d6db perf(attention): index subject reads once per batch (#35088)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 06:33:47 -07:00
NeilandClaude 4916c09079 fix(terminal): a WSL bridge pane keeps its session when its distro is booted again before the check (#35050)
* fix(terminal): a WSL bridge pane keeps its session when its distro is booted again before the check

A bridge exit that the running list calls 'running' is now host loss when the distro's boot id
changed since the pane spawned (something booted it again first), and an unanswered list is asked
once more before the exit stays an exit. Boot ids are read once per distro boot, only into a
distro the background-work gate confirms running, so the read never boots one.

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

* fix(terminal): an exit drops the distro's boot id at once, and a new incarnation takes the current one

Reviews of #35050: a pane spawned during another pane's exit verdict, or the same session
respawned into a rebooted distro, kept the old boot's id, so its own later exit read as
'rebooted' and its tab never closed. A burst of exits now shares one read of the current id,
and the verdict log names the exit code.

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

* fix(terminal): a stale bridge exit drops the boot id, and the respawn that beat it re-reads its own

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

* test(terminal): wait on the exit, not the clock, in the bridge relaunch suite

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-28 06:18:54 -07:00
Neil 938286e6bf perf(orcad): qualify a bundled slot once per unchanged host instead of every launch (#35064)
* perf(orcad): qualify a bundled slot once per unchanged host instead of every launch

Every bundled orcad launch ran a second full orcad-server.js process (the startup preflight)
before serving: 0.7-1.4 s after a WSL distro restart. Once a launch with the same key reaches
readiness, the slot records a marker; the next launch with that key skips the child. The key
covers the artifact version, each installed file's stat identity, the runtime identity, Node
version, libc and kernel. The marker is consumed at startup and rewritten only after readiness,
so a launch that fails or crashes before readiness re-qualifies; it is written via temp + rename,
and any read, parse or write problem falls back to the preflight.

* perf(orcad): keep running the startup preflight on Windows

There the child also proves the process identity table, which depends on host services rather
than on the slot's bytes.

* docs(wsl): note when the version GC memo can leave a stale dir behind

* fix(orcad): harden the startup qualification marker

- A failed preflight child deletes any marker, so a concurrent launch cannot rely on it.
- Only managed slots (launched with the managed activation root, as for the compile cache)
  outside process.resourcesPath ever read or write a marker.
- The key fingerprints NODE_OPTIONS, LD_PRELOAD, LD_LIBRARY_PATH and TMPDIR as orcad sees them.
2026-10-28 06:14:49 -07:00
OrcaWinandOrcaWin 3e625b18b8 perf(browser): await installed proxy policies during startup (#34977)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 06:11:44 -07:00
OrcaWinandOrcaWin 05aab3a185 fix(browser): retire notifications with unloaded extensions (#35006)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 05:46:28 -07:00
Brennan Benson ab512bfe13 Show a chat's saved permission mode while its agent isn't reporting (#34546)
Chats with an explicit mode showed a disabled 'Permissions' placeholder whenever no running agent had reported, which is every idle or resumed chat, so the mode could not be read or changed. A live report still wins; chats that follow the agent's own settings still wait for the report.
2026-10-28 05:44:03 -07:00
Neil 8857567570 perf(wsl): read the kernel, login home and platform in one exec (#35070)
* perf(wsl): read the kernel, login home and platform in one exec

The WSL connect's first exec now prints the kernel release, $HOME and the marker-backed uname
platform probe together, and hands the platform and home to resolveOrcadRemoteContext, which
then skips its own uname and $HOME probes: two fewer serial guest round trips per connect. SSH
passes neither, so its probes are unchanged.

* fix(wsl): accept the folded host facts only in their exact shape

Each fact now prints after its own marker, and the output is used only when it has exactly the
kernel line, the home line, the blank separator and the platform line. Anything else (stdout
noise, a HOME containing a newline) falls back to reading the kernel alone and lets the context
probe the platform and home itself, so no truncated path is ever used.
2026-10-28 05:43:33 -07:00
OrcaWinandOrcaWin f50425f2ec fix(browser): retire deleted profile extension action state (#34988)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 05:36:26 -07:00
Neil 760e311693 test(wsl-host): the last Orca on a WSL host tears down once the other is gone past the grace (#35086)
R39 follow-up. When one Orca's Remove kept the server for another, that other
Orca's later Remove must tear it down once the first is gone. The test covers
it end to end on a real server: kept while both are connected, still kept
inside the first Orca's 60-second reconnect grace, and no peers after it.
2026-10-28 05:32:54 -07:00
OrcaWinandOrcaWin a4ecf2741c perf(browser): reuse native census during SSH partition teardown (#34979)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 05:31:27 -07:00
Neil 49bec7dd16 fix(runtime): sleep and stop resolve project-group folder workspaces (#35082)
Refs STA-12562
2026-10-28 05:31:05 -07:00
Neil b329de4407 fix(wsl-move): say a moved project's host was kept for another Orca and needs re-adding (#34989)
* fix(wsl-move): say a moved project's host was kept for another Orca and needs re-adding

When this Orca removed a WSL host while another Orca kept its server running
(R39), "Use on this computer again" refused with the generic "the host isn't
answering, connect it or remove it". Neither works, because the host is
already removed here. It now says: "<project> moved to the <distro> host, which
is still running for another Orca. Re-add the host to use it here again."

* i18n(wsl-move): German for the kept-host undo copy
2026-10-28 05:29:47 -07:00
Oleksandr SuvorovandNeil 3bfb2bd094 fix(build): explain missing mobile/ deps instead of failing build:mobile-web (#24325)
mobile/ is a separate pnpm project, so the root pnpm install leaves
mobile/node_modules empty and pnpm build failed in build:mobile-web with
hundreds of unexplained esbuild "Could not resolve" errors.

build-mobile-web-app-bundle now checks for mobile/node_modules first and
exits with the one command that fixes it. The probe path is shared with
the bundle tests' dependency check. CONTRIBUTING documents the install in
Local Setup and points "Before Opening a PR" at it.

Fixes #24324

Co-authored-by: Neil <neil@stably.ai>
2026-10-28 05:27:25 -07:00
Neil daf806bb41 fix(wsl-host): refuse Windows-only agent CLIs in phone, resume and fork launches (#35016)
* fix(wsl-host): give phone, resume and fork agent launches the Windows-only refusal

* fix(wsl-host): hint the Command setting on required-CLI refusals

* fix(wsl-host): refuse explicit resumes of a Windows-only CLI with the fix-it message
2026-10-28 05:15:44 -07:00
TotoroandNeil 48b62d9e15 fix(daemon): arm the shutdown deadline when idle retirement begins (#29407)
Idle retirement (last-client disconnect, initial-adoption timeout, ownership
loss, and shutdownIfIdle) skipped onShutdownRequested(), so a stalled resource
disposal left the daemon alive with no five-second exit deadline.

Fixes #29406

Co-authored-by: Neil <neil@stably.ai>
2026-10-28 05:10:24 -07:00