Repository navigation
Conversation
…31817) * feat(mobile): decode page-bundle download windows natively Each 384 KiB window of the page-bundle download cost about 200-300 ms of Hermes JS time (tweetnacl secretbox open, fflate gunzip, a base64 re-encode check and the TextDecoder polyfill), which kept the JS thread busy for the whole download. The phone now opens v2 frames with react-native-libsodium (secretbox open and strict base64) and decodes ranges with a local Expo module, orca-bundle-window-codec (bounded gunzip via system zlib on iOS and java.util.zip.Inflater on Android, plus strict UTF-8). The shared v2 session takes these as optional primitives; the desktop keeps tweetnacl. If any native piece is missing or fails a known-answer probe, the phone keeps today's JS path, with the base64 re-encode replaced by an O(1) canonical check. * refactor(mobile): name the native decode for every inbound frame, not just bundle windows The native secretbox, base64 and UTF-8 primitives decode every inbound v2 frame on the phone, so the files and the Expo module are renamed for what they cover (paired-e2ee-native-*, orca-gzip-utf8-codec). A throw from the native UTF-8 decode now falls back to TextDecoder, since the frame is already open and its counter advanced. * test(mobile): pin the TextDecoder fallback when native UTF-8 throws * fix(mobile): hand the native decode to the transport from the app entry The transport modules are reached by shared, desktop and e2e code. Importing the native bindings there pulled expo-modules-core into the e2e typecheck, whose global types make NODE_ENV required and broke ~20 e2e files. The app entry now provides the bindings; without them the transport runs the JS path. * fix(mobile): a native-codec lookup before the app provides bindings does not pin the JS path
…ks (stablyai#31769) * feat(mobile): download only the page assets the cached generation lacks Before paging the bundle, the phone matches the new manifest against the host's active generation by content (sha256 and length). Matches are read from disk and hashed again while the changed assets come over the wire; one whose bytes no longer hash to the manifest is downloaded instead. Progress counts only the bytes that cross the wire. * test(mobile): put the older-build manifest note back on its describe * perf(mobile): copy unchanged page assets natively instead of reading and hashing them The reuse pass read every unchanged asset into JS and hashed it again, which kept the JS thread busy for most of an update. The cached generation was hash-verified when it was written, is never written again, and is what the page already opens as is, so matching assets are now copied natively into the staging tree and checked by size. A copy that fails or comes up short is downloaded instead; stage refuses a reused copy that is no longer whole. Path rules move to generation-asset-path.ts and the copying to generation-reuse.ts. * fix(mobile): copy reused page assets at stage, on the store's queue Copies made when the manifest was read sat in tmp for the whole download, where a second shell mount's sweep, or a second download of the same build, could take them away and fail the stage. The fetch now only checks that each reusable file is still whole (a native stat) and leaves it to the stage, which copies it from the generation active at that moment and checks its size. Copy destinations must not exist, as on both platforms.
…ive driver (stablyai#31755) * feat(mobile): one download bar whose fill follows progress on the native driver The page download's replies keep the JS thread busy, so React committed nothing until the end and both bars sat at zero, then jumped to full. The session now publishes each progress step to a small feed as it is dispatched, and one shared bar eases its fill to each value with Animated on the native driver (scaleX). The caption stays React-drawn. * fix(mobile): the download bar always moves on the native driver With reduced motion, the fill jumped through a JS-side setValue on a value that never became native, so on Fabric it only moved with React commits, which the download holds off. An unread preference also counted as reduced, so a freshly mounted bar took that path. Every step is now a native-driven timing, of zero length when motion is reduced, and the preference is read through a ref. * fix(mobile): the download bar starts at most one ease per 50 ms The feed fires per asset, often well under a millisecond apart. Starting a new 150 ms timing on each one replaced every ease before it drew a frame, so on iOS the fill stayed near empty until the last update. Now a callback inside the 50 ms window only records the latest fraction; the next callback past the window, or a trailing timer at its end, eases to it over 100 ms. Full lands at once. The effect cleanup clears the timer.
…lyai#32110) * fix(mobile): the shell returns to a screen already on its stack The page's own "back to hosts" chevron calls dismissTo('/') inside the page, which the page's router hands to the shell as one navigate message. The shell pushed every such href, so leaving a host from its page left [Home, Host, Home] with the old host page still mounted (WebView and live subscriptions), and every round trip stacked another one. System Back then walked back through stale host pages. The shell now reads the navigation container's state first: an href that is already a screen below this one (same path and query) is popped back to, and an href that is this screen is dropped. Anything else is pushed as before. The pop names its navigator and source route explicitly, because a screen's dispatch otherwise stamps its own key as the source and a parent stack that cannot find it drops the pop. The wide host-route dismissTo stays for the hrefs this rule does not cover: a host route whose query differs from the one below (the missing-worktree bounce), and a cold deep link with no host route below to return to. Overlay replace is unchanged, and so is the bridge message. * fix(mobile): a param cleared to empty and a fragment still match a screen on the stack The session screen clears paneKey with setParams({ paneKey: '' }), which leaves ?paneKey= on the stack entry, so a later navigate to the plain session href found no match and pushed a duplicate. Empty query values are now dropped when canonicalising, and the fragment is stripped since expo-router keeps it as a param no href spells the same way.
…seat feed on live sessions, and log demote outcomes (stablyai#32149) * fix(relay): repair cell seat-log drift, and keep a new session's generation above a listed seat Directors mirror each cell's seat feed, so the feed must list exactly the cell's live sessions. The cell now sweeps its seat log against its sessions on a director's poll: a seat no session backs is left (4409) and the live session listed, and a live session the feed lost is listed again, each once two sweeps in a row find it. A demotion naming an unbacked seat repairs it at once. A host's new session now starts above any generation the feed still lists, which closes the drained-session reconnect race that removed a live seat. Claude-Session: asia-drain-pulse * fix(relay): refuse a rebind whose session left the map during activation, and keep a per-host generation floor A rebind whose database activation outlived the orphan grace (or a drain) revived the removed session outside the map: connected, still in the seat feed, and unreachable by phones or demotion for as long as the host stayed up. Activation now rechecks the map after its awaits and refuses with PEER_DROPPED so the host redials. Generations come from a per-host floor that outlives the session, and an activation at a generation already used here is refused. Claude-Session: asia-drain-pulse * fix(relay): log each demote outcome on the director by host digest The director now reads the cell's existing {v:1, outcome} demote reply and logs it; the cell's feed stays the only source of its map. The supersede line now reaches the log as well. Claude-Session: asia-drain-pulse
…stablyai#31662) * Add Orca's own bundled-skill planner and installer (not wired in yet) One planner decides what installing Orca's bundled skills does to each target folder; execute re-plans under per-path locks and runs only a plan whose digest still matches; a shared summary derives badge, wording and exit code. A copy counts as Orca's untouched one only when its SKILL.md bytes match a version some build shipped (resources/skills/released-digests.json, generated from git history and checked add-only). Nothing calls this yet; the npx path is unchanged. * Report left-alone folders as warnings and keep backups in the home A leave is no longer a failure: the outcome line says what happened plus "N left alone: <reason>", and the exit code is 1 only for a failed or changed op. Backups for every scope go to <home>/.agents/.orca-skill-backups on the executing host, so a project Replace never writes into the repo; moving there falls back to copy, verify, then remove across filesystems. * Escape non-ASCII characters in bundled-skill regex and wording The orcad bundle rejects a literal non-ASCII character in a regex. * Make bundled-skill test fixtures link folders the way the product does on Windows Directory links in fixtures are junctions on Windows, which need no Developer Mode; the one file-link fixture is skipped there. * Reject stale skill replacements when auxiliary content changes * Keep ordinary bundled skill classification shallow * Leave unreadable skill replacements alone without aborting plans * Bound bundled skill classification reads and parse names linearly * Keep workspace skill roots inside the resolved workspace * Compare workspace skill roots with native path semantics * Restrict bundled skill backups to their owner on POSIX
…desktop (stablyai#32132) * fix(automations): a slept headless run opens from a paired desktop, and a half-failed sleep keeps its pane link A paired desktop now asks the server to open a run whose pane retention slept (its PTY id is dropped, its pane kept), instead of only opening the workspace. Retention finishes a sleep that stopped the run's PTY and then failed, as the host's sleep state still holds it, instead of forgetting the run's pane on the next sweep. * test: use typed automation retention drain hook * test(automations): fail the real resume-record write, and recover a slept run whose record failed to save * revert(automations): drop the half-failed sleep recovery, which no real path reaches A real headless serve keeps a slept run's pane resolving to its stopped PTY, so retention's retry already re-sleeps and keeps the pane link; a failed resume-record write is swallowed inside the sleep. Only a mocked null PTY lookup reached the runSleepHeld branch.
…tablyai#31688) * Add Orca's own bundled-skill planner and installer (not wired in yet) One planner decides what installing Orca's bundled skills does to each target folder; execute re-plans under per-path locks and runs only a plan whose digest still matches; a shared summary derives badge, wording and exit code. A copy counts as Orca's untouched one only when its SKILL.md bytes match a version some build shipped (resources/skills/released-digests.json, generated from git history and checked add-only). Nothing calls this yet; the npx path is unchanged. * Report left-alone folders as warnings and keep backups in the home A leave is no longer a failure: the outcome line says what happened plus "N left alone: <reason>", and the exit code is 1 only for a failed or changed op. Backups for every scope go to <home>/.agents/.orca-skill-backups on the executing host, so a project Replace never writes into the repo; moving there falls back to copy, verify, then remove across filesystems. * Update Orca's skills with Orca's own installer instead of npx skills The app's Update skills dialog, badge, nudge and status pills now read the bundled-skill plan and summary, and Update executes the reviewed plan's digest. `orca skills install|update` runs the same planner in-process with --dry-run, --force, --json and per-summary exit codes. Removes both npx spawn sites, the freshness inventory modules and the npx round-trip CI. * Update only where the skill already is; one provider-root rule for app and CLI installedOnly now drops every location that holds nothing (keeping the shared slot only when an existing agent link points at it), so Update never adds a skill for another agent. The app and CLI resolve the Claude skills folder through the same rule in localBundledSkillInput; a test asserts both plan identically. * Compact Update skills dialog: one row per skill, locations named by agent summarizeBundledSkillPlan now returns each skill's locations, labelled by agent (or "Shared folder") with a ~-collapsed path; the dialog shows one row per skill that needs something, collapses up-to-date skills into one line, and lists every location behind "Show all locations". The result reads "Updated N skills · M left alone". Under installedOnly a Replace with no shared copy replaces in place instead of adding one. * fix(skills): keep location paths readable by putting the state under the path * fix(skills): hold the last plan in state, not a ref mutated during render Split the update dialog's rows, headline and footer into components, move the Update label next to the other plan copy, and use z.strictObject for the request schemas. * Escape non-ASCII characters in bundled-skill regex and wording The orcad bundle rejects a literal non-ASCII character in a regex. * fix(cli): escape non-ASCII apostrophes in the skills install help text * test(orcad): check the bundled CLI plans a skill install without npx Drop the deleted roundtrip workflow's group from the closed-PR cancellation fixture. * Make bundled-skill test fixtures link folders the way the product does on Windows Directory links in fixtures are junctions on Windows, which need no Developer Mode; the one file-link fixture is skipped there. * Resolve legacy skill agent keys canonically * Reject stale skill replacements when auxiliary content changes * Keep ordinary bundled skill classification shallow * Leave unreadable skill replacements alone without aborting plans * Pass force-all through shallow planning and describe unreadable copies * Clarify skill update statuses and folder details * Keep selected skill replacements in place with one status * Report completed skill replacements with their backup confirmation * Clarify available skill updates and skipped copies * Keep skill update results in preview order * Show each skill skip reason once * Count skipped skills instead of skipped folders * Make installer input and link tests work on Windows * Bound bundled skill classification reads and parse names linearly * Keep workspace skill roots inside the resolved workspace * Compare workspace skill roots with native path semantics * Restrict bundled skill backups to their owner on POSIX * Keep recovered skills needing attention until they are updated * Count completed skill updates in the status tooltip * Sync the runtime localization catalog
…ipt ledger (stablyai#32130) * fix(connectors): a connector backlog cannot fill orchestration's receipt ledger Connector deliveries now refuse with delivery_backlog_full once 1,000 are unsettled, and a new seam settles a previous process's pending connector receipts as completed-unknown so the ledger can prune them. * fix(connectors): settle only a previous process's receipts, not a re-enable's The delivery receipt owner now lives for the install (one per process) and is shared by every enabled-period seam, so toggling connectors off and on no longer completes this process's still-running deliveries as unknown.
…blyai#31867) * Add Orca's own bundled-skill planner and installer (not wired in yet) One planner decides what installing Orca's bundled skills does to each target folder; execute re-plans under per-path locks and runs only a plan whose digest still matches; a shared summary derives badge, wording and exit code. A copy counts as Orca's untouched one only when its SKILL.md bytes match a version some build shipped (resources/skills/released-digests.json, generated from git history and checked add-only). Nothing calls this yet; the npx path is unchanged. * Report left-alone folders as warnings and keep backups in the home A leave is no longer a failure: the outcome line says what happened plus "N left alone: <reason>", and the exit code is 1 only for a failed or changed op. Backups for every scope go to <home>/.agents/.orca-skill-backups on the executing host, so a project Replace never writes into the repo; moving there falls back to copy, verify, then remove across filesystems. * Update Orca's skills with Orca's own installer instead of npx skills The app's Update skills dialog, badge, nudge and status pills now read the bundled-skill plan and summary, and Update executes the reviewed plan's digest. `orca skills install|update` runs the same planner in-process with --dry-run, --force, --json and per-summary exit codes. Removes both npx spawn sites, the freshness inventory modules and the npx round-trip CI. * Update only where the skill already is; one provider-root rule for app and CLI installedOnly now drops every location that holds nothing (keeping the shared slot only when an existing agent link points at it), so Update never adds a skill for another agent. The app and CLI resolve the Claude skills folder through the same rule in localBundledSkillInput; a test asserts both plan identically. * Compact Update skills dialog: one row per skill, locations named by agent summarizeBundledSkillPlan now returns each skill's locations, labelled by agent (or "Shared folder") with a ~-collapsed path; the dialog shows one row per skill that needs something, collapses up-to-date skills into one line, and lists every location behind "Show all locations". The result reads "Updated N skills · M left alone". Under installedOnly a Replace with no shared copy replaces in place instead of adding one. * fix(skills): keep location paths readable by putting the state under the path * fix(skills): hold the last plan in state, not a ref mutated during render Split the update dialog's rows, headline and footer into components, move the Update label next to the other plan copy, and use z.strictObject for the request schemas. * Escape non-ASCII characters in bundled-skill regex and wording The orcad bundle rejects a literal non-ASCII character in a regex. * fix(cli): escape non-ASCII apostrophes in the skills install help text * Plan and update Orca's skills on paired servers, SSH hosts and WSL * Show the skills pill for paired hosts; real-WSL installer test * test(orcad): check the bundled CLI plans a skill install without npx Drop the deleted roundtrip workflow's group from the closed-PR cancellation fixture. * Let the WSL installer create the backups folder itself * Review fixes: follow the active workspace's host, keep hosts' plans and runs apart, never boot WSL for a background check * test: execute requests carry the plan request; CLI pill follows the local target * Write large WSL skill files in chunks that stay under the command-line limit * Make bundled-skill test fixtures link folders the way the product does on Windows Directory links in fixtures are junctions on Windows, which need no Developer Mode; the one file-link fixture is skipped there. * Let a client ask a host to install named Orca skills, not only update installed ones * Plan an SSH workspace on the managed server that serves its host; ask to connect otherwise * Translate the remote skill states into every locale * Resolve legacy skill agent keys canonically * Reject stale skill replacements when auxiliary content changes * Remove the Windows-hosted WSL bundled skill installer * Wait for active workspace ownership before planning bundled skills * Keep ordinary bundled skill classification shallow * Leave unreadable skill replacements alone without aborting plans * Pass force-all through shallow planning and describe unreadable copies * Clarify skill update statuses and folder details * Keep selected skill replacements in place with one status * Report completed skill replacements with their backup confirmation * Clarify available skill updates and skipped copies * Keep skill update results in preview order * Show each skill skip reason once * Count skipped skills instead of skipped folders * Make installer input and link tests work on Windows * Bound bundled skill classification reads and parse names linearly * Keep workspace skill roots inside the resolved workspace * Compare workspace skill roots with native path semantics * Restrict bundled skill backups to their owner on POSIX * Keep bundled skill updates on the proven local workspace host * Keep recovered skills needing attention until they are updated * Count completed skill updates in the status tooltip * Sync the runtime localization catalog
…31918) * Add Orca's own bundled-skill planner and installer (not wired in yet) One planner decides what installing Orca's bundled skills does to each target folder; execute re-plans under per-path locks and runs only a plan whose digest still matches; a shared summary derives badge, wording and exit code. A copy counts as Orca's untouched one only when its SKILL.md bytes match a version some build shipped (resources/skills/released-digests.json, generated from git history and checked add-only). Nothing calls this yet; the npx path is unchanged. * Report left-alone folders as warnings and keep backups in the home A leave is no longer a failure: the outcome line says what happened plus "N left alone: <reason>", and the exit code is 1 only for a failed or changed op. Backups for every scope go to <home>/.agents/.orca-skill-backups on the executing host, so a project Replace never writes into the repo; moving there falls back to copy, verify, then remove across filesystems. * Update Orca's skills with Orca's own installer instead of npx skills The app's Update skills dialog, badge, nudge and status pills now read the bundled-skill plan and summary, and Update executes the reviewed plan's digest. `orca skills install|update` runs the same planner in-process with --dry-run, --force, --json and per-summary exit codes. Removes both npx spawn sites, the freshness inventory modules and the npx round-trip CI. * Update only where the skill already is; one provider-root rule for app and CLI installedOnly now drops every location that holds nothing (keeping the shared slot only when an existing agent link points at it), so Update never adds a skill for another agent. The app and CLI resolve the Claude skills folder through the same rule in localBundledSkillInput; a test asserts both plan identically. * Compact Update skills dialog: one row per skill, locations named by agent summarizeBundledSkillPlan now returns each skill's locations, labelled by agent (or "Shared folder") with a ~-collapsed path; the dialog shows one row per skill that needs something, collapses up-to-date skills into one line, and lists every location behind "Show all locations". The result reads "Updated N skills · M left alone". Under installedOnly a Replace with no shared copy replaces in place instead of adding one. * fix(skills): keep location paths readable by putting the state under the path * fix(skills): hold the last plan in state, not a ref mutated during render Split the update dialog's rows, headline and footer into components, move the Update label next to the other plan copy, and use z.strictObject for the request schemas. * Escape non-ASCII characters in bundled-skill regex and wording The orcad bundle rejects a literal non-ASCII character in a regex. * fix(cli): escape non-ASCII apostrophes in the skills install help text * Plan and update Orca's skills on paired servers, SSH hosts and WSL * Show the skills pill for paired hosts; real-WSL installer test * test(orcad): check the bundled CLI plans a skill install without npx Drop the deleted roundtrip workflow's group from the closed-PR cancellation fixture. * Let the WSL installer create the backups folder itself * Review fixes: follow the active workspace's host, keep hosts' plans and runs apart, never boot WSL for a background check * test: execute requests carry the plan request; CLI pill follows the local target * Write large WSL skill files in chunks that stay under the command-line limit * Make bundled-skill test fixtures link folders the way the product does on Windows Directory links in fixtures are junctions on Windows, which need no Developer Mode; the one file-link fixture is skipped there. * Let a client ask a host to install named Orca skills, not only update installed ones * WIP surfaces * fix casts * Prune ratchet and shard entries for deleted files * Review fixes: disable feature-wall Install without a host, name unknown-skill errors, drop leftovers * Setup buttons follow the plan: Update only when it would change something, Replace for an edited copy; complete translations * Plan an SSH workspace on the managed server that serves its host; ask to connect otherwise * Translate the remote skill states into every locale * Install on SSH workspaces through their managed server; ask to connect an unserved SSH host * Resolve legacy skill agent keys canonically * Reject stale skill replacements when auxiliary content changes * Remove the Windows-hosted WSL bundled skill installer * Wait for active workspace ownership before planning bundled skills * Keep legacy WSL skill setup on its inline npx flow * Use each setup surface's target for discovery and installation * Describe skill setup actions and results from their install plans * Keep ordinary bundled skill classification shallow * Leave unreadable skill replacements alone without aborting plans * Show blocked skill setup plans as needing attention * Resolve skill setup discovery and installation from workspace ownership * Keep legacy WSL setup scoped to the selected runtime * Pass force-all through shallow planning and describe unreadable copies * Keep skill setup previews shallow until Replace is clicked * Stop Replace when its explicit plan cannot replace a selected copy * Keep skill setup within the focus and workspace-record read ratchets * Clarify skill update statuses and folder details * Clarify skill setup results and blocking reasons * Keep selected skill replacements in place with one status * Use first-install wording when no agents have the skill * Report completed skill replacements with their backup confirmation * Preserve main’s skill selection for unavailable Computer Use * Derive setup status and coverage from the install plan * Use shared plan status labels on every setup panel * Show blocking skill folders and keep incomplete setup steps pending * Clarify available skill updates and skipped copies * Pass setup execution outcomes to the skill result API * Use update skipped wording in skill setup results * Keep skill update results in preview order * Show skipped skill copies before installing for more agents * Show unsupported skill setup guidance before installation * Use the host install plan for orchestration agent coverage * Show each skill skip reason once * Count skipped skills instead of skipped folders * Make installer input and link tests work on Windows * Show disconnected host guidance before offering skill installation * Bound bundled skill classification reads and parse names linearly * Keep workspace skill roots inside the resolved workspace * Compare workspace skill roots with native path semantics * Restrict bundled skill backups to their owner on POSIX * Keep bundled skill updates on the proven local workspace host * Keep skill details on the originating setup target * Keep recovered skills needing attention until they are updated * Expect recheck after a failed skill setup plan * Count completed skill updates in the status tooltip * Count only usable skills in orchestration agent coverage * Sync the runtime localization catalog
…ablyai#32063) * docs(chat): explain structured sessions and conversation handoffs * docs(chat): distinguish copy handoffs from in-place view switches Same labels mean different things by surface: tab/header Continue in Chat UI opens a new structured chat, while the terminal-pane context menu toggles the transcript view in place. Scope composer live-value routing by session type. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
stablyai#32021) Exclude the seven repository-root development configs reported in stablyai#30993 from app.asar, using the exclusion glob suggested in the issue. Co-authored-by: Marcin Nowicki <31430+pr0d1r2@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
* fix(cli): negotiate agent launches with paired runtimes * refactor(cli): share paired client capability list across request paths Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…32078) * fix(git): retain normalized authentication diagnostics in push errors * fix(git): label auth failures for every remote operation Pull, fetch, fast-forward and rebase toasts leaked the IPC wrapper around the normalized auth message; Git <2.46 also reports 'could not read Password' for remotes whose URL carries a username. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…yai#32018) * fix(runtime): reject unsupported renderer-owned tab properties * refactor(runtime): keep tab-props rationale above its method Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…i#31991) * fix(search): date undated Cursor sessions and retain sidecar metadata * fix(search): truncate repaired Cursor dates to whole milliseconds SQLite rounds sub-millisecond file times while Date#toISOString truncates, so repaired rows could land 1ms after the date a re-read writes. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…ai#32060) * fix(github): reject cached same-branch PRs with foreign heads * fix(github): keep same-repo cached PRs behind renamed remote URLs A stale origin URL after a repository rename or transfer made the foreign-head check reject the checkout's own same-repo PR and clear its cache. Treat a PR whose head matches its canonical base URL as local. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…tablyai#32056) * fix(terminal): parse Markdown file destinations before bare paths * fix(terminal): keep Windows backslashes in Markdown file destinations Markdown unescaping turned C:\Users\me\.config\app.json into C:\Users\me.config\app.json, a regression versus bare-path detection. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…yai#31992) * fix(claude): match WSL account selection across distro casing * fix(claude): keep exact WSL selection spelling ahead of casing aliases A saved key that matches the launch distro exactly now resolves as before, so existing mixed-alias selections do not regress to System default. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…and main typechecks again (stablyai#32168) stablyai#32018 pushed headless-terminal-tab-close.ts over the 300-line lint limit, and its new test passed sleepWorktree to RuntimeNotifier after stablyai#31564 removed it. setMobileSessionTabProps moves unchanged into RuntimeHeadlessTabProperties, which already owns the helpers it calls and directly extends the close class.
…ablyai#32044) * fix(cli): reject orchestration ask waits above the documented maximum * fix(cli): keep ask timeout help ASCII and trim redundant cases Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…#31978) * fix(usage): read Cursor Unified Ultra current-period quotas * fix(usage): fall back when Cursor serves the current-period route as HTML Cursor answers unknown /api/dashboard routes with a 200 HTML app shell, so a retired current-period endpoint would surface as a permanent parse error for every Unified Ultra account instead of the summary fallback. Co-Authored-By: Claude <noreply@anthropic.com> * fix(usage): stop labelling Cursor plan usage as monthly Unified Ultra now reports a weekly period, so the Accounts heading and search copy no longer promise a monthly window. Co-Authored-By: Claude <noreply@anthropic.com> * fix(usage): read weekly Cursor periods for all unified and idle-pool plans Cursor's weekly X Subscription plans (Plus/Premium/Super/Ultra, incl. enterprise seats moved to Premium) all keep stale monthly zeros in usage-summary. Gate on unified_* membership, or on idle summary pools with a sub-monthly current period; non-unified plans ignore current-period failures so their behavior is unchanged. Co-Authored-By: Claude <noreply@anthropic.com> * fix(usage): skip the Cursor current-period request for unlimited non-unified plans Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…31971) * fix(agents): apply paired host preferences to launch menus * fix(agents): keep desktop preferences for older hosts and reopen menus instantly Hosts without settings.agent-launch.v1 (before 2026-10-11) cannot store launch preferences, so their menus keep the desktop's visibility and default instead of losing both. Cache the last host answer per environment so freshly mounted menus render at once and revalidate; host-settings saves invalidate the cache. Co-Authored-By: Claude <noreply@anthropic.com> * fix(agents): align new-agent shortcut with host menu and bound first read The tab.newAgent shortcut, its menu badge, and bound per-agent shortcuts now use the same per-host preference snapshot as the menu. A first read that fails or stalls past 3s falls back to desktop preferences (pre-PR behavior) instead of a neutral order or a long placeholder; a late answer still applies. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…2061) * fix(codex): pair structured launches with the CLI runtime * test(codex): align launch snapshots with runtime pairing * fix(agent-session): keep this app's CLI ahead of the paired runtime dir Pairing ran after the Orca CLI prepend, so a runtime dir that also holds an `orca` (e.g. /usr/local/bin with node+codex+orca) shadowed this app's launcher for the child. Pair first; the CLI dir stays first on PATH. Drops a PATH-shape test the parity snapshots already cover. Co-Authored-By: Claude <noreply@anthropic.com> * fix(cli-runtime): skip compiled CLIs and keep inherited PATH when pairing a sibling node A native codex/claude beside a node (Homebrew, /usr/bin) never runs on it, so pairing only reordered PATH. An env naming no PATH now pairs over the PATH the child inherits instead of replacing it with the CLI dir alone. Co-Authored-By: Claude <noreply@anthropic.com> * test(cli-runtime): type the PATH-less env fixture Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…tablyai#32238) * fix(terminal): focus the neighboring pane when a split pane closes * test(terminal): cover focus after closing a split pane in the app * fix(terminal): focus the neighboring pane when a split pane closes * test(terminal): cover focus after closing a split pane in the app * test(terminal): keep pane-close parity exclusions evidence based --------- Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
…ai#32341) * fix(runtime): retire predecessor exit evidence on incarnation change When a PTY id is re-registered with a different, known incarnation, the handle was already invalidated but lastExitCode/lastExitCause (pty and leaves) still carried the predecessor exit, so a live replacement reported the old stop. Clear them at that same proven-replacement point. Same or unknown incarnation keeps the evidence (fail closed). * fix(runtime): retire exit evidence for replacement incarnations Clear predecessor exit evidence on the PTY and its indexed leaves when registration or provider spawn proves a different known incarnation owns it. Cover both paths so an earlier spawn cannot hide the transition from later registration. Keep same and uncertain incarnation evidence conservative. Adapted from Cubatica's original fix and regression cases in stablyai#24513; extend the coverage to spawn-first replacement on the current runtime modules. Co-authored-by: Cubatica <4414418+Cubatica@users.noreply.github.com> --------- Co-authored-by: Cubatica <4414418+Cubatica@users.noreply.github.com>
…tablyai#32480) * fix(editor): resume media previews from their last playback position Switching tabs unmounts the editor surface, so the media element was recreated and every video or audio preview restarted from zero. Record the playback time on teardown and seek back once metadata loads. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(editor): resume media previews from their last playback position Switching tabs unmounts the editor surface, so the media element was recreated and every video or audio preview restarted from zero. Record the playback time on teardown and seek back once metadata loads. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(editor): verify media remount playback and cleanup --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
…i#32587) With automatic symlink following disabled, re-reading a parent lists its links as files and discards the directory flag set when a user opened one. Keep that flag while a successful same-owner child listing is cached, in both direct reads and expanded-directory refreshes. Mark inferred folder rows separately so a failed child read can clear them without changing host-confirmed directories. Preserve normal deleted-link and missing-target recovery behavior. Add parent/full refresh, failed read, ownership and Windows drive-root regression coverage. Refs stablyai#29069. Co-authored-by: Arnobrizwan <147672066+Arnobrizwan@users.noreply.github.com>
…33008) * fix: reset Muse hook state and strengthen boundary tests * test: require live permission, replay, and recency controls --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…cked (stablyai#30063) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com> Co-authored-by: Neil <neil@stably.ai>
…auto-sync-fork-with-upstream-stablyai-orca-ru-20261024T1400 # Conflicts: # config/scripts/check-node-runtime-pin.test.mjs # config/scripts/ci-e2e-job-selection.test.mjs # config/scripts/linux-package-fixture-cache.test.mjs # config/scripts/localization-extraction-change-scope.test.mjs # config/scripts/pr-auxiliary-preflight-admission.test.mjs # config/scripts/pr-code-change-scope.test.mjs # config/scripts/pr-e2e-route-contracts.test.mjs # config/scripts/pr-preflight-gates.test.mjs # config/scripts/verify-skill-update-roundtrip.test.mjs # config/scripts/win32-test-lane-registration.test.mjs # src/main/skills/skill-update-run.test.ts # src/renderer/src/components/native-chat/native-chat-composer-composition.test.tsx # src/renderer/src/components/native-chat/native-chat-composer-prompt-recall.test.tsx # src/shared/agent-feature-install-commands.test.ts
Reset upstream-owned paths to the tag, honour fork deletions, restore
exceptions and three-way merge the 62 exceptions and 237 seams upstream
changed (24 and 53 conflicted, resolved by hand).
- re-home the heimdall seams onto src/shared/remote-runtime/{control,requests}/
and the terminal-dock tab-props patch onto headless-tab-properties.ts,
where upstream moved that code
- restore GitHub-hosted runners in 32 fork-run workflows upstream moved to
Blacksmith, declared as fork-infra seams
- regenerate the bundled skill sources and released digests with the
fork-only skills and own both files
- add pt.json to the 22 fork locale bundles for upstream's new Portuguese
- follow upstream's moves of native-chat-send.ts and its skill-update tests,
retiring 10 seams whose fork lines have nothing left to attach to
- replay upstream into the 4 tier-2 copies whose sources changed and advance
all 16 headers to 47f77cf
- trust com.stablyai.orca.dev in the fork's computer-use peer check, the
fork dev runner's bundle id (upstream stablyai#26500)
…utionHostId v1.4.239 dropped the getRepoHostedReviewExecutionHostId re-export from hosted-review-execution-host and points store-backed callers at repo-execution-host's getStoredRepoExecutionHostId, which it aliased. Same function, so the sitter's contention check is unchanged.
v1.4.239 added an early return for a stale post that only repeats the current windows. The session-info seam makes ingestLiveClaudeRateLimits report whether the selected account accepted the post, and this path is past the account check, so it answers true like the existing same-window dedupe below it.
v1.4.239 widened resolveTuiAgentLaunchArgs to take the agent launch profile (default args plus permission defaults) instead of the bare agentDefaultArgs map, and moved every upstream caller over. Automation runs inherit the same defaults as every other launch.
v1.4.239 made RuntimePtyWorktreeRecord.tabId and paneKey optional (window-owned builds only). The dock's live-key scan already skips records without both, so only its input type changes.
v1.4.239 (stablyai#31517) changed appendWorktreeRows to take a RepoOfWorktree lookup instead of the repo map; SectionAppendContext carries both.
…39 homes v1.4.239 moved native-chat/native-chat-send.ts to shared/native-chat-paste-bytes.ts and shared/native-chat-command-envelope.ts under shared/native-chat/. Six fork files still named the old paths (TS2307).
…poser's suite v1.4.239 appended a test for stablyai#30398 (long paste kept as a text-file reference) that drives upstream's rich prompt editor. This exception file runs upstream's paste-remount coverage against the fork's textarea composer, which has no pasted-text references, so the test cannot apply and its promptValue import collided with the fork helper (TS2300). Porting the feature is deferred-328.
v1.4.239 (stablyai#31203) changed useNativeChatTypedInsertion to write through the field unless an IME composition owns it, replacing its caret and draft inputs with isComposing, and the command picker now takes isComposing as well. The fork composer passes its own IME gesture, as upstream's composer does.
…w cases v1.4.239 added two OMP/Codex question-card cases that call useNativeChatInteractiveSend without the fork's leading terminal tab id.
Same v1.4.239 resolveTuiAgentLaunchArgs change as the automation runner: the fork's override fields now read the launch profile, so the inherited args they display include the permission default a launch would add.
…cipe v1.4.239 (stablyai#28709) made the fix-checks recipe a function so it re-reads settings after agent detection; the fork's session-option lines still read it as a value.
v1.4.239 (stablyai#28709) changed detectAgentSessionContinuationAgents to return { detected, offered }, where offered adds chat agents whose host runs their chat program. Handoff launches the agent's terminal session, so it keeps using the detected list, as upstream's own terminal route does.
The seam's boolean return now also covers v1.4.239's stale-repeat path, one more changed line against the tag.
Replaying v1.4.239 into the tier-2 copy added upstream's getRepoExecutionHostId import next to the copy's own parseExecutionHostId import from the same module (import/no-duplicates).
…k code v1.4.239 (stablyai#31462) routes renderer reads of worktreesByRepo, folderWorkspaces and detectedWorktreesByRepo through store/workspace-record-selectors and adds a ratchet that allows no new direct reads. Nine fork files read the fields directly. Store reads now use the selectors; the two plain objects that only share the field name (the ledger catalog and the ledger panel's source) are destructured, as upstream did for its own non-store reads, and the renderer-only LedgerCatalog field is renamed folders.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ELI5
This brings the fork up to upstream's newest stable release, v1.4.239 (from v1.4.237). The release is big on paper because upstream rewrote comments across ~5,000 files, but three changes mattered for the fork: upstream moved almost all of its CI onto Blacksmith runners the fork doesn't have, replaced
npx skills addwith its own bundled skill installer, and moved several modules the fork hooks into. The fork's CI was put back on GitHub-hosted runners, the fork's own skills were added to the new installer's bundle, and the fork's hooks were moved to follow upstream's files. Four feature-collision questions are with the owner (see the end).What Changed
v1.4.239at47f77cf701.auto-ours+tree. 92 content conflicts went to-X ours; 14 tree conflicts remained, all modify/delete: 11 "deleted by us" resolved by honoring the fork's deletion, 3 "deleted by them" kept for Step 6 (all three were later removed with upstream, see below).origin/backup/main-20261024-140140Zat0416180d2e.allow-runtime-launcher-protocol-bump, becausedaemon-protocol-version.tschanged in this range.Ownership classifier: 14,495 differing paths (v1.4.237's sync had 4,460); 11,038 reset to the tag, 1,094 removed, 173 exceptions restored, 2,190 merge-review paths. The surplus is upstream's comment audit (
2847bbe9e8, stablyai#32966, stablyai#32946) and its removal of checked-in audit artifacts (stablyai#32903).Exceptions (
ours.txt). No stale exceptions and no module splits. 62 changed upstream and were three-way merged against v1.4.237; 38 merged clean, 24 were resolved by hand. The ones worth a reviewer's eye:pr.yml: all 10 hunks are upstream edits in regions the fork removed or re-runnered, so the fork side wins. One clean hunk had movedcross-version-wireontoblacksmith-4vcpu-ubuntu-2404-arm; that was put back, sopr.ymlis byte-identical tomain.release-cut.yml: upstream only touched comments inside theskill-sharing-release-gatejob the fork deletes. It newly callsdependency-security.ymlfor stable tags (fork tags carry-rc, so it is skipped) withrunner: ubuntu-latest.publish-complete-draft-releases.test.mjs: upstream rewrote two tests to use a real git repo and the real asset verifier. The fork's implementation is unchanged upstream and still takes the injected verifier, so the fork's upstream/.zyNNparameterized tests stay and upstream's two new tests are added beside them.native-chat-send.tsmoved toshared/native-chat-paste-bytes.ts; five fork exception files were repointed.NativeChatComposer.paste-remount.test.tsx: upstream appended a test for Attach a long paste as a text file, and say a message is too large before it is sent stablyai/orca#30398 (a long paste kept as a text-file reference) that drives its rich prompt editor. This file runs upstream's coverage against the fork's textarea composer, which has no pasted-text references, so the test was left out (d77c3bb8fe) and the port is filed asdeferred-328.use-native-chat-composer-attachments.test.tsxbecame identical to the tag: upstream moved its test target into a newnative-chat-composer-attachments-test-probe.tsx. The fork'sterminalTabIdline moved there, and the bug-1 pending-upstream exception moved with it.use-native-chat-paste-bridge.ts: upstream extracted a text-onlypasteClipboardTextInto; the fork's image-only fallback to the composer is kept for the no-origin path.readme-downloads-badge.yml(zpyoung/orca),updater-prerelease-feed.ts(fork release feed),macos-tcc-prompt-watch.test.tsandmacos-daemon-launchd.test.ts(com.zpyoung.orca).Seams (
merge-review.txt). 237 seam files changed upstream (82 last sync) and were re-merged without-X ours: 179 clean, 53 resolved by hand, 5 whose upstream file was deleted or moved. Most hand resolutions are a fork line next to a comment upstream shortened, or both sides adding to the same import list or union. Moves and retirements:src/shared/remote-runtime/{control,requests}/(upstream moved the shared-control modules), and the terminal-dockterminalDocktab-props patch ontoheadless-tab-properties.ts, where upstream movedsetMobileSessionTabProps. Budgets unchanged except the new home (+8).run-node-server-tests.mjs,OrchestrationPane.test.tsx,LinearAgentSkillSetupPrompt.test.tsx,src/cli/skills.test.tsandonboarding-feature-setup.test.ts, whose npx install URLs upstream removed;headless-terminal-tab-close.ts(moved, above); andweb-preload-api-composition.test.ts, whose exact key list upstream deleted.store-test-helpers.tsandtabs-close-actions.ts, where upstream re-nested the block.Blacksmith runners. v1.4.239 hardcoded
blacksmith-*runners into 32 workflows the fork runs (PR-triggered checks,unit-tests.yml/unit-selection-evidence.ymlcalled by the fork'spr.yml, andrelease-javascript.yml, whose default runnerrelease-cut.ymluses). Those jobs would queue forever here. Each line was restored to its v1.4.237 GitHub-hosted runner and declared as afork-infraseam (61 lines).daily-mac-build,hourly-mac-buildandrelease-policyare guarded tostablyai/orcaand were left alone.ci-closed-pr-caches.ymlalready ran on Blacksmith before this release; filed asbug-327.Skills. Upstream now installs skills from a generated bundle (
bundled-skill-sources.ts,resources/skills/released-digests.json) instead ofnpx skills add <repo>(stablyai#31662, stablyai#31688, stablyai#31918). The tag's bundle lacked the fork'sorca-ask,orca-heimdall,orca-ledgerandorca-loop, which would have made them uninstallable and failedverify:skill-bundle-manifest. Both files were regenerated and declared permanent fork exceptions, matchingcurrent-manifest.json. Thezpyoung/orcaURL swap stays on the npx path upstream still uses for WSL.Other sweeps. Upstream identity:
TrustedOrcaApplication.swifthardcodescom.stablyai.orca*; the fork keeps its own peer predicate inmain.swiftand addscom.stablyai.orca.dev, the fork dev runner's id (upstream stablyai#26500). The mobile podspec'ssourceURL is metadata and stays. Locales: upstream added Portuguese, so all 22 fork bundles gainedpt.json({}). Undeclared-edit sweep, deleted-exception sweep, cross-version tag pins, workflow-swap commit under the tag: none. Toolchain: release workflows match upstream's (pnpm/setup@v2on both sides). The benchmark seam keeps the fork'sclearBuildOutputKeepingMobileWebbeside upstream's new mobile-bundle copy pending the owner's answer.Tier-2 copies: 16 checked. Four sources changed and were replayed:
loop-precheck-runner.ts(comments),use-worktree-card-review-details.ts(equal-context hold viauseState),fix-checks-agent-launch.ts(lazy recipe and prompt, stablyai#28709), andAgentComposerField.tsx(IME composition-end text only; upstream's other change guards its rich editor's chip node views, which the textarea doesn't render). All headers advanced to47f77cf701.Tier-4 pending-upstream: every ledger target exists and no fork delta was absorbed.
Feature-collision review: 2 confirmed (skills-repository, fork-benchmark-baseline), 2 possible (computer-peer-identity, agent-composer), 29 none. Nothing was dropped; the owner question is at the end.
Fixes after the merge, one commit each:
942a76f8f9: the sitter reads its host throughgetStoredRepoExecutionHostId; upstream dropped the old alias.ce3e0eb34d,c864f05f00: upstream's new stale-repeat return in live Claude ingest answerstrueunder the session-info seam's boolean contract; budget re-baselined.f68a09a7e2,6a49938d8a:resolveTuiAgentLaunchArgsnow takes the launch profile (args plus permission defaults); the automation runner and the fork's override fields pass it.60462ba546: the dock's live-key scan accepts PTY records whosetabId/paneKeyare now optional.ee8006638b: loose worktree rows pass the section'srepoOflookup (fix(sidebar): keep each host's activity, PR lane and retention apart for a same-id workspace (dark) stablyai/orca#31517).533c2626be: six fork files import paste bytes and command envelopes from their new homes.d77c3bb8fe: the rich-editor paste test (above).9db480a7b4: the fork composer passes its IME state to upstream's reworked typed insertion and picker (fix(native-chat): typing fast after focus moves keeps keys in order stablyai/orca#31203).d811b23065: upstream's two new interactive-send cases call the fork's tab-scoped hook.9a512bff91: the fix-checks seam reads launch options from the now-lazy recipe.5d5c680e40: handoff keeps targeting CLI-detected agents now that continuation detection returns{ detected, offered }.72be7fc702: one duplicate import in the replayed fix-checks copy.d42c4319d9: nine fork files read workspace records through upstream's new selectors, for its new workspace-record-read ratchet (refactor(renderer): read workspace records through typed selectors stablyai/orca#31462).Why
Merging the tag keeps every fork SHA permanent. Following upstream's moves keeps the fork's footprint in upstream files small, and putting CI back on GitHub-hosted runners keeps the fork's checks running at all.
Linked Issue
N/A. This is an upstream sync.
Visual Proof
N/A. No fork UI changes; upstream's own UI changes ship as released.
Testing
Local gate on
d42c4319d9: frozen install;--verify-seams(1,357 lines across 676 entries) and--verify-residuals(591 files) pass; typechecknode,web,cliand the process-host tests one at a time, clean;pnpm lintpasses; clean tree;check-pr-verify-selections, the root-directory guard and the fork ownership guard pass; the preflight replay passes every step it can run. Tests are left to this PR's CI.Decisions pending with the owner
Asked through
orca askwhile CI runs; this PR will not merge before the answer.clearBuildOutputKeepingMobileWebbeside upstream's mobile-bundle copy, or retire it.TrustedOrcaApplication.deferred-328.