Commit Graph
10584 Commits
Author SHA1 Message Date
Jinwoo Hong 5a0795a59b fix(browser): double-click in the address bar selects a word, like other browsers (#27371)
* fix(browser): double-click in the address bar selects a word, like other browsers

The click that focuses the address bar selects the whole URL. Chromium treats
a press inside a selection as a possible text drag, so the second press of a
double-click never picked a word, and re-clicking a blurred bar restored its
old selection instead of selecting all. Clear that selection before the press
(focusing first, as Firefox's urlbar does) so single, double and triple clicks
match Chrome and Firefox.

* refactor(browser): keep address-bar click selection to one flag inside its hook

The focusing press now focuses and clears the selection itself, so focus can
always select all and the bar no longer shares the press flag with its focus
and blur handlers. A second press only meets a range our click made, so
event.detail === 2 replaces the select-all flag.
2026-10-11 03:04:38 -04:00
Jinwoo Hong b197bc611f fix(remote): move tabs into a split-off group on the server too (#26522)
In a server workspace the desktop and the server mint different ids for a
split-off group, so a drag into it named a group the server didn't know and
was silently dropped. The desktop now names the server group that holds
another tab of the target group, falling back to its own id as before.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
2026-10-11 02:58:28 -04:00
Jinwoo Hong 08c8d30f10 fix(e2ee): stop dropping terminal output on a backed-up legacy connection (#26528)
* fix(browser): retry a screencast frame a viewer's socket refused

An idle page sends no next frame, so a refused last frame left the viewer on a stale picture. The
desktop's relay leg to a server uses legacy E2EE, which drops on a full socket where a direct v2 phone
queues; retrying the newest pending frame restores parity. Retries never count toward ghost eviction.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* fix(e2ee): queue legacy binary replies with text instead of dropping them

Legacy E2EE (every direct phone, the desktop's server link) sent binary straight to the socket and
silently dropped it once the outbound budget was full, so terminals lost output and binary could
overtake queued text. Binary now shares the ordered text queue and closes on overflow like v2; the
lossy screencast opts into dropWhenBacklogged and its retry delivers the newest frame after a drain.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* fix(e2ee): keep a backlogged screencast viewer instead of evicting it as a ghost

A lossy frame skipped on a busy socket returned false like a dead socket, so a long backlog evicted a
live viewer. Skips now return 'backlogged', which retries without counting toward eviction; legacy
judges idleness on the sealed size before encrypting, so skipped frames cost no encryption.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* test(browser): expect the ready gate to forward screencast send options

The pre-ready gate now passes the per-frame send options through to the
socket sender, so the replayed startup frame arrives with an options slot.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* test(browser): share the streamed-guest double across screencast tests

Main's renderer throttle lease now calls setBackgroundThrottling on the guest,
so the bare { isDestroyed } guest in two branch tests threw. One shared double
keeps all three screencast suites on the shape the lease needs.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
2026-10-11 02:54:27 -04:00
Jinwoo Hong de00a4f03c feat(runtime): let a paired desktop register its phones as phone devices (#26427)
* feat(runtime): let a paired desktop register its phones as delegated mobile devices

A desktop paired to this runtime can now call pairing.delegatedMobileDevice.sync to make each of
its phones an ordinary mobile-scope device it owns, so the phone mirrors that host through the
desktop. Children are never pending, inherit the parent's reach, and die with the parent's grant.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* refactor(runtime): move the mobile device revoke primitive below dispatch

Dispatch binds the caller-bound delegated-device context, so the revoke path it needs now lives in
a layer under it as a pure move; this drops the abstract method seam. No behaviour change.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* fix(runtime): keep a runtime grant until its delegated phones are revoked

A failed child cleanup now leaves the parent in place so a retry can still find the children, and
revokeRuntimeAccess lives beside the revoke it cascades to. Adds restart, rename and bounds coverage,
shares credential minting, and drops the timing-dependent census.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* fix(runtime): fail a delegated sync whose dropped phone cannot be revoked

Matches the parent revoke: a child whose cleanup could not be saved is kept and the sync errors
before minting anything, so the desktop retries instead of believing the server matches its list.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* fix(runtime): refuse pairing admin to phones delegated through a paired desktop

A delegated child phone could call the mobile-allowlisted pairing-admin methods
(push registration, relay provisioning) that its parent desktop is never granted.
The caller scope now marks delegated phones and denies them that permission.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
2026-10-11 02:54:09 -04:00
Jinwoo Hong 7abee44e78 feat(mobile): show SSH host health on the workspace row badge (#26415)
* feat(mobile): show SSH host health on the workspace row host badge

Rows on an SSH host the desktop cannot reach looked healthy on the phone. The badge now
adds the desktop sidebar's own word ("devbox · Disconnected"), derived by the same shared
function from the connection status ssh.listTargetSummaries already sends; old desktops keep today's badge.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* feat(mobile): name an unhealthy SSH host even in a single-host list

The desktop card shows SSH status on any host count, so the phone now reads target summaries
whenever a repo is on SSH and badges an unhealthy host alone too. Labels and health share one
target-to-host keying, and a hook-level test pins the reply-to-row wiring.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* fix(mobile): clear stale SSH host badges and announce them without the dot

A catalog that no longer spans hosts or holds an SSH repo now clears the health and label maps,
so a host that left cannot keep badging rows. The badge gets a screen-reader label ("devbox,
Disconnected") instead of reading the middle dot.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* test(mobile): type the single-host health fixtures inline so the test tsc passes

Fixtures hoisted into consts widened their health maps to string, which the now-required
hostHealthById rejects under the tests-typecheck ratchet; passing them inline keeps the union.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* test(mobile): re-record the repo-metadata goldens for SSH host health

The settled metadata state now carries hostHealthById, and an SSH-only catalog now reads the
target summaries so a lone unhealthy host can be badged. Scoped re-record via rpc-recording.mts.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
2026-10-11 02:53:57 -04:00
Neilandm4air 58d1d8d101 fix(persistence): save editor-only host sessions during quit (#26848)
Normalize the incoming host slice and the saved partition before retirement and
membership rebasing read their terminal maps.

Fixes #25924

Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-10 23:52:32 -07:00
c37ce7add2 fix(zsh): keep deferred line-init defined for plugins that call it by name (#26842)
* fix(zsh): keep deferred line-init defined for plugins that call it by name

Fixes #26029

Co-Authored-By: petersindex <petersindex@users.noreply.github.com>

* test(zsh): keep the named-call regression test out of the relay module

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
Co-authored-by: petersindex <petersindex@users.noreply.github.com>
2026-10-10 23:51:24 -07:00
Jinwoo Hong 92fb883cf2 fix(runtime): refuse headless tab split/move into an unknown group (#27381)
The headless split and move-to-group handlers answered {moved:true} when the
target group did not exist, hiding desktop/server group-id drift (#26522).
They now refuse with target_group_not_found, as reorder already does.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
2026-10-11 01:54:29 -04:00
f425cab536 fix(agent-status): keep nested models off parent panes (#26846)
* fix(agent-status): keep nested models off the parent pane

Preserve the parent's model when the existing identity fence retains an
active parent for a nested CLI hook. Exercise native SessionStart and Stop
bodies alongside model updates and legitimate pane takeovers.

Adapted from PR #25687, with real native-hook and hidden renderer proof.

Co-authored-by: Regis <92858615+Regis-RCR@users.noreply.github.com>

* chore: record original authorship for Parent-pane model ownership

Records the retained adapted contribution from #13602 in replacement PR #26846.

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>

* test: drop redundant single-agent model case

---------

Co-authored-by: Regis <92858615+Regis-RCR@users.noreply.github.com>
Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-10 22:46:06 -07:00
OrcaWinandm4air 2b4b60a87e refactor(relay): delete the SSH relay server, its build assets and tests (#27215)
* wip: delete the SSH relay server and its build, assets and tests

* wip: drop main/relay plugin conformance; WSL reader lookup test

* fix: drop the emptied relay bench; prune baselines

* test: keep the native halves of tests that also covered the relay

* chore(ci): drop shard timings for the deleted relay server tests

* fix: keep the directory listing budget that darwin terminal names now import

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-10 22:36:42 -07:00
Neilandmmarabel c2c63e7f9a Avoid downloading unchanged paired-runtime session history (#27383)
* perf: avoid retransferring unchanged paired-runtime session history

Keep selected finite-depth history refreshes content-conditional while preserving scans, full old-peer replies, force refreshes and the existing cache lifetime.

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>

* perf(ai-vault): keep full host list behind unchanged replies for cache readers

---------

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>
2026-10-10 22:31:20 -07:00
Neilandmmarabel d07ac4b1bc perf(worktrees): skip unchanged lineage after sidebar order saves (#27384)
* perf(worktrees): skip unchanged lineage after sidebar order saves

Mark order-only remote events and skip redundant lineage downloads only
after a successful current-host read. Preserve independent cold, failed,
pending and structural refreshes, including reconnect and re-pair.

Addresses #27268.

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>

* fix(worktrees): notify after recording SSH-created worktree lineage

Paired clients now skip lineage refetch on sort-order-only events, so the
pre-lineage create notify on the SSH route could leave lineage stale until
the next structural change.

---------

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>
2026-10-10 22:31:16 -07:00
Neil a13c2b3633 [CI] Reduce test teardown and scope server qualification (#27380)
* [CI] Reduce test teardown and scope server qualification

* [CI] Retain raw platform paths in server qualification
2026-10-10 22:23:53 -07:00
ff27338299 refactor(ssh): connect fails for hosts orcad can't serve; remove the relay client path (#27214)
* wip: connect fails for hosts the managed server can't serve; remove relay session, deploy and relay UI

* wip: delete relay-only client modules left unreachable, prune their tests and gates

* wip: format

* wip: exhaustive unserved message

* wip: drop relay attestation test for the deleted ownership proof

* fix: prune stale baselines; type the test transport stub

* fix(ssh): census proves leftover relay leases; name the remedy for older terminals; translate every connect-failure surface

* test(ssh): leftover leases defer to the host census

* test(e2e): remove relay-path SSH e2e specs and their CI lanes

* test(e2e): drop the auto-convert case that built its relay era through a live relay

* test(e2e): mark relay-era browser and catalog journeys fixme until they seed a profile

* test(e2e): seed relay-era browser and catalog journeys from a saved profile

The three journeys built their old-version state through a connect without an orcad template, which now refuses the host. They now start from a seeded relay-era profile, so the first connect converts the host as an upgrading user's would.

* chore(ci): drop shard timings for the deleted relay tests

* test(e2e): carry a relay-era login cookie across the browser conversion; own every launch

* test(ci): drop the deleted SSH layout oracle from its route

* test(e2e): open the retained browser after conversion, retrying a pre-connect card

* test(e2e): bind the relay-era browser partition before seeding its cookie

A relay-era build always recorded the partition binding before a page stored
data in it. Seeding the cookie into an unbound partition made the binding store
refuse it (browser_route_partition_binding_store_invalid), so the retained tab
showed the generic routing card and Retry could never clear it.

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

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
Co-authored-by: Claude <noreply@anthropic.com>
2026-10-10 22:10:33 -07:00
Jinjing 3aaa6a854a Require pointer rest before opening activity hover cards (#25931)
* Require pointer rest before opening activity hover cards

Defer hover card open until pointer stops moving, preventing accidental
popover display on rapid mouse movement. Add progress indicator showing
rest duration. Keyboard focus still opens the card immediately.

* refactor to keep file small
2026-10-10 21:40:35 -07:00
OrcaWinandm4air 22bcda1074 fix(ssh): a restore racing a disconnect never leaves a forward behind (#27368)
Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-10 21:39:26 -07:00
OrcaWinandm4air bcc50483bb fix(vm): a recipe VM's SSH root runs on a managed Orca server (#27366)
* fix(vm): a recipe VM's SSH root runs on a managed Orca server

A recipe VM's hidden SSH target was counted as owned by another runtime, so
every connect refused to deploy a managed server and fell back to the relay.
Its runtime owner only records when the VM is created and destroyed, so it no
longer blocks the deploy. The VM's workspace then lives on that server: the
server adopts the provisioned root as its main worktree, and removing the
project destroys the VM and forgets its server.

* fix(vm): release the server of a relay-era VM that converted on connect

* fix(vm): resume reconnects an SSH VM's server; removal stays on its own VM

* fix(vm): removal and the remove dialog find a VM's server before the catalog loads

* fix(vm): a catalog refresh failure never blocks a VM create

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-10 21:39:23 -07:00
0081ea0941 fix(clipboard): paste a macOS image copied beside its file URL (#27346)
* fix(clipboard): paste a macOS image copied beside its file URL

When a screenshot tool saves a file and also copies the image, the
pasteboard holds public.png and public.file-url, and Chromium reports
only text/uri-list from availableFormats(). readClipboardImageSource()
then saw no image and Cmd+V dropped the paste, although readImage()
returns it. On macOS, also check public.png and public.tiff with
clipboard.has() before giving up.

Fixes #27345

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HzCzr11hHmaEhiUoGJCrDy

* test(clipboard): cover macOS file URL image paste safety

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Neil <neil@stably.ai>
2026-10-10 21:30:27 -07:00
VladislavandNeil d2ba67d109 fix(claude): register a short PostCompact hook command (#25211)
* fix(claude): register a short PostCompact hook command

Claude Code echoes every PostCompact hook's full command into the
post-compact transcript, so Orca's ~3KB portable wrapper landed in the
model's context after every /compact. On POSIX hosts (local macOS/Linux and
SSH remotes) PostCompact now gets only the POSIX branch of the wrapper;
every other event, and Windows, keep the full wrapper.

Fixes #25209

* fix(claude): guard runtime home and verify hook process identity

---------

Co-authored-by: Neil <neil@stably.ai>
2026-10-10 21:25:20 -07:00
Neilandmmarabel e4f599df05 perf(worktrees): preserve Git scans when saving sidebar order (#27343)
* perf(worktrees): preserve Git scans when saving sort order

Credit @mmarabel for identifying the repeated scans and the host-only approach in #27271.

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>

* perf(worktrees): skip Git scan invalidation for order saves on desktop hosts too

The desktop window notifier ran the worktree-change invalidators unconditionally,
so a desktop (or paired-host) Orca still cleared Git scan caches on every sidebar
order save. Carry the invalidateGitScans flag through the notifier; every other
caller keeps the default.

---------

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>
2026-10-10 21:24:34 -07:00
Jinwoo Hong 74856c83b3 fix(dev): keep Node-only Quick Open path accumulator out of the renderer (#27372)
The renderer imports quick-open-listing-limits for the result cap, but the
same module also held a Buffer-backed accumulator that imports the CommonJS
@orca/process-host dist. Vite dev serves that dist as raw ESM, so the named
import failed and the workspace workbench and right sidebar crashed. Move the
accumulator to its own main-only module.
2026-10-11 00:22:18 -04:00
Neil dae2cc9110 test(runtime): enforce ANSI preview-final pre-filter invariant (#27376)
Follow-up to #27344. isTerminalPreviewLineControl now gates on
isTerminalPreviewLineControlFinal, so the normalizeTerminalChunk
pre-filter cannot drop a final the predicate accepts. Add a test over
every CSI final 0x40-0x7e and replace String.prototype.charCodeAt spies
with behavior assertions.
2026-10-10 21:21:27 -07:00
Neil f49d0bc764 test(main): guard against a shared journal no-row sentinel returning (#27375)
Follow-up to #27342: the existing tests also pass on the old module-level
Error, so add one that fails if a single error object is reused.
2026-10-10 21:19:50 -07:00
YEONGUK LEE 1e5031e134 fix(i18n): correct Korean CI check translations (#27367)
* fix(i18n): correct Korean CI check translations

* fix(i18n): clarify Korean GitLab pipeline requirement
2026-10-10 21:11:29 -07:00
Neil c2d5430489 [CI] Fix test fixtures and reduce unnecessary test setup (#27330)
* [CI] Fix E2E folder and catalog fixtures

* [CI] Strengthen folder readiness and reuse composer fixtures

* [CI] Repair E2E catalog owners and retain stronger unit checks

* [CI] Defer optional unit deletions to avoid extra CI jobs

* [CI] Forward Monaco test mocks to the real editor API

* [CI] Make agent launch fixtures handle probes and terminal resize

* [CI] Avoid unused test initialization and flush version probe output
2026-10-10 21:06:11 -07:00
NeilandMatheus Breguêz 41de89a626 fix: spell source NUL separators as Unicode escapes (#26864)
Co-authored-by: Matheus Breguêz <23284276+matbrgz@users.noreply.github.com>
2026-10-10 21:04:49 -07:00
Neilandoutof-place bc02f3ce6e perf(main): release startup allocations held by journal sentinel (#27342)
Credit to outof-place for identifying the retention and proposing the focused fix in #27335. Independently validated 15.19 MiB of collectible startup allocations.

Co-authored-by: outof-place <contact@outofplace.space>
2026-10-10 21:01:23 -07:00
Neilandoutof-place b411bf33fd perf(runtime): reduce terminal ANSI scanning work (#27344)
Adapted from outof-place normalization work in #27170. Preserve tail behavior while avoiding repeated CSI scans and newline-density regressions.

Co-authored-by: outof-place <contact@outofplace.space>
2026-10-10 21:00:37 -07:00
NeilandRishabh Jain a2c2f8b859 fix(computer-use): clean up completed permission helpers asynchronously (#27347)
* fix(computer-use): clean up completed permission helpers asynchronously

Stop the helper belonging to each finished status check without waiting
for a process scan on the main thread. Keep concurrent probes, setup
prompts and agent helpers running.

Adapted from #22451; fixes the cleanup gap reported in #22436.

Co-authored-by: Rishabh Jain <18290665+jrishabh55@users.noreply.github.com>

* test(computer-use): derive cleanup expectations from host paths

---------

Co-authored-by: Rishabh Jain <18290665+jrishabh55@users.noreply.github.com>
2026-10-10 20:55:35 -07:00
Neilanddrakeo338 56d25b00bd fix(settings): reenable terminal link Actions after an old opt-out (#26853)
An explicit Actions, Open URL, or Leave to terminal choice now also writes the
legacy terminalLinkActionPopoverEnabled switch, so an older opt-out no longer
snaps the Actions selection back to Leave to terminal.

Fixes #25576

Co-authored-by: drakeo338 <paranoyouz@gmail.com>
2026-10-10 20:47:45 -07:00
Jinwoo Hong 666d990bc0 Record a display-only snapshot of each paired server's tabs (inert) (#27359)
* feat(layout): record a display-only snapshot of each paired server's tabs

Records the session.tabs.subscribeAll frames main already relays to the window
into a new remoteLayoutSnapshots profile domain (design 6.3, D3). No new server
requests; written only by the recorder; dropped when the server is removed.
Nothing reads it yet.

* fix(layout): keep only what the snapshot draws and save it on structure changes

Drop retirement proofs (sent as deltas) and one-shot navigation from recorded
workspaces; save immediately only when tabs or groups change, letting title
ticks ride the next save; drop the protocol field.
2026-10-10 23:36:37 -04:00
e0625521ac fix(files): a managed terminal links and opens a host file outside its workspace (#27364)
* fix(files): a managed terminal links and opens a host file outside its workspace

A paired-server terminal checked out-of-workspace paths on this computer, so a
host file such as /tmp/screenshot.png never became a link, and a click was
refused. Link detection now asks the host the same question a click asks, with
the printing terminal's handle, and a granted file opens read-only through the
host's existing terminal-artifact grant.

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

* fix(files): a restored server-granted tab is never this computer's file

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

* test(e2e): keep the external-image journey's /tmp outside every workspace

The default folder workspace is /tmp, so the image resolved into it instead of
exercising a host file outside all workspaces.

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

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
Co-authored-by: Claude <noreply@anthropic.com>
2026-10-10 20:36:10 -07:00
OrcaWinandm4air 5f350a3786 fix(ssh): restore saved port forwards on managed hosts and show their Ports tab (#27361)
* fix(ssh): restore saved port forwards on managed hosts; show Ports for managed workspaces

* test: annotate the mock connection casts

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-10 20:01:11 -07:00
cf36928a69 test(native-chat): unmount the cut-turn notice hooks after each test (#27358)
A rendered hook left mounted can commit after happy-dom is torn down, which
fails the shard with "window is not defined" from React's scheduler.

Co-authored-by: m4air <m4air@Mac.localdomain>
Co-authored-by: Claude <noreply@anthropic.com>
2026-10-10 19:44:23 -07:00
OrcaWinandm4air 1dde4c0049 fix(projects): create on a server's SSH project; Add Project SSH lists the server's targets (#27331)
* fix(projects): create on a server's SSH project; Add Project lists the server's SSH hosts

* fix(projects): derive server SSH states; drop redundant casts

* fix(composer): a server's SSH project gets its agents from the server

* fix(composer): only agent detection treats a server's SSH project as the server's

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-10 18:41:46 -07:00
OrcaWinandm4air e6af89741f feat(ssh): a paired client can manage the server's own SSH hosts (ssh.target-management.v1) (#27329)
* feat(ssh): manage a paired server's own SSH targets over RPC (ssh.target-management.v1)

* fix(ssh): keep a browsed remote path untrimmed

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-10 18:25:54 -07:00
Jinwoo HongandClaude f6d536dcda Save runtime-started tabs in the tab bar before their terminal starts (#27083)
* Write runtime-started panes with their tab bar entry and group before they spawn

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

* List the headless reorder's row-order finding and mark the headless group writer for the switch

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

* Admit runtime-started tabs into the targeted or focused tab group

A phone, CLI or orchestration create on a headless host with two tab groups was written into the
first group, so after a restart the tab moved groups. The phone's targetGroupId, else the host's
focused group, now reaches the pane admission.

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

* Admit an untargeted runtime-started tab into the first tab group

Defaulting to the host's focused group moved a CLI-created tab to the right group after a restart
and in the desktop window, while main and the live view keep it in the first group. Only the
phone's explicit targetGroupId now picks the group.

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-10 21:22:45 -04:00
Neil 91f9744d3a fix(settings): return current preferences after slow updates (#27199)
* fix(settings): return current preferences after reconciliation

* test(settings): run SQLite reply regressions in Node
2026-10-10 17:36:49 -07:00
OrcaWinandm4air 77d5de1f6c fix(orcad): provide the orca CLI in Windows managed-host terminals (#27324)
Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-10 17:18:01 -07:00
outofplaceandoutof-place ee8cd8e58f perf(ai-vault): pipeline fresh transcript discovery with bounded I/O (#27009)
Overlap transcript stat/sidecar reads in ordered batches (4 workers per root, 8 global slots); WSL stays sequential.

Fixes #27008

Co-authored-by: outof-place <contact@outofplace.space>
2026-10-10 17:14:25 -07:00
OrcaWinandm4air b4d8e370da fix(orcad): install agent status hooks when a managed host starts (#27319)
* fix(orcad): install agent status hooks when a managed host starts

* fix(orcad): read login-profile Grok/Kiro homes before installing hooks

* refactor(agent-hooks): run the login-shell home probe through process-host

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
2026-10-10 17:08:36 -07:00
Neilandpetersindex 884575a797 fix(github): verify cached integration PRs after tracking is removed
Use the existing REST PR mapping to read the head repository's default
branch when no tracked remote or origin can identify it. Require matching
repository and head metadata, and preserve the PR if the lookup fails.

This clears both closed and merged integration PRs cached by a fork
checkout after its upstream tracking is removed.

Co-authored-by: petersindex <287557875+petersindex@users.noreply.github.com>
2026-10-10 17:08:10 -07:00
Neilandpetersindex 82c5484f66 fix(github): scope PR selection and clear rejected cached links
Apply the default-branch policy while probing each repository, so an
integration PR cannot preempt a valid result or suppress the same number
in another repository. Check branch heads by repository and server.

Invalidate remote defaults when their review scope or SSH provider changes.
Report rejected PR URLs through an optional refresh-result field, so merged
integration PRs clear from both caches even at the current worktree head.
Share the manual and coordinator cache update implementation.

Co-authored-by: petersindex <287557875+petersindex@users.noreply.github.com>
2026-10-10 17:08:10 -07:00
Neil 0bc07c9954 fix(github): validate implicit default-branch PR repository identity 2026-10-10 17:08:10 -07:00
petersindex 7ac9f4d2f1 fix(github): compare a tracked upstream with its own remote's default branch
A fork's upstream remote can default to a different branch than origin.
Read refs/remotes/<remote>/HEAD for the tracked remote and fall back to
origin's default only when git never recorded it. Reuses the default-branch
resolver's host routing and cache.
2026-10-10 17:08:10 -07:00
petersindex ae861b76c1 fix(github): don't link a PR headed by the default branch a branch tracks
A branch made with `git switch -c feature/x origin/develop` tracks the
default branch. When its own PR lookup missed, the tracked-upstream fallback
attached the newest PR whose head is `develop` (an unrelated develop to
release PR) and cached its number, so the wrong link survived restarts.

Drop a match headed by the tracked upstream when that upstream is the default
branch of a repo PRs target. The check runs only after such a match, so normal
polling adds no git calls, and it also heals numbers cached before the fix.

Fixes #26948
2026-10-10 17:08:10 -07:00
Neil 8b2c795d8a test(native-chat): seed large transcript fixtures in one transaction 2026-10-10 17:05:02 -07:00
Neil b74e9464eb fix(native-chat): prepare SQLite readers for ZCode-only WSL homes 2026-10-10 17:05:02 -07:00
Neil 3d51f67f2f test(native-chat): seed ZCode through the execution host 2026-10-10 17:05:02 -07:00
Neil 45c4d6ecbb fix(native-chat): preserve ZCode store selection and transcript order 2026-10-10 17:05:02 -07:00