Commit Graph
17936 Commits
Author SHA1 Message Date
OrcaWinandOrcaWin e7e3e568e7 fix(editor): keep composition-owned Escape inside Find (#34969)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:56:33 -07:00
Kelvin Amoaba 2e5711fcaa fix(mobile): use paired ports in firewall help (#36130)
* fix(mobile): use paired ports in firewall help

* fix(mobile): use a namespace type in diagnostics test
2026-10-29 22:55:38 +00:00
Kelvin Amoaba c97e6f16bc fix(computer): report macOS actions that changed nothing, read back wrong or hung (#36020)
* fix(computer): fail set-value when its read-back shows a different value

A value_mismatch came back as ok with exit 0, so callers that check only
the exit status took an ignored or misplaced write as success. The runtime
now turns it into a verification_failed error at the sidecar boundary,
which covers every provider and every caller of the RPC.

Part of #33511

* fix(computer): pair macOS AX windows with their CGWindowID

AppKit and WebKit windows don't answer AXWindowNumber, so matching a
capture to its accessibility window fell back to frames. Two windows with
the same frame then paired the screenshot of one with the tree and title
of whichever AX listed first, under the first one's id. Read the id with
_AXUIElementGetWindow, as yabai and Hammerspoon do, and keep AXWindowNumber
as the fallback.

Fixes #27252

* fix(computer): fail fast when a macOS app stops answering accessibility

Every request runs behind one helper lock, and a hung app cost a timeout
per AX read, so one get-app-state on it held every agent for up to the 60 s
RPC timeout. Pin the AX messaging timeout at 1.5 s, refuse an app that
doesn't answer a root probe, and stop a tree walk at the first read that
waits out the timeout, each with an action_timeout error.

A press or write that the app received but didn't answer now fails the
same way, saying it may have taken effect. Before, the click fell through
to AXConfirm and then a synthetic click, so a button whose handler blocked
ran twice, and type-text typed the text again as keys.

* fix(computer): report macOS accessibility actions that changed nothing

AXPress and other accessibility actions came back as plain unasserted
success even when the app ignored them, as Chromium does for a role=button
whose handler sits on a child. After such an action the helper now compares
the target's tree, frame and on-screen windows with the snapshot it took
just before. If they still match after re-reading for about a second, the
result says unverified/suspected_noop; if they change late, the result
carries the settled state instead.

The new reason is additive; older CLIs print it like any other reason.

Refs #31758

* fix(computer): propagate late macOS observation failures

* fix(computer): select existing text before replacement

* fix(computer): share native macOS window identity
2026-10-29 22:55:16 +00:00
OrcaWinandOrcaWin a83cb6ee33 Reuse Markdown tokenizer and details start searches across paragraph suffixes (#35374)
* Reuse Markdown tokenizer start searches across paragraph suffixes

* Reuse details start searches across Markdown paragraph suffixes

* test(editor): drop prototype spy-count tokenizer cursor tests

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:50:57 -07:00
OrcaWinandOrcaWin 5535d5e372 test: remove low-value inventories and wording suites (#36129)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:48:15 -07:00
OrcaWinandOrcaWin 95f45db57c fix(editor): honor Plain text code block highlighting (#35111)
* fix(editor): honor Plain text code block highlighting

* fix(editor): trim Plain text highlighting tests and drop redundant guard

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:48:09 -07:00
OrcaWinandOrcaWin 35c779ea36 perf(editor): honor the Find query debounce (#34829)
* perf(editor): honor the Find query debounce

* test(editor): drop redundant Find debounce walk-count test

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:47:13 -07:00
OrcaWinandOrcaWin 85ddd7aa30 test(native-chat): drop flaky at-rest admission bounds test (#36134)
The N/10N case asserted exact start/peak/permit counts across concurrent work under fake timers and failed intermittently on CI (expected 3 to be 4). The phone dispatch/retirement and shared-context tests in the same file still cover the user-facing behavior.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:46:48 -07:00
Kelvin Amoaba 7a805621b2 fix(mobile): forward iOS keys and Shift+Enter (#36120)
* fix(mobile): forward iOS keys and Shift+Enter

* fix(mobile): preserve Option text and newline mirrors
2026-10-29 22:46:04 +00:00
Kelvin Amoaba 41cd866fb1 fix(mobile): recover from native screen render errors (#36121)
* fix(mobile): recover from native screen render errors

* fix(mobile): avoid replaying launch links after recovery

* fix(mobile): discard launch intent before recovery Home

* test(mobile): correct recovery fixture types
2026-10-29 22:44:22 +00:00
Kelvin Amoaba a7c63de35e fix(mobile): return typed terminal input to the prompt (#36122)
* fix(mobile): return typed terminal input to the prompt

Phone input travels over RPC and bypasses xterm's user-input event.

Fixes #36092

* test(mobile): cover pointer queue failure retirement

* fix(mobile): preserve refused-send mutation anchor
2026-10-29 22:38:18 +00:00
Brennan Benson 019318b8df fix(settings): permission menus match the chat permission picker (#36104)
* fix(settings): permission menus match the chat permission picker

The per-agent permission menu (Settings > Agents and Source Control actions)
and the 'Agents without Approve for me' toggle rendered their own plain-text
items. They now reuse the chat picker's items: the same icons, Full access
warning colour, per-agent descriptions and width, with the agent's own
settings after a separator.

* Unify legacy permission menus and verify selection behavior

* Fix permission selection test typing and remove obsolete locale keys
2026-10-29 15:37:16 -07:00
Kelvin Amoaba a51164379e fix(mobile): explain scanned download QR codes (#36128) 2026-10-29 22:36:27 +00:00
Neil 6c6e6294c7 fix(sidebar): draw a cross-host project's header in each host section (#36012)
A project checked out on two hosts kept one header, placed in the host
section of its anchor repo, so the other host's rows sat under the
previous project. Project headers now carry, for each host that owns one
of their rows, that project's own registration on that host and its
counts, and host sectioning gives every such host its own copy, the way
Pinned and status lanes already split. A header never borrows another
host's or another project's registration, a hidden host that only
anchors the header no longer gets a section, and a view that ends up
showing one host still names that host's registration.

Every header inside a host section now names that section's host, and a
copy an earlier section already drew is marked repeated. When a repo id
is registered on several hosts, a copy's create button opens the
composer on its own host; header drag keys on the project's anchor and
skips repeated copies, so reordering still moves the project once; the
phone keys each copy per section while collapsing it as one. The desktop
list also resolves each row's repo by host, as the feed already does, so
same-id registrations on two hosts keep their own.

Host sectioning also stops carrying an ended project group into the next
ungrouped project, and host badge counts no longer add a project group's
project count when the group is expanded.

Fixes #35741
2026-10-29 15:32:59 -07:00
NeilandClaude 09f58f120b perf: fix six scan findings (STA-12863, 12852, 12864, 12865, 12867, 12871) (#36103)
* perf: gate store sweeps, dedupe plugin/catalog reads, index WSL git owners; convert nested WSL projects together

- STA-12863: skip binary draft cleanup on store writes that leave tabs, buffer index and boxes untouched
- STA-12852: native chat repo lookup re-resolves only when its file-link inputs change
- STA-12864: auto-update reads the install lockfile once per pass instead of once per plugin
- STA-12865: monorepo image fill runs per entry inside extraction and hands over bytes it already read
- STA-12867: Windows/WSL git router builds a repo->project owner map once per rebuild
- STA-12871: converting a project also converts nested projects so their saved-session identities move with them

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

* fix(plugins): retry the lockfile read after a failed auto-update read

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

* fix(wsl): expand nested conversion by the rewrite's own roots and drive roots; skip auto-update on a catalog switch

Addresses review on #36103: nested projects inside a saved worktree or under a drive root
were missed, and a source switch mid-pass could install from the old catalog.

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-29 15:31:47 -07:00
Neil 82108b0da3 fix(wsl): uninstall ends a recorded holder its command line proves, even without a start time (#36126) 2026-10-29 15:27:09 -07:00
Jinwoo Hong a3ddc75414 perf(jira): resolve the project-sort collator once per sort (STA-12861) (#36107)
Resolve the UI-language collator once per Jira project sort instead of re-resolving locale support on every comparison.
2026-10-29 18:17:45 -04:00
OrcaWinandOrcaWin fee06ab9c3 test: remove low-value test inventories and wording fences (#36114)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:17:40 -07:00
Kelvin Amoaba 3b83d3d260 fix(computer): skip activation for accessibility clicks (#36006)
* fix(computer): leave Linux and Windows windows in the background for accessibility actions

Element clicks no longer restore and activate the target window when an
AT-SPI action or UIA Invoke/SelectionItem/Toggle pattern handles them; only
the pointer fallback activates. On Linux, type-text and paste-text insert
into the focused editable field through AT-SPI EditableText without needing
window focus, and fall back to key synthesis or the clipboard otherwise.

Refs #12412

* fix(computer): refuse pointer input after failed activation

* fix(computer): stop after unconfirmed text writes

* fix(computer): insert the full UTF-8 text on Linux

* test(computer): focus each Linux text-entry trial

* fix(computer): verify Linux text mutations before deletion

AT-SPI can acknowledge writes without changing text. Read back
mutation counts and caret state before reporting success.

* fix(computer): verify complete Linux text replacements

* fix(computer): decline unreadable Linux text selections
2026-10-29 22:17:13 +00:00
Neil c74168516b fix(mobile): update URI decoder for denial-of-service advisory (#36124) 2026-10-29 15:15:41 -07:00
OrcaWinandOrcaWin 9dfb110420 fix(emulator): follow decoded Android video dimensions (#35635)
* fix(emulator): follow decoded Android video dimensions

* test(emulator): trim decoded video size test to the rotation case

* chore(emulator): note video stream effect's timer cleanup for react-doctor

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:13:43 -07:00
Kelvin Amoaba c31fdaa6a5 feat(computer): drive macOS apps in the background by default (#36005)
* feat(computer): drive macOS apps in the background by default

Clicks no longer activate and raise the target first. Pointer and key
input go to the target window's pid through a new BackgroundInputTransport:
mouse and scroll events carry the window id in field 51 and a window-local
location, keys run inside a focus-without-raise key-window scope, and
chords carry no Unicode string so menu key equivalents fire. Scroll and
drag now land (#27306); typed text no longer doubles in Electron (#17942).

The HID tap and focus fence stay for --restore-window only. Results
report action.delivery, the handshake reports supports.input.background,
and a missing private symbol or a popup click fails with
background_unavailable instead of falling back to the foreground.

* test(computer): read typed key strings back instead of diffing live-state events

* fix(computer): keep Unicode characters in one key event

* fix(computer): preserve active macOS key windows

Refuse key-window changes in the active app and surface failed
focus records, including cleanup after partially delivered input.

* fix(computer): guard macOS click routes before delivery

* fix(computer): let paste events read the clipboard

* fix(computer): classify clicks in the requested macOS window

* fix(computer): fence macOS scroll and drag recipients
2026-10-29 22:13:19 +00:00
Kelvin Amoaba 960332fc72 fix(mobile): keep shortcut swipes from sending keys (#36116)
* fix(mobile): keep shortcut swipes from sending keys

* test(mobile): follow array type style in shortcut tests
2026-10-29 22:12:43 +00:00
Kelvin Amoaba d5611cf274 fix(mobile): report task pages and review state accurately (#36115)
* fix(mobile): report task pages and review state accurately

* test(mobile): record task page error provenance

* test(mobile): record task page errors in reply matrices
2026-10-29 22:09:45 +00:00
Kelvin Amoaba 0a75796a03 fix(mobile): detect dead direct links in seconds (#36112)
Fixes #36093
2026-10-29 22:07:47 +00:00
Brennan Benson d2d61ba0c0 Center plain Project table cells and label the linked PR overflow (#34532)
* fix(github-project): make linked PR numbers clickable

* fix: open linked pull requests at their exact URLs

* test: assert complete project relation cell text

* fix: clarify linked pull request controls and overflow

* Fix linked pull request focus clipping and overflow label

* Keep linked pull request overflow outside clipped values

* fix(github-project): center plain project cells and say what +N means

Drop the clickable linked PR numbers: the numbers stay plain text as
before. Plain text cells (repository, parent issue, linked pull requests,
sub-issue progress) now center vertically like the other cells, and the
linked PR overflow reads "+N more" instead of a bare "+N".

* fix(github-project): keep the linked PR "+N more" visible when numbers truncate
2026-10-29 15:04:43 -07:00
OrcaWinandOrcaWin 89d365eb46 ci: run Git compatibility as a free hosted matrix, one Git version per job (#36106)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:04:21 -07:00
Neil 6be115a064 refactor(jira): group status and quick-filter owners (#36082) 2026-10-29 15:04:11 -07:00
OrcaWinandOrcaWin c5d74cec5f fix(browser): close client-hosted Find on full navigation (#35692)
* fix(browser): close client-hosted Find on full navigation

* test(browser): trim client-hosted Find navigation coverage

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:57 -07:00
OrcaWinandOrcaWin f6d4381a79 fix(emulator): reject reported Android activity launch failures (#35623)
* fix(emulator): reject zero-exit uiautomator dump failures

* fix(emulator): reject reported Android activity launch failures

* test(emulator): trim Android launch and uiautomator dump failure cases

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:53 -07:00
OrcaWinandOrcaWin 2d6ee2ab9b fix(emulator): run Android commands through the process host (#35599)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:48 -07:00
OrcaWinandOrcaWin b0e2bf6f81 fix(emulator): wait for the requested AVD during Android boot (#35536)
* fix(emulator): match the requested AVD while waiting for boot

* test(emulator): trim AVD boot identity test to the regression case

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:43 -07:00
OrcaWinandOrcaWin 71918d4a78 fix(emulator): launch scrcpy through the background process wrapper (#35566)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:37 -07:00
OrcaWinandOrcaWin 895fd4324a fix(emulator): publish scrcpy JAR only after download completes (#35503)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:30 -07:00
OrcaWinandOrcaWin 6c8baa3fc2 fix(emulator): quote Android text for the device shell (#35561)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:25 -07:00
OrcaWinandOrcaWin a4447426a3 perf(emulator): reuse registered device backend routing (#35616)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:20 -07:00
OrcaWinandOrcaWin 7ad81415e7 fix(emulator): reset partial JPEG state when reconnecting (#35593)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:15 -07:00
OrcaWinandOrcaWin 59be15b7ef fix(persistence): reject non-file recovery artifacts before publication (#35059)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:10 -07:00
OrcaWinandOrcaWin 35124e4252 fix(agent-awake): release macOS sleep assertions when Orca exits (#35649)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:05 -07:00
OrcaWinandOrcaWin c2cc986a8d fix(diagnostics): handle late request errors until socket close (#35496)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 15:00:00 -07:00
Neil a4c0b16eeb fix(wsl): read a distro's automount root once per start, the default /mnt/ too (#36097)
A successful read of the default /mnt/ root stored nothing, so every confirmed running-distro
probe (e.g. the 2 s WSL transcript observer) launched another wsl.exe guest read per distro.
Any successful read is now remembered until the distro stops; a failed read still retries, and a
stop during a read leaves the restart to read again.
2026-10-29 14:59:32 -07:00
Kelvin Amoaba f7bb5be8c2 fix(mobile): keep live input focus and recover failed sends (#36109) 2026-10-29 21:58:14 +00:00
Neil 4f18d01a97 perf(wsl): a held WSL spawn reads the running list once, reusing only its own read (#36077)
* perf(wsl): a held WSL spawn reads the running list once

The provider-level holds (daemon adapter, daemon-off local provider) accept a running-list read started within a 5 s lease, so they reuse the startup-target hold's probe instead of running wsl --list --running again. A noted stop still forces a fresh read; a read older than the lease probes again.

* perf(wsl): a held spawn's provider hold reuses only that spawn's own running read

Replaces the 5 s lease: the startup-target hold records a read anchor on the spawn's options and reads after it; the provider hold reads after the same anchor, so it reuses that spawn's read and nothing older. No anchor means a fresh read; a noted stop or wake still forces one.

* fix(wsl): cap how old a spawn's own anchored read may be at the provider hold

A daemon respawn or a same-session history lock can sit between the two holds, so the provider hold reads after max(anchor, now - 2 s).
2026-10-29 14:56:29 -07:00
Neil 1e6b29a59c fix(ai-vault): bound WSL session carryover to the most recent scopes (#36090)
The WSL rows kept for a transient running-list failure were stored per
scope key in a module-global map with no limit, so every visited scope's
rows stayed alive until a history delete or a restart. The map now keeps
the 4 most recently used scopes (carrying a scope over counts as use) and
spends no slot on scopes without WSL rows. Explicit deletes still clear it.
2026-10-29 14:53:28 -07:00
Kelvin AmoabaandNeil c3518250c5 feat(browser): send compact annotation feedback by default, with page details as an opt-in (#35990)
* fix(ci): drop duplicate grab-annotations type and split chat subscription perf test

* feat(browser): send compact annotation feedback; page details are opt-in

Annotations sent or copied to an agent now carry the page, element label,
intent, selector, source file, text and feedback. Tab id, viewport, bounds,
classes, nearby context, computed styles, DOM path and HTML move behind an
'Include page details' checkbox in the Send menu, which also drives Copy.

* refactor(browser): share the annotation Copy tooltip and simplify the details toggle

* refactor(browser): keep tray types with page types

---------

Co-authored-by: Neil <neil@stably.ai>
2026-10-29 21:43:39 +00:00
Neil b03c540390 fix(ci): drop duplicate grab-annotations type and split chat subscription perf test (#36101) 2026-10-29 14:42:43 -07:00
Kelvin Amoaba 5ecfa8d5f5 fix(mobile): grow chat composer with its draft (#36083) 2026-10-29 21:42:39 +00:00
OrcaWinandOrcaWin f9a21bcfff test: remove redundant schema,registration,compact and language mapping cases (#36075)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 14:37:02 -07:00
Neil 7f3eb41bf7 fix(plugins): bound plugin preview cache to one current revision per plugin (STA-12859) (#36089) 2026-10-29 14:34:45 -07:00
NeilandNaufaldi 19f6c10c3f perf(renderer): drop group-has-[:focus-visible] rules that restyle whole subtrees (#36098)
Fixes #34312. Takes over naufaldi/orca#1 by @naufaldi, with the main.css part dropped because #34932 already covers it.

- SshTargetCard and the reasoning chevron now use the scoped `[[class~='group/x']:has(:focus-visible)_&]` shape. Tailwind's `group-has-*` compiles to a non-subject `:has()` whose subject is `*`, and that rule made Blink restyle whole subtrees on every mutation. This change is the entire measured win: 19.4 → 1.6 ms, 12.5 → 3.6 ms and 8.0 → 2.4 ms per mutation.
- rich-markdown-editor.css drops a redundant `:has()` on the TOC header, as defence in depth.
- Adds a guard, check-has-restyle-scope.mjs. It compiles the renderer's Tailwind CSS, adds plain stylesheets and the listed vendor stylesheets, and fails on any non-subject `:has()` whose subject has no class, id or attribute. Three pdf.js rules are baselined after being measured as harmless. It runs in lint, check:changed and PR CI in about 1.5 s.

Co-authored-by: Naufaldi <naufaldi.rafif@gmail.com>
2026-10-29 14:31:45 -07:00