Commit Graph
19106 Commits
Author SHA1 Message Date
Brennan Benson e5a960cbf9 Show changed files directly in chat turns (#38256)
* Show changed files directly in chat turns

* Use the fixture frame for the diff interaction

* Keep changed filenames readable and preserve file actions

* Keep unconfirmed file changes in tool activity

* Capture changed files in completed transcript fixtures

* Preserve patch data with authoritative history status

* Keep mobile diff interaction coverage beside its card

* Assert the decoded patch line contract

* Exercise full returned history in catch-up coverage

* test(chat): target file summary when reopening patches
2026-11-04 17:53:16 -08:00
OrcaWin 9661361266 fix(sidebar): extend the workspace list scrollbar hit area past the seam (#38288)
* fix(sidebar): extend the workspace list scrollbar hit area past the seam

Add a 4px strip just right of the sidebar seam that drives the list
scroll position like the native thumb (drag the thumb, or jump on track
click), and falls back to resizing where no list scrollbar is under it.
The resize handle starts past the strip; the divider line stays on the seam.

* fix(sidebar): keep seam scrollbar drags alive over native plugins
2026-11-04 17:52:49 -08:00
Brennan Benson 2929162aad Keep long agent turns alive beyond 128 timeline entries (#38257)
* Keep long chat turns alive past timeline entry limits

* Retire completed tool payloads and preserve late event ownership

* Use canonical payload metadata in the long-turn benchmark

* Explain the real-scale benchmark timeout
2026-11-04 17:48:26 -08:00
OrcaWinandOrcaWin 39aa21f535 test: remove low-value renderer suites and orphaned harnesses (#38299)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-04 17:48:03 -08:00
Neil 00c454252e fix(terminal): every terminal tab close declares who asked; no implied user close (#38284)
closeTerminalTab defaulted a missing reason to 'user', so programmatic
closes (a withdrawn launch pane, a host-retired pane) reached a paired host as session.tabs.close reason:'user' and
killed its live terminal. The reason is now required; only gestures
declare 'user', CLI/RPC/phone closes forwarded by main declare
'requested', and housekeeping declares 'cleanup', which never kills a
paired host's live terminal. A launch pane closed by housekeeping no
longer tells main the user stopped its launch.

Refs #37245
2026-11-04 17:46:10 -08:00
NeilandBrennan Benson 688adc4b4c fix(serve): give headless hosts the services the desktop window path started (#37633)
Headless orca serve (orcad and Electron --serve) was missing services that only
the desktop composition or a window attach started.

- orcad now wires the orchestration environment transport, so a headless Run
  home can place workers on its paired servers again. The transport moves into
  a shared factory both hosts use. Its routing graph broadcast to renderers
  through BrowserWindow directly; that now goes through the desktop-surface
  port, so the graph runs on plain Node.
- orcad also resolves paired-device names, which was a declared gap.
- Usage polling runs from the account composition every host builds. Polls
  fire while someone watches: the focused desktop window, or a live
  accounts.subscribe stream. A headless host's remote readers now get the polls
  that stream promises, and unwatched hosts spend no usage budget.
- The composition parity test now accounts for every service a window attach
  starts, so a new window-only start can't silently skip headless hosts.

Fixes #36853
Refs #37256

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-11-04 17:43:35 -08:00
Neil 86d0ddd06b fix(agent-state-rules): treat a 404 as nothing published, not a warning (#38278)
* fix(agent-state-rules): treat a 404 as nothing published, not a failure

No agent-state-rules release has been published yet, so every packaged
app logged a warning on each refresh. Log 404 at debug level; other HTTP
errors still warn.

Refs #37538

* test(agent-state-rules): drop the server-error case

Refs #37538

* fix(agent-state-rules): log nothing for a 404

orcad routes console.debug to stderr, so a debug line still reached
orcad.log on every refresh.

Refs #37538

* test(agent-state-rules): check the app fetches where the publisher uploads

A 404 is now silent, so a tag, engine-version or asset-name drift between
the publisher script and the app would go unnoticed.

Refs #37538
2026-11-04 17:42:44 -08:00
OrcaWinandOrcaWin 9f8515de57 test: remove low-value renderer suites and unused fixtures (#38292)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-04 17:11:32 -08:00
Neil 99e75ebdde fix(orcad): stop the managed server crash-looping under a ulimit -v address-space limit (#38263)
* fix(orcad): fit orcad inside a `ulimit -v` address-space limit

On hosts that cap virtual memory (ulimit -v 8 GiB on an HPC node), the
managed orcad crash-looped with "Failed to reserve virtual memory for
CodeRange" whenever it started a worker thread.

Two reservations used up the limit:
- undici's WASM HTTP parser, loaded by the first fetch, reserves a
  trap-handler guard region (4-9 GiB). The pinned-Node orcad launch now
  passes --disable-wasm-trap-handler --wasm-max-mem-pages=1024.
- each Worker isolate reserves V8's default CodeRange (512 MB on x64,
  ~600 MB of address space per worker). Main-process workers now go
  through spawnWorkerThread(), which caps the code range at 64 MB, and
  a lint rule keeps new sites on it.

Fixes #37538. Thanks to lin-tianyu for the report and logs.

* fix(orcad): keep the runtime selector one command; enforce spawnWorkerThread with ast-grep

Refs #37538

* test(orcad): run the address-space regression on Node

Refs #37538

* docs(orcad): note the WASM memory cap at the pinned-Node flags

Refs #37538
2026-11-04 17:00:52 -08:00
Neil 0186fb347c fix(terminal): only resume a terminal stream where xterm is, so escape tails never print (#38049)
* fix(terminal): only resume a terminal stream where xterm is, so escape tails never print

After switching workspaces, Claude Code's prompt could show stray text such as
"43B": the tail of ESC[43B from a frame whose start was lost when output was
dropped (hidden panes, the pending cap, daemon background thinning, the
renderer backlog cap) and the stream resumed raw.

Main marks every delivery that cannot prove it starts at escape-parser ground
(midEscape: true, or 'unknown' after bytes it never saw), never batches bytes
across a gap, and routes salvaged query copies through the drop sentinel.

The renderer tracks where xterm's parser stands in the stream. Bytes enter
xterm only as an exact continuation of what it parsed, or from a boundary main
proves is ground (grounded with CAN); anything else is skipped whole, still
answers its queries, and is repainted by a restore. Snapshot and reattach
replays anchor the position; Orca's own CAN-led writes invalidate it. This
replaces the gap-label and seq-proof admission from #37269.

* refactor(terminal): tidy stream-boundary plumbing

Share the drop-sentinel check, build sentinel bytes once, name main's start field as a boundary, and drop unused test fixtures.
2026-11-04 16:42:37 -08:00
OrcaWinandOrcaWin f6d04f9f31 test: remove low-value renderer suites (#38276)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-04 16:36:04 -08:00
Kelvin Amoaba 35d26e44af fix(browser): stop a person's link on a remote workspace lighting the agent glow (#38262)
The remote host relays commands for desktop-hosted pages back to the
desktop, which ran every relayed command as the orca CLI. A terminal
link's follow-up browser.goto therefore marked the page agent-driven.
The host now tags relayed commands with whether its caller was an agent,
and the desktop only uses the agent identity for those.
2026-11-05 00:28:38 +00:00
Kelvin Amoaba 5f367e14bd fix(chat): show Codex image generation as generating while it runs (#38269)
* fix(chat): show running Codex image generation as generating

* fix(chat): settle an abandoned Codex image generation as not running

* refactor(chat): inline the running image status check
2026-11-05 00:28:22 +00:00
Brennan Benson 8610b35715 fix(sidebar): show hidden discovered worktrees outside project grouping (#38231)
* fix(sidebar): show hidden discovered worktrees outside project grouping

* fix(sidebar): place hidden-worktree lines from the rendered rows in one pass

* fix(sidebar): keep shared-anchor hidden-worktree lines in row order

* fix(sidebar): count row visits without Reflect and drop a cast

* test(sidebar): build typed fixtures instead of casts

* fix(sidebar): show one hidden-worktrees line for all projects outside project grouping
2026-11-04 16:26:24 -08:00
Brennan BensonandClaude Opus 5.5 7c0ef1725e test(e2e): layout oracle restart comparison honors terminalsRestart (#38271)
relaunch() already lets a scenario declare terminalsRestart and passes it to
oracle.step, but compareRestart masked PTY ids only for coldDaemon, so
sleep-quit-resume reported its permitted terminal restart as a PTY id change.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-04 16:17:07 -08:00
Brennan Benson da904ad40c Say where to switch back from Chat UI wherever Orca turns it on (#38243)
* Say where to switch back from Chat UI wherever Orca turns it on

The Chat UI tip pointed to Settings → Agents, which users did not guess, and turning
Chat UI on from the tip or picking it in onboarding gave no reminder of where to undo it.
Point every surface at the Chat UI is on / Turn off switch in Settings → Chat UI, and
confirm the switch with a toast that names that path.

* Point browser and phone users at their own switch-back control, and word the toast as a default change

The browser client has no Chat UI launch switch, so its onboarding note names the
Onboarding checklist. Phone onboarding names Settings → Chat UI. The toast after Use
Chat UI says Chat UI became the default for new agents, since agents with their own
choice keep it.
2026-11-04 16:15:17 -08:00
Brennan BensonandJames Hart 776917931b fix(mobile): send chat with Cmd/Ctrl+Enter (#38267)
* fix(mobile): send chat with the hardware keyboard modifier shortcut

Co-authored-by: James Hart <hjhart@gmail.com>

* test(mobile): provide attach icons for keyboard completion cases

* test(mobile): use a named native type import in keyboard coverage

---------

Co-authored-by: James Hart <hjhart@gmail.com>
2026-11-04 16:14:32 -08:00
Brennan Benson c9b480fda4 Show the requested wait duration in Codex chats (#37951)
* fix(chat): show the requested Codex wait duration

* test(chat): complete sleep activity test inputs

* test(chat): keep activity rendering within the web project

* test(chat): follow the translator module relocation
2026-11-04 16:10:06 -08:00
Kelvin Amoaba 5231abe592 test(cross-version): accept the moved terminal stream protocol in release checkouts (#38270)
v1.4.249 is the first release with the reorganized src/shared layout, so the checkout wire-surface check rejected it and every baseline suite failed to extract. Module imports already resolve moved files by name.
2026-11-05 00:09:21 +00:00
Jinwoo Hong 2e41b7f59d fix(automations): let Run Now start without checking the GitHub source tool (#38029)
Manual runs refused when a GitHub/GitLab-tagged automation's source tool or
auth was unavailable, while scheduled runs of the same automation ran. Drop the
source check and the per-row source-host probing that only fed it, so manual
runs match scheduled runs.

Fixes STA-13275
2026-11-04 19:06:45 -05:00
Kelvin Amoaba 4337392b75 fix(right-sidebar): hide the previous worktree's panels while a workspace is created (#38261)
During creation the prior worktree stays active until handoff, and since #36920
the right sidebar stays open, so its panels showed the old worktree's files.
2026-11-04 23:56:38 +00:00
OrcaWinandCodex 0a06fe9621 Remove 552 low-value test registrations and 58 whole suites (#38255)
Co-authored-by: Codex <codex@openai.com>
2026-11-04 15:27:41 -08:00
OrcaWinandOrca Worker 03ea41d2b0 fix(terminal): keep the ligature addon from reading font files (#38240)
* fix(terminal): parse ligature fonts once and skip fonts whose rules explode

Since 1.4.247 the main window holds the local-fonts permission, so
@xterm/addon-ligatures reads and parses the whole font file once per
terminal. Fonts with large calt chained-context rules (Commit Mono: ~200MB
and ~1.7s per parse) then OOM the renderer when a session restores many
terminals, crash-looping Orca on every launch.

Share one parsed font per font stack across terminals, and estimate the
calt context expansion from raw GSUB bytes before parsing; over-budget,
oversized, or unreadable fonts keep the addon's common-ligature list, which
matches 1.4.246 behaviour.

* chore(terminal): document the ligature delegate terminal casts

* fix(terminal): keep the ligature addon from reading font files

Replace the shared-parse approach with the conservative fix. Since 1.4.247
the main window holds local-fonts, so @xterm/addon-ligatures read and parsed
the whole font file once per terminal; fonts like Commit Mono (~200MB per
parse) OOMed renderers on restore and crash-looped Orca.

Hide the terminal's font family from the addon so it never loads font files
and joins its common-ligature list, exactly as before 1.4.247. The settings
preview now uses the same wrapper. local-fonts stays granted for the font
picker.

---------

Co-authored-by: Orca Worker <orca-worker@localhost>
2026-11-04 18:19:19 -05:00
Jinjing edf5384668 Add hide button to onboarding checklist (#38241)
* Add a hide button to the onboarding checklist sidebar entry

* Preserve sidebar focus when hiding onboarding checklist
2026-11-04 14:52:44 -08:00
Kelvin Amoaba 1bec35aa3a fix(chat): keep pending workspace composers ready (#37954)
* fix(chat): keep pending workspace composers ready

* test(chat): cover refusal after immediate chat opening
2026-11-04 22:52:01 +00:00
OrcaWinandCodex 129999a4a7 Remove 382 low-value test cases and 46 whole suites (#38238)
* Remove low-value renderer and main tests

382 registrations removed; 46 whole suites deleted.

* Remove deleted-suite exclusions and use deterministic cache timestamp

---------

Co-authored-by: Codex <codex@openai.com>
2026-11-04 14:19:36 -08:00
Jinjing 0b73edc6e7 Add Chat UI choice to onboarding (#36204)
* Add Chat UI choice to onboarding and tailor agent tours

* Add setup guide controls for Chat UI and Yolo permissions

* Refresh native chat agents and improve surface radio controls

- Re-read the host inventory alongside workspace refreshes, including WSL
- Recognize downloaded, ready chat runtimes without a CLI on PATH
- Standardize onboarding and checklist surface choices on accessible radio variants

* Show full-access agent overrides in Yolo mode settings

* Polish Chat UI onboarding and clarify terminal fallbacks

- Group agents by launch surface and refresh selection previews
- Add scroll-edge fades to reveal clipped onboarding content

* Recognize ready custom Chat commands and nested scroll changes

* Advance agent tour after selecting a new tab type

* Install onboarding skills for selected chat providers

- Route Chat UI setup to local provider-specific skill roots
- Improve tour focus, Escape handling, and delayed target transitions

* Keep split lesson while a new pane mounts; update renamed skill in test

* Assert agentDefaultSurface in Chat UI onboarding e2e

* Open the chosen Chat UI agent when a new project's default checkout opens

* Make the onboarding chat preview match native chat

- Soften the selected preview tile styling.
- Accept a leading separator in dev:fresh arguments.

* Fix scrolling in the onboarding agent step

* Preserve initial working directory when opening empty workspaces

Also check only remaining tour steps for unfinished actions.

* Fix tour resumption after completed split steps
2026-11-04 21:47:28 +00:00
OrcaWinandCodex bcb6dd0102 Remove 129 low-value test cases and 45 whole suites (#38233)
* Remove low-value renderer and main tests

129 registrations removed; 45 whole suites deleted.

* Clean deleted-suite CI reference and retained type import

---------

Co-authored-by: Codex <codex@openai.com>
2026-11-04 13:44:42 -08:00
Kelvin Amoaba e7801630fa fix(program-status): announce a finished OpenCode turn reported only over OSC 7501 (#38222)
OpenCode ends every turn with idle and never reports done, so its idle after
work became a session boundary and no finished notification fired.
2026-11-04 21:24:54 +00:00
Younghwan ChaeandClaude Opus 5.5 dd4e5001b1 fix(floating-terminal): close a browser split from its own toolbar (#38175)
The floating panel has one tab row, and it shows only the focused split.
A browser in another split had no tab and no close button on screen, so
the terminal beside it could be closed but the browser could not.

Show an X in the browser toolbar when the page is in a floating split,
using the same close command as the tab row. The main window is unchanged
because each of its splits has its own tab row.

Fixes #38167

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 21:24:37 +00:00
Kelvin Amoaba f19e0b9c01 fix(checks): render Mermaid diagrams in PR comments (#38215)
* fix(checks): render Mermaid diagrams in PR comments

* refactor(checks): drop unused node prop in Mermaid pre override
2026-11-04 21:24:22 +00:00
Kelvin Amoaba 30c7dc022f chore(mobile): bump to 0.0.64 and Android versionCode 28 (#38230) 2026-11-04 21:23:41 +00:00
Brennan Benson 812a23a729 fix(sidebar): keep discovered worktrees hidden when adding a project (#38208)
* fix(sidebar): keep discovered worktrees hidden when adding a project

Adding a project no longer switches it to show worktrees Orca didn't create
(Conductor workspaces and other tools' worktrees). They stay behind the
sidebar's "Hiding N discovered worktrees" line, the same as every other
way a project is added.

* fix(sidebar): open a picked linked worktree instead of revealing its siblings

When the folder added as a project is itself a linked worktree, its main
checkout is hidden. Open the picked worktree instead of switching the whole
project to show worktrees Orca didn't create.

* fix(repos): register clone and create paths with symlinks resolved

Git reports checkout paths with symlinks resolved. Clone and create saved the
typed path, so a project cloned under a symlinked folder (e.g. /tmp on macOS)
did not recognise its own checkout and hid it as a discovered worktree. Resolve
the existing part of the destination before registering, as adding an existing
folder already does.

* fix(repos): keep finding projects saved under a symlinked clone or create path

Projects cloned or created before paths were resolved keep the typed
spelling. Match both spellings so retrying the same clone or create reuses
the saved project instead of failing on its non-empty folder.

* fix(repos): keep Windows clone and create paths as typed

Windows Git reports the typed spelling, and resolving would turn mapped
drives into UNC paths. Runtime clone/create tests now use resolved temp
roots, matching what registration saves.

* fix(repos): register Git's checkout path for clone and create

Replace the parent-symlink resolution with the path Git reports after clone
or git init, as adding an existing folder already does. This also covers a
symlink at the target folder itself and WSL paths, leaves plain folders and
Windows spellings unchanged, and matches saved projects by both the typed and
the resolved spelling.

* fix(sidebar): keep opening projects whose own checkout isn't recognised

Projects saved through a symlinked path by older builds or paired hosts don't
recognise their own checkout. Keep main's behaviour for that case: show the
project so the add still opens it.

* fix(repos): match resolved paths when importing a folder of repos

Clone and create now save Git's resolved checkout path, so a nested import
through a symlinked folder must also match that spelling instead of
registering a duplicate project.

* fix(repos): find saved projects through a symlink before the clone target exists

Resolve a missing clone target through its existing ancestors, reusing the
worktree-create alias resolver, and read the lookup keys inside the clone
lock. Queued clones through a symlinked folder reuse the first clone, and a
different repository at a saved project whose folder is gone is refused
before cloning, as on main.

* fix(repos): match a folder import's resolved path only to local projects

The resolved spelling names this machine's folder, so a remote (SSH) project
at the same path string must not be treated as the import.

* fix(repos): limit a desktop folder import's resolved-path match to this machine

Runtime-owned and SSH projects can share the path string; only projects on
this machine may match the import's resolved folder.

* fix(repos): read a nested import row's connection through the host helper

* fix(repos): match only this machine's projects when creating a local project
2026-11-04 13:21:06 -08:00
Kelvin Amoaba aaf4a95166 fix(mobile): address android auto quit (#38226)
* fix(mobile): address android auto quit

Android has no 'tabbar' accessibility role and throws when the Home tab bar mounts, killing the app on every launch of 0.0.63. Use 'tablist', which both platforms support.

* fix(mobile): keep the tab-bar accessibility trait on iOS

'tablist' maps to no trait on iOS, so VoiceOver stopped announcing the Home tabs as a tab bar. Only Android lacks 'tabbar'.
2026-11-04 21:18:59 +00:00
c06edaff83 perf(agent-hooks): start 7 processes per Claude hook event instead of 17 (#38180)
* perf(agent-hooks): start 5 processes per Claude hook event instead of 17

The managed Claude hook runs for every PreToolUse and PostToolUse. On macOS
each event started 17 processes; on Linux 17 (dash) or 19 (bash).

- Agent identity: Linux reads /proc/<pid>/stat and boot_id with `read`
  builtins. macOS skips `uname` when OSTYPE is darwin and runs only
  `exec /bin/ps`, without `sed` or `printf` subshells. The identity stays per
  event: no shell builtin can tell a reused PID from the process that had it.
- Metadata header: packed once per pane into hook-metadata/pane-<id> beside
  the endpoint file, and reused only while all six inputs match exactly.
- Payload: the capture subshell execs /bin/cat, curl reads the body from a
  here-document, and the PreToolUse reply subshell execs curl.

Other agents keep their scripts byte for byte. Against a fake hook server,
the old and new scripts give the same server records, stdout, spool records
and time limits; the raw JSON body gains one trailing newline from the
here-document, which JSON parsing ignores.

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

* fix(agent-hooks): keep the hook payload pipe off the exec path and prune metadata files

- Only the reply subshell that execs curl reads the body from a
  here-document. The print-then-post path of Claude-compatible CLIs uses the
  printf pipe again, so its body stays byte for byte and needs no TMPDIR.
- The spool drain removes hook-metadata files older than
  AGENT_HOOK_SPOOL_MAX_AGE_MS, in main and in the WSL/remote guest.
- The Linux identity reads /proc/<pid>/stat to EOF, so a command name with
  a newline keeps its start time.
- Comments are one line each, and the string-index stdin test is deleted;
  the runtime stdin tests in the same file cover every generated script.

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

* test(agent-hooks): run the refresh locale test on the raw JSON exec-curl path

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

* fix(agent-hooks): keep the Claude hook body piped to curl

The here-document added a trailing newline to the raw JSON body and,
under macOS /bin/sh (bash 3.2), wrote every payload to a temp file.
Pipe the body again so the hook server gets the same bytes as before.

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>
2026-11-04 21:09:11 +00:00
Kelvin Amoaba dbd664b6ab fix(mobile): keep a new project's section collapsed on the phone (#38225)
* fix(mobile): re-read project catalog after the window publishes it

reposChanged went out before the window published the new project's
catalog, so the phone keyed a new project repo:<id> and its collapse
was lost when the catalog caught up.

Fixes #37067

* test(mobile): fold catalog re-announce check into the serve test
2026-11-04 21:07:27 +00:00
OrcaWinandCodex 31d0f53cd9 Remove 230 low-value main, renderer, and mobile test cases (#38223)
Delete 19 whole suites and update coverage metadata and reduced flaky-pattern counts.

Co-authored-by: Codex <codex@openai.com>
2026-11-04 12:59:51 -08:00
Kelvin Amoaba 000ca24c22 fix(claude-accounts): keep /model and effort choices on managed Claude accounts (#38219)
* fix(claude-accounts): keep /model and effort saved in a managed account across launches

Profile settings.json was overwritten from ~/.claude/settings.json on every
launch. Apply only the top-level keys the default home changed since the
last sync, tracked by per-key digests beside the profile marker, and keep
the rest of the profile copy.

* test(claude-accounts): fail hook install through a broken linked settings file

* fix(claude-accounts): leave an unreadable account settings file alone

* fix(claude-accounts): carry Orca hook changes in the default home to account copies

* refactor(claude-accounts): spell out the no-record case in the settings sync
2026-11-04 20:42:37 +00:00
Kelvin Amoaba b8969c9c53 feat(mobile): split Home into Feed, Usage, Automations and Settings tabs (#38206)
* revert(mobile): drop the details card on session tab taps

Reverts 852391da0f (#36395). The card popped up on every tab switch.
Tapping a tab switches tabs again, and the session title card goes back
to its own owner from #30389. Keeps later changes to these files: tab
press feedback, the compact top bar's + button, and #36866's keyboard
keep-focus for title taps.

* fix(mobile): hide branch and folder when the setting is off

The phone's workspace row always printed the branch or folder path, so the
Branch name / Branch / folder path toggle under Card display did nothing.
The shared card details now carry that rule, and the row reads it.

* fix(mobile): centre the chevron on Home list rows

* fix(mobile): scroll sheets taller than the screen

Content-sized sheets ride the keyboard by translation, but their height cap ignored that lift, so a tall sheet pushed its top off screen with no way to scroll back to it. The cap now gives back the keyboard lift. Sheets that scroll their own list can now shrink to the cap instead of clipping it, and the GitHub Pages picker no longer nests its list inside the drawer's ScrollView.

* feat(mobile): show each desktop's machine kind and model

The desktop now reports whether it is a laptop, desktop or server, and its
model, on status.get. The phone stores it with the other last-known host
fields and turns it into a line like "MacBook Pro · macOS".

* feat(mobile): edit a host from its screen and align the Automations bar

The host screen's menu gains Edit host and Network diagnostics. Edit host moves
onto the standard bar and gains Remove host. Automations uses the standard bar
with its switcher pinned under it, as Source Control does.

* feat(mobile): arrange Home and bring back stats and account usage

Home drops the Jump back in times, names the repo on every Jump back in row
(#37642), shows each desktop's machine kind, and adds stats and account usage
at the bottom. A new Arrange button reorders and hides sections, saved on the
phone.

* fix(mobile): keep the page bundle within budget and show the machine on the host screen

The edit route gets a web stub so its native-only removal flow stays out of
the page's chunks, and Automations keeps its own segment style. The host
screen header shows the machine line like Home does.

* fix(mobile): give the edit route's page stub its own module

A bare re-export of the catch-all route compiled to the same asset as
[...page], so the page manifest listed it twice and the desktop template's
inventory check refused the build.

* feat(mobile): turn Home into Feed, Usage, Automations and Settings tabs

Feed keeps agents (needs-you first, five then Show all), desktops with a
needs-you count, and Tasks; New workspace moves to a floating button.
Usage shows stats and per-desktop account usage, Automations a per-desktop
summary with on/off switches that opens the page for editing (new=1 opens
its editor). Settings becomes a tab. Arrange Home is removed: tabs replace
the long scrolling Home it was for.

* style(mobile): darken the accent blue slightly

* style(mobile): give the Home Tasks row the desktop tile icon

* style(mobile): condense the Home Feed

Smaller tiles, type and gaps; a desktop is two lines with its needs-you
count as an amber pill; the Tasks row drops its duplicate heading.

* style(mobile): drop the Last known prefix on Home desktop rows

* chore(mobile): bump to 0.0.63 and Android versionCode 27

* test(mobile): re-record Linear task recordings for the darker accent blue

* test(mobile): check the page Back stack on Tasks now that Edit host is native

* fix(mobile): pass the Usage tab's limit window to the shared usage helpers

* fix(mobile): type the Usage tab test to the account-slot limits and keep the tab under 400 lines
2026-11-04 20:35:53 +00:00
Jinlong LiuandClaude Opus 5.5 05f674a32a fix(claude): keep "Allow for this session" rules out of settings files (#37895)
Claude Code suggests allow rules with destination localSettings, and Orca
passed them back unchanged, so "Allow for this session" wrote a permanent
rule to the project's .claude/settings.local.json. Scope every suggested
update to the session, as the button says.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 20:21:20 +00:00
Kelvin Amoaba a2c8cde655 fix(projects): refuse removing a project while one of its workspaces is being created (#38196)
* fix(projects): refuse project removal while a workspace is being created

Removing a project mid-create let the create land a workspace no project
owns, and its armed .orca-preparing checkouts outlived the project: a quit
inside their TTL leaked them locked, since crash reclaim only runs when the
same repo prepares again. Hold each create against its project row so
removal refuses until it settles, and release the repo's armed and
crash-left preparations when the project is removed.

* fix(projects): keep project removal working when its runtime needs repair

Resolving Git options for the dead-owner reclaim threw for a WSL runtime
needing repair, which blocked forgetting the project. Make the reclaim
best effort, and give host-setup deletion the same create fence and
preparation release as project removal.

* fix(projects): skip WSL boot and late prefetch arms on project removal

The removal-time reclaim no longer boots a stopped WSL distro, and a
prefetch that finishes after its project was removed no longer arms a
checkout nothing would reclaim.

* test(projects): assert the removal refusal by code, not copy

* refactor(projects): key the create hold by the shared repo host identity

* refactor(projects): keep workspace creation under the file line cap
2026-11-04 20:15:26 +00:00
Brennan Benson 155083b0a0 Keep the Split tip until the user splits or closes it (#38097)
* fix(contextual-tours): keep the Split tip until the user splits or closes it

The Split a terminal pane tip was saved as seen the first time it painted,
so any dialog, page change or restart ended it for good and the next tip
never appeared. A step that waits for an action is now done only when the
split succeeds (the saved split record) or the user closes the tour; the
tour resumes at its first unfinished step and keeps its session slot while
paused.

* fix(contextual-tours): a resumed tip never takes focus, at any step

* fix(contextual-tours): keep the pause across an activation that never painted

* fix(contextual-tours): a forced tour can't take a paused Split tip's place

* fix(contextual-tours): type the focus hook's tour ids

* fix(contextual-tours): remember a resumed tour in the store, and stop watching for a sidebar tip while the sidebar is closed

The overlay unmounts between activations, so its pause memory never
survived; the activation itself now says it resumes a tour already
started this session.

* fix(contextual-tours): keep the agent-sessions interaction counted only before a first split

* fix(contextual-tours): a tip that waits for a split never takes keyboard focus

It shows over the terminal the user types into and comes back each
session until they split, so taking focus (first display, after a
restart, or on the next tip after a keyboard split) would send their
keystrokes to its dismiss button. Replaces the in-memory resumed flag.

* fix(contextual-tours): keep focus in the callout when the user navigates inside it

* fix(contextual-tours): let other pages' tips show while the Split tip waits for a split

The Split tip now sits outside the one-tour-per-session limit while it is unfinished: it
neither blocks another page's tips nor is blocked by them, and it resumes afterwards.

* fix(contextual-tours): open the sidebar for a paused Split tip only if it started this session

* fix(contextual-tours): decide the session limit inside the tour effect, as main read its inputs
2026-11-04 12:05:49 -08:00
OrcaWinandCodex 9160eb60e6 Remove 390 low-value test cases and 18 whole suites (#38209)
Co-authored-by: Codex <codex@openai.com>
2026-11-04 11:49:38 -08:00
Kelvin Amoaba 8d662f5c63 fix(ai-vault): show closed Antigravity chats in Agent Session History (#38203)
* fix(ai-vault): list managed Antigravity chats in Agent Session History

Orca's managed Antigravity chat sets GEMINI_HOME under the app's data
directory, so its transcripts land in antigravity-chat/antigravity-acp/brain,
which the history scanner never walked. Scan that root, take each session's
cwd from the server's conversations/<id>.meta so the row shows in its
workspace, and treat rows no chat owns as transcript references, since agy
cannot open the server's conversations.

* fix(ai-vault): scan managed Antigravity chats only for reference-aware clients
2026-11-04 19:31:13 +00:00
Kelvin Amoaba 7247685c74 feat(native-chat): let users pick when idle chat agents stop, or never (#38202)
* feat(native-chat): let users change or turn off the idle stop for chat agents

The idle sweep stopped every chat's agent after a hard-coded 30 minutes,
which broke peer messaging, Claude Remote Control and background
subagents. Settings > Chat > Behavior now picks the window, including
Never, and the sweep reads it every tick so a change applies without a
restart. Never only keeps agents running: a chat handle with no agent
still retires on the default window.

* test(native-chat): type the childless sweep fixture's journal parameter
2026-11-04 19:30:58 +00:00
Manuel MeurerandKelvin Amoaba 8fa41115a0 feat(native-chat): add a setting to keep the scroll position when sending (#38162)
* feat(native-chat): add a setting to keep the scroll position when sending

Own sends from a pane bring the latest into view and follow the reply.
A new Chat > Behavior setting, "Scroll to latest when sending" (on by
default), turns that off: a reader who scrolled up stays in place, one
at the end keeps following the reply, and Jump to latest still works.

The gate sits in the one reveal every send path reports to, so the
explicit Jump to latest button and find navigation are unaffected.

Fixes #38153

* fix(native-chat): keep following a reader at the end when reveal on send is off

A reader can sit at the end without following (a rail jump that clamps at
the end, a short nudge up). The setting's gate skipped their reveal, so
the sent message and its reply grew below the viewport. The list now
decides: off skips only readers who stopped away from the end, judged by
where they last scrolled so the send's own echo doesn't count.

* refactor(native-chat): read the scroll-on-send setting through one helper

Also drops the redundant 'scroll' search keyword (the title already
matches) and the settings switch call-shape test.

* fix(native-chat): decide the send reveal from where the reader was at the press

The last-scroll distance stayed small after output grew past a reader who
had nudged up, so a later send still jumped them with the setting off.
The list now reads live geometry, and a structured message, which reveals
only once the host admits it, captures that answer at the press, before
its own echo moves the end.

* fix(native-chat): read the reader before Resume waits for the host

Resume reveals only after the host lifts the pause, by which time the
drain may already have added rows below the reader.

---------

Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>
2026-11-04 19:30:42 +00:00
Kelvin Amoaba a71ad90883 fix(mobile): keep reasoning effort as segments for every level count (#38200) 2026-11-04 19:30:25 +00:00
Kelvin Amoaba 18fa4f8a6d feat(mobile): title Jump back in rows with the conversation name (#38194)
Rows named only the workspace, so with several agents in one workspace they didn't say which conversation needed you. The newest live top-level agent in the row's dot state now gives the title, the workspace moves to the subtitle, and tapping the row opens that conversation's tab. Older desktops send no names and keep the workspace title.
2026-11-04 19:30:09 +00:00
Kelvin Amoaba 0ffb87fc18 feat(mobile): show usage for every agent desktop tracks on the Accounts screen (#38187)
* feat(mobile): show every desktop usage provider on Accounts

* refactor(status-bar): import moved usage helpers from shared

* refactor(mobile): reuse shared usage rules for provider names and data checks

* test(mobile): type account-slot fixtures as Claude/Codex limits
2026-11-04 19:29:54 +00:00
d3d157756a fix(mobile): make the app icon full-bleed so iOS masks it cleanly (#37074)
icon.png shipped its own rounded corners, transparent corners and a bright
bevel. iOS applies its own corner mask on top, so the bevel showed as a sharp
light outline, most visibly on Spotlight's search results.

Replace the bevel and corners with the icon's existing vertical gradient,
extended to a square opaque 1024x1024 RGB image. The logo is unchanged.

Verified by pixel checks (no alpha channel; rows outside the logo are uniform;
no logo-region pixel moved by more than 6/255) and a simulated iOS mask. Not
yet checked on a device.

Fixes #26834

Co-authored-by: Rongzheng Liu <tianlrz@users.noreply.github.com>
Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>
2026-11-04 19:29:38 +00:00