mirror of
https://github.com/stablyai/orca.git
synced 2026-11-01 17:47:40 +00:00
d6918c7a1d3603d64b4c99b81631d2d64f2fd612
3951
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
d6918c7a1d |
fix(remote-files): cap search replies, say when a diff is too large, and measure a 100 MB read on WSL (#34882)
Follow-ups from the large-file audit (E7): - files.search had no byte budget: a result past the remote reply cap failed outright with reply_too_large. It now keeps the whole files that fit and marks the result truncated, as files.listAll and searchPaths already do. Local callers stay uncapped. - A diff side past the 10 MiB read cap came back as binary, so the diff said "Binary file changed" for a large text file. Blob reads mark it `tooLarge`, the binary diff result carries an optional `tooLarge`, and both diff views say "File too large to diff". Older clients ignore the field and keep the binary view. buildDiffResult builds its binary sides without a cast. - The real-WSL lane pages a 100 MB file over the plain distro's shared control socket in the editor's 384 KiB chunks and records the time, chunk count and orcad's VmHWM. Record-only: it asserts nothing, and a failure is recorded in the receipt. |
||
|
|
780ab3d71d |
fix(bitbucket): canonicalize ssh.bitbucket.org remotes in review links and Gitea detection (#30808)
Fold every forge SSH host alias (ssh.github.com, altssh.gitlab.com, ssh.bitbucket.org) through one shared normalizeForgeWebHost so main-process provider detection and renderer manual review links agree. Remotes on ssh.bitbucket.org now open bitbucket.org pull request forms instead of ssh.bitbucket.org URLs, and Gitea no longer claims the host. Co-authored-by: Eric Junker <4758+ejunker@users.noreply.github.com> Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com> |
||
|
|
1a0ce3a55c |
feat(editor): highlight Groovy files and Jenkinsfiles (#26792)
Register Groovy as a lazily loaded TextMate language using Shiki's bundled grammar, and map .groovy/.gvy/.gy/.gsh/.gradle, Jenkinsfile, Jenkinsfile.* and *.Jenkinsfile (plus the groovy shebang) to it. Token scopes are mapped onto ids the stock Monaco themes already style. Fixes #25635 Co-authored-by: Neil <neil@stably.ai> |
||
|
|
bd4702fbb5 |
fix(managed-server): let a forced update or rollback cross mixed daemon generations (#34664)
The terminal census collapsed sessions spread over more than one daemon generation to a null protocol, so a host that kept a legacy daemon alive across an earlier update refused every forced update and rollback while any terminal ran. The census now reports every live protocol, and the crossing check requires the incoming build to attach each one. The single-protocol field stays for older desktops. |
||
|
|
612febdadd |
Open existing agent chats and retained panes from their rows (#34650)
* fix(agents): open existing chat and retained pane destinations * fix: keep agent navigation scoped to the current destination owner * test: initialize dashboard tabs without a type assertion * fix: complete navigation test and English catalog contracts |
||
|
|
cd1fe07182 |
feat(kimi): add K3 to the commit-message model picker (#11386)
Adds kimi-code/k3 (Kimi K3) to the static Kimi model list, which is also the allowlist, so planning with K3 no longer fails with "not available". Drops the test that only restated the catalog. Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com> |
||
|
|
85ea1cc4c5 |
feat(browser): add Vivaldi as a Chromium cookie-import source (#11449)
Detect Vivaldi profiles on macOS, Windows, and Linux and import their cookies like other Chromium browsers. On Linux, Vivaldi stores its cookie key under Chrome's libsecret application name, so the browser definition can override the keyring application used for the lookup. Co-authored-by: Neil <neil@stably.ai> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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. |
||
|
|
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 |
||
|
|
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. |
||
|
|
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> |
||
|
|
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. |
||
|
|
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 |
||
|
|
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> |
||
|
|
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> |
||
|
|
52a43ed99e |
feat(i18n): add Russian UI language (#34717)
* feat(i18n): add Russian UI language Register `ru` as a built-in UI language using the catalog from #33370, reconciled against current en.json: keys pruned from English were dropped, stale translations whose English source changed were removed, and the catalog verifier now accepts CLDR few/many forms for an existing `_other` family. Co-authored-by: Vyacheslav Scherbinin <gentslava@mail.ru> * fix(i18n): drop Russian _one entries superseded by count placeholders Main now interpolates the count in English _one strings (#34693), so the literal-1 Russian forms no longer match their source. * feat(i18n): complete Russian catalog and add terminology glossary Translate the 650 remaining English keys and the few/many plural forms for every count family, and document the Russian glossary and style conventions. * fix(i18n): apply reviewed Russian translation corrections Fix mistranslations and grammar flagged in a full-catalog review, and align terminology with the glossary: рабочее дерево for worktree, рабочее пространство for workspace, пул-реквест and файлы cookie. * fix(i18n): resolve Russian plural forms in main-process strings and align ru terminology translateMain now resolves literal _one/_other keys through the CLDR plural family like translate(), so native dialogs pick Russian few/many forms. The plural helpers move to src/shared for reuse. apply-translation-delta accepts locale-only plural categories sourced from English _other. ru.json follows the glossary for account/session/prompt and uses a single ellipsis character. --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> Co-authored-by: Vyacheslav Scherbinin <gentslava@mail.ru> |
||
|
|
55f9525c49 |
feat(editor): highlight CUDA C and C++ files (#21384)
Register a `cuda-cpp` Monaco language (VS Code's id) that reuses Monaco's C++ grammar with CUDA qualifiers, built-ins, and vector types as keywords. Map `.cu`/`.cuh` to it, and alias it to lowlight's cpp grammar on mobile. Fixes #21267 Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com> |
||
|
|
0866cb1b08 |
fix: bound local iteration checks and show live progress (#34700)
* fix: bound local iteration checks and show live progress * fix: harden check lifecycles and cached test evidence * fix: preserve process instrumentation and fixture lifecycles * fix: give fixture unref spy a portable function type --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
fed9a762be |
feat(editor): detect the language of extensionless scripts from their shebang (#25055)
Extensionless files such as bin/deploy now pick their syntax highlighting from a leading shebang (python, shell, node, ruby, perl, php, lua, powershell, ts-node/tsx) via the shared setup-script shebang parser. Named files and unmapped extensions keep their name-based language, and diff tabs stay name-based so highlighting does not flicker on save. Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com> |
||
|
|
b62f9bf624 |
feat(i18n): add Traditional Chinese (zh-Hant) UI locale (#29795)
* feat(i18n): add Traditional Chinese (zh-Hant) UI locale Adds 繁體中文 as a selectable UI language and derives its catalog from zh.json rather than translating English afresh, so the reviewed Simplified terminology and Orca glossary decisions carry over. The conversion needed three corrections beyond OpenCC's `cn -> twp`: - One pass only. `twp`'s phrase dictionary is not idempotent (it maps 進程->程序 and 程序->程式), and iterating to a fixed point makes output worse: it rewrites the correct Taiwan 游標 to 遊標, and 程序 to 程式 where the source meant an OS process. - 16 terms where `twp` emits a form Taiwan does not use, each confirmed against Microsoft's VS Code zh-Hant language pack (許可權 0 vs 權限 84, 賬戶 0 vs 帳戶 111, and so on). - 進程 vs 程序 collapse in `twp` output. Taiwan calls an OS process 行程, so the generator consults the Simplified source to disambiguate; daemon copy reads 守護行程, not 守護程式. Also pins `load: 'currentOnly'` on both i18next instances. i18next's default expands `zh-Hant` into ['zh-Hant', 'zh', 'en'], so a key missing from the Traditional catalog would silently render Simplified. zh-Hant.json is generated and compared byte-for-byte, so the new check is wired into verify:localization-catalogs to fail when a Simplified edit skips regeneration. Refs #10592 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(i18n): fail the zh-Hant check on an unreadable zh.json The generator caught every error from reading and parsing zh.json, so a malformed or unreadable Simplified catalog logged "absent here" and exited 0 without ever comparing the generated Traditional catalog. Only ENOENT means there is nothing to derive, so every other failure now propagates. Tests cover the three paths the catch was conflating: an absent zh.json still passes for the combined verifier's synthetic fixtures, malformed JSON throws, and a directory where the catalog belongs throws EISDIR rather than reporting the file as missing. Co-Authored-By: Claude Code <noreply@anthropic.com> * feat(i18n): ship Traditional Chinese (Taiwan) as a maintained built-in catalog Keeps the zh-Hant locale from this PR and makes it a hand-maintained catalog like the other built-ins, without the OpenCC generator: - Catalog reconciled with current en.json. Per key it prefers the Taiwan-reviewed copy from #22402 (which carries #14223), falls back to the zh-derived copy here, and drops entries whose English changed. A review pass then applied Taiwan terms (代理程式, 工作階段, 存放庫, 分頁, 列/欄) and 「」 quotes. Glossary: config/i18n-traditional-chinese.md. - Label 繁體中文(台灣)in every catalog, the picker, onboarding and search. - Detection maps zh-TW/zh-HK/zh-MO/zh-Hant* to zh-Hant; zh-CN/zh-SG/zh-Hans stay on zh. Both i18next instances use load: 'currentOnly' so missing keys fall back to English, not Simplified. - Drops opencc-js, the generator scripts and their verify hook. Co-authored-by: hungchihsueh <84211143+hungchihsueh@users.noreply.github.com> Co-authored-by: chilung-cgu <b0423031@gmail.com> * feat(i18n): translate remaining Traditional Chinese (Taiwan) catalog keys Fill the 2,043 keys added to en since the source PRs branched, following the Taiwan glossary, and extend the glossary with skill, automation, usage, review, token and related terms. * fix(i18n): review Traditional Chinese (Taiwan) catalog wording Apply 629 reviewed corrections across the full catalog: 30 meaning or untranslated-text fixes and 599 glossary and phrasing fixes (終端機, 用量, API 金鑰, clearer counts and actions). Each edit was cross-checked by an independent review pass. * fix(i18n): polish sampled zh-Hant strings and drop redundant locale test Co-authored-by: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> Co-authored-by: hungchihsueh <84211143+hungchihsueh@users.noreply.github.com> Co-authored-by: chilung-cgu <b0423031@gmail.com> |
||
|
|
0a5f9e9dc5 |
fix: keep identifier casing locale-independent (Turkish) (#34709)
* fix: keep identifier casing locale-independent (Turkish) Under a tr/az default locale, toLocaleLowerCase()/toLocaleUpperCase() map I to dotless ı and İ, and default-locale collation stops treating I/i as base-equal. Switch identifier matching (Linear CLI selectors, priorities, error classification, plugin/Jira/worktree/address/slash-command search) to toLowerCase()/toUpperCase(), and pin collation to 'en' where ordering feeds hashes, canonical JSON, semver precedence, remote selection, SSH Include order, or WSL distro equality. User-visible prose casing and display-list sorting stay locale-aware. * fix: order SSH Include globs bytewise and fold dashboard search ids locale-independently --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
ea6c69be9a |
fix(runtime): add opt-in agentWait to worktree ps agent rows (#24142)
`orca worktree ps --agent-wait --json` now reports, on each terminal-backed agent row of the returned page, the same agentWait verdict `orca terminal show --json` gives for that terminal. The lookup is opt-in (RPC `includeAgentWait: true`) because it reads screens and may probe PTYs, which is too costly for default pollers. Hook rows use their terminal handle only when a connected PTY confirms it, and pane-only hook rows resolve the live terminal by pane key. Structured-worker rows and older hosts omit the field (absent = not evaluated; null = looked, no wait). Fixes #23921 Co-authored-by: Neil <neil@stably.ai> |
||
|
|
40721a849b |
fix(terminal): answer ConPTY startup DA1 before stream attachment (#34466)
Bundled ConPTY 1.23 sends a DA1 query as soon as its input reader starts and stalls ~3s waiting for the reply. The daemon held that query in the startup buffer until a client attached, so every new Windows pane paid the stall. The startup watcher now answers the DA1 itself, strips the query from the replayed startup output, and leaves CPR and other output for the client. The ConPTY DA1 reply moves to a shared constant used by the daemon and renderer. Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com> |
||
|
|
8d908764dc |
Revert "Keep same-machine folders with matching Git remotes in separate projects (#32272)" (#34662)
* Revert "Keep same-machine folders with matching Git remotes in separate projects (#32272)"
This reverts commit
|
||
|
|
66134086bd |
fix(cli): strip terminal control sequences from Linear text in CLI output (#31677)
Linear-provided titles, states, assignees, projects, labels, workspace names and error messages were printed verbatim, so remote text could emit OSC/CSI/C1 sequences or forge extra output lines. Move terminalSafe into src/shared/terminal-safe-text.ts, add terminalSafeLine (collapses CR/LF), and apply it to every Linear text field in the human-readable formatters. --json output is unchanged. Fixes #20478 Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com> |
||
|
|
48f7ce7fed |
feat(terminal): seed MacPorts /opt/local on PATH when port is installed (#20146)
Packaged macOS builds now append /opt/local/bin and /opt/local/sbin to the seeded PATH when the default-prefix `port` binary exists, and the agent CLI install-dir fallback also checks /opt/local/bin. Both are appended last so existing Homebrew/system resolutions never change. Co-authored-by: Neil <neil@stably.ai> |
||
|
|
280dee2477 |
fix(dsh): resume DSH sessions on the DSH backend (#27949)
dsh-tui 0.14+ boots the backend last picked in its launchpad (~/.dsh-tui/kernel.json), so a plain `dsh-tui --resume <id>` could hand a DSH session id to the Claude or Codex backend. Pin --backend=dsh in the resume argv; dsh-tui <0.14 skips the joined form, but would read a separate `dsh` token as the initial prompt. Fixes #27944 |
||
|
|
6bb0c14a98 | refactor: group native chat text presentation (#34647) | ||
|
|
3a4ac5445c | fix(daemon): roll the daemon-side terminal fixes since v1.4.241 into a fresh v53 daemon (#34627) | ||
|
|
4d3451601a | refactor: group native chat live presentation (#34638) | ||
|
|
8482a3fbb1 |
fix(i18n): localize source control count and force-push tooltips (#34639)
Shared remote dropdown builders take count/force-push sentence builders
through RemoteDropdownCopy; English defaults keep mobile and older callers
byte-identical. Desktop uses whole-sentence {{count}} plural keys, also for
the primary action tooltip. Refs #34144.
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
|
||
|
|
64c12b0f89 |
feat(plugins): allow language packs to declare a native display name (#13140)
* feat(plugins): allow language packs to declare a native display name Plugin language packs can set contributes.languagePacks[].displayName so the Settings language picker shows 中文(繁體) instead of `zh-TW — pluginKey`. Omitted names keep the previous fallback label. Fixes #13031 * refactor(plugins): inline language-pack picker label and guard displayName Inline the one-line picker label fallback, type-check displayName in the registration guard, drop issue refs from comments, and trim tests. --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
ea532813b1 | refactor: group native chat turn presentation (#34629) | ||
|
|
ec49e9fac0 |
fix(native-chat): list OMP skills in the / menu as /skill:<name> (#31999)
* fix(native-chat): list OMP skills in the / menu as /skill:<name> * test(native-chat): OMP now carries the Pi-shaped skill profile * Publish native OMP skills with compatible command catalogs * Index native skill descriptions once per picker build * Combine catalog test composer imports * Correct native catalog test types and project inputs * Run cross-platform picker scaling contract with mobile tests * fix: discover native commands before the first chat message * test: isolate native command discovery from mobile typechecking * fix: release command discovery ownership after managed root exit * refactor: reuse the ACP child owner during shutdown drain * test(acp): load filesystem implementation before test execution * test: drive discovery close completion explicitly * test: await discovery admission cleanup between demand waves * test: control discovery close ordering in demand waves --------- Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> |
||
|
|
99199b2bd2 |
fix(i18n): localize GitHub project view errors and states (#34621)
* fix(i18n): localize GitHub project view errors and states Main now tags Orca-authored project-view failures with an optional reason code plus host, rate-limit numbers and diagnostic detail; the English message is unchanged for mobile, older clients and logs. The renderer maps type/reason to translated copy in the error state, picker, item dialog and mutation toasts, falling back to the English message for older hosts and GitHub's own text. Also wraps the layout labels, unsupported-layout, not-found/too-large copy, picker partial-failure summaries and the gh sign-in help. Closes #34589 * test: expect input_too_large reason on oversized project refs * fix: make project view error copy switches exhaustive --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
16547ff203 |
fix(i18n): localize the rest of the source control dropdown (#34145)
* fix(i18n): localize the rest of the source control dropdown The Commit & Push, Push, Force Push, Pull, Fast-forward, Sync, Publish, abort and Push-before-PR rows and their tooltips were English literals next to rows that already go through translate(). Route them through translate(), reusing the primary button's and the conflict card's keys where the words match, and add 42 keys to the English catalog. Commit blockers stay English inside eligibility, which compares them, and are translated only when the dropdown shows them. * test(i18n): pin the other two commit blockers under the pseudo-locale The pseudo-locale test only reached the stage-file blocker, so an English return for the conflict or commit-message blocker still passed. The new case checks both in the Commit, Commit & Push and Commit & Sync titles. * i18n: translate source control dropdown keys; trim duplicate pseudo-locale test Add zh/ko/ja/es/fr/pt translations for the 42 dropdown keys this PR adds to en.json, matching each catalog's existing source-control glossary. Drop the second pseudo-locale test; the first already covers commit-blocker titles through the active locale. --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
acec0e7aa0 |
test: remove two load-dependent CI flakes (#34613)
- git-binary-compatibility: give the docker image runs of the ref-pairing case a 90 s budget; each Git call is a docker exec and the case normally takes 22-25 s of the 30 s default. - claude-transcript-catch-up: fire the 5 ms catch-up deadline with fake timers only after the fallback lookup has started, instead of racing a real timer. |
||
|
|
47018d4844 |
fix(source-control): decode Kimi generated text by selected format (#34237)
* fix(source-control): read the Kimi answer from stream-json Kimi Code's text mode prefixes thinking and hook output with a bullet, so the commit message arrived mixed with narration. The recipe now asks for --output-format stream-json and the answer is taken from the last assistant record, which is the commit message (#33556). A record that requests a tool is narration rather than an answer, so it clears the candidate: a stream that ends on a tool call yields no answer, which finalizeFromAgentOutput already treats as a failed run. Only a body whose every non-empty line is a record counts as stream output, so a plain answer that happens to contain a JSON line is left alone. * fix(source-control): decode Kimi output only for the selected protocol * fix(source-control): satisfy generation hook checks * Preserve Kimi generation failures and normalize options linearly * Fix Kimi argument failure messages * Bound Kimi option failure recognition * Fix Kimi generation test fixture types --------- Co-authored-by: beduldul <alkaysan07@gmail.com> |
||
|
|
90c713af1f |
fix(wsl): refuse Windows drive folders on a WSL host, offer Add on this computer (#34530)
* fix(wsl): refuse Windows drive folders on a WSL host and offer to add them on this computer A /mnt/<drive> project on a WSL host shows false line-ending changes, misses edits made from Windows, and searches slowly. Add Project refuses typed, picked and dropped Windows drive folders for a WSL host and shows the refusal inline with Add on this computer, which switches the open dialog to this computer. The WSL-host orcad re-checks by /proc/self/mountinfo (after resolving symlinks) in repo.add, repo.create, repo.clone, explicit folderWorkspace.create and the nested scan/import, answering with the existing runtime_error code plus optional data, so older clients still show a readable message. Everything is behind the WSL hosts gate; SSH is untouched. * test(wsl): hold the e2e's this-computer add instead of racing its failure On the Linux CI host the switched local add of a Windows path fails its nested scan and hands off to the Open as Folder modal, closing Add Project before the test looked. The refusal itself already came before any scan. The e2e now records the local add at its scan step and asserts it went to this computer with the Windows path; a unit test pins that a refused pick never reaches the host path step. * test(wsl): type the e2e's held-scan window hooks instead of Reflect |
||
|
|
6c469aea6d |
fix(plugins): reject locale ids Intl cannot parse (#12533)
* fix(plugins): reject locale ids Intl cannot parse `pluginLocaleIdSchema` checks the shape of a locale id but not its grammar, and the shape check is looser than BCP 47 in one direction: `en-US-US` (duplicate region) and `en-aaa` (a subtag that is neither region nor script) both match it. A pack declaring one installs, loads, and translates every string — and then `Intl.DateTimeFormat` throws inside `getIntlLocale()`, which swallows the error and falls back to English. Nothing is logged, so the pack author sees a working pack with English dates and no way to tell why. Delegate the grammar to `Intl.getCanonicalLocales` in a `.refine`, so the tag is rejected at install where the author can still act on it. The bundled `pt-BR` pack and every other well-formed tag are unaffected. * Condense this branch's comments to one line AGENTS.md asks for one-line comments that say why, and main's comment cleanup (#33249) applied that across the repository. This brings the comments this branch adds in line with it. No code changes. --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
5e49b6dd11 | refactor: group native chat context usage (#34595) | ||
|
|
f3adb8f85a | refactor: group native chat work-run boundaries (#34528) | ||
|
|
917ef9c737 | feat(browser): install Chrome extensions from the Web Store into Orca's browser (#30940) | ||
|
|
649dc1a6fb |
test: remove 113 low-value tests (#34541)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |