Commit Graph
13902 Commits
Author SHA1 Message Date
NeilandKelvin Amoaba 5470ff907c fix(mobile): stop review notes from disappearing or coming back after deletion (#31699)
* fix(mobile): stop review notes disappearing or coming back after deletion

The phone sent its whole notes list on every add or delete, and the host
stored it as is. A note added on desktop after the phone loaded was wiped
by the phone's next edit, two quick taps could overwrite each other, and a
failed save rolled back to an old snapshot.

worktree.set now takes an optional diffCommentsBase, like linkedItemsBase:
the host applies only the writer's own adds, edits and removals to the
stored notes. The phone sends the list it started from, shows the host's
merged list from the reply, and undoes only its own change on failure.
Older hosts drop the field and replace the list as before; older phones
send no base and get the same.

Co-authored-by: Neil <neil@stably.ai>

* fix(mobile): keep loaded review notes when an early save fails

The first load was discarded once any save started, so a save that failed
before it landed left the host's notes hidden. The load now applies the
phone's changes made during the read onto the host's list instead.

* fix(mobile): send review-note requests one at a time

Two in-flight saves could reach the host in either order, so adopting the
later reply hid a note the earlier save had stored. Session notes now send
one request at a time and reconcile every reply with the phone's changes
made since it was sent, replacing the sequence counters.

* fix(mobile): drop review-note saves queued behind a failed one

A save queued behind one that failed still sent the list built on the
failed change, and an older host stores that list whole. Those saves now
undo their own change instead of sending. Also renames the shared base
type so it no longer shares a name with the renderer's mutation record.

* fix(mobile): show review notes as the host's list plus pending saves

A queued reply was reconciled against the list captured at tap time, so a
note desktop deleted meanwhile came back on the phone. The phone now keeps
the host's last list and its unanswered saves per workspace and shows the
two combined; a reply for another workspace is ignored. The review screen
also shows the host's list after a save, so an edit to a note desktop
deleted no longer looks saved.

* fix(mobile): fail queued review-note requests while disconnected

A notes request queued behind a pending load waited for a reconnect with
no timeout, holding every later save. Notes requests now fail at once when
the connection is down, like terminal input.

* fix(mobile): drop every review-note save built on a failed or dropped one

A save made while a dropped save was still pending carried its change,
so an older host could store it. Each failed or dropped save now moves
the failure count.

* fix(mobile): send each review-note save as the host's list plus its change

Each queued save now builds its payload when it is sent, from the host's
last list plus only its own change. A note added before the first load
no longer replaces the loaded notes on an older host, and a failed save's
change never rides along, so later saves no longer need dropping.
Delivered-note cleanup waits for a reconnect again so those notes are not
sent twice.

---------

Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>
2026-10-29 00:40:56 +00:00
OrcaWinandOrcaWin dd34216da9 perf(editor): skip Markdown link structure scans without link delimiters (#35055)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:40:46 -07:00
OrcaWinandOrcaWin 7a614b0cc4 perf(editor): reuse the content snapshot during mount sync (#34921)
The mount reconciliation already reads the full model text for its
stale-cache guard. Pass that snapshot into syncContentOnMount so a mount
reads the model once instead of twice.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:40:42 -07:00
OrcaWinandOrcaWin 1bd7f54712 fix(editor): apply diff Rich mode to the opened file ID (#34898)
handleOpenDiffTargetFile keyed editor/markdown view-mode preferences by
the raw file path, but openFile returns owner-scoped IDs for remote
runtime files and same-path tabs in other worktrees, so Rich mode was
lost or written onto another owner's tab.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:40:17 -07:00
OrcaWinandOrcaWin 05c2667b68 Fix notebook scroll tracking after source recovery (#35034)
Key the notebook scroll listener and restore effects on notebook
readiness instead of raw content, so the listener attaches once an
invalid notebook becomes valid and content republishes no longer snap
the view back to a stale cached position.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:40:12 -07:00
OrcaWinandOrcaWin aadde96e4e fix(editor): keep notebook cell undo across cell and tab switches (#34952)
Notebook cell models were anonymous and disposed whenever a cell lost
focus or the notebook view unmounted on a tab switch, so Undo did
nothing after returning to a cell.

Give cells that have a stable nbformat id a vscode-userdata model URI,
scoped to the view, so Monaco's model service keeps and restores the
disposed model's undo stack. Monaco restores only when the text is
unchanged and bounds retained history to its closed-file budget.
Id-less cells keep anonymous models because their position-based key
can move to a different cell, and a duplicate id falls back to an
anonymous model instead of colliding.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:40:06 -07:00
OrcaWinandOrcaWin cdbaccb583 fix(editor): cancel paste when its target model changes (#34904)
Snapshot the paste target (model, container, focus) before the context-menu
clipboard IPC read and before the yielding byte measurement of large pastes,
and re-check it afterwards so a model swapped during the await (e.g. a diff
refresh via setModel) does not receive the paste.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:40:00 -07:00
OrcaWinandOrcaWin 90da32500f fix(editor): keep CRLF pairs in one chunk during large Monaco paste (#34976)
Monaco normalizes line endings per edit, so splitting a CR from its LF
across chunked executeEdits calls inserted an extra blank line.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:39:09 -07:00
Neil 28b904939c fix(runtime): a device registry save never resurrects a device removed on disk (#35483)
* fix(runtime): a device registry save never resurrects a device removed on disk

Every DeviceRegistry save wrote orcad's whole in-memory list. A lastSeen flush (250 ms after any
socket auth, and again at shutdown) could therefore write back a device an admin had just removed
from orca-devices.json on the host, silently undoing the revoke; it also dropped rows another
writer had added. Saves now re-read the file and write the in-memory change merged over it: rows
this process knew of that are gone from disk stay gone (in memory too), rows added on disk are
kept, and this save's own adds and removals apply. The write stays the secure-file atomic rename.
The pairing-repair e2e logs the registry's device ids after the kill and after the reconnect.

* fix(runtime): tombstone devices this process removed so a stale writer can't restore them

Review of #35483: after removeDevice(a), a stale writer (an old orcad's flush during an SSH
relaunch or upgrade overlap, an external tool) could write a back; the next save treated it as
new on disk, adopted it and let it authenticate. DeviceRegistryWriter now remembers every id
this process removed, recorded before the write so a failed load-time cleanup counts too, and
never adopts those from disk. replaceRow reports false when the merge dropped the row, and a
pending offer removed on disk is replaced instead of handed out.
2026-10-28 17:38:05 -07:00
Neil 70db375c56 perf(orcad): spawn the terminal daemon before the runtime graph evaluates (#35486)
* perf(orcad): spawn the terminal daemon before the runtime graph evaluates

The daemon spawn now starts right after the login env lands, before the runtime graph's imports
instead of midway through them. Bundled dynamic imports resolve as microtasks without yielding to
the event loop, so two loop turns between the first imports let a finished login env start the
daemon process, which then boots on another core while ~0.4 s of runtime modules evaluate.

* fix(orcad): register the daemon disconnect as soon as its spawn starts

An import or init step that throws between the daemon spawn and the old registration point left
no cleanup to disconnect the in-flight daemon. It is now registered right after daemonStartup,
first, so it still runs last.
2026-10-28 17:37:46 -07:00
OrcaWinandOrcaWin 6f41a55b8b fix(clipboard): preserve copy order across text, images and files (#35332)
* fix(clipboard): order text, image and file IPC copies

* fix(clipboard): time out stalled file path resolution in the shared copy queue

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:36:22 -07:00
Neil 828fe5fea3 fix(wsl-mover): say when a refused undo left the host's terminals asleep (#35449)
* fix(wsl-mover): say when a refused undo left the host's terminals asleep

* fix(wsl-mover): count only running workspaces as asleep, and flag post-sleep refusals
2026-10-28 17:34:55 -07:00
Kelvin Amoaba bbb7f2d695 fix(agent-status): keep Grok background work visible after a cancel (#35495)
StopCancelled carries no backgroundTasks, so a cancelled Grok turn settled
done while the shells and subagents it left running kept going. Track
Grok's own task ids per pane and settle the cancelled row on each task's
own end.
2026-10-29 00:34:00 +00:00
Neil ed8f62cf94 fix(wsl): session history reads never boot a stopped WSL distro (E9) (#35367)
* fix(wsl): session history reads never boot a stopped WSL distro (E9)

Transcript and session-history reads touched \\wsl.localhost shares, and ran
`wsl.exe --exec` probes, for any distro the root list named. Those touches are
the OpenCode reader, its setup, HOME and realpath probes, and the session
scanner and search index. Nothing re-checked that the distro still ran. A
`wsl --terminate` mid-scan, or a list taken while the distro was still
stopping, let background work boot it again.

Every UNC transcript touch (stat, readdir, open, access, readFile) and every
scanner `--exec` now asks a settled running read first. That read is no older
than 5 s, because the scanner process hears of no stop by itself. A user act on
the distro still passes.

* fix(wsl): opening a chat starts its stopped distro; scanner hears main's stop notes

A user-opened chat, a history page and an AI Vault resume start the
transcript's stopped WSL distro once, as a user act, so its history
shows; watch and scan reads stay background. Main forwards WSL stop and
wake notes to the session-scanner process so a terminate main saw is
honoured there at once.

* fix(wsl): type the scanner note channel structurally; test the resume wake

Keeps node:child_process out of the new scanner-notes module (the
process-host import check) and adds a test that fails if an AI Vault
resume stops starting the session's WSL distro.
2026-10-28 17:32:51 -07:00
Neil bc6a5ec32e fix(wsl): flag-on liveness and post-launch WSL steps use settled running reads (E9) (#35433)
L1: the orcad liveness supervisor's heartbeat/verify reads, its recovery gate, the no-boot
reconnect check and the connector's passive probe now take a settled read of their own distro, so
a list probed while the distro is still stopping cannot admit a holder spawn, identity read or
reconnect that would boot it again.
L2: a Git cancel/timeout's guest kill, the WSL move's process table and each step of the Codex
session bridge chain check the distro first. A confirmed stop counts as the group gone / an empty
table / the end of the chain; an unanswered read proves nothing and spawns nothing.
2026-10-28 17:32:29 -07:00
OrcaWinandOrcaWin b685340243 perf(browser): skip unused frame scans for site permissions (#35326)
* perf(browser): skip unused permission frame inventories

* test(browser): collapse frame-inventory regression to one case

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:29:45 -07:00
Jinjing 2b73288a0b Recover native OpenCode failures in chat sessions (#35247)
- Read per-turn provider errors from OpenCode’s SQLite history
- Preserve quota, billing, access, and retry details over generic ACP errors
2026-10-28 17:29:10 -07:00
OrcaWinandOrcaWin 34643c383c fix(emulator): settle gestures when the peer closes after the final point (#35329)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:28:35 -07:00
Neil 017276aeb4 perf(orcad): skip the node-pty probe child for a slot qualified on an unchanged host (#35484)
A slot whose startup qualification marker matches (same artifacts, runtime, libc, kernel and
launch env, last launch reached readiness) now also skips the synchronous node-pty load probe
child (~0.1 s on the WSL lane). The marker is now recorded only when that launch's probe
passed cleanly; schema 2 so earlier markers, which did not promise that, re-qualify once.
2026-10-28 17:28:23 -07:00
OrcaWinandOrcaWin b2feed0e92 fix(editor): scope Mermaid diagram scroll position per pane (#34983)
Key MermaidViewer's scroll cache with the pane-scoped editorViewStateKey,
matching IpynbViewer, so split panes showing the same .mmd file no longer
overwrite each other's saved diagram position.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:26:47 -07:00
OrcaWinandOrcaWin 2f3cdbab78 perf(editor): memoize image identity key across zoom renders (#35001)
Zoom and resize re-renders reuse the same key string instead of rebuilding
and comparing it, which matters for base64-backed images (diff, conflict
review, fallbacks) where the key embeds the whole payload.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:26:43 -07:00
OrcaWinandOrcaWin 918cc3a8cc perf(editor): avoid redundant and abandoned excerpt colorization (#34876)
Key the colorize effect on joined content and line count instead of the
lines array identity, so re-renders with an equal fresh array (PR comment
code context) no longer re-run monaco.editor.colorize. Check cancellation
before colorizing so excerpts replaced or unmounted while a lazy tokenizer
loads skip the work.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:26:39 -07:00
OrcaWinandOrcaWin a871bca8f7 Enforce Monaco paste cap before Monaco's capture handler (#35057)
Monaco's CopyPasteController claims paste on the editor container in the
capture phase before Orca's listener, so Ctrl/Cmd+V bypassed the 16 MiB
cap. Listen on the editor shell instead, scoped to this editor's subtree
and text focus, and only reject over-cap pastes; smaller pastes keep
Monaco's atomic native paste. Remove the DOM chunked-paste plumbing
(save deferral, isApplyingLargePasteRef) that could never run.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:26:36 -07:00
OrcaWinandOrcaWin d6e80dab06 fix(editor): bound retired content ID tracking (#34903)
Prune file/diff read generations only when a tab goes from open to closed,
replacing the append-only known-open-ID set, and fence the restored-owner
migration so a late result cannot discard a newer read's generation.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:26:33 -07:00
OrcaWinandOrcaWin 3e93223f30 fix(editor): stop idle TS and JS workers independently (#34875)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:26:30 -07:00
OrcaWinandOrcaWin ea413738a0 perf(ssh): overlap small-file round trips in directory uploads (#35348)
Upload up to four files concurrently within the existing 2 MiB in-flight budget, sizing each file's window from its size. A per-file failure aborts siblings and surfaces the first error after the SFTP channel closes.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:24:33 -07:00
OrcaWinandOrcaWin 58f95230eb fix(web): retry expired runtime handshakes without waiting for close (#35311)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:21:22 -07:00
OrcaWinandOrcaWin 88c064f95c perf(ssh): disable Nagle during authentication (#35318)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:20:52 -07:00
Kelvin Amoaba ad50070223 fix(files): terminal artifact saves share the editor's per-file write lock (#35418)
Two clients hold separate grants for one file, and the desktop editor saves through its own guarded path, so concurrent writers could all pass their content check before any of them replaced the file, and the last one silently won. Run the artifact check-to-rename under the same canonical-path/inode lock that guarded editor saves already use; the later writer now sees the earlier one's bytes and is refused.
2026-10-29 00:17:53 +00:00
OrcaWinandOrcaWin 12a7d4c13a feat(mobile): localization infrastructure and language setting (#35399)
* feat(mobile): add UI localization infrastructure

Mobile follows the phone's language (or an in-app choice under Settings > Appearance)
across the same 11 languages as desktop, switching live like the theme does.

- i18next with desktop's translate(key, fallback, options) call shape; catalogs in
  mobile/src/i18n/locales load lazily, English fallbacks stay inline
- Hermes lacks Intl.PluralRules: load the FormatJS polyfill with the 11 languages' rules
- OTA pages get the shell's language through an optional bridge init field
- iOS permission prompts localized; iOS and Android 13+ per-app language pickers
- verify:mobile-localization and a coverage ratchet run in lint, check:changed and CI

* fix(mobile): mount pages after the newest language request; tighten localization gates

- Wait for the latest page language activation, not a superseded one
- Keep literal fallbacks when a key also has a dynamic one
- Count headerTitle as visible copy; select the mobile check when the runtime catalog generator changes

* feat(mobile): repaint themed components on language changes

Components that read the theme already subscribe for repaint; a language switch
repaints them too, so labels built by helpers during render follow it. RPC
recordings load the real i18next and JSON catalogs.

* fix(mobile): scope the translate() gate to render bodies and memos; prune stale keys on sync

Handlers and effects may call translate() when they run. sync:mobile-localization now
removes keys no code references from every catalog.

* fix(mobile): use node: imports in the locale config plugin; pass uiLocale in bridge hook test

* chore(mobile): refresh the localization coverage baseline

* fix(mobile): follow render callbacks in the translate() gate; keep used plural siblings on prune

Also let anonymous default-exported screens count as components, flag any plural
family a locale started, and mark JSON modules as ES modules in the recording loader.

* fix(mobile): treat async and named local callbacks as handlers in the translate() gate

* chore(mobile): refresh the localization coverage baseline

* chore(mobile): refresh the localization coverage baseline

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:14:05 -07:00
OrcaWinandOrcaWin ff93859b66 Validate Web Store download destinations before following redirects (#35286)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:04:24 -07:00
OrcaWinandOrcaWin 62314930c4 fix(i18n): localize plurals, sentence fragments and hardcoded copy in editor, chat, skills and onboarding (#35440)
* fix(i18n): localize plural counts, sentence fragments and hardcoded copy in editor, chat, skills, stats, onboarding and tips

Refs #32207

* chore(i18n): resync runtime English catalog after merging main

* test(i18n): let mocks interpolate counts and keep real i18n exports

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:02:53 -07:00
OrcaWinandOrcaWin d6fcdfce25 fix(browser): contain malformed automation messages (#35291)
Handle 'error' on accepted CDP proxy sockets so an invalid frame (bad
UTF-8, bad opcode) closes that client instead of crashing the main
process. Validate parsed command envelopes: null params/sessionId stay
treated as absent, malformed bodies with a numeric id get an
'Invalid CDP request' error reply, and id-less garbage is dropped.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 17:01:39 -07:00
OrcaWinandOrcaWin 79dbada2c8 fix(i18n): localize sidebar, status bar, tab bar and workspace cleanup copy (#35443)
* fix(i18n): localize sidebar, status bar, tab bar and workspace cleanup copy

Replace fragment-concatenated sentences, separate singular/plural keys and
raw English in the S2 renderer areas (sidebar, status-bar, tab-bar,
tab-group, workspace-cleanup, new-workspace, activity, dashboard,
terminal-pane, cmd-j) with whole-sentence keys and CLDR plural families,
and add translations for all built-in locales.

Refs #32207

* fix(i18n): subscribe DashboardAgentRow to UI language changes

* test: keep real i18n exports in SmartWorkspaceNameField mocks for Trans rows

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 16:48:43 -07:00
Neil 5598d2fd09 fix(wsl): runtime RPC background reads never start a stopped WSL distro (E9) (#35430)
Paired phones, web clients and the CLI poll reads nobody is looking at:
history, submodule status, ignored paths, the conflict operation, the
in-flight mutation probe, upstream status and link-existence checks.
Their desktop IPC twins already refuse a stopped distro; these did not, so
a client left open booted the distro again after the user terminated it.
Each now asks the settled running gate first and refuses with
WslDistroStoppedError, which reaches every client version as the existing
runtime_error.

User acts stay ungated: git.status (a viewing client's implicit wake),
diffs and compares (opened views), file reads and directory listing
(taps and browsing), and stat (the download name check).
2026-10-28 16:48:31 -07:00
Neil b18dc951ca i18n(wsl-mover): translate the undo-running refusal into every UI language (#35473) 2026-10-28 16:46:51 -07:00
a5322350b2 fix(mobile): keep unmounted desktop browser tabs visible and closable (#31665)
* fix(mobile): retain renderer-owned browser tabs while unmounted

Adapt the community browser ownership fix from #14792 to the current runtime modules. Preserve renderer epochs and route mobile browser close through its owner.

Co-authored-by: Bing.Z <zzb@gxsmjx.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* test(mobile): cover browser ownership lifecycle races

* test(runtime): cover browser identity collisions and stale retirement

* fix(mobile): retain browser group membership after renderer reconnect

* fix(mobile): drop renderer browser rows once the desktop window closes

In serve mode the offscreen reconcile no longer checked for a window, so a
closed window's browser rows stayed listed with no page behind them. Also
drop the legacy :headless-merge: ownership fallback, which nothing produces.

* fix(mobile): list a desktop webview's page once in serve mode

The bridge inventory also lists an attached window's webviews. Only the
offscreen reconcile filtered those out, so hydrate added a second row for
the same page, and closing it unregistered the desktop's guest. Filter in
the shared builder instead.

* fix(mobile): list only pages the serve browser backend created

With a desktop window attached in serve mode the bridge inventory also
lists the window's background webviews, which the renderer does not
publish. Those became offscreen rows, and closing one unregistered the
desktop's guest. Ask the backend which pages it owns.

* style(mobile): keep projection layout file under the line cap

* fix(mobile): keep the serve publication epoch when browser pages change

* test(mobile): give browser backend doubles ownsTab and drop removed notifier field

* fix(mobile): republish browser rows when the desktop window closes and dedupe serve rows

* fix(mobile): rebase detached publications only for retained offscreen pages

* fix(mobile): advance snapshot versions when the desktop window closes

* test(mobile): name the offscreen epoch ownership tests after what they cover

---------

Co-authored-by: Bing.Z <zzb@gxsmjx.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>
2026-10-28 23:45:35 +00:00
Neil 4c31ba52e6 test(worktree): check concurrent create names, not which create reached Git first (#35457) 2026-10-28 16:40:50 -07:00
Kelvin Amoaba b28bd423c5 refactor(runtime): move the durable prompt-delivery probe out of orca-runtime-get-status.ts (#35460)
* refactor(runtime): move the durable prompt-delivery probe out of orca-runtime-get-status.ts

* style: format AGENTS.md
2026-10-28 23:31:27 +00:00
OrcaWinandOrcaWin 06c3443ab5 fix(i18n): localize right sidebar, GitHub and PR page leftovers (#35416)
Replace sentence fragments, manual non-family plurals, item(s) copy and
hard-coded English in the right sidebar, GitHub item dialog, PR page,
GitLab item dialog and diff-comment surfaces with whole-sentence keys and
CLDR plural families, and add translations for all built-in locales.

Refs #32207

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 16:26:36 -07:00
Kelvin Amoaba cc3b3fb9a5 fix(agent-status): leave Grok cancels to Grok's own StopCancelled hook (#35417)
Esc never cancels a Grok turn and Ctrl+C can open a stop dialog the user
can decline, so keypress inference marked live Grok turns finished.
2026-10-28 23:22:23 +00:00
Neil 797bbaa64c fix(wsl-mover): say a move waits for a project coming back, not for another move (#35406) 2026-10-28 16:21:09 -07:00
OrcaWinandOrcaWin b1cf46775c fix(i18n): localize remaining plurals, fragments and hardcoded copy in task page, automations and shared components (#35413)
* fix(i18n): localize remaining renderer plurals, fragments and hardcoded copy

Convert manual one/many keys and value0 counts to CLDR plural families,
replace fragment concatenations with whole-sentence keys or Trans, and route
hardcoded English labels, errors and compact time units through the UI locale.

Refs #32207

* fix(i18n): re-render memoized agent state dots on language change

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-28 16:20:33 -07:00
Neil 552691fa0e fix(browser): "Server (streamed)" on a server that cannot stream hosts pages through it (#35381)
With "Remote server workspaces" set to "Server (streamed)", a paired server
that has no way to stream pages (an orcad `orca serve`: its browser engine
offers no screencast) could not take the desktop's new tabs. The desktop
fell back to a plain desktop tab the server never heard of: it browsed from
the desktop's network and never appeared in `orca tab list`, so agents could
not see or drive the page the user was on.

The setting is a rendering preference. When the server cannot stream, the
desktop now renders the page itself as a page the server owns (the existing
client-hosted path), so traffic still goes through the server and the tab is
listed and drivable from the server's CLI. Servers that can stream keep
rendering on the server; an explicit server placement is unchanged.

Refs #35156
2026-10-28 16:16:41 -07:00
Neil e5b5ae2d78 fix(wsl): account sync and usage previews never boot a stopped WSL distro (E9) (#35387)
* fix(wsl): account sync and usage previews never boot a stopped WSL distro (E9)

Four account paths touched WSL distros in the background:
- Every launch mirrored ~/.codex/config.toml into each WSL Codex account home over UNC.
- Inactive Codex usage previews read a WSL home that nobody had checked.
- The startup Claude publish and inactive Claude previews trusted an unsettled
  running list.

Any of these booted a stopped distro, or one still stopping. The mirror now skips
WSL homes not seen running after any stop; launch preparation syncs them before
use. The other three use the settled running gate.

* fix(wsl): the Codex mirror trusts only a running list from the last 60 s

WSL's own idle stop is reported by nothing, so an old list must not
vouch for a distro. Drop the inert user-act clause: select and sign-in
do not run as WSL user acts.
2026-10-28 16:15:09 -07:00
NeilandClaude 86def974bd feat(wsl): a WSL bridge shell reports its folder, so restores follow cd (#35385)
* feat(wsl): a WSL bridge shell reports its folder, so restores follow cd

Bridge bash and zsh send no OSC 7, so the terminal daemon's emulator and every checkpoint kept
the spawn folder until a Sleep read the shell's folder in the distro. A terminate, a quit or a
timed-out read reopened the pane at the project root (verify-18 e). The bash rcfile and zsh
wrapper now report the folder at each prompt where it changed, only inside WSL, percent-encoded;
the daemon already reads OSC 7 into a WSL pane's UNC path.

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

* fix(wsl): re-send the folder report every prompt, and prove the daemon bridge sources it

* fix(wsl): keep the zsh folder report's locals in Orca's namespace; update wrapper snapshots

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-28 16:10:23 -07:00
Brennan Benson 78ad9f4255 fix: keep chat option actions independent of inventory (#31927)
* fix: separate chat option input from inventory observations

* fix: preserve scoped chat choices and publication ownership

* fix: complete scoped catalog and applied control ownership

* test: make catalog fixture dependency boundaries explicit

* test: request catalog discovery explicitly in demand contracts

* fix(chat): preserve option observations and operation boundaries

* fix(chat): finish pending option and catalog lifetimes

* fix(chat): project saved permissions without launch preparation

* fix(chat): correct option rejection and catalog retirement

* Preserve Claude effort validation advice through chat rejection

* test: align refresh mocks and preserve fixture type evidence

* fix: share catalog claims only across equivalent owners

* test: use typed catalog corpus instrumentation

* fix: consolidate structured launch imports

* Validate SDK queue regression envelopes without assertions

* fix: complete catalog runtime and fixture type contracts

* Align native option fixtures with explicit discovery and applied facts

* Keep initial compatibility catalog reads on held memory

* Complete the installed catalog fixture envelope

* Observe learned defaults after asynchronous projection settles

* Consolidate host fixture journal type imports

* test(native-chat): align goal and seed fixtures with applied inputs

* fix(codex): retain applied proof when goal settings skip a write

* test: load rejection wording before timed queue regression

* Fix catalog fixtures and queued option snapshot typing

* Align permission publication fixture with passive option reads

* Separate startup config from held turn permission fixture

* Align input lifecycle fixtures with sparse applied choices

* Simplify scoped catalog refresh ownership and coalesce cache snapshots

* Load catalog persistence real-module fixture during collection

* Compose catalog availability fixtures from valid session records

* Align catalog and startup fixtures with current option contracts

* Fix permission read types and separate catalog fixture preparation

* Align option and restart fixtures with current lifecycle owners

* test(mobile): retain reported model alongside discovery

* test(mobile): recalibrate the measured route script envelope

* test: let the preflight shell-capture mock run its detection callback
2026-10-28 16:08:01 -07:00
Neil a678688f68 i18n(wsl-mover): translate the project mover into every UI language (#35414)
* i18n(wsl-mover): translate the project mover into every UI language

* i18n(wsl-mover): ru says a move goes to the distro's host, not out of it
2026-10-28 16:07:25 -07:00
NeilandClaude a03598dad5 chore(wsl): keep the Sleep folder and bridge-exit lines in the local trace (#35378)
* chore(wsl): keep the Sleep folder and bridge-exit lines in the local trace

A packaged build keeps no console, so #35150's Sleep folder line and the WSL bridge exit verdict
were invisible on a device. Each now also goes to main.trace.ndjson as a span with the line and
its facts as filterable fields.

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

* fix(wsl): keep session paths and distro names out of the persisted WSL trace

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-28 16:07:16 -07:00
Brennan Benson f0d55e7319 Nest chat-UI orchestration workers under the agent that started them (#34601)
* Nest chat-UI orchestration workers under the agent that started them

Main's lineage projection only walked terminal panes, so workers running
in the chat UI never got a parent link and listed flat in the sidebar.
It now also projects chat workers, keyed by their visible chat row, and
resolves a chat creator or coordinator to that chat's visible row
instead of its handle or private mailbox pane key.

* Fix public worker lineage across assignment and row identities

* Complete terminal lineage provenance and bound active session selection

* Repair lineage test runtime boundaries and SQLite counters

* Batch public lineage verification after exact recency selection

* Use checked runtime values in lineage integration tests

* Document the trusted Dispatch SQL row boundary

* Keep lineage integration imports within their test programs

* Load native lineage fixtures before test execution

* test: complete lineage inputs in runtime and sidebar fixtures

* test: seed benchmark facts from active dispatches

* test: replace partial orchestration DB casts with typed fixtures

* test: complete stale-leaf mailbox fixture session input

* fix(test): render worker lineage fixture with production list
2026-10-28 16:06:38 -07:00