Commit Graph
21347 Commits
Author SHA1 Message Date
Kelvin Amoaba 86f9e206e4 fix(browser): refuse --environment browser commands that name no page or worktree 2026-11-14 01:04:25 +00:00
Brennan BensonandClaude Opus 5.5 e5e4f6f4c9 perf(pickers): window the Automations and Skill install workspace pickers (#41396)
* perf(pickers): window workspace comboboxes and the Cmd+J result list

The Automations and Skill install workspace comboboxes mounted one cmdk row
per workspace while open, and the Cmd+J result list mounted every capped
section row plus each See more page. cmdk moves the highlight, runs Enter and
publishes aria-activedescendant by querying mounted rows, so these lists could
not be windowed while cmdk owned selection.

Each surface now owns its highlight over the full ordered result list:
movement keys follow cmdk's bindings over every result, Enter and click share
one activation path, and the input's aria-activedescendant names the
highlighted option, which stays mounted. Rows render as plain listbox options
outside cmdk's registry and only the visible window mounts (TanStack
virtualizer; Cmd+J keeps natural layout below 50 rows). Filtering, ranking,
section caps and See more are unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* refactor(pickers): share the windowed command virtualizer and keep the compiler gate

Move the active-option pin and command-list reveal padding into one hook used
by all three surfaces, keep virtualizer consumers out of React Compiler like
the other TanStack lists, and express the dialog row styles and the flush skill
rows as command variants.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* chore(pickers): record the windowed command virtualizer hook's compiler bailout

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(pickers): keep virtualizer geometry across scrolls and match prior highlight/IME behavior

- Stable per-list key/size getters so scrolling and hovering no longer rebuild
  every row's virtual geometry.
- Moving the pointer over the already-highlighted option does no work.
- Jump to… numbers every rendered option, disabled ones included.
- The task Cmd/Ctrl+Enter shortcut ignores IME composition keys.
- The skill install workspace picker opened with nothing chosen highlights the
  first workspace again.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(pickers): let the shared virtualizer own row key identity

Callers now pass their ordered row keys; the shared hook keeps one key array
per ordered sequence and derives the key getter from it, so a list rebuilt
with the same rows (for example after an unrelated workspace metadata update)
no longer forces a full geometry rebuild, while real reorder, insert, remove
and filter changes still do.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(pickers): keep the row See more selects in view when Jump to… starts windowing

Crossing 50 rows through See more switches the list to windowed rendering;
reveal the newly highlighted row after that commit so it stays on screen as
it did before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* perf(pickers): keep Jump to… on its original list; window only the two workspace pickers

The real-app benchmark showed no meaningful gain for the Jump to… results
(they rarely reach 50 rows), and windowing them changed the See more
behaviour at the threshold. Restore Jump to… exactly as on main and keep the
windowed list, model-owned selection and option primitive for the Automations
and Skill install workspace pickers, which measured clear wins.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-13 17:03:58 -08:00
Neil 6a0d446ccf fix(release): build Linux x64 on ubuntu-24.04 to keep node-pty baseline x86-64 (#42210)
ubuntu-latest now resolves to the Ubuntu 26.04 image, which installs the
amd64v3 package variant. Its GCC defaults to -march=x86-64-v3, so the
Electron-ABI node-pty in 1.4.257 shipped AVX instructions and the terminal
daemon died with SIGILL on CPUs without AVX. Pin the Linux x64 release
build to ubuntu-24.04, the image that produced the working 1.4.256.

Fixes #41637
2026-11-13 17:01:54 -08:00
Jinjing 4d3cfb7dcc fix(notifications): remap accent/input/border onto the notice surface (#42207)
Outline and ghost buttons in toasts and corner cards painted dark:bg-input/30
and hover:bg-accent from the app palette under popover text, and panels and
buttons drew edges from the app's --border and --input. For app themes the
notice scope now remaps --accent, --accent-foreground and --input onto the
readable secondary fill, and --border onto a popover-text edge. Dark outline
buttons get an inset edge, and --notice-border now follows the popover text.
Built-in themes paint as before.
2026-11-13 16:58:47 -08:00
Kelvin Amoaba 62b22aeab0 fix(computer-use): read minimized, hidden and other-Space macOS windows without --restore-window (#42182)
* fix(computer-use): observe minimized, hidden and other-Space windows on macOS without a restore

macOS only enumerated on-screen windows and dropped minimized AX windows,
so an app whose window was minimized, hidden or on another Space (any
full-screen app) could not be observed, and agents fell back to
--restore-window, which activated every window of the app and switched
the user's Space.

Enumerate every window, keep the off-screen ones accessibility can still
read (other-Space windows by remote token, closed windows dropped by
their Space membership), and report their real minimized and off-screen
state. Background pointer and key input on such a window refuses before
sending anything. --restore-window now raises only the target window,
once per request, and delivery is measured from whether the target
became frontmost.

* fix(computer-use): pin the restored window and prefer visible windows by default

* fix(computer-use): keep window-index cache keys and stale-element checks across a restore

* fix(computer-use): restore only this app's resolved window and refuse a closed target before raising

* docs(computer-use): say macOS reads minimized, hidden and other-Space windows
2026-11-14 00:58:33 +00:00
Kelvin Amoaba cf02703c13 fix(browser): refuse exec commands that leave Orca's page; keep orcad Chromium headless (#42200)
* fix(browser): keep agent-browser exec on Orca's page and orcad Chromium headless

exec passed raw agent-browser argv through after stripping only --cdp and
--session, so connect, tab/window, close, set viewport, batch items and
global launch options could move the helper to another browser or create
targets behind Orca's tab model. Refuse them in one shared gate used by the
desktop bridge and orcad's external-Chromium provider.

orcad's external-Chromium helper inherited AGENT_BROWSER_* and read the
user's ~/.agent-browser/config.json and ./agent-browser.json, so headed or
extensions settings opened a visible window. Drop inherited settings, point
AGENT_BROWSER_CONFIG at an empty Orca-owned file and pin --headed false.

* fix(browser): refuse inspect, stream and auth in exec and match agent-browser's batch escapes

* fix(browser): retry orcad's agent-browser config write after a failure
2026-11-14 00:57:19 +00:00
Brennan Benson 70525610f7 Keep remote browser certificate warnings actionable (#41235)
* Preserve remote browser certificate warnings through navigation

* Apply current remote observations at the session boundary

* Document array proxy forwarding in the performance contract

* Keep remote browser failure fallbacks within current observations

* Defer remote observation reads to lifecycle callbacks

* Apply remote page observations without preempting pending outcomes

* Preserve command loading ownership across partial page updates

* Reuse browser host identity within each mirror record

* Explain transparent record access in the loading contract fixture

* Keep adoption fixture aligned with remote loading session

* Name the remote navigation fixture return contract
2026-11-14 00:52:46 +00:00
Kelvin Amoaba 80a514cfb6 fix(browser): stop agent CLI clicks over --environment from moving the desktop (#42205) 2026-11-14 00:51:47 +00:00
Kelvin Amoaba a376f8fbe3 fix(cli): keep orca open and computer permissions from taking the foreground (#42166)
* fix(cli): keep Orca in the background when orca open launches it

* docs(cli): say orca open leaves the foreground alone

* fix(cli): ask a running Orca to open its window in the background

* fix(main): keep background reveals inactive on Linux maximize and drop the flag on admin restart

* fix(cli): narrow the open status before returning it

* fix(main): keep focus-existing-window free of main-window contracts for the web typecheck

* fix(cli): cap the open window request at five seconds
2026-11-14 00:51:45 +00:00
Kelvin Amoaba 746b031870 fix(terminal): keep the user's focus when an agent splits a terminal (#42204) 2026-11-14 00:44:02 +00:00
Brennan Benson 235d446873 perf(codex): derive mirror section headers once per document (#42190) 2026-11-13 16:37:49 -08:00
Brennan Benson 8c306365dd perf: refresh agent models when CLI inputs change (#41976)
* perf: refresh agent model catalogs when launch inputs change

* test: cover model catalog launch input changes

* test: require explicit refresh intent for floating agents

* fix: combine model catalog ownership imports

* Observe direct agent scripts after interpreter options

* Expose refresh intent in preflight API types

* Keep slow model discovery alive beyond picker waits

* Explain the real transport regression test budget

* Use typed catalog test requests and locate cast rationale

* Assert discovered ACP effort choices directly

* Fix catalog regression fixture types
2026-11-13 16:34:06 -08:00
Jinjing 9f956312e3 perf(hooks): skip lint-staged's serial worktree walks in pre-commit (#42184)
lint-staged 16.4.0 walks the whole worktree several times before any
linter runs. On a cold stat cache that made small commits take over a
minute. Extend the existing lint-staged patch:

- getDeletedFiles: replace the serial `ls-files --deleted` with
  `diff-files -D` (parallel preload, fsmonitor bypassed) plus
  assume-unchanged entries, filtered by the same lstat rule, so the
  deleted-file contract is unchanged.
- getUnstagedFiles: `status --untracked-files=no`; the `??` lines were
  already discarded.
- config discovery: list tracked config files only. A nested config
  must be tracked or staged to apply; untracked configs at the repo
  root are still found.

Run lint-staged directly from the hook; husky already puts
node_modules/.bin on PATH, so `pnpm exec` only added startup time.
2026-11-13 16:33:59 -08:00
Brennan BensonandJinjing a36620afd0 perf(github): share automatic PR reads and reuse the host budget (#42033)
* perf(github): share and pace timed pull request reads on the host

Reuse exact completed results for automatic refreshes, back off unchanged
settled pull requests, and route server revalidation through the existing
host budget while preserving foreground reads and older clients.

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>

* fix(github): preserve shared producer settlement and selected demand

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>

* test(github): cover paired receipt retries and watch fairness

* test(github): explain shared fake-clock fixture

* test(github): typecheck host and renderer integration together

* test(github): name exported fixture mock types

* Revert "test(github): typecheck host and renderer integration together"

This reverts commit 756a38787c.

* test(github): place host and renderer loops in cross-layer suite

* fix(github): preserve refresh policy and shared callers

Use the same validated freshness for cached queue reads and their follow-up. Keep forced mergeability rereads and detach cancelled consumers independently from the shared lookup.

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>

* fix(github): refresh settled rows when exposed again

Use the same finite foreground age to admit and consume the queued read. A recent exact result can still satisfy it, and settled rows do not acquire a recurring timer.

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>

* fix(github): accept only current PR read completions

Keep shared publication and retry planning on the accepted actual read. Preserve legacy own replies, terminal loading and ordinary work after a superseded lookup, and honor the accepted error gate before automatic recovery.

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>

* test(github): follow moved request contracts

* test(github): explain the partial event fixture type assertion

* fix(github): preserve queued deadlines and detachable PR waits

* fix(github): compare refresh wakes on the elapsed clock

* test(github): format queued refresh deadline cases

* fix(github): charge actual producers and fence retry gates

* fix(github): preserve fresh intent and producer error policy

* fix(github): retain owned cold-read retry gates

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-11-13 16:33:07 -08:00
Kelvin Amoaba bff57f1e37 fix(browser): keep late page-opened tabs and system-browser opens from moving the user (#42199)
A tab a page opened with no gesture counted as the agent's only within the
agent's 20 s idle window, so a late open (an OAuth tab finishing after the
agent went quiet) switched the user's visible tab. Track, per guest, whether an
agent drove the page since the desktop user last gave it input, carry it into
popups the page opens, and keep such opens in the background.

A popup whose owner tab was gone handed any http(s) open to the system browser,
including agent, phone and scripted ones, which took the foreground. Only the
desktop user's own click opens it there now; the rest are reported blocked.
2026-11-14 00:31:44 +00:00
Kelvin Amoaba cc1e3740da feat(computer-use): scroll and select list rows in background Linux windows, and aim GTK 4 clicks (#42201)
* feat(computer-use): scroll and select rows in background Linux windows, and aim GTK 4 pointer input

Scroll moves the nearest scroll bar's value by whole viewports, handing
the scroll outward at a view's end, or pages a web document with
Component.ScrollTo, before falling back to the pointer. A click on a
list row with no action selects it through the list's Selection when
the index is proven to name that row. GTK 4 rectangles come from
WINDOW extents plus the X11 client origin, since its SCREEN extents
read [0, 0, w, h].

* fix(computer-use): keep Linux background scroll and select honest under partial and slow results

Wait for ScrollTo to move before planning the next page, report pages
already scrolled instead of falling back, let refused scroll bars fall
through, clear a multi-select list before a plain-click select, accept
only an InvalidArgs refusal as index proof, bound child walks, and
read GTK 4 origins lazily.

* fix(computer-use): scroll the innermost Linux view that overflows, and bound the scroll search

ScrollTo now runs on each ancestor that overflows its own box, innermost
first, so an inner scroller moves before the page; coordinate scrolls
start from the deepest node under the point. Cap the scroll bar search
to small containers, report a document at its end as a no-op, keep
looking past an unusable spanning child, and look up GTK 4 window names
once per operation.
2026-11-14 00:31:34 +00:00
OrcaWinandOrcaWin 5463aa10d6 test: delete shallow telemetry schema and allowlist suites (#42203)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 16:21:12 -08:00
Yasyf Mohamedali 0bc55330fc fix(orchestration): mark a question read when reply answers it (#41979) 2026-11-13 19:15:46 -05:00
Jinjing f993c66b74 refactor(menus): share menu row styles and add a compact density (#41847)
* refactor(menus): share menu row styles and add a compact density

* test(menus): drop the CSS-class density test
2026-11-13 16:12:40 -08:00
OrcaWinandOrcaWin dfbfec3e3b test: remove low-value compatibility and stream cases (#42202)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 16:11:57 -08:00
Kelvin Amoaba fe138b0ece feat(settings): add per-project workspace cleanup rules to project settings (#42055)
* feat(settings): add per-project workspace cleanup rules to project settings

A project's settings get a Workspace cleanup section: Use global, Off, or
Custom rules seeded from the host's global rules, using the same rule rows
as the Workspace Cleanup page.

* fix(settings): compare a cleanup change against a fresh preview, not the cached one

A cached baseline can predate files that now protect a workspace, which
would hide it from the confirm. The host shares concurrent previews, so a
fresh read stays one evaluation.
2026-11-14 00:05:03 +00:00
Kelvin Amoaba cfa6f0e5e3 fix(cli): stop telling agents to run orca open after a transient disconnect (#42185) 2026-11-14 00:04:47 +00:00
OrcaWinandOrcaWin 8063a69924 test: remove low-value layout and daemon suites (#42198)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 16:01:56 -08:00
Kelvin Amoaba 5a14019c15 test(browser): check on Windows that agent browser input leaves the user's app in front (#42194)
* test(browser): measure agent input focus on the Windows desktop

* test(browser): show Orca inactive before the Windows holder takes the foreground

* test(browser): name the foreground window in Windows holder replies

* test(browser): lift the foreground lock before the Windows holder takes the foreground

* test(browser): run the Windows agent focus check from a dispatch-only workflow

* test(browser): skip the Windows focus checks before launch off hosted runners

* test(browser): harden the Windows focus holder and its dispatch workflow
2026-11-14 00:00:31 +00:00
OrcaWinandOrcaWin 4ce1f9e9ab test: remove marginal lifecycle and protocol cases (#42191)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 15:50:13 -08:00
Kelvin Amoaba 513aef5e7d fix(computer): ask the user before retrying with --restore-window (#42181)
* fix(computer): ask the user before retrying with --restore-window

Error hints, recovery steps, the skill guide and the CLI follow-up command
told agents to retry with --restore-window on their own, which raises the
target app and takes the user's screen. They now say to ask the user first,
stop recommending a restore just to observe, and fix stale per-platform
background claims.

* docs(computer): name the Linux keyboard gate and the Wayland limit
2026-11-13 23:50:03 +00:00
Brennan Benson d8cb3863f8 Stop rereading unchanged Codex history copies during discovery (#42160)
* Avoid repeated content reads for canonical Codex rollout aliases

* Preserve completed exclusions and source failure fallback

* Terminate alias fallback regression fixture records

* Pin shell platform in resume ownership fixture

* Correct mutable read checks and fixture type annotations

* Use a production-shaped stream in JSONL reader fixtures
2026-11-13 15:49:10 -08:00
Kelvin Amoaba 34d9d372ed fix(browser): agent clicks on popups no longer take the user's focus (#42186)
Pages outside an Orca pane (popups, serve pages) got native webContents.focus() on every agent press, which focuses and can raise their window. Emulate page focus instead, and focus natively only inside a window that already has focus.
2026-11-13 23:41:24 +00:00
Brennan Benson 03c828eece Run setup scripts for project group folder workspaces (#41744)
* Add setup scripts for project group folder workspaces

* Align setup regression fixtures and catalog read validation

* Target the Advanced disclosure in group setup regression

* test: initialize project groups in worktree slice fixture

* Preserve group setup startup input across paired hosts

* Check paired group startup regression in cross-layer project

* Restore group setup settings when saving fails

* Wait for group agents to accept startup input

* Type the group startup readiness fixture foreground state

* Give group startup fixture mocks portable public types

* Reuse worktree startup for group folder setup

* Keep example shell regression while removing obsolete observer tests

* Complete launch runtime fixture PTY options

* Exercise terminal startup failure and worktree draft paste in parity tests

* Preserve repository type defaults for setup commands
2026-11-13 15:37:54 -08:00
OrcaWinandOrcaWin 8268704516 test: remove weak recovery observation and repeated lifecycle cases (#42183)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 15:36:51 -08:00
Brennan Benson f28d4ab797 Reuse executable paths for Mac process launches (#42155)
* Reuse resolved executable paths for Mac process launches

* Keep synchronous launch wrappers covered by the ratchet

* Explain executable launch type assertions

* Remove resolved Git imports from the direct-launch baseline

* Keep native spawn cancellation on the native lookup path
2026-11-13 15:35:33 -08:00
Brennan Benson dda5047b7e perf(native-chat): avoid per-commit journal fsync (#42162) 2026-11-13 15:32:44 -08:00
Neil dcf2515ac4 fix(mobile-relay): bounded resolve on persistent 4404, widen a timed-out resolve, rate-limit deferral logs (#41994)
* fix(mobile-relay): resolve on persistent 4404 and make deferral logs readable

* fix(mobile-relay): bound 4404 director resolves for a desktop that stays offline

Review follow-up:
- Resolve on the 2nd consecutive 4404 of an episode, then the 4th, 8th, 16th,
  and never twice within 5 minutes per host. A sleeping laptop with a
  foregrounded phone now costs 6 resolves in 30 minutes, not ~1 per 2 dials.
- If the director names the same cell and epoch, keep the normal 4404 wait:
  no re-route and no immediate redial.
- The streak ends on any other outcome (including aborts), when the phone has
  connected since the last 4404 (a direct-path win), or after a 2-minute gap.
- Clear the gate reprobe due time with its timer so the deferral log never
  reports a stale remainingMs.

* fix(mobile-relay): double the gap between 4404 resolves while the desktop stays offline

The 5-minute floor alone set the pace (12 resolves/hour, forever). After each
resolve the minimum gap now doubles, 5 -> 10 -> 20 -> 40 -> 60 min, and
returns to 5 min after a successful relay dial or any connection. A laptop
asleep for two hours with the phone in the foreground costs 5 resolves.

* refactor(mobile-relay): namespace the supervisor's diagnostic log import to stay within max-lines
2026-11-13 15:25:31 -08:00
Kelvin Amoaba 1f56231043 fix(computer-use): keep Linux actions in the background and refuse ones that need the foreground (#42157)
* fix(computer-use): keep Linux actions in the background unless the user allows a raise

Pointer fallbacks, scroll and drag no longer raise the target window and
warp the pointer without --restore-window; they refuse with
background_unavailable before sending anything. With the flag, the
target point is validated before the raise, a window on another
workspace is refused instead of switching the user's view, and the
pointer is put back afterwards.

Also refuse background clicks that open menus, keyboard-grabbing popups
or dialogs (ported from agent-desktop's foreground classifier), refuse
synthetic input on Wayland where it never lands, press Return through a
GTK entry's activate action, re-check focus and held modifiers while
typing, and report action.delivery from what happened.

* fix(computer-use): check the workspace before every Linux raise and release held buttons

Run the other-workspace check before GrabFocus too, raise before a
user-approved menu or dialog opener, validate a pointer target before
asking for the flag, count newly active app windows as foreground,
release synthetic buttons when input is interrupted, and stop typing
without an exception exit so the user's held keys are left alone.

* fix(computer-use): keep held modifiers from other X screens and settle remapped keys on early stop

* fix(computer-use): refuse a Linux raise when the target's workspace can't be read
2026-11-13 23:23:34 +00:00
OrcaWinandOrcaWin cb381e0ac4 test: remove redundant browser recovery coverage (#42178)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 15:21:00 -08:00
Neil 262491c2d9 fix(relay): probe on an overdue keepalive ack; 60s retry cap for a newly named failing cell (#41992)
* fix(relay): faster stall detection and a 60s retry cap when only the cell failed

Start the existing 3 x 8 s ping probe once a keepalive reply is 10 s overdue,
cutting silent-stall detection without shortening the keepalive interval or
tearing down on a single lost frame.

When the director answered and only the cell connect failed, cap the drain
retry at 60 s instead of 300 s. Director failures keep the full schedule.

* fix(relay): use the 60s cap only for a newly named failing cell

Every drain retry re-asks the director, so capping retries at 60 s for a cell
that keeps failing would raise director load for every host on that cell. The
short cap now applies only when the director names a cell that has not just
failed; the same cell failing again falls back to the full 300 s schedule.

* refactor(relay): keep retry-cap state next to assignment state

* fix(relay): give each failing cell the short retry cap once per episode

A director alternating between failing cells (A, B, A, B) kept the 60 s cap
forever because only the previous cell was compared. Track every cell that
failed since the last success; a repeat of any of them uses the full backoff.
2026-11-13 15:10:18 -08:00
Neil 486f01bf3e fix(relay): re-ask the director when phone data attaches keep failing; close coordinator recovery gaps (#41991)
* fix(relay): re-ask the director when data attaches fail and on broker self-close

Edge keepalives are answered without the host being seated, so a live control
does not prove phones can reach the desktop. Two consecutive data-attach
failures within 2 minutes now drain the origin through the existing
resolve-director path (at most once per 60 s per origin).

The coordinator now rebuilds a broker that closed itself after token refresh
gave up immediately instead of at the next 5-minute tick, and the tick no
longer tears down a pool that is already retrying against the director.

* fix(relay): count only failed host data dials, per-pool pacing, bounded recovery trust

Review follow-up for the data-path and coordinator fixes:
- Only a host data dial that fails before opening counts. After open, 4401
  (phone left), 4408 (phone dropped) and the attach deadline (quiet phone)
  are phone behaviour, not path evidence.
- Require failures on two distinct connections; a replayed pending attach
  counts once.
- Pace data-path recovery once per minute per pool (not per origin) and
  drain with a 60 s grace so live phones on the old cell are not cut off.
- isRecovering() trusts a failing pool retry for at most 5 minutes and never
  after a non-retryable director refusal, so ensureLive rebuilds again.

* fix(relay): count a data dial that opens after half the attach window as failed

The relay's attach window starts when it sends conn-open and ours when we
receive it. On a lossy path a dial that opens at ~7 s leaves host-data-auth
missing the relay's window (phone gets 4404 attach-timeout, relay closes
4401), yet it counted as healthy and cleared the failure set. Opens slower
than RELAY_HOST_ATTACH_DEADLINE_MS / 2 now count as failures and never clear
it; fast opens still do.

* fix(relay): count a slow data dial only if its attach then fails

A slow open whose first relay frame still arrives (a slow-but-working path,
an event-loop stall, wake from sleep) no longer counts as a failure, and it
clears pending failures. The transport now reports each attach once, when it
ends: open latency plus whether the first frame arrived. A slow open counts
only if the socket closes or times out before that frame, the relay's 4401
first-frame timeout being the real failure.
2026-11-13 15:10:05 -08:00
Neil b81f0dde51 fix(pairing): never advertise or dial link-local direct endpoints (#41982)
Desktop: drop IPv4 169.254.0.0/16 (and, as before, IPv6 fe80::/10)
addresses from the pairing interface list, so an APIPA or idle adapter is
never the QR's direct endpoint. When nothing else is usable the offer
already omits the direct address (Relay carries the invite; LAN-only
refuses). Among non-Tailscale candidates, an adapter known to hold the
default route now wins ties.

Mobile: a relay-paired host whose stored endpoint is link-local seeds its
logical client with a never-dialing 'reconnecting' stand-in and disables
the direct return probe, so already-paired phones go straight to Relay
instead of redialing the dead address. Relay-less hosts still dial.
2026-11-13 15:09:53 -08:00
Neil ff79fe0a82 fix(ui): scope button outline interaction cues to dialog footer actions (#42171)
#41870 added hover/focus/press outlines to every Button, Toggle and
SelectTrigger, which read as noise on dense toolbar icon buttons.
Restore the previous focus-visible ring for those primitives and keep the
outline treatment only for buttons inside DialogFooter.
2026-11-13 15:07:33 -08:00
OrcaWinandOrcaWin 984653de2a test: remove low-value preview and setup mapping coverage (#42170)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 15:02:56 -08:00
Kelvin Amoaba 57c9991c98 fix(computer-use): refuse macOS background clicks that open a menu or dialog, and stop refusing plain AX presses (#42158)
* fix(computer-use): refuse macOS background actions that open a menu or dialog over the user

* fix(computer-use): let web comboboxes click in the background and stop probing a hung app

* fix(computer-use): refuse background drags that start on a menu owner

* docs(computer-use): note background drags on menu owners are refused

* fix(computer-use): classify the element under a drag's start and check AXConfirm/AXOpen secondary actions
2026-11-13 22:50:27 +00:00
OrcaWinandOrcaWin 01cddfb50f test: trim redundant browser cleanup and preview coverage (#42167)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 14:47:44 -08:00
Kelvin Amoaba 10302c46a8 fix(computer-use): stop Windows clicks, scrolls and drags from taking the screen without --restore-window (#42161)
* fix(computer-use): refuse Windows pointer fallbacks without --restore-window

Coordinate, right, middle, modified and multi-clicks, clicks on elements with no
primary pattern, unscrollable wheel scrolls and drags raised the window and
moved the real cursor without being asked. They now refuse with
background_unavailable before anything is sent. Coordinate and fractional
scrolls go through ScrollPattern first. With --restore-window only the target
window is raised (never a cloaked one), with a UIA activation fallback and a
second attempt, points are validated first and the cursor is put back behind
the input. A failing UIA pattern or disabled element is an error instead of a
real click, and delivery is measured after the post-action observe.

* fix(computer-use): settle Windows clicks before restoring the cursor and keep scroll writes honest

* fix(computer-use): restore the Windows cursor with SetCursorPos and hit-test coordinate scrolls

* test(computer-use): assert Windows raise outcomes, not attempt order

* fix(computer-use): report a Windows page scroll the provider ignores as not scrolled
2026-11-13 22:44:25 +00:00
OrcaWinandOrcaWin 2386a0125d test: remove duplicate guest shortcut cases (#42163)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 14:33:26 -08:00
OrcaWinandOrcaWin 39ff7be5bd test: trim redundant browser timing and projection cases (#42159)
* test: remove redundant browser getter and chunking cases

* test: trim synthetic browser effects and default budget replay

* test: trim screencast timeout and viewport projection cases

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 14:20:33 -08:00
Kelvin Amoaba f6f5eb6aa3 feat(settings): add a Workspace Cleanup settings page with rules, run now and activity (#42039)
* feat(settings): add Workspace Cleanup settings page

Adds a Settings > Workspace Cleanup page for the host that owns the repos:
status with Clean up now, the rule switches, the ignored-files protection
and an Activity list of past runs. Turning on a delete rule that matches
workspaces right now asks first; Keep pins a workspace.

The page refreshes when the host's runner finishes a run: desktop main now
forwards workspaceCleanupRunFinished to its window, and remote hosts' event
is no longer dropped by the client event allowlist.

* feat(settings): confirm any cleanup rule change that would delete workspaces now

Lowering the inactive days or turning off the ignored-files protection makes
the runner delete within seconds too, so those changes get the same confirm
as turning a rule on.

* fix(settings): serialize cleanup rule changes and guard the confirm

One rule change at a time, built from the host's rules as they are when it
is saved; Esc or the close button can no longer abandon a confirm that is
already saving. Local save failures surface, a host whose rules cannot be
read says so with a retry, and the page follows project rules that keep
the runner on.

* fix(settings): keep cleanup changes bound to fresh rules and this page

A change re-reads the host's rules when it is confirmed, a change still
previewing when the page closes is dropped, Keep locks while saving, and
each preview is kept with the rules it evaluated. The page is hidden in a
paired browser, whose settings are not the host's.

* refactor(settings): reuse existing helpers in the Workspace Cleanup page

One row key helper, useMountedRef, SettingsSwitchRow and the shared
runtime target builder; only the preview of rules about to be saved is
kept as the page's matches, and the report waits for the rules.

* chore(i18n): protect the cleanup confirm's copy

* fix(settings): re-check the cleanup confirm when the rules moved meanwhile

If another client changed the rules while the confirm was open, preview
again and list any workspace the dialog had not shown before saving.

* fix(settings): preview again on every cleanup confirm

A workspace can age past a rule while the confirm is open, so the confirm
always checks again and lists anything new before saving.

* fix(settings): drop a confirmed cleanup change if the page closed while pinning

* feat(workspace-cleanup): keep PR number and ignored file names on cleanup rows

Run and preview rows now carry the merged PR number and up to 3 ignored
file names the evidence already read, so the page can say 'Merged · #4182'
and 'Ignored files · .env'. No new Git reads; older saved runs lack them.

* fix(settings): say when a run's saved receipt lists fewer kept workspaces

* fix(workspace-cleanup): import at-risk local files from its new home

* perf(workspace-cleanup): share in-flight previews and stop re-scanning confirmed rules

The host shares one evaluation between previews of the same rules, so
reopened pages and several clients no longer stack full scans. The page
keeps a would-be rules preview out of its matches until those rules are
saved, then adopts it, and reuses its own preview for the current rules.
2026-11-13 22:18:59 +00:00
Brennan Benson 3168badf7e Approve workspace setup from the branch the workspace is created from (#41823)
* fix(hooks): approve setup from the ref a new workspace checks out

The setup trust check before a create read orca.yaml from the project's
own checkout, while the host (since #37977) checks the created worktree.
A checkout behind origin/main made every create skip setup and open the
"branch has different setup commands" dialog right after creation.

The check now reads orca.yaml at the ref the create checks out (the
resolved base, or the local branch for explicit reuse), refreshing it
only when create would, under one deadline. Any failure falls back to
the previous checkout read, and older hosts ignore the new parameter.

* fix(hooks): stop optional setup reads at the deadline and cover automation recovery, VM and web paths

* fix(hooks): refuse late WSL git retries and approve an automation's saved base on recovery

* docs(hooks): move the skipped-setup recovery comment back to its function

* fix(automations): re-approve setup when an automation's base branch changes
2026-11-13 14:16:23 -08:00
Jinwoo Hong 1afbb01955 fix(orchestration): a reuse start that failed before binding reads as never started (#42112)
* fix(orchestration): a reuse start that failed before binding reads as never started

* test: read the failed reuse start's dispatch without a cast
2026-11-13 17:12:43 -05:00
OrcaWinandOrcaWin 16093f1ff5 test: remove redundant browser suites and adapter workflows (#42154)
* test: remove redundant browser policy and migration suites

* test: remove duplicate cross-context Electron identity probe

* test: remove repeated browser prompt adapter workflows

* test: drop synthetic browser RPC integration harness

* test: prune ratchet entries for removed Electron probe

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-13 14:04:56 -08:00
Brennan Benson 58c09251b1 fix(observability): import git admission tier from its moved contract path (#42151) 2026-11-13 13:55:30 -08:00