mirror of
https://github.com/stablyai/orca.git
synced 2026-10-31 09:07:40 +00:00
96cd21bbc4e18de362decccd5eaec78c0bad176f
17220
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
96cd21bbc4 |
Keep remote agent status in sync after completion and approvals (#34729)
* fix(remote): reconcile stale paired agent status and pane titles Adapt the remote completion repair from #25205 while preserving sparse runtime pane slots through existing PTY bindings. Co-authored-by: Manan Chataut <mananchataut@gmail.com> * fix(remote): preserve pane identity when reconciling moved titles Use mounted manager identities and retained PTY bindings ahead of replay order; keep fresh byte-stream ownership on the correct moved pane. * fix(remote): release byte status fence after host approval * fix(remote): tighten paired title removal and test the timing fence - Share the byte-write timing decision (resolveRendererOwnedAgentStatusTiming) between pty-connection and the flap test so reverting it fails a test. - Only delete a saved pane title when its durable leaf is absent from both the host layout and local panes; unresolved or surface-less slots are kept. - Share the client-fence predicate (clientAgentStatusFencesHost) between status and title reconciliation. - Cover removed-leaf spinner fallback in worktree status and a client split absent from a pre-split host snapshot. * fix(remote): correct fence predicate and title test types --------- Co-authored-by: Manan Chataut <mananchataut@gmail.com> |
||
|
|
c665754a8e |
feat(cli): add --branch to orca worktree create (#26752)
Expose the runtime's existing branchNameOverride on `orca worktree create` so callers can name the Git branch (skipping the configured branch prefix) while --name keeps setting the workspace name. A valueless or empty --branch fails before any runtime request; omitting it leaves the request unchanged. Document the flag in help, the spec notes, and the CLI reference, including the numeric suffix applied when the name is taken. Fixes #19541 Co-authored-by: Neil <neil@stably.ai> |
||
|
|
d20791e522 |
fix(session-search): read --since as an instant, whatever offset it carries (#28329)
Hosts filter with `updated_at >= ?`, comparing text against UTC toISOString() values, so a `+08:00` cutoff was read as if UTC and a whole-second `...00Z` cutoff dropped sessions in that same second (`Z` sorts after `.`). The cursor key also hashed the raw spelling. Normalize `since` to toISOString() in AiVaultSearchFiltersSchema. Every client and host path parses this schema, so new clients send a cutoff older hosts already compare correctly, and new hosts normalize whatever older clients send before filtering or building the cursor key. `Date` keeps milliseconds only, so a cutoff like `...00.0005Z` rounds up to the next millisecond rather than letting in a session from before it. Fixes #28253 Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com> |
||
|
|
0a349b3197 |
Prioritize exact visited URLs over popular subpages (#34583)
* Prioritize exact visited URLs over popular history subpages * Prioritize typed URL history over frequent subpages |
||
|
|
3c6775746d |
perf(space): omit unchanged drafts from companion updates (#34854)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
a891e3612c |
chore: remove remaining Vitest patch (#34878)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
d155cfba05 |
feat(editor): syntax highlighting for Glimmer .gjs/.gts files (#13236)
Register glimmer-js and glimmer-ts Monaco languages that embed JavaScript/TypeScript as the background script and tokenize each <template> block as a Handlebars island. Embed entry is bounded by the shared line budget so long lines cannot blow the Monarch recursion limit. Mobile maps the new ids to javascript/typescript highlighting. Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com> |
||
|
|
e3cabd5e3c |
feat(wsl-mover): restore the host's browser link before a move, else say logins stay behind (#33086)
* feat(wsl-mover): restore the host's browser link before a move, else say logins stay behind A WSL host without its deployment link has no stable browser partition, so the move's cookie copy carries nothing. Connecting a move's host now re-saves the live connection once when the link is missing, which restores it whenever the pairing or ports were what broke it. When the host still cannot keep logins, the move preview lists "browser sign-ins won't carry over"; the move is never blocked for it. The move result also names the reason the copy recorded. * refactor(wsl): share the save-and-notify of a host connection; keep the service under its line cap Rebased on main, wsl-host-service.ts went over 300 lines. The persist-then-retire-transports step now lives in wsl-host-connection-record.ts (saveWslHostConnection), used by both the connection-change handler and resaveConnection. |
||
|
|
70edd36af0 |
perf(github): reuse participant profiles during mention enrichment (#34771)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
91ad307281 |
perf(github): revalidate PR lookup reads without spending unchanged REST quota (#34759)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
624e01bfcd |
docs(cli): say orchestration check --peek and --all cannot drain a mailbox (#19161)
--peek and --all return no deliveryId, so a coordinator that loops on them never acknowledges anything. Document that, note the 100-row cap for --all and Run --peek, and give the drain recipe: repeat plain check with --ack <previous deliveryId> until deliveryId is null. Co-authored-by: 서정화 <seojeonghwa@Mac.mshome.net> Co-authored-by: Neil <neil@stably.ai> |
||
|
|
82c492c684 |
fix(agents): use a Qoder icon that stays visible in dark mode (#29038)
Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
c017ef983c |
Preserve WSL Codex question and child completion status (#34724)
* fix(agent-status): preserve WSL Codex questions and child completion * test(agent-status): route remote Codex question test through relay envelopes * fix(agent-status): scope remote Codex roster removals to the reporting relay session - Unlabelled relayed polls retire only children the current relay link listed; each WSL link starts a new session, so a restarted guest's partial roster cannot delete children an earlier guest reported. - One removal rule: an explicit list, a done aggregate, or an unshed absent roster proves removals; a shed roster with live work keeps the children. Drops the old done-main-agent clear that wiped shed rosters. - An unshed poll with no roster now retires the last child while the root works. - Share the Codex hook event-to-state rule between local and relayed paths. |
||
|
|
bb10b80be5 |
feat(wsl-mover): D3a-2 move status line on WSL host rows (dark) (#34676)
* feat(wsl-mover): D3a-2 per-distro move status line on WSL host rows, with decline causes and stale-record pruning (dark) * fix(wsl-mover): key D3a-2 status records without the node-only journal module in the renderer * fix(wsl-mover): D3a-2 pre-review — never prune user choices or on an unreadable host file; calm paused line; one-key blocker sentence; Show terminal feedback * refactor(wsl-mover): D3a-2 distro-in-use check in its own module * test(wsl-mover): the orchestrator host-connect test gives the new in-use port * fix(wsl-mover): D3a-2 Check again runs as the user's act on the distro (stopped-distro gates) * fix(wsl-mover): D3a-2 user steps use main's runAsWslUserAct gate; wiring test |
||
|
|
03dcd30367 |
docs: fix README typo and drop stale release-rc.yml cron note (#14569)
The README misspelled "sponsored" in the Signed Builds section, and CONTRIBUTING.md still pointed at a scheduled release-rc.yml workflow that no longer exists (release-cut.yml is dispatch-only). Fixes #14568 |
||
|
|
a21f79dee4 |
Fix copying from Codex started manually in remote shells (#34715)
* fix(terminal): forward copies from Codex started in remote shells * test(terminal): capture PowerShell copy probe exit status * fix(terminal): preserve configured shell arguments for remote profiles * test(terminal): isolate profile result from system startup output * test(terminal): run native daemon shell probes with Node * fix(terminal): keep an inherited remote-viewer marker out of local panes An Orca started from a remote viewer's pane inherits ORCA_REMOTE_VIEWER_CLIPBOARD, which would make every local Codex fake an SSH session. Treat the marker as per-spawn identity so only explicit launch env carries it. |
||
|
|
109fe8db7c |
docs(readme): add Russian README and refresh Turkish links (#34856)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
a312ea5ddc |
fix(fonts): bump Geist to v1.8.2 so lowercase omega no longer renders as capital Omega (#29315)
Geist 1.800 mapped U+03C9 (ω) to the capital Ω glyph. Upstream fixed the cmap in v1.8.1 (vercel/geist-font#248); v1.8.2 drops the bad mapping so ω falls back to the system font while Geist keeps its Λ λ μ π Ω glyphs. Vertical metrics are unchanged. Fixes #23152 Co-authored-by: Neil <neil@stably.ai> |
||
|
|
365482c849 |
fix(worktrees): finish a delete Git left half-done on macOS and Linux (#33209)
* fix(worktrees): finish a delete Git left half-done on macOS and Linux git worktree remove drops the registration even when its recursive delete fails partway, on every OS. The in-operation recovery that finishes that delete was gated to win32, so on macOS and Linux the leftover folder was recorded as failed and every retry was refused. Run the recovery on all platforms with its existing gates (Git lock, strict listing without the path, watchers closed first). Later retries and the startup finish still never delete an unregistered folder. Fixes #33023 * fix(worktrees): skip partial-delete recovery over a nested worktree * fix(worktrees): leave orphan errors to the proven orphan cleanup * test(worktrees): fail Orca's follow-up delete where a partial delete must stay listed Git-deregistered partial deletes are now finished by Orca on every OS, so the mocked IPC and runtime leftover tests make that follow-up delete fail too. Co-authored-by: Anmol Bhardwaj <anmolbhardwajinv@gmail.com> * fix(worktrees): finish a recovered partial delete like a normal one Skip the repo-wide git worktree prune (Git already dropped the row; prune can unregister checkouts on unmounted drives) and verify the row is gone instead. Delete the branch with the normal -d policy rather than always preserving it, so merged branches go and unmerged ones are kept. * refactor(worktrees): drop the dead force arg and run the live partial-delete test on macOS Co-authored-by: Anmol Bhardwaj <anmolbhardwajinv@gmail.com> * test(worktrees): match main's signal arg and locked-file delete error in partial-delete tests Co-authored-by: Anmol Bhardwaj <anmolbhardwajinv@gmail.com> * fix(worktrees): surface the nested-worktree refusal and keep the live race test Windows-only The recovery swallowed the nested-worktree guard into 'not recoverable', so users saw Git's 'Directory not empty' instead of the nested-worktree message. The live churn race flaked on macOS when Git won the race; real-Git darwin runtime tests already cover it. * refactor(worktrees): drop the redundant post-delete registration re-check in partial-delete recovery The predicate already proved Git dropped the row; re-listing after the rm only turned a listing failure into a misleading stale-registration error after the folder was gone. The force argument is now always true for the remaining stale-registration caller. --------- Co-authored-by: Neil <neil@stably.ai> |
||
|
|
c698f9bded |
fix: prevent setup command truncation during shell startup (#25820)
* fix: keep setup command short so it survives shell startup The POSIX setup wrapper inlined the runner path six times. On long worktree paths it exceeded macOS's 1024-byte canonical PTY input limit when typed while the shell was still sourcing rc files, so the tail and submit byte were dropped, setup never ran, and a gated agent waited forever. Carry the setup script in ORCA_SEQUENCED_SETUP_SCRIPT and submit only `bash -lc 'eval "$ORCA_SEQUENCED_SETUP_SCRIPT"'`, mirroring the existing startup gate. The env is merged into setup.envVars wherever the gate is built so provisioning, fallback retries and renderer tabs/splits all receive it, and WSL imports it untranslated. Closes #20935 * fix(wsl): forward the setup script WSLENV entry before the daemon boundary Same-protocol daemons from older builds rebuild WSLENV without ORCA_SEQUENCED_SETUP_SCRIPT, so WSL setup would eval an empty script and the gated agent would wait for its timeout. Also swap new spec casts for the spawnedPtyEnv fixture. * fix: fail loudly when the sequenced setup script env is missing A dropped ORCA_SEQUENCED_SETUP_SCRIPT made eval run an empty string and exit 0, silently skipping setup. ${VAR:?missing} reports it in the Setup pane. --------- Co-authored-by: Neil <neil@stably.ai> |
||
|
|
fdfc5e2569 |
test: remove 36 low-value capability, schema and config cases (#34708)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
f44b782492 |
perf(browser): reuse startup profile metadata during hydration (#34748)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
bd9455b616 |
test(wsl): cover a WSL-host orcad and the desktop at different versions (#34792)
* test(wsl): cover a WSL-host orcad and the desktop at different versions The desktop and a WSL distro's orcad update independently, and nothing pinned how they meet. - wsl-orcad-update-admission.test.ts: an older desktop keeps the newer orcad another desktop deployed serving, with no Update hint, and deploys over it only on Force; a policy refusal over that host carries orcad_host_newer. A newer desktop updates an older orcad on connect, keeps it serving with a Force hint after a failed update, and treats an orcad from before app provenance as updatable. - cross-version-wire/wsl-host-desktop-downgrade: against the baseline release, a newer desktop withholds the agent-session account env from a WSL orcad that never advertised it (the release's strict schema accepts the call), sends agent.launch's account env the release accepts, and reads the release's errors with no drive refusal; an older desktop reads the Windows-drive refusal as the readable runtime_error it already shows. * test(wsl): type the unused Claude preparation, and read the older orcad's error with the newer desktop's unwrap |
||
|
|
4b7eaa3b7c |
fix(wsl-mover): undo's host checks fail closed with one deadline; label moved automations (#34686)
* fix(wsl-mover): undo's host checks fail closed and keep one deadline; label moved automations Follow-ups from the #34059 undo review, stacked on it: - A host workspace's terminal count reads as zero only when the host says it no longer has the workspace (selector_not_found); any other error, or an answer it cannot read, now counts as the host not answering, so undo refuses. - The exit wait keeps one wall-clock deadline for the whole stop instead of counting polls, so a slow host can no longer stretch it many times over. - A test for D1b-7a's hydration purge rule: a moved project's chats survive, a stale worktree still goes. - A moved project's local automation reads "Runs on the <distro> host" in the list, where it read Enabled though this computer never runs it. * fix(wsl-mover): undo gives the host's terminals a minimum window to exit after the last sleep A slow but healthy host with many workspaces could spend the whole stop budget sleeping them and then read as still running on the first exit check. The exit wait now runs at least 5 s past the last sleep, within or beyond the overall deadline. |
||
|
|
ad8d35eb59 |
feat(wsl): serve saved WSL work behind a closed hosts gate (gate states, kill switch 1/2) (#34683)
* feat(wsl): serve saved WSL work behind a closed hosts gate (serve-only) The WSL hosts gate gains three states. A closed gate with a saved WSL host or a committed move becomes serve-only: saved hosts stay listed and reachable, committed rewrites, retention, interrupted-move recovery and the way back keep running, and the preload API is exposed through a stamped window argument. Adding hosts and starting moves still need the open gate. With nothing saved the gate stays closed exactly as before. * fix(wsl): stamp serve-only into the dashboard popout and Space windows too They load the same preload, so without the argument they hid saved WSL hosts' status and Connect in serve-only. One helper now supplies the argument for every window on the shared preload. * fix(wsl): reviewer follow-ups for the serve-only gate - Refuse wslHosts:add unless the internal gate is open here, so this PR is safe on its own. - Promote on any move journal entry, so recovery can reset an in-flight move whose host record is gone. - List unfinished moves in serve-only. - An unreadable WSL deployment store fails closed in serve-only too, through a shared serving flag main sets at startup. - Report the gate state in wsl_usage_snapshot as an optional field. |
||
|
|
b287531024 |
fix(wsl-mover): hold an app update install while a WSL project move runs (#34813)
Installing an update quits the app. A move interrupted that way recovers on the next launch with nothing lost, but the user sees the move fail and, if it stopped between sending the copy and the host's commit, the projects stay read-only until a move is started again. The install now refuses while this process runs a move, says why, and keeps the staged update's Install retry; the move and its terminals carry on. Moves only run behind the internal WSL hosts gate, so nothing changes with the gate off. |
||
|
|
7cdfebdc1b |
Revert iteration checks and custom Vitest selection (#34834)
* revert: remove iteration checks and custom Vitest selection * chore: use upstream affected-test selection --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
1983946e25 |
Keep remote terminal input working after a failed viewport restore (#34716)
* fix(terminal): preserve remote input after passive resize failure * test(terminal): assert passive resize input ordering * refactor(terminal): share passive desktop resize claim chaining Move the desktopClaimTail passive-resize rule into chainPassiveDesktopResize so the multiplex and binary-subscribe transports use one implementation, drop the unreachable outer catch, and pass startStream test options as an object. |
||
|
|
c10110b5f9 |
perf(wsl-host): a call made while the host connects joins that connect (#33180)
* perf(wsl-host): a call made while the host connects joins that connect, keeping no-boot semantics * fix(wsl-host): never join an Update/Force connect, and wait for the new bridge while one is connecting |
||
|
|
7b36efda85 |
perf(wsl): ride the liveness watch on the desktop's own bridged sockets (#34802)
* perf(wsl): ride the liveness watch on the desktop's own bridged sockets The supervisor held a dedicated wsl.exe bridge per connected distro only to see orcad exit, about 21 MB on Windows and 7 MB in the guest. The WSL listener now reports when the guest ends one of the desktop's bridged sockets (its control and request connections) before the desktop did, and the watch fires on that; the port probe stays a short-lived bridge. A watch with no open socket proves nothing, so the heartbeat then verifies in full. * perf(wsl): verify every 30 s while no desktop socket proves orcad Review of #34802: with the watch riding the desktop's sockets, a host with none open was only checked on the 120 s heartbeat. While the watch proves nothing, the next tick now comes after 30 s and does the full verify (one identity read and a probe bridge); with a socket open it is the cheap heartbeat again. Heartbeat scheduling moved into the monitor to keep the supervisor at its line cap. * fix(wsl): fire the socket watch only when the guest ends the last open socket Review of #34802: a WebSocket close lets the server end the stream first, so every normal close of a one-shot RPC or an idled request socket read as guest-ended and fired a full verify. orcad exiting ends every bridged socket at once, so the watch now fires only when a guest-ended socket was the last one open. The real-WSL lane counts watch fires across 10 one-shot RPCs with the control socket held and expects none. * fix(wsl): check sooner once the last desktop socket closes, and coalesce exit bursts Review of #34802: - When the desktop closes its last socket to a host, the watch reports idle and the next full check moves to the 30 s idle period instead of waiting out the 120 s heartbeat. - Exit signals within 2 s of the last one (one-shot sockets coming and going with none held) coalesce into one verify; the first still fires at once, so detection keeps its speed. * test(wsl): type the supervisor harness watch's idle hook |
||
|
|
f173998203 |
feat(wsl-host): a chat on a stopped WSL distro says so and offers Start (#34681)
* feat(wsl-host): a chat on a stopped WSL distro says so and offers Start * fix(wsl-host): a chat's Start never cancels a pending WSL host Remove |
||
|
|
1eaaf85e9f |
Land the WSL project mover dark (merges only after verify-15b, the flag-off audit and green CI) (#34059)
* test(orcad-migration): pin the SSH manifest through the real dormant collectors Co-Authored-By: Claude <noreply@anthropic.com> * refactor(orcad-migration): read the dormant-state export through a source-kind scope A local-WSL scope lives on host local and owns only its projects, so host-wide matches stay an SSH whole-host rule. SSH bytes are pinned by the collector golden. Co-Authored-By: Claude <noreply@anthropic.com> * feat(wsl-mover): export a local WSL move's signed manifest with its dormant state (D1b-3c) Collects the scoped projects, their groups and every dormant-state kind through the local-WSL export scope, rewrites UNC paths to the distro's, and returns blockers for anything the collectors can't carry instead of dropping it. Automations move disabled, as the wire requires, and come back as a list to re-enable on the host after commit. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): reset an interrupted move to zero, or finish it once the host proves a commit Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): abort a move by its identity when its manifest is too large for a request Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): cap a new move's manifest below the request limit, and move forward on a by-reference commit only once the host flushed it Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): remove only the newest move of a distro, so its chain stays readable Co-Authored-By: Claude <noreply@anthropic.com> * feat(runtime): clients read a migrated pane's scrollback from its host (D1b-6d-1) * fix(runtime): hold a remote pane only when its host is known to serve scrollback, and never read bytes in render (D1b-6d-1) * fix(runtime): route the scrollback read by the tab's own host, never the focused one (D1b-6d-1) * fix(runtime): resolve the scrollback host through resolveOwner and use the shared RPC error check, after main moved both (D1b-6d-1) * feat(wsl-mover): a moved project's existing chats stay listed and resumable on this computer (D1b-7a) * fix(wsl-mover): moved-project chats go through the layout owner instead of writing layout directly (D1b-7a) * test(wsl-mover): run the moved-project chat runtime test in the Node runtime (D1b-7a) * test(wsl-mover): read the hidden local row through main's per-host hidden-repo API (D1b-7a) * feat(wsl-mover): rewrite the desktop's routing and seed the host's session after a move (D1b-7c) Registers the main-side desktop rewrite stores ui-routing, session-globals and host-session-seed. Adds a +2 main layout-writer baseline line for wsl-move-main-rewrite-stores.ts: these are one-shot, ledgered move rewrites, and no LayoutCommand can set focus or seed a runtime host's partition. * fix(wsl-mover): finish the main rewrite before the window loads, keep one copy of each moved tab, and copy instead of move (D1b-7c) * feat(wsl-move): rewrite renderer stores for moved projects and keep their UI through catalog prunes (D1b-7d) Registers the renderer-side desktop rewrite stores quick-open-history, file-view-preferences and notebook-environments. The renderer copies each moved workspace's entry to its WSL host key, marks it applied in the same storage, and records the ledger entry; main requests a storage flush first and accepts only the main window. Committed moves are re-listed for re-application at every startup. Catalog prunes keep filters, hook trust and setup-script dismissals of moved repos. * fix(wsl-move): import the migration manifest types from main's orcad-migration folder (D1b-7d) * fix(wsl-move): import wslUncPathToLinux from shared wsl-paths in the manifest exporter, where 7d moved it (D1b-7d) * feat(wsl-mover): rewrite a moved project's orchestration history on the desktop (D1b-7e) Settled local worker dispatches and their worker-terminal rows in a moved project take the WSL host's worktree id, in one ledgered, idempotent store. Chat workers, live rows, federated attachments and JSON receipts stay as written; automations keep their unchanged local copy (the scheduler only advances it). Per-table dispositions for orchestration.db. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): hold the orchestration store while a worker in scope is live; skip federated rows (D1b-7e review) Co-Authored-By: Claude <noreply@anthropic.com> * feat(wsl-mover): copy in-app browser logins into the WSL host on a move (D1b-7f) A committed WSL move now copies each in-app browser profile's cookies once into the WSL host's stable route partition (owner decision 3a), merging without overwriting what the host jar holds and never touching the source. Where that is infeasible (no deployment link so no stable partition, the destination is not a WSL host or is gone, or the partition name is held by another identity) the host starts fresh and the move journal records why (3b). Registered as the ledgered browser-cookies rewrite store; it runs only once browser sessions and an app window exist. WSL_MOVE_DESKTOP_REWRITE_REGISTRY_COMPLETE stays false. * feat(wsl-mover): retain moved source rows, reconcile them on start, and plan delta moves (D1b-8) * fix(wsl-mover): keep the retained mark out of the WSL move manifest (D1b-8) * feat(wsl-mover): the move driver runs a WSL move end to end, with production gate facts and journaled restore folders One entry point (and preview/start/cancel/listUnfinished IPC for D1b-9) plans the move, gates terminals on the hook server's agent status, the close-tab process probe, running automation runs and live dispatches, pauses and proves exit, stages, sends blobs, commits only from blobs-transferred (#29825), and finishes on the desktop. Any failure resets to zero or goes forward when the host committed. Restore folders and the automations to turn back on are kept in the journal; the host turns those automations back on after commit, retried until it confirms. A real-PTY test pauses daemon shells, and runs on a real distro in the WSL orcad lane. * feat(wsl-mover): move dialog with preview, blockers, progress and result behind the internal WSL hosts gate (D1b-9) * fix(wsl-mover): move dialog hides instead of blocking, follows runs after a reload, and lets a start settle an unfinished move (D1b-9 review) * fix(wsl-mover): word an unfinished earlier move as still finishing (D1b-9) * test(wsl-mover): type the e2e's fake move state instead of reading it through Reflect (D1b-9) * WIP(wsl-mover): 7f-2 registry complete, coverage proof, startup re-apply (D1b-7f-2) * test(wsl-mover): registry-complete lifecycle, stale-focus restart, unload re-apply (D1b-7f-2) * fix(wsl-mover): share the session focus write so the re-apply adds no layout writer (D1b-7f-2) * fix(wsl-mover): redo additive rewrites once at a stale window's unload; behavioural coverage proof (D1b-7f-2 review) * test(wsl-mover): the IPC record test now finishes the rewrite with the registry complete (D1b-7f-2) * fix(wsl-mover): fence worktree-less spawns by cwd and re-prove terminal exit before commit (R46, WIP) * test(wsl-mover): pin the commit re-proof, browser jar identity and repeated move generations (R45, R46, R47) * fix(wsl-mover): fence any spawn by its folder and name the re-proof's reason (R46 review) * fix(wsl-mover): a terminal in a known folder outside the move never blocks it (R46 follow-up) * test(wsl-mover): kill the real move driver at every point against a real host store; abort a reset move's leftover stage on reconnect Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): carry unsaved drafts into the moved project; round-trip every fixture through the real export, driver and host import Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): reset a move waiting on a distro that is proven unregistered; test updates mid-move (R41), lost distros (R38) and two desktops (R39) Co-Authored-By: Claude <noreply@anthropic.com> * test(wsl-mover): list the D1b-10 real-SQLite mover tests Co-Authored-By: Claude <noreply@anthropic.com> * test(wsl-mover): type the fault test's journal hook without a cast Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): reset for a lost distro even when its kept host fails to connect, never for a renamed one; compare filled-in repo keys only where the source lacked them Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): carry markdown frontmatter visibility and closed-terminal-tab tombstones into the moved project Co-Authored-By: Claude <noreply@anthropic.com> * test(wsl-mover): read the persisted stage through a typed record, not Reflect Co-Authored-By: Claude <noreply@anthropic.com> * feat(telemetry): report how WSL moves end, by phase and reason code (R43) Co-Authored-By: Claude <noreply@anthropic.com> * fix(telemetry): report a pause refusal's reason, an outcome for a thrown run, and only real transport errors as unreachable Co-Authored-By: Claude <noreply@anthropic.com> * fix(agent-hooks): a WSL host's orcad never removes the hook entries the WSL bridge shares (R42) Co-Authored-By: Claude <noreply@anthropic.com> * fix(agent-hooks): a WSL host's Codex account-home launch with hooks off skips too; mark the R42 guard to drop with the bridge Co-Authored-By: Claude <noreply@anthropic.com> * feat(wsl-mover): "Use on this computer again" brings a moved project back as it was before the move Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): judge a bridge WSL pane's foreground inside its distro On Windows every live bridge pane's own process is wsl.exe, so the busy-terminal gate read every open WSL terminal as running a program and refused the move. Read the pane's terminal foreground process group inside the distro (processes carry ORCA_PANE_KEY): only shells means idle, anything else blocks, and an unreadable guest stays unverifiable. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): only the selected projects' session rows can refuse a WSL move The session eligibility check treated host local's whole partition as the move's, as the SSH conversion does. So an agent session or unsaved draft in any other project on this desktop, or in a project an earlier move retained, refused every later WSL move from that distro. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): sign the manifest as the journal and the host read it The digest was computed over in-memory rows. A value with toJSON (a Date on a row added this session) canonicalized to {} when signing but to its string once written to the journal or sent to the host, so the first move after adding a project reset with orcad_migration_manifest_digest_mismatch until a restart reloaded the row. Normalize through JSON before signing. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): carry a slept pane's scrollback from its daemon checkpoint The move sleeps every pane first, and a slept pane's history lives only in the daemon's checkpoint, never in a renderer snapshot. The export carried renderer snapshots only, so moved terminals opened empty. After Sleep the driver reads each paused pane's checkpoint (as cold restore would replay it) and the export carries it under the pane's own snapshot ref; the snapshot channel serves those bytes, checked against the signed hash. SSH conversions pass no reader and are unchanged. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): say why when a move can't be prepared, instead of a bare reset An export or journal failure after the pause (a digest mismatch, on awin) was rethrown and shown as "everything was put back" with no reason. Nothing is journaled yet at that point, so refuse with the error named instead. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): retry a renderer store main refused to record The renderer applied a store and wrote its marker, but ignored a refused ledger record (gated-off, failed, not-main-window), so a committed move stayed unfinished and refused every later move of the distro until the next app start. Log the reason and retry with backoff until it lands. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): a WSL pane is idle only when its shell has nothing else Review of #32343: reading only the terminal's foreground group let background jobs, nohup and disowned work, setsid daemons and a script waiting at read pass as idle, and the move's Sleep would end them. Scan the pane shell's subtree, its session and every process carrying its key; any non-shell process, or a shell running a script, blocks. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): never leave behind an agent whose key may be the selected project Review of #32343: scoping the session check to the selected projects let an unqualified key for a repo id another host also registers fall out of both the transfer and the refusal. Such a key now refuses. Adds tests that fail on the old code: another project's live agent with its tab open and its draft don't refuse, the same kinds of state in the selected project still do. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): refuse an unreadable slept checkpoint, prefer it, and spool it to disk Review of #32343: - A checkpoint behind an unreadable log (or an unreadable one) refuses with the pane named instead of carrying stale history. - For a pane the move just slept the checkpoint is the newest copy, so it wins over an older renderer buffer or snapshot. - Buffers spool to a per-move folder and only their hashes and sizes stay in memory; the snapshot channel reads them by offset. The folder is removed whatever the outcome. - A journal write that landed before it threw is reset, so no orphan record blocks the next move. awin's checkpoints were 310-615 KB, well inside the 5 MB per-pane cap, so nothing there is trimmed. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): retry a failed listing, never a record another window was refused Review of #32343: not-main-window can't clear by waiting, while a listing failure is transient. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): sign the manifest as the host parses it The likelier cause of awin's digest mismatch: the signature covered the exported objects, but the manifest parser keeps only the fields it knows, so a session field it drops (one a sleep can write) left the journal and the host hashing something else. Sign the parsed form, and warn when the parser dropped anything, since such a field does not move. Co-Authored-By: Claude <noreply@anthropic.com> * chore(wsl-mover): split the journal step out of the driver, and format The review fixes took wsl-move-driver.ts past the line limit; the export-and-journal step moves to its own module unchanged. Co-Authored-By: Claude <noreply@anthropic.com> * fix(wsl-mover): a slept pane passes the busy check; say what each move dropped or lacked Re-run on awin ( |
||
|
|
cb43b47359 |
fix(terminal): let file existence pick spaced path readings so prose cannot hide a path (#34281)
* fix(terminal): let file existence pick spaced path readings so prose cannot hide a path * refactor(terminal): let the host's file check decide spaced paths and replay phone taps that name no file Spaced readings no longer guess where a path ends: a rooted path offers one reading per following word (up to ten), and a relative path grows only to its first filename so dense path lists stay cheap. A phone tap whose readings name no file replays the ordinary tap instead of reporting a failed open, and checks up to 16 readings at once. * fix(terminal): drop a phone tap's replay after a newer tap, and accept digit-led extensions * fix(terminal): drop a phone tap's replay after typing, URL taps or selection, and accept Unicode extensions * refactor(mobile): decide terminal file taps from the text under the finger instead of replaying withheld taps A tap is a file tap only when it lands on a path itself; prose beside a path stays an ordinary tap at once. This removes the withheld-tap fallback and its stale-tap counters. * refactor(terminal): return spaced path guesses apart from written paths so only a host check can act on a guess Hover and chat check every reading as before. A click opens a guess only after the host finds its file, and never past an external share. A phone tap is a file tap only when a written path is under the finger, so a markdown destination with spaces counts. OSC 8 targets are parsed as written. Phone file checks return to 8 at a time. * fix(terminal): leave a click on prose beside a path to the terminal unless a written path or a confirmed guess covers it * fix(terminal): fall back to the shortest checked written path when a click's file checks fail * docs(terminal): say relative paths grow only to their first filename |
||
|
|
852626d87b |
test(wsl): make the holder script tests wait on the holder, not the clock (#34814)
Under load the holder's start-up rm -f of a stale request could run after the test wrote its request, so the holder never saw it and the hidepid test (and others) timed out. Tests now wait until the holder has cleared a start-up sentinel before writing a request, wait for the hold decision through its own blocked note, and give releases a generous bound that ends on exit. |
||
|
|
9d33005090 |
perf(mobile): defer unopened terminal document allocation (#34743)
* perf(mobile): defer terminal documents until first selection * test(mobile): address review findings on pane-gating test * test(mobile): use T[] array type in terminal document mount test --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
f0e97a6b2d |
fix(mobile): stop repository requests for obsolete task searches (#34740)
* fix(mobile): stop obsolete task repository requests * fix(mobile): release task-list spinners when a load is abandoned * fix(mobile): release spinners only for in-flight abandoned task loads --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
9d5406c633 |
docs: add Windows troubleshooting entry for RAM lost to process-leaking kernel drivers (#30519)
Explain how a kernel driver that retains exited processes drains RAM on Windows, how to spot it (PID range, RAMMap Page Table), the known AMD amdkmdag.sys cause with tested driver versions, and that only Restart reclaims the memory when Fast Startup is enabled. Fixes #30509 Co-authored-by: Neil <neil@stably.ai> |
||
|
|
56d66f0598 |
fix(terminal): keep keys typed into a remounted remote pane before it re-attaches (#34630)
A remounted remote (SSH or WSL host) pane shows its terminal id before its deferred attach starts. Keys typed in that window sat in the transport's pre-bind hold, and attach() discarded it, so the shell got only the suffix typed after the attach. Bind that typing to the terminal the attach names, as the local attach and a remote connect restoring a session already do; a pane with startup work, or a host now holding another terminal, still drops it. Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
f150deb226 |
feat(native-chat): show the full date and time when hovering a message timestamp (#32051)
Message timestamps render time-only; the full localized date and time was only exposed via aria-label. Wrap the <time> element in the shared Tooltip so hover and keyboard focus reveal the same full label, without adding a duplicate aria-describedby announcement. Transcript render tests now go through a TooltipProvider harness, matching App's production provider. Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com> |
||
|
|
09dd95d632 |
docs(cli): document terminal read --json result fields and cursor roles (#13173)
`orca terminal read --help` listed flags but not the --json result shape, so agents guessed field names and paged with latestCursor instead of nextCursor. Add Notes listing result.terminal fields, the meaning of truncated vs limited, when nextCursor is null, and how to page with nextCursor/oldestCursor. Fixes #7433 Co-authored-by: Neil <neil@stably.ai> |
||
|
|
4b1967bdd8 |
feat(i18n): add Turkish UI language (#34718)
* feat(i18n): add Turkish UI language Register Turkish (tr) as a built-in UI language alongside en, zh, ko, ja, es, fr and pt: language setting, system-locale detection, renderer and main-process lazy catalogs, Settings picker label in every catalog, Settings search keyword, onboarding picker, docs, README link and a Turkish style glossary (config/i18n-turkish.md). tr.json comes from the community Turkish catalog (#22200, refreshed in #31316), reconciled with the current en.json: keys retired from en.json, entries whose English source changed since the refresh, and entries with placeholder mismatches are dropped and fall back to English until the next translation pass. Supersedes #31316. Co-authored-by: Uğur Pala <mail@ugurpala.com> Co-authored-by: mert <mmerttpz@gmail.com> Co-authored-by: Mehmet Efe Aytaş <mehmetefeaytas@icloud.com> * feat(i18n): complete Turkish catalog Translate the 1,432 keys tr.json was missing, restore the count placeholder in six Turkish singular forms, and order the catalog like en.json. * fix(i18n): apply Turkish translation review Correct 32 mistranslations (wrong meaning, translated command names and example paths, swapped placeholders) and 525 glossary and grammar issues that two independent review passes both flagged. * fix(i18n): Turkish review fixes and dotted-I settings search Fold U+0307 from lowercased Turkish İ so settings search matches plain-i queries, fix sampled Turkish meaning/terminology issues, and align the glossary casing rule with the catalog. --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> Co-authored-by: Uğur Pala <mail@ugurpala.com> Co-authored-by: mert <mmerttpz@gmail.com> Co-authored-by: Mehmet Efe Aytaş <mehmetefeaytas@icloud.com> |
||
|
|
5237d52f82 | feat(wsl-host): point the WSL chat refusal at adding the distro as a WSL host (#34804) | ||
|
|
6d5db9a397 |
fix(mobile): cancel superseded shell download flows (#34780)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
8916bf36aa |
fix(mobile): release queued inbound frames after transport teardown (#34777)
* fix(mobile): release queued inbound frames when transports close * test(mobile): run relay inbound retention regressions in every runner --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
55f8a8d219 |
test: remove 29 low-value notification and diagnostic cases (#34703)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
ff6a3755a2 |
docs(usage-tracking): say Orca fetches usage over the network (#27318)
The usage-tracking docs claimed Orca only reads local agent state with no API calls. Orca actually fetches usage from each provider (Claude via api.anthropic.com/api/oauth/usage with the existing Claude Code login). Describe the network fetch, list the Claude fetch triggers, and fix the matching sentences on the Claude Code and Codex pages. Fixes #27150 Co-authored-by: Neil <neil@stably.ai> |
||
|
|
72ff417691 |
fix(mobile): discard refused picker cache copies (#34772)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
4270c886d8 |
fix(mobile): release native picks after page teardown (#34760)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
1ac9be7605 |
fix(mobile): let native screens handle Android Back after handoff (#34766)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
9c094e16d2 |
fix(mobile): share microphone ownership across page sessions (#34762)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |