Commit Graph
16002 Commits
Author SHA1 Message Date
AdolaniumandNeil b10f90c8f9 fix(files): restrict staged saves to their owner (#36343)
* fix(files): restrict staged saves to their owner

* fix(files): remove a temp restriction cannot keep

writeSecureFile publishes the file before it reports that owner-only permissions failed, and nothing else tracked it.

* fix(files): reject a staging directory whose mode does not stick

chmod can succeed on DrvFs without making the directory owner-only. Non-Windows setup now refuses unless the directory mode is 0700.

* fix(files): keep staged saves working where owner-only modes don't stick

Create the temp owner-only at creation (wx + 0o600) instead of through
writeSecureFile, and treat a staging folder whose mode or ACL cannot be
tightened as a one-time warning rather than a save failure, so network,
FAT and some WSL mounts keep saving.

---------

Co-authored-by: Neil <neil@stably.ai>
2026-11-06 16:24:28 -08:00
Neil bb5f37c916 feat(pairing): unscanned desktop pairing codes expire (QR 10 min, link 60 min) (#37957)
* feat(pairing): unscanned desktop pairing offers expire (QR 10 min, link 60 min)

Headless serve/orcad mint offers without a TTL, so they never expire.
Paired rows and rows without offerExpiresAt are unaffected.

* feat(pairing): refresh the mobile QR before it expires and show runtime link expiry

The QR re-mints a minute before expiry while visible; an unused runtime
link shows its expiry and, once expired, is replaced by a notice. Web
clients rejected while pairing now suggest asking for a new link.

* feat(mobile): say a refused pairing code expired or was replaced

A first pairing the desktop refuses (direct or Relay) now asks for a new
code instead of showing the raw transport error.

* refactor(pairing): replace type assertions in code-refusal detection and tests

* test(mobile): re-record pairing race golden for refused-code error

* fix(pairing): keep pairing codes valid across sleep and stale registry writers

- QR refresh rechecks the wall clock every 15 s and on window focus, so a
  computer waking from sleep never keeps showing an expired code.
- A registry save from a process with an older copy can no longer reset a
  paired row back to unscanned (which would let its offer expire).
- The QR caption says how long a copied code works.

* test(pairing): annotate the IPC handler stub cast
2026-11-06 16:23:44 -08:00
Neil a745884b17 fix(automations): store the approved setup hash and skip setup when a run's branch differs (#37979)
* fix(automations): store the approved setup hash and skip setup when a run's branch differs

Saving an automation with setup run records the hash of the content the user
approved; headless, chat and desktop-dispatched runs send it with the create,
so a branch whose setup differs skips setup (logged on the host). Writes that
set the decision without a hash (CLI --setup run) and older automations keep
today's behaviour.

* fix(automations): show on the run when setup was skipped because the branch differs

Runs record setupSkippedReason 'setup-changed' when the new workspace's
orca.yaml setup differs from the hash saved with the automation (headless,
chat and desktop-dispatched runs), and the run page says so with what to do.
The note survives the run's completion update.

* test(automations): pass run history to the setup-skipped run details test
2026-11-06 16:23:20 -08:00
Kelvin Amoaba 768df33d84 fix(dictation): handle cloud dictation's 10-minute cap, stalled uploads and bad API keys (#39114)
* fix(dictation): bound cloud uploads, stop at the 10-minute cap, check the OpenAI key on save

* refactor(dictation): share the OpenAI error reader
2026-11-07 00:22:24 +00:00
Kelvin Amoaba ea32ccb0ec fix(dictation): show Listening while the speech model loads, and link start toasts to Voice settings (#39136)
* fix(dictation): say Listening once the mic is recording, and translate start toasts with an Open Settings action

* refactor(dictation): derive the indicator label from the listening flag
2026-11-07 00:21:33 +00:00
Kelvin Amoaba a3a0e68380 fix(packaging): require macOS 13.4, the minimum the on-device speech engine runs on (#39135)
* fix(packaging): require macOS 13.4, which the bundled speech engine needs

* fix(updater): keep the macOS requirement title clear of the close button

* fix(packaging): check out the Darwin floor table for adhoc builds and raise the cask floor

* refactor(updater): reuse the parsed Darwin floor for the macOS requirement

* fix(updater): use a margin to keep the macOS requirement title clear of the close button

* fix(updater): say the macOS requirement comes from Electron and the speech engine
2026-11-07 00:18:50 +00:00
Kelvin Amoaba efc27ee8ee fix(terminal): finish a paste in its terminal when dictation or overlays move focus mid-paste (#39112)
* fix(terminal): finish a paste when focus moves to a non-input control mid-paste

External dictation tools and overlays can leave focus on a control outside the pane while the clipboard read is in flight, and the paste was thrown away as stale. Only cancel when another paste target (terminal, input, frame) took focus.

* fix(terminal): count Monaco and rich editors as paste targets

* test(e2e): a paste survives focus moving to a non-input control mid-read

* refactor(terminal): one focus rule for terminal and popout paste

* test(e2e): scope each focus-move script so later cases actually move focus
2026-11-07 00:18:12 +00:00
Kelvin Amoaba 58c739b75c fix(speech): add a dictation language setting that Whisper, SenseVoice and OpenAI use (#39102)
* fix(speech): send the dictation language to Whisper, SenseVoice and OpenAI

The voice language setting was stored but nothing read it, and its 'en' default never came from the user. Replace it with dictationLanguage (default auto), pass it to every engine that accepts one, and add a picker that says when the selected model ignores it.

* test(settings): add dictation language fixtures

* refactor(speech): keep each model's dictation languages on its catalog entry

Language support belongs to the model, not its engine type, so an English-only Whisper build can't be sent another language. Also reuse SettingsRow and cache Intl.DisplayNames.

* fix(speech): let SenseVoice users pick Cantonese

* test(speech): drop type assertions from the new language tests
2026-11-07 00:17:37 +00:00
Brennan BensonandWooseong Kim ef68fa9bb3 Shrink oversized pasted images to fit instead of failing with "Clipboard image is too large" (#39050)
* fix(clipboard): shrink re-encoded paste images to fit size limits instead of rejecting

Pasted images are re-encoded as PNG before saving, and the size cap was applied to
that output, so a retina screenshot or copied photo that grew during re-encoding
failed with "Clipboard image is too large". Downscale until it fits at every
re-encode site (desktop clipboard image, Windows copied files, renderer conversion).

Fixes #37855

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>

* fix(clipboard): keep image copies full size; only pastes shrink to fit

Copy image shares the PNG conversion with paste. Copies keep rejecting an
oversized PNG instead of silently copying a smaller image, and canvas
downscales use high smoothing quality.

* test(clipboard): match macOS paste tests to downscale-to-fit

Image mocks gain resize; the over-pixel-cap rejection case is removed since
those pastes now downscale (covered by the handler regression test).

* fix(clipboard): let pasted non-PNG images above the pixel cap downscale in the renderer

* test(clipboard): drop web paste test for the removed over-pixel-cap rejection

* fix(clipboard): let pasted PNGs above the pixel cap downscale instead of rejecting

* fix(clipboard): route web PNG pastes through the fit-to-limit converter

---------

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-11-06 16:11:45 -08:00
Brennan Benson d84abfb4f5 Offer terminal sign-in recovery in native agent chats (#39012)
* Offer terminal sign-in from native chats and retain refused worker tasks

* Handle sign-in terminal failures and complete failed-start cleanup callers

* Read retry task identity from its dispatch context

* Assert retained transcript identity through the bounded worker read

* Remove obsolete private structured retry teardown assertion

* Use real signed-out Pi and OMP error frames in regression coverage

* Route chat sign-in through explicit host terminal creation

* Keep paired agent launch owner explicit in the tightened terminal contract

* Keep focus baseline pruning limited to the removed reads

* Keep terminal login recovery available for unresolved model notices

* Keep the Grok diagnostic assertion scoped to its refused delivery

* Limit chat sign-in subscriptions to eligible failure rows

* Pass the execution host in terminal creation fixtures

* Scan Pi OAuth failures linearly and verify shared sign-in bounds

* Assert failure metadata and diagnostic routing without translated copy

* Bound diagnostic matcher steps at the Pi failure boundary

* Type the diagnostic matcher receiver explicitly

* Check sign-in button elements with a DOM type guard

* Recognize Pi credential failures and keep one recovery action

* Keep Pi sign-in diagnostics behind failure details

* Verify recovery action changes while refusal wording stays stable

* Use the recorded refusal sentence in the recovery fixture

* Type the recovery fixture as a submission rejection

* Make chat sign-in actions large primary controls

* Reuse primary action styles without duplicate notice subscriptions

* Keep translated primary chat actions within narrow notices
2026-11-06 16:06:14 -08:00
Jinwoo Hong 555bd481bc Let multi-repo folder workspaces parent and nest workspaces, including on other machines (#38904)
Multi-repo folder workspaces can parent workspaces on this machine and on paired servers, and their children nest under them in the sidebar and on the phone. Task parents are inferred at creation instead of on every lineage refresh.
2026-11-06 19:03:51 -05:00
Brennan Bensonandlydiassssz 548ba48c32 Upload images before publishing GitHub drafts (#38928)
* Upload GitHub images when pasted or dropped

Keep image bytes out of issue and review bodies by uploading from the owning composer and inserting hosted attachment URLs.

Co-authored-by: lydiassssz <60514233+lydiassssz@users.noreply.github.com>

* Preserve GitHub image intake across editor and thread states

* Keep image placeholder boundaries and ordinary HTML paste intact

* Match the native replace overload in the image projection fixture

* Use typed element queries in the image intake fixture

* Narrow textarea elements at the fixture boundary

* Show failed GitHub draft images as filename links

* Keep GitHub draft attachment links current across updates

* Supply the repository address in the attachment preview fixture

---------

Co-authored-by: lydiassssz <60514233+lydiassssz@users.noreply.github.com>
2026-11-06 16:03:20 -08:00
Jinjing a5da3ed41e Highlight already open structured agent panes (#39219) 2026-11-06 15:49:44 -08:00
Neil 2137a614d9 feat(browser): show when an SSH host is controlling Orca browser tabs, and let people stop it (#39212) 2026-11-06 15:49:24 -08:00
0b5a293fa2 feat(serve): add bind address option (#35095)
* feat(serve): add bind address option

* fix(serve): validate service bind address

* fix(serve): validate bind flag values

* fix(serve): reject scoped bind addresses

* docs(serve): document bind option paths

* docs(serve): note that --mobile-pairing needs an all-interfaces bind

* fix(serve): move bind address parsing to shared so the packaged CLI can load it

The packaged CLI ships out/cli and out/shared but not out/main/orcad, so
cli/runtime/serve-bind-flag.js failed the packaged runtime-import check
(and would fail to load) when it imported main/orcad/orcad-bind-address.
Move the module, unchanged, to src/shared and point orcad, Electron serve
and the CLI at it.

* test(serve): pin down the default listener and the --bind startup paths

- Extract the Electron serve listener pin into resolveServePinnedBindHost
  and test that serve without --bind stays unpinned (all interfaces, as
  before), an explicit --bind pins it from either argv form, and the orcad
  browser sidecar stays on loopback.
- Golden the orcad and Electron serve argv without --bind against the
  pre---bind output.
- Test that the CLI passes bind only when given and refuses --bind with
  --mobile-pairing before launching.
- Guard that serve-bind-flag and the shared serve validation load only CLI
  and shared modules, which is what the packaged CLI ships.

---------

Co-authored-by: lw <13579959+bertramlongwuyan@user.noreply.gitee.com>
Co-authored-by: Neil <neil@stably.ai>
Co-authored-by: xuanchangfeng <210147232+xuanchangfeng@users.noreply.github.com>
2026-11-06 15:47:42 -08:00
Neil 490a5c05b8 fix(hooks): run a created worktree's setup once its own content is approved (#37978)
* fix(hooks): run a created worktree's setup once its own content is approved

Adds worktrees:runApprovedSetup (IPC) and worktree.runApprovedSetup (RPC,
capability worktree.run-approved-setup.v1). The host re-hashes the worktree's
setup and default-tab commands, runs them only on a match, and otherwise
reports the new content. After a create mismatch the host opens only the
command-less default tabs; approving in the trust prompt starts setup and the
command tabs. Clients whose host lacks the capability keep setup skipped.

* fix(hooks): review a created branch's different setup from the workspace, not instead of it

The trust prompt now says the workspace was created and its branch's setup
differs; approving runs it for that workspace without replacing the primary
checkout's approval (which made the next create prompt twice). Declining shows
a toast whose Review setup action reopens the prompt. Repo-wide trust returns
the content's hash so the host can run it.

* fix(worktrees): import approved setup from its path after the RPC methods move
2026-11-06 15:37:32 -08:00
Neil 051bc5bc15 refactor(terminal): organize PTY connection lifecycle owners (#39188)
* refactor(terminal): organize PTY connection lifecycle owners

* refactor(terminal): consolidate imports from concrete owners

* test(e2e): assert durable pending automation acknowledgement
2026-11-06 15:23:27 -08:00
NeilandClaude d5d92649ac plugins: show the publisher when two plugins or themes share a name (#39205)
Co-authored-by: Claude <noreply@anthropic.com>
2026-11-06 15:15:26 -08:00
Brennan Benson e0005f5cbf Attach existing worktrees to folder workspaces from the CLI (#39018)
* feat(cli): attach existing worktrees to folder workspaces

worktree set accepts --parent-worktree folder:<id> (hosts advertise
worktree.set.folder-parent.v1), keeping each worktree to one parent in the
store. --parent-worktree active/current resolves to a folder workspace from
its terminal or enclosing directory, and worktree create without --repo under
a folder workspace lists the folder's Git repositories with a ready command.

* fix(cli): report folder parents and keep typed flags in folder repo choices

worktree show/set report a folder parent; the missing-repo error lists --repo
choices to add to the user's command and names the Attached worktrees panel.
Load and import repairs skip malformed rows and only touch imported worktrees,
an import keeps a worktree's existing parent, a twin-owned folder parent warns,
and folder ambiguity keeps its choices.

* fix(persistence): settle one parent per imported worktree before writing

An Orca server migration import now decides each touched worktree's parent
before any write: an explicit folder parent replaces an inferred worktree
parent, any other disagreement refuses the import. --parent-worktree active
in a folder terminal still lists the folder's repositories.

* fix(persistence): let a folder parent beat hydrate's inferred worktree parent

Load repair and import reconciliation share one rule: an inferred worktree parent loses
to a folder parent when the folder was chosen explicitly or the worktree parent carries
hydrate's orchestration stamp. Import tests now run payloads through the manifest parser
and cover a conflict that appears after staging.

* fix(cli): list folder repos when active resolves to the enclosing folder

worktree create without --repo used only the terminal's env to find the folder, so
--parent-worktree active run outside an Orca terminal fell back to the generic
missing-repo error. Use the parent create already resolved.
2026-11-06 15:13:57 -08:00
Neil 71ebf751a3 fix(hooks): run worktree setup only when its content matches the approved script (#37977)
* fix(hooks): run worktree setup only when its content matches the approved script

Clients may send approvedSetupHash with a create. After git worktree add the
host hashes the created branch's shared setup and default-tab commands with
the prompt's function; on a difference it skips them and returns
setupTrustMismatch with the branch content. Creates without a hash (older
clients, CLI, mobile, orchestration) and older hosts behave as before.

* fix(hooks): send the approved setup hash and re-prompt on a changed branch

The composer and direct work-item creates send the hash of the setup content
the user approved (empty content included; none under repo-wide trust or
local-only policy). When the host reports different branch content, show a
setup-skipped toast and the existing trust prompt with that content.

* test(hooks): hash the prompt's and the host's orca.yaml from the same fixture

Covers CRLF and BOM primary checkouts, the plain-HTTP digest, the hash a
runtime host reports to remote and mobile clients, run-both and local-only
policies, creates without a hash, and pins the digest so a format change is
deliberate.

* style(worktrees): keep the creation flow under the line limit
2026-11-06 14:58:05 -08:00
Neil de80cd74c0 fix(agents): list agents found through a custom command path (#39178) 2026-11-06 14:52:08 -08:00
Neil 5ed96fbdd9 fix(browser): require a per-session token on the local CDP proxy (#37938)
* fix(browser): require a per-session token on the local CDP proxy

* fix(browser): reset the helper session when the CDP proxy refuses it

Explain a 403/404 handshake from Orca's CDP proxy and retire the session so
the next command gets a fresh proxy and helper. Drop an inherited
AGENT_BROWSER_CDP from the helper env so only Orca names the target, and pin
the env contract and minimum bundled agent-browser version in tests.
2026-11-06 14:42:33 -08:00
Neil 738396cc7f fix(setup): review imported setup scripts in a dialog before saving (#37937)
* fix(setup): show the detected command for every setup import source

* fix(setup): review imported setup scripts in a dialog instead of inline

Imported setup and archive scripts can be long, so the setup card now shows
the first command and a Review setup script button. The dialog shows the full
setup and archive scripts and is where non-package-manager imports are saved.
Package-manager suggestions stay inline and editable as before.

* fix(setup): use compact dialog title and description sizes
2026-11-06 14:42:01 -08:00
Neil b9a4b5fd2f fix(plugins): re-review any plugin whose catalog moves it to another repository (#36643)
* fix(plugins): drop a plugin's approval when its catalog moves it to another repository

* plugins: revokePluginConsent refuses when the plugin service is not running

* cli: orca plugin install/update ask again when a plugin moves to another repository, for every plugin kind
2026-11-06 14:41:29 -08:00
Brennan Benson 92590de7ea Allow Gemini Enterprise sign-in for Antigravity Chat (#38737)
* Support Gemini Enterprise authentication for Antigravity Chat

* Keep Antigravity account settings current across clients

* Type the mutable account snapshot fixture

* Keep account settings readable during Antigravity sign-in

* Use standard account form controls and localized placeholders

* Refresh Antigravity account settings after host reconnect

* Annotate the account form fixture without a cast

* Keep Antigravity auth settings at the ACP boundary

* Exercise host settings in the Enterprise sign-in regression

* Save visible Antigravity account settings before sign-in

* Remove obsolete account Apply copy and correct renderer test types

* Put Antigravity sign-in choices before the action

* Keep unchanged account fields editable on blur

* Preserve Antigravity sign-in status beside account choices

* Fix sign-in status predicate type narrowing

* Reject unconfirmed Antigravity account settings

* Show a shared Antigravity account failure once

* Type the Antigravity publication candidate

* Pair Antigravity settings failures with meaningful recovery

* Register account failure copy and refresh the schema catalog

* Keep the latest Antigravity save outcome ahead of delayed reads

* Type the retained account normalization fixture directly

* Keep RPC recovery coverage within its project boundary

* Keep Antigravity settings recovery in the Sign in action

* Keep unavailable Antigravity choices out of the recovery form

* Keep Antigravity settings reads stable across renders

* Retain the ACP task fixture deletion option type

* Hide unavailable Antigravity sign-in choices after a load failure
2026-11-06 14:36:37 -08:00
Neil 1824515698 fix(plugins): warn, not fail, when a language pack translates protected security text (#39187)
Orca already drops protected strings when it loads a language pack and keeps
its own English text for trust, permission and destructive dialogs.
validate:plugin and orca plugin validate still rejected the whole pack, so the
community directory refused otherwise-good packs. They now report how many
protected strings are ignored as a warning; every other pack rule stays strict.
2026-11-06 14:35:22 -08:00
Jinjing c21f3c5173 Redesign plugin details with publisher discovery (#39181)
* Redesign plugin detail pages with publisher discovery

- Show publisher provenance, related plugins, and clearer source links
- Preserve installed release attribution and README links across catalog changes
- Support navigation between plugin pages while preserving review queues

* Fix publisher link button styling

* Format resolved installer test

* Remove unrelated scratch files
2026-11-06 14:34:25 -08:00
Neil be3b87f3ac cli: add orca plugin install, update, uninstall and catalog list/add/rm (#36647)
* cli: add orca plugin install, update, uninstall and catalog list/add/rm

* plugins: escape the invisible-character regex so the orcad bundle stays ASCII

* plugins: split approval re-run helpers and plugin RPC binding to stay under max-lines
2026-11-06 14:20:27 -08:00
Neil bf07b8f60e fix(antigravity): say Antigravity Chat isn't available on Windows instead of silently opening a terminal (#38997)
* fix(antigravity): say Antigravity Chat isn't available on Windows instead of silently opening a terminal

Google publishes no Windows agy-acp-server, so a Windows host refused
Antigravity chats with the generic 'agent' reason: launches fell back to a
terminal with no explanation and Settings showed nothing.

A Windows host now reports reason 'windows' (createSupport and published
availability), which launch receipts state as chat_unavailable_on_windows,
the new-tab picker labels 'No chat on Windows yet', and explicit-chat
failures explain. Agents and Accounts settings say so for a Windows host.
The decision is the execution host's OS, so a Windows client chatting on a
macOS or Linux host is unaffected; one predicate
(structuredChatUnavailableOnPlatform) gates it all.

Fixes #30817, STA-11245

* docs: correct chatUnavailableOnThisDesktop comment
2026-11-06 13:59:04 -08:00
Kelvin Amoaba 025d63514e fix(speech): stop offering the Zipformer EN dictation model and move its users to Parakeet v2 (#39173)
* fix(speech): stop offering Zipformer EN 20M and move its users to Parakeet v2

The model drops the start of every utterance. A replacedBy catalog field hides
it from the desktop and phone pickers, and a saved selection loads as Parakeet
v2. Downloaded files stay listed in Settings so they can be deleted.

* fix(speech): dim the retired model row in the Voice picker

* refactor(speech): share the offered-model check between main and renderer

* fix(speech): dim only the retired model's text so its delete button stays clear
2026-11-06 21:37:46 +00:00
Neil 88fa7ed2a9 feat(onboarding): install Antigravity in an explicit setup terminal (#39172)
* feat(onboarding): install Antigravity in an explicit setup terminal

* fix(onboarding): address review on Antigravity installer dialog
2026-11-06 13:30:03 -08:00
Neil 77214beaae test(agent-hooks): warm encoded PowerShell before timing Windows payload delivery (#39171)
The payload-delivery suite started its first Windows PowerShell 5.1 hook
launches at the same moment as the runner's cold first powershell.exe start,
with only a 15s per-launch bound. The stdin-lifecycle suite already absorbed
that cost in a warm-up; share it so both suites pay cold start outside the
per-hook hang bound.
2026-11-06 13:17:25 -08:00
Neil c85d633837 test: fail unit tests that run a real agent CLI from PATH (#38961)
* test: stop unit tests from running the developer's real agent CLIs

A live relay test reached the host's real `claude --version` through the
inherited PATH. On a machine whose claude wrapper never exits, each run left
an orphaned loop behind (14 were found on one host, running for days).

- Add a unit-test setup guard that shadows agent CLI names on PATH with
  stand-ins that fail the test which ran them.
- Give the live relay test its own claude/codex stubs.
- Kill the whole process tree when the WSL guest's version probe times out.

* test: keep structured-session tests off the real codex CLI

These hosts get a scripted transport, but the at-rest `/` command read
spawns the resolved codex command directly, so on a machine with codex
installed each run started a real `codex app-server`. Point them at a
missing binary, as on CI.

* test: isolate agent discovery in session fixtures
2026-11-06 12:56:01 -08:00
Neil f0bfce8fce fix(automations): accept Antigravity model and effort extra arguments (#39161)
Antigravity automations refused --extra-agent-args, so unattended agy jobs
could only use the model and effort from agy's global settings.json. Allow
--model and --effort through the existing allowlist; permission, mode, and
other flags stay refused.

Part of #35234 (STA-12678).
2026-11-06 12:55:54 -08:00
Jinjing 1cd9ed1355 fix: restore delete action in session list (#39163) 2026-11-06 12:55:14 -08:00
Neil c8e06e5e30 fix(antigravity): wait for agy's composer before pasting continuation context (#38939)
* fix(antigravity): wait for agy's composer before pasting continuation context

The renderer's paste gate armed its 1.5s quiet window on any bracketed-paste enable, including the launching shell's own prompt, so a slow agy start received the handoff in cooked mode before its TUI ran. Wait for agy's '? for shortcuts' composer row while agy holds bracketed paste instead.

* fix(antigravity): accept agy's composer rows when a custom statusLine hides the hint

A command statusLine replaces agy's '? for shortcuts' row, so Continue in New Session waited the full 20s and pasted blind, and a CLI launch prompt burned 20s of its 60s. Also accept the rule / '>' / rule composer rows (the layout #38930 reads), still anchored to agy's own 2004h and revoked by the shell's 2004l. Checked against agy 1.5.2 captures: custom statusLine and default layouts fire; the trust dialog and signed-out startup do not.

* fix(antigravity): offer back pre-ready typed text the composer wait drops; move scanner tests

The agy composer wait has no quiet fallback, so a slow start now hits the
20s timeout and drops held type-ahead. The drop notice now carries a Copy
action with the typed text, and still shows when the user switched
worktrees, so it is never lost silently.

Move the composer-rows scanner cases into draft-paste-ready-scanner.test.ts
since main removed antigravity-readiness-transcripts.test.ts (#38973).

* chore(plugins): regenerate declarative testing bundle for antigravity config change
2026-11-06 12:54:24 -08:00
Neil a20e577dc9 feat(antigravity): manage accounts in the selected WSL distro (#39007)
Antigravity Accounts rejected a WSL account location outright. agy inside
WSL keeps its login in its file store (~/.gemini/antigravity-cli/
antigravity-oauth-token; it detects WSL the same way
isAntigravityFileStorageHost does), so save/select/remove now work there:

- A WSL credential backend reads and writes that file through runWslProcess
  in the selected distro (default resolved via resolveWslDefaultDistro). It
  checks the distro is running before every guest command and never starts a
  stopped one. Writes are a compare-and-swap inside the guest (sha256 of the
  expected file), go through a private temp file and rename, and pass the
  credential on stdin rather than the command line.
- runWslProcess accepts stdin input for argv-delivered commands.
- Each distro gets its own encrypted vault, so accounts never cross distros
  or the Windows host.
- Accounts "Refresh usage" is enabled for WSL now that usage reads the
  selected runtime (#38985), and rejects a reading tagged with another
  runtime's provenance.

Fixes #25847
Linear: STA-9624
2026-11-06 12:54:20 -08:00
Jinwoo Hong 01f65352d8 fix(automations): run lists send byte-bounded previews; Run Details reads one full row (#38218)
* fix(automations): run lists send byte-bounded previews; Run Details reads one full row

* fix(automations): retry a failed full run read on the next history read

* fix(automations): show a full-output read failure with Retry in Run Details
2026-11-06 15:49:45 -05:00
Jinwoo Hong 16f2d38acb fix(automations): Run now returns the saved pending row; launcher parity (#38217)
* fix(automations): Run now returns the saved pending row; quiet, titled, retained run terminals

Run now answers with the durable pending row instead of waiting behind
the automation's lane; one detached handler records a launch failure.
Existing-workspace launches no longer surface their owner, a new
workspace's startup tab carries the run title, and finished-run cleanup
keeps a terminal a user opened after its process started.

* fix(automations): keep launched runs and user-opened run terminals intact

A failed flush after a launch no longer rewrites a dispatched run as a launch failure.
A user tab open marks the pane activation shows, read after any spawn it starts.

* fix(automations): own launch-failure recording in the service; quiet pending pane notice on mobile
2026-11-06 15:46:47 -05:00
Brennan Benson 969c5ddd3a Support native Plan mode in chat (#38286)
* Add session Build and Plan choices to native chat

* Refresh planning choices across connected composers

* Give composer catalog tests a complete transport fixture

* Preserve planning choices through fresh turns and older hosts

* Type planning delivery fixture choices explicitly

* Honor mode capability for retained queued command picks

* Update existing native mode contract expectations

* Keep proposed plans visible in completed chat turns

* Group chat mode with permissions and goal controls

* Keep chat composer controls accessible in narrow panes

* Preserve composer overflow ownership and editor focus

* Complete composer localization catalog and subscription checks

* Keep chat composer controls contained in narrow panes

* Use the button spacing for compact Save

* Place chat mode immediately before Goal

* Restore Plan status test dependencies after main sync

* Show an exit pill only while chat Plan mode is active

* Remove obsolete composer tooltip translations

* Remove unused Build toggle catalog entries

* Apply Plan commands immediately from composer picks

* Preserve picked skill origin in composer admission

* Supply phone platform to composer regression fixture

* Preserve mode picks until their writer admits them

* Narrow the phone mode command before its draft transform

* Document the option fixture mutation shape

* Match phone Plan controls to the composer mode pills

* Assert optimistic mode feedback in the phone fixture

* Retain the phone mode pick recovery regression proof

* Use the relocated observation imports after the main merge

* Restore the composer IME module import after merging

* Read the queue assertion helper from its relocated owner

* Point the mode fixture at the relocated selection controller

* Register the phone Plan pill localization keys
2026-11-06 12:42:48 -08:00
Neil 10b8666c45 refactor(terminal): organize rendering and parked-view owners (#39146) 2026-11-06 12:11:27 -08:00
Brennan Bensonandalexcastgonz 48476a8055 fix(gitlab): paginate pipeline jobs and bridges past 100 items (#39046)
* fix(gitlab): paginate pipeline jobs and bridges past 100 items

The Checks panel fetched one 100-item page of a pipeline's jobs and
bridges, so larger pipelines (and expanded child pipelines) silently lost
the rest. Move the header-aware page walker used for labels and members
into its own module and use it for pipeline jobs and bridges too.

Fixes STA-13623

Co-authored-by: alexcastgonz <82875882+pcbeingused333@users.noreply.github.com>

* fix(gitlab): follow every advertised page and keep fetched pages on a later failure

Review repairs for #39046: follow advancing x-next-page headers without a
page cap (the cap now bounds only guessed pages for missing or unusable
headers), keep rows already fetched when a later page fails, and stop
bridge paging once the parent job list fails.

* fix(gitlab): fail the details read on an incomplete page walk

A later-page failure now fails the MR details read, so Checks and the
dialog keep the jobs they last showed and report the failure, instead of
replacing a complete list with a prefix. Forbidden child pipelines (first
page refused) stay tolerated. Paging also stops on empty pages and
rejects page numbers past the safe-integer range so it always ends.

* fix(gitlab): treat exhausted page guesses as incomplete and translate the dialog load error

* fix(gitlab): follow only the consecutive next page and name the dialog load-error key

A next-page header that skips ahead or carries trailing text is now
treated like a missing header, so no page is skipped. The dialog's
load-error message uses an intent-named translation key.

---------

Co-authored-by: alexcastgonz <82875882+pcbeingused333@users.noreply.github.com>
2026-11-06 11:46:20 -08:00
Brennan Benson d0a3190b86 Import Codex command history the way the live chat shows it (#39066)
* Import canonical Codex execution history

* Fix Codex history import lint warnings

* Preserve Codex imported prompt content and item lifecycle

* Preserve Codex root order after history fact eviction

* Order imported Codex turns by recorded chronology

* Preserve retained Codex lifecycle and history row placement
2026-11-06 11:44:32 -08:00
Neil 2462e9cac4 refactor(renderer): organize terminal PTY transport owners (#39134)
* refactor(renderer): organize terminal PTY transport owners

* test(terminal): mock concrete PTY shutdown owner
2026-11-06 11:36:05 -08:00
Jinjing a5ca71c3ba fix(sidebar): include Pinned in collapse all projects (#39145)
* fix(sidebar): include Pinned in collapse all projects

* fix(sidebar): keep pinned toggles working outside project grouping
2026-11-06 11:31:29 -08:00
Brennan Benson d2637d1bf9 Group turn diffs and opened PRs under Chat UI › Turn activity (#39127)
* feat(native-chat): group turn diffs and opened PRs under Settings › Chat UI › Turn activity

Both Hide buttons now share one toast naming what Orca stops showing, with a
link to the new Turn activity section.

* fix(native-chat): say where to turn a card kind off when Hide can't save
2026-11-06 11:29:41 -08:00
Kelvin Amoaba 937ff5fea6 fix(dictation): hold-to-dictate keeps what you said when settings change or the window loses focus (#39132)
* fix(dictation): keep a held dictation through settings changes and insert it on blur

* test(dictation): name the callback re-creation test after what it does

* fix(dictation): keep a held dictation when keybindings are refetched
2026-11-06 19:23:55 +00:00
Neil 4941215ad1 refactor(terminal): organize input, clipboard, links and completion owners (#39113)
* refactor(terminal): group input, clipboard, links and completion owners

* test(terminal): mock concrete file action owners

* refactor(terminal): preserve file routing import admission

* test(acp): import host fixtures from defining owners

* ci: follow concrete journal item lifecycle owners
2026-11-06 11:12:24 -08:00
Brennan Benson 261533ae01 refactor(native-chat): split transcript slot selection under the line limit (#38978) 2026-11-06 11:05:30 -08:00
Neil 3228095e97 refactor(renderer): organize launch, workspace, browser and search owners (#38845)
* refactor(renderer): group launch, workspace, and browser owners

* fix(renderer): restore workspace name Enter focus to agent picker
2026-11-06 10:37:45 -08:00