Commit Graph
20022 Commits
Author SHA1 Message Date
buf0-bot[bot] 97f0dd7a04 Update README downloads badge (#39561)
Co-authored-by: buf0-bot[bot] <252831055+buf0-bot[bot]@users.noreply.github.com>
2026-11-07 18:20:34 +00:00
OrcaWinandOrcaWin e97b290cb8 test: remove 835 low-value tests (#39558)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 10:13:20 -08:00
Neil 4d33cd22cc refactor: group native chat session reads and delivery by owner (#39526) 2026-11-07 10:02:15 -08:00
OrcaWinandOrcaWin b0d15b6103 test: remove 587 low-value tests (#39553)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 09:48:15 -08:00
Neil 7ccc3c2e50 refactor: group native chat media, links and appearance owners (#39511)
* refactor: place native chat media and link code with defining owners

* refactor: preserve code control copy protection after relocation

* style: format rebased native chat owner imports
2026-11-07 09:37:06 -08:00
OrcaWinandOrcaWin 7ec3e7935b test: remove 676 low-value tests (#39550)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 09:30:22 -08:00
OrcaWinandOrcaWin eb9312fc7c test: remove 660 low-value tests (#39547)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 09:18:17 -08:00
OrcaWinandOrcaWin 3d8c3a899d test: remove 571 low-value tests (#39546)
* test: remove 571 low-value tests

* test: make tooltip render type portable

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 09:08:59 -08:00
OrcaWinandOrcaWin 4243da77d5 test: remove 414 low-value tests (#39539)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 08:41:24 -08:00
Neil c231b5d7da refactor: place renderer store state with defining feature owners (#39508) 2026-11-07 08:19:02 -08:00
OrcaWinandOrcaWin 5c5c7ca235 test: remove 283 low-value tests (#39533)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 08:11:30 -08:00
OrcaWinandOrcaWin 5f226987f1 test: remove 279 low-value tests (#39527)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 07:58:19 -08:00
OrcaWinandOrcaWin 5c487a8be4 test: remove 328 low-value tests (#39525)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 07:44:08 -08:00
OrcaWinandOrcaWin 9b98b38506 test: remove 137 low-value tests (#39522)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 07:20:11 -08:00
OrcaWinandOrcaWin e280eb0734 test: remove 125 low-value tests (#39513)
* test: remove 124 low-value tests

* test: remove 125 low-value tests

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 06:59:05 -08:00
OrcaWinandOrcaWin 5bd03f75f5 test: remove 124 low-value tests (#39509)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 06:46:19 -08:00
OrcaWinandOrcaWin deb834db05 test: remove 244 low-value tests (#39507)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 06:33:36 -08:00
Neil b165e387d3 refactor: retain settings owners and current test policy (#39451) 2026-11-07 06:25:50 -08:00
OrcaWinandOrcaWin cc6900fc0b test: remove 193 low-value tests (#39506)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 06:20:37 -08:00
b07b0432a4 fix(cursor): write workspace trust where cursor-agent reads it (#38807)
* fix(cursor): write workspace trust where cursor-agent reads it

cursor-agent names ~/.cursor/projects/<dir> by replacing every
non-alphanumeric character with '-', collapsing repeats, and trimming
dashes. Orca only replaced Windows-illegal characters, so paths with
'_', '.', spaces or non-ASCII got a marker cursor-agent never reads and
the trust menu appeared on every fresh worktree.

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

* test(cursor): cover space, non-ASCII and Windows paths in the trust slug test

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
2026-11-07 09:09:52 -05:00
OrcaWinandOrcaWin 3c4990dc03 test: remove 263 low-value tests (#39504)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 06:07:51 -08:00
OrcaWinandOrcaWin bd68461280 test: remove 264 low-value tests (#39500)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 05:56:06 -08:00
OrcaWinandOrcaWin c39a1b3627 test: remove 665 low-value tests (#39498)
* test: remove 262 low-value tests

* test: remove 665 low-value tests

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 05:43:22 -08:00
Kelvin Amoaba 7234301afb fix(mobile): finish Android dictation on a call, alarm or leaving the app (#39492)
* fix(mobile): finish Android dictation on a call, alarm or leaving the app

A transient audio-focus loss (call, alarm, assistant) left the mic recording
silence, and pausing the activity closed the mic only to reopen it on resume,
splicing a silent gap into the dictation. Both now end the recording and emit
an interruption, so dictation finishes and inserts what was heard. The
dictation hook also finishes when the app goes to the background, which
covers iOS and shells without this native change.

* fix(mobile): keep a dictation that is waiting on the Android mic prompt

* fix(mobile): keep Android recording state consistent across the focus and JS threads

* refactor(mobile): name the Android pause path for what it does and stop retaking focus on resume

* fix(mobile): keep what the open mic heard when leaving during a pending host start

* fix(mobile): close the open mic at once when leaving during a pending host start

* fix(mobile): a second page capture end waits for the stop already in flight
2026-11-07 13:30:50 +00:00
Kelvin Amoaba b9832c2106 fix(mobile): show the phone speech download size only for English (#39496) 2026-11-07 13:19:23 +00:00
OrcaWinandOrcaWin 5fc5aa435e test: remove 295 low-value tests (#39494)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 05:10:40 -08:00
Kelvin Amoaba 3501cd2f1c fix(mobile): keep on-device speech text revisions rising across sessions on iOS (#39481) 2026-11-07 12:53:36 +00:00
OrcaWinandOrcaWin 274b3e359f test: remove 65 low-value tests (#39491)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 04:51:05 -08:00
Kelvin Amoaba 5dae65c4b4 fix(mobile): treat a slow phone speech service as busy, not unsupported (#39489) 2026-11-07 12:36:51 +00:00
OrcaWinandOrcaWin 3ca9cb8bc2 test: remove 242 low-value tests (#39487)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 04:36:43 -08:00
OrcaWinandOrcaWin cecfa9865d test: remove 158 low-value tests (#39483)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 04:18:13 -08:00
Neil 27a724e303 refactor(backend): import defining owners and extract ACP startup (#39417)
* refactor(backend): use defining owners for orchestration and ACP startup

* test(orchestration): trim redundant observations and retain safety cases

* test(orchestration): seed restored sessions with one fixed operation clock
2026-11-07 04:15:38 -08:00
Kelvin Amoaba 9ea9ea9a19 fix(mobile): show the phone speech download size and drop a cancelled session's late text (#39479)
* fix(mobile): show the phone speech download size and drop a cancelled session's late text

* fix(mobile): show the Android language download size too

* fix(mobile): keep a recognizer error raised while its start resolves, and read the download size aloud
2026-11-07 12:07:17 +00:00
OrcaWinandOrcaWin c8ed5c6be4 test: remove 295 low-value tests (#39480)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 04:03:51 -08:00
Neil 09722a6cf2 feat(antigravity): run Full access chats on the host's agy with --dangerously-skip-permissions (#39471)
agy has no Full access session mode, so Full access chats always fell back to
Orca's managed runtime, which kept most people off the host's agy (and off
Intel Macs, where only the host can run it). agy 1.5.2+ `agy acp` accepts
--dangerously-skip-permissions, which approves tool requests but not plans.

Host chats now launch with that flag only in Full access, in agy's default
mode. Switching permission mid-chat already restarts the ACP process and
resumes the session, so the flag follows the chat's mode. The flag never
approves plans, and Orca still leaves agy's requests to the person, so plan
approvals keep surfacing.

The cached readiness check launches with the flag, so a build that rejects it
keeps chats on Orca's runtime without an extra spawn; such a binary is not
checked again until it changes. Because ask and Full access both run agy's
default mode, the reported mode is read per launch, so a Full access chat
does not show as Ask.

Refs #39006, #33188
2026-11-07 03:58:51 -08:00
Neil c0e8e4e6eb docs(plugins): theme background video ships in 1.4.254 (#39478)
#39450 merged after the 1.4.253 cut, so the videoPath since-version and the
theme reference name 1.4.254.
2026-11-07 03:49:08 -08:00
Neil b0dd73e7aa feat(plugins): play a looping video behind app themes (#39450)
App themes may set background.videoPath: a muted, looping MP4 or WebM (H.264
recommended, VP9 or AV1; one video track, no audio; <= 60 s, 8 MB, 2.3 MP)
played over the required static background.path. Main checks it from container
headers without decoding and serves it on the orca-plugin-image slot
theme-<i>-video; images stay static-only. The renderer reveals it on its first
frame, keeps the still on any failure or a decoded size past the limits, plays
it only while main reports the window focused, shown and not minimized and no
dialog is open, and omits it under prefers-reduced-motion.

Animated WebP was measured and declined: software-decoded every frame, it cost
11-23 points of CPU vs 3-10 for the same loop as video.

Implements #38363 proposed by @dohaidang.
2026-11-07 03:32:14 -08:00
Neil 23808bb73f refactor(renderer): organize host and terminal owners and remove forwarding shells (#39320)
* refactor(renderer): organize host and terminal implementation owners

* fix(refactor): align active adoption reliability references

* refactor(terminal): remove forwarding shells and stale mocks

* fix(renderer): consolidate direct owner imports

* fix(refactor): route incoming issue trust type to its owner

* test(runtime): give independent status viewers separate pairing tickets

* style(refactor): normalize rebased terminal mock formatting
2026-11-07 03:31:13 -08:00
Neil aa3cf3b027 refactor(native-chat): tidy the rail wake hook and cover it with tests (#39477)
Store absolute deadlines instead of two last-seen timestamps, and let
scroll events with no wake pending return before reading the clock.
Behaviour is unchanged.
2026-11-07 11:27:47 +00:00
Kelvin Amoaba 2d79ec271c fix(mobile): report a slow Android speech service as busy, not unsupported (#39476)
* fix(mobile): report a slow Android speech service as busy, not unsupported

* fix(mobile): replace only the speech recognizer the service disconnected
2026-11-07 11:23:06 +00:00
OrcaWinandOrcaWin a523f1d4c5 test: remove 32 low-value shared helper tests (#39475)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 03:20:35 -08:00
0173de9b52 fix(plugins): don't count time asleep as worker idle time (#28299)
* fix(plugins): don't count time asleep as worker idle time

The idle reaper measured idleness with the wall clock, so after a sleep longer than the reap window its first sweep reaped every worker before their own timers could fire. A sweep gap well past the 60s interval now starts a fresh idle window.

* fix(plugins): count a sleep before the first idle sweep as asleep, not idle

Start the reaper's sleep-detection clock when the first worker starts, so the
first sweep after waking can see the gap even if no sweep ran before the lid
closed.

* fix(plugins): keep worker manager under max-lines and restore real timers after sleep tests

Move the idle-candidate filter into PluginWorkerIdleClock so the rebased manager
stays within the 300-line lint cap, and reset fake timers after the idle-reap
tests so the sleep-before-first-sweep case does not leak them.

---------

Co-authored-by: petersindex <287557875+petersindex@users.noreply.github.com>
Co-authored-by: Neil <neil@stably.ai>
2026-11-07 03:19:46 -08:00
NeilandJinwoo-H e7b0e4029e fix(antigravity): say why a downloaded chat runtime failed its start check (#39456)
The managed-runtime install message now names the observed cause after the
existing headline: a timeout, an exit code with a redacted stderr excerpt, or
the version the server answered as. The host agy check that shares the
initialize helper is unchanged.

Takes over #34167 by @Jinwoo-H (away), ported onto main after #39006.

Co-authored-by: Jinwoo-H <73622457+Jinwoo-H@users.noreply.github.com>
2026-11-07 03:17:56 -08:00
NeilandCopilot 8ceea00464 perf(terminal): stop painting busy TUI frames twice on non-Windows DOM terminals (#39462)
Live foreground output with background colors or in-place rewrites
requested a synchronous xterm row repair after every write, on top of
the dirty-row frame xterm had already queued while parsing. Busy
OpenCode frames all carry background SGR, so DOM panes painted each
frame twice.

The synchronous repair exists for Windows ConPTY DOM rendering. Keep it
there and let other platforms merge the repair into xterm's queued
frame. Replay and snapshot refresh policy is unchanged.

Drop tests that only asserted the private synchronous refresh call.

Fixes #22458

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-11-07 03:16:44 -08:00
BingZandNeil a93741a901 fix(plugins): surface reserved-identity install errors for local forks (#12606)
* fix(plugins): surface reserved-identity install errors for local forks

Official template forks keep stablyai/orca-* identities that correctly
cannot install from a local path, but the UI swallowed the reason as a
generic failure. Keep the security block and show actionable rename
guidance in the install dialog (#12598).

* test(plugins): mock i18n for reserved-identity error presentation

* fix(plugins): match reserved-identity errors before git heuristic

Production trust strings mention github.com; the broad /(git|...)/ check
matched the "git" substring inside "github" and mis-surfaced reserved
fork installs as fetch failures. Prefer reserved-identity matching and
lock presentation tests to the full pluginInstallTrustError strings.

* fix(plugins): map the current reserved-name install refusal to rename guidance

Main now refuses reserved plugin keys from every non-official source with
"<key> uses a name reserved for official Orca plugins; ...", so the
author's matcher on the old "reserved plugin identity" string never fired
and forks of official templates still saw the generic install failure.
Match the current string (before the Git heuristic), use one message that
tells the user to rename id/publisher, and register the English key.

Refs #12598

---------

Co-authored-by: Neil <neil@stably.ai>
2026-11-07 03:07:37 -08:00
Pr1pandNeil 3585a38b72 fix(plugins): resolve workspace context for remote active workspaces (#38671)
* fix(plugins): resolve the active workspace context on remote hosts

* fix(plugins): scope the remote workspace context to its host

* docs(plugins): document the remote context resolver

* fix(plugins): keep remote context ids raw and never fall back for local rows

The stored-row fallback returned host-qualified ids (ssh:host|repo::path), which no
terminal selector or agent-status row matches, so agents.list stayed empty for the
remote workspace. It also answered for a removed local worktree, turning a stale
focus that used to read null into a context for a workspace that no longer exists.

* fix(plugins): resolve a focused paired-server workspace from the desktop's server rows

A paired orcad server's workspaces live in that server's store, so neither the local
catalog nor the desktop's stored rows can name one and workspace.readContext,
workspace.changed and agents.list saw no context. The runtime now asks the relay host
catalog, which answers from the worktree.ps rows the desktop already caches. Only a
miss on a reachable server fetches, bounded at 1.5 s and at most once per 10 s per
missing workspace; an unreachable or hung server answers null.

* fix(plugins): keep a stale local focus stamp resolving as before, and cover #38653 end to end

A focus stamped 'local' whose repo row now routes elsewhere resolved through the
unscoped selector before #38653; the host-scoped lookup turned it into null. A
local stamp now retries unscoped, so local and unstamped focus answers exactly
what main did. Remote stamps keep the scoped lookup, so a paired-server focus
never borrows a local twin's context.

Tests: real-git parity of local, folder and SSH contexts against the pre-change
selector answer for every session shape the renderer writes; panel polling
against a hung or failing server (one fetch, one bounded wait per 10 s window);
an e2e that pairs a desktop with a headless Orca server, clicks a local and a
server row, reads workspace.readContext from a plugin panel, and keeps polling
fast after the server goes away.

---------

Co-authored-by: Neil <neil@stably.ai>
2026-11-07 03:04:32 -08:00
Neil 35975c0580 feat(themes): theme tokens for chat text styling and a readable chat selection (#39432)
* feat(themes): public plugin theme tokens for chat text and selection

Themes can now set chat bold text, muted text, inline code, code blocks and
the chat selection. Omitted tokens paint exactly what chat painted before,
except the selection, which now keeps selected text 4.5:1 by default.

* docs(themes): note the bubble and code-block checks for chat text tokens

* fix(themes): never lower the chat selection under its visible floor
2026-11-07 03:02:23 -08:00
OrcaWinandOrcaWin 07e55b91f7 refactor(renderer): spell out logical assignments React Compiler can't lower yet (#39339)
React Compiler skips any function containing `??=`, `||=` or `&&=`. Rewrite
the statement-position ones whose target re-reads without side effects
(identifiers and plain member chains) as the equivalent `if`:

  a ??= b  ->  if (a == null) { a = b }
  a ||= b  ->  if (!a) { a = b }
  a &&= b  ->  if (a) { a = b }

21 files; 25 fewer bailouts and 12 more compiled functions in the
compiler-compat baseline.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-07 02:59:48 -08:00
cb3f367b33 fix(plugins): isolate development watcher retries by root (#38289)
* fix(plugins): isolate development watcher retries by root

* test(plugins): keep coverage for late binding checks after housekeeping disposal

The per-root rewrite replaced the old housekeeping unit tests; restore the
disposal/coalescing case so a slow check that resolves after dispose cannot
restart a watcher or refresh, and per-root checks do not stack.

* fix(plugins): skip the full plugin rediscovery while a dev folder retry keeps failing

A maintenance retry that subscribes already refreshes itself; one that keeps failing (an
unreachable WSL share) rediscovered every plugin each tick. Only a changed root binding needs
discovery now.

Also covers what the per-root rewrite must keep: adding/removing a folder leaves the others'
watchers and frame revisions alone and releases its subscriptions, a rejecting registration
retries once per tick, Linux sibling folders keep separate parent watches, and an Electron e2e
where deleting/recreating/removing one dev folder never reloads another folder's open panel.

---------

Co-authored-by: be0hhh <182023099+be0hhh@users.noreply.github.com>
Co-authored-by: Neil <neil@stably.ai>
2026-11-07 02:58:29 -08:00
Agustin Varela b62351f9ce fix(plugins): forward sidebar and zoom shortcuts from plugin frames (#37939)
A focused plugin frame resolved Mod+B/Mod+L to the sidebar toggles and
Mod+=/-/0 to zoom, but the guest forwarder had no sidebar branch and
dropped zoom for non-page guests, so the plugin kept the keys.
2026-11-07 02:57:26 -08:00