* feat(telemetry): report plugin installs and removals from Orca's public catalogs
* refactor(plugins): move marketplace install origin out of the installer
* fix(wsl): main's background start preps its host env without waking the distro (E9)
* fix(wsl): daemon-off background starts prep their env without waking the distro (E9)
* fix(acp): update Antigravity model and effort metadata
* fix: confirm ACP model families and idle option metadata
* Preserve provider-owned model and effort selection
* test: repair model option host and consumer fixtures
* Use the provider child type for optional delivery ownership
* test: match model option fixtures to their protocol contracts
* fix: isolate resting options from adapter type dependencies
* Preserve Antigravity option fixture types
* Match option fixture control response contract
---------
Co-authored-by: Vyacheslav Scherbinin <gentslava@mail.ru>
* fix(editor): preserve literal text in citation paste fallback
* test(editor): drop paste-meta implementation assertion from fallback test
---------
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Find stale lowlight decorations of touched code blocks in the old DecorationSet, remove them, then map only the survivors instead of mapping every span and searching by mapped bounds.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* fix(claude): ignore a launcher's own version when choosing hook events
* Bind Claude capability versions to identified output
* Complete Claude version probe test process results
* perf(editor): collect review note elements once per geometry pass
* test(editor): drop selector call-count tests for review note heights
---------
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* fix(editor): scope delayed review saves to the current draft owner
* fix(editor): drop unreachable root/editor-swap checks from review submit guard
---------
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* feat(computer): send tree diffs after actions and add get-app-state --query
Action results now carry only the accessibility-tree lines that changed since
the caller's last view of the same window (~ changed, + added, - removed as
index ranges, or an explicit no-change line), plus the focused element. The
runtime sidecar keeps the last tree per session/worktree and app, so all three
providers get it. The CLI opts in with treeDiff; older runtimes strip the
param and keep returning the full tree, and --full-tree opts out.
The macOS helper now keeps an element's index across snapshots of a window:
AX identity first, then the next unclaimed index with the same signature for
views that rebuild their AX objects, and never reuses a removed index.
get-app-state --query prints matching elements with their ancestors and
--max-elements caps the output, both in the CLI over the rendered tree.
Custom action names with raw newlines no longer split an element over lines.
* fix(computer): preserve parent changes in snapshot diffs
* fix(computer): refuse stale index reuse for lookalike controls
* fix(computer): print full trees in action replies
* fix(computer): keep controls located in snapshot replies
* fix(editor): preserve combining marks in whole-word replacement
* fix(editor): keep whole-word boundaries after emoji presentation sequences
Resolve a leading combining mark to its base character so VS16 after an
emoji does not count as a word character, treat enclosing marks (keycaps)
as symbols, and drop the redundant hook-level undo/redo test.
---------
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* 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
* 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>
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>
* 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
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
* 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>
* 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
* 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>
* 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
* 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