mirror of
https://github.com/stablyai/orca.git
synced 2026-10-30 16:47:34 +00:00
7cdfebdc1becc12ae969bd34ea98186b7f3947ff
17194
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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> |
||
|
|
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> |
||
|
|
a1522f94b3 |
perf(native-chat): skip session-bridge reconcile for rank-only worktree patches (#34781)
* perf(native-chat): skip session-bridge reconcile for rank-only worktree patches Share the worktree owner-row token with editor identity so sort-order, unread and activity patches no longer re-walk every structured session tab. * test: type the reranked owner row |
||
|
|
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> |
||
|
|
9588b5337a |
fix(i18n): use port-status wording for the live-ports zh-CN label (#34670)
The zh-CN aria-label for the sidebar ports button translated "live" as 直播 (livestreaming). Use 个正在运行的 (running) instead. Fixes #34667 |
||
|
|
92f3fef421 |
fix(github): drop redundant is:pr from gh pr list search (#34633)
gh pr list already scopes --search with repo:OWNER/REPO type:pr. The extra is:pr Orca added made private-repo PR lists come back empty when gh is authenticated with a GitHub App user token (ghu_). Fixes #34536 |
||
|
|
eac5699bcd |
perf(mobile): pause active turn clocks while backgrounded (#34746)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
6fcbce32b9 |
fix(mobile): release cancelled relay stream captures immediately (#34745)
* fix(mobile): release cancelled relay subscription callbacks * test(mobile): run relay cancellation GC regression tests by default and in CI Expose GC via v8 flags so the collection cases no longer skip under the default pool or Bun, run the file on Node in mobile CI, and drop cases that already passed on main. --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
d5dcc2cdf7 |
perf(mobile): keep terminal backlog draining linear (#34741)
* perf(mobile): drain terminal backlog without repeated array shifts * test(mobile): cover backlog reuse after mid-drain dispose --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
00666138a7 |
fix(mobile): show pairing progress and errors without camera access (#34739)
* fix(mobile): show pasted pairing feedback without camera access * test(mobile): drop unreachable revoke and mock-only listener tests --------- Co-authored-by: OrcaWin <293788423+OrcaWin@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> |
||
|
|
4dca163bb7 |
fix(github): count gh pr and issue commands against the GraphQL rate limit (#28778)
* fix(github): count gh pr and issue commands against the GraphQL rate limit gh serves pr/issue/repo view-style subcommands over GraphQL, but the breaker filed every non-api command under core and only matched REST's "API rate limit exceeded" wording, so GraphQL exhaustion never tripped it. Map those subcommands to the graphql bucket, match GraphQL's "API rate limit already exceeded", and guard project-view issue close/reopen against the GraphQL quota. Fixes #28767 * test(github): drop redundant Date.now() args in graphql breaker test Keeps the flaky-test-pattern ratchet at its baseline. --------- Co-authored-by: Neil <neil@stably.ai> |
||
|
|
9105ade917 |
docs: fix dead Goose and Continue quickstart links (#14574)
The Goose (block.github.io/goose/docs/quickstart/) and Continue (docs.continue.dev/guides/cli) links 404. Point them at goose-docs.ai/docs/quickstart/ and docs.continue.dev/cli/quickstart in the READMEs, the supported-agents docs page, and the in-app agent catalog. Co-authored-by: Neil <neil@stably.ai> |
||
|
|
766462be18 |
perf(native-chat): memoize file-link context per chat on its resolver inputs (#34755)
* perf(native-chat): memoize file-link context per chat on its resolver inputs Every mounted chat (hidden ones included) re-resolved its directory and runtime owner on every store write. Reuse the context until an input the resolvers read changes. * docs(native-chat): scope the file-link input completeness comment |
||
|
|
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> |
||
|
|
9558439018 |
perf(i18n): ship only main-process strings in the main bundle (#34711)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
7b74657a32 |
fix(sidebar): keep incoming host headers above sticky groups (#34751)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
66e2d39827 | Keep agent handoff confirmations linked to their workspace (#34722) | ||
|
|
ca2154945b |
ci: run advisory e2e lanes on free hosted runners (#34725)
The layout oracle merge gate keeps Blacksmith via fast_runners: true; the advisory e2e call, nightly schedule and layout-owner dispatch run on ubuntu-24.04. Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
57c2b53625 |
fix(orchestration): allow owner Run to address a nested worker Dispatch (#24974)
Naming a Dispatch's own Run with --run is equivalent to omitting it, so mail to a Dispatch whose assignee now coordinates a child Run redirects to that Run's mailbox instead of failing recipient_run_mismatch. Fixes #24699 Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com> |
||
|
|
8b7f8c88ce |
ci: run terminal perf on demand only, on a hosted runner (#34726)
* ci: run terminal perf on demand only, on a hosted runner The nightly failed every run: the presented-frame guard accepts only GitHub-hosted Xvfb displays, but the workflow ran on Blacksmith. Drop the schedule, move dispatch runs to ubuntu-24.04 and document local use. * docs: record the first hosted terminal perf result --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> |
||
|
|
32a50856ac |
fix(ipc): refuse unpinned file:// senders for browser and clipboard IPC (#34710)
isTrustedBrowserRenderer and isTrustedClipboardRenderer fell back to trusting any sender whose URL started with file:// in packaged builds when no main renderer id was pinned (e.g. after the last window closes on macOS), unlocking clipboard read/write and all browser:* handlers for arbitrary local documents. Fail closed like isTrustedUIRenderer already does, and share one isTrustedMainRendererSender check across the browser, clipboard, and UI trust gates so they cannot drift again. Fixes #25521 Co-authored-by: Matheus Breguêz <matbrgz@gmail.com> |
||
|
|
6a55358427 | fix(test): resolve Claude rewind session module from structured folder (#34721) | ||
|
|
5d6cb343ab |
Native chat tabs show Hand Off in their top-right header, like terminals (#34544)
* Add Hand Off to the native chat pane header * Test native chat header and menu hand-off parity |
||
|
|
c0a7aca7ee |
The + menu can start a "(CLI)" agent as a chat (#34587)
* feat(tab-bar): "(CLI)" rows in the + menu offer a chat button An agent set to open as a CLI shows as "Claude (CLI)" in the + menu with no way to start it as a chat, while chat rows already carry a trailing terminal button for the CLI. A CLI row whose agent can open as a chat on this host now carries the mirror button: the row starts the CLI, the button (or ArrowRight, then Enter) starts the chat. * Test agent menu activation and alternate route work * Use activated agent menu action and skip unused route work * Fix agent menu lint and formatting * Cover CLI row annotations in picker and search * Share prepared agent menu answer context and verify route work * Align agent menu fixture imports with static checks |