Repository navigation
sync: upstream main 2026-10-11 - #17
Merged
Merged
Conversation
Co-authored-by: m4air <m4air@Mac.localdomain>
…#26863) Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
…st (stablyai#27177) stablyai#27164 made an old host without a known non-Windows platform ask for an update instead of answering its default list. The cross-version journey mocked the capability probe but not the status read, so no request ever reached the wire. Co-authored-by: m4air <m4air@Mac.localdomain>
Name Agent Dashboard columns using their translated visible headings. Co-authored-by: Matheus Breguêz <matbrgz@gmail.com>
Use the approved Korean Finder wording and preserve it during locale regeneration. Co-authored-by: YEONGUK LEE <contact@abruption.dev>
…force (stablyai#27172) * fix(repos): deleting a project with live terminals warns and needs --force orca project setup-delete now refuses a repo-backed project that still has terminals not known to have exited or saved workspace details, unless --force. The sidebar remove dialog says how many open terminals will close. Co-Authored-By: Claude <noreply@anthropic.com> * fix(repos): count a sibling host's host-qualified workspace metadata in the delete guard Co-Authored-By: Claude <noreply@anthropic.com> * test(sidebar): cover the remove dialog's open-terminal warning Co-Authored-By: Claude <noreply@anthropic.com> * test(sidebar): type the dialog mock state without assertions Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: m4air <m4air@Mac.localdomain> Co-authored-by: Claude <noreply@anthropic.com>
Preserve active graph lanes through unrelated root commits and share node/reference colors. Isolate real-Git fixtures from inherited Git settings and use the existing public process-host import after the current-main package migration. Co-authored-by: Matheus Breguêz <matbrgz@gmail.com>
* feat(hosts): servers publish a host descriptor A paired server now reports a stable installation id, created once per profile, plus an optional machine binding (HMAC keyed by that id over the machine id and profile path) in status.get and in runtime pairing offers. Optional fields only: older clients ignore them and older hosts omit them. Clients start using it in the follow-up. * fix(hosts): serialize installation id creation so concurrent starts never fork it --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…7188) * feat(ports): host-scoped port scan and stop on the server Add workspacePorts.scanHost/killHost, addressed by workspace and resolved on the server to the workspace's own execution host (this machine or one of its SSH hosts). Stop is bound to the host its row was scanned on and is refused on SSH hosts, where ownership cannot be proven. Advertised as workspace-ports.host-scoped.v1. * fix(ports): only this host's workspaces authorize Stop; a failed relay scan is not empty Port ownership probes now come from host routing instead of the repo row's connectionId, so an SSH repo that carries only executionHostId (or a runtime- hosted repo) can no longer make a local listener look workspace-owned. The relay's ports.detect now fails when it could not read the socket table (unreadable /proc/net/tcp, or neither Windows scanner answering) instead of answering an empty list, so a host scan reports unavailable rather than none. --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…kground (stablyai#27022) * Let a Grok chat list and stop the commands it left running in the background A command Grok backgrounded (a dev server, a watcher, a monitor) showed only as a transcript line: it never reached the background-tasks card above the composer, so it could not be seen as running or stopped from Orca. Grok's subagents and Claude's and Codex's background commands already list and stop there. The ACP lane that publishes Grok's subagents as child records now also publishes its background-task rows: a running task as a live background command or monitor, an ended one as removed, derived from the rows the journal admitted. A Stop for one of them goes through the same adapter route to Grok's own per-task kill (x.ai/task/kill); Grok's completion notice ends the row, and a task Grok no longer holds is removed at once. A refusal reports the task as not stopped; no answer or an unreadable one leaves the outcome unknown. Each Grok process is checked once at start with a no-target kill, beside the existing subagent check. Only Grok naming the method unknown hides Stop. * Settle a Grok task's transcript row when Stop finds it already gone When Grok answered a Stop with already_exited or not_found, the card row was removed out of band while the transcript row kept saying it was running, and a later restated running notice could bring the card row back with Stop. The answer now settles the transcript row through the translator, like the subagent Stop, so the card row leaves because its row settled, the existing no-relight rule keeps it gone, and a completion Grok still sends after already_exited writes the real result. Also covers /clear being refused while a Grok background command runs.
…26760) * Keep repository detection off the main IPC thread Share repository discovery decisions across synchronous compatibility callers and the existing asynchronous Git runner. Await discovery in project registration, nested imports, and folder upgrades, and recheck folder ownership after discovery completes. * Make repository detection fixtures work on native Windows * Await asynchronous Git checks in folder upgrade fixtures * Prevent duplicate project registration after async discovery * Check authoritative registration identity before renderer convergence * Narrow repository responsiveness to detection and registration * Keep one local project identity after concurrent registration * Run registration SSH coverage in the existing Docker lane * test(git): cover classifier failure stages and literal path identity * test(git): use the current process host package * test(repos): use current process host in registration fixture
* chore: remove verified unused Orca code * chore: remove translations orphaned by dead code cleanup
…blyai#26790) * Keep repository detection off the main IPC thread Share repository discovery decisions across synchronous compatibility callers and the existing asynchronous Git runner. Await discovery in project registration, nested imports, and folder upgrades, and recheck folder ownership after discovery completes. * Make repository detection fixtures work on native Windows * Await asynchronous Git checks in folder upgrade fixtures * Prevent duplicate project registration after async discovery * Check authoritative registration identity before renderer convergence * Narrow repository responsiveness to detection and registration * Keep one local project identity after concurrent registration * Run registration SSH coverage in the existing Docker lane * Await Git discovery when scanning and importing nested projects * test(git): cover classifier failure stages and literal path identity * test(git): use the current process host package * test(repos): use current process host in registration fixture
…ablyai#26791) * Keep repository detection off the main IPC thread Share repository discovery decisions across synchronous compatibility callers and the existing asynchronous Git runner. Await discovery in project registration, nested imports, and folder upgrades, and recheck folder ownership after discovery completes. * Make repository detection fixtures work on native Windows * Await asynchronous Git checks in folder upgrade fixtures * Prevent duplicate project registration after async discovery * Check authoritative registration identity before renderer convergence * Narrow repository responsiveness to detection and registration * Keep one local project identity after concurrent registration * Run registration SSH coverage in the existing Docker lane * Keep folder upgrades responsive and recheck pending project ownership * test(git): cover classifier failure stages and literal path identity * test(git): use the current process host package * test(repos): use current process host in folder upgrade fixture * test(repos): use current process host in registration fixture
…yai#26798) * fix(codex): keep running subagent groups in long chats * fix(codex): remember superseded settled child turns * fix(native-chat): retain running Claude subagent groups
…lyai#27197) * feat(pairing): re-pairing the same server keeps its environment The web client minted a new environment id on every runtime-scope pairing link, even for the same server key, so existing terminals kept the old id and failed as ambiguous. A key-matched re-pair now keeps the id (bumping the pairing revision) and pins the server's host descriptor; a same-key server with a different installation gets a new id, and a downgraded server never replaces the pin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): a reply from the replaced pairing never overwrites a same-server re-pair Re-pairing now keeps the environment id, so fence on the pairing revision too: a request captured before the re-pair can neither reopen a client with the replaced token nor save the old pairing back over the new one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: m4air <m4air@Mac.localdomain> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…blyai#27196) * fix(mobile): agents for workspaces another runtime owns show why The paired host no longer lists its own agents for a workspace another Orca server owns: preflight.detectAgents refuses with workspace_on_other_runtime, and the phone shows 'Agents on Another Server - Pair that server directly'. The phone also recognises an unambiguous runtime-owned repo row itself, so an older host is never asked. * fix(mobile): a shared repo id with a runtime-owned row defers to a refusing host Rows on several hosts can share a repo id, and the first row's SSH connection could name the paired host's own target. When any row is runtime-owned the phone now asks a host that advertises preflight.other-runtime-refusal.v1 to decide by worktree, and shows the other-server row on an older host. * fix(mobile): keep the agent-loader change inside the web bundle budget Move the refusal code beside its capability in protocol-version, read the capability in the loader, and test the runtime: prefix directly: importing execution-host into the loader split a web bundle chunk (129 > 128 assets). --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…tablyai#27198) * [CI] Overlap independent process waits and remove two static tests * [CI] Use the declared conditional Vitest chain
…ablyai#27174) * refactor(wsl): move the WSL guest bundle sources out of src/relay The WSL hook relay and WSL browser network relay are built from src/relay but are not part of the SSH relay. Move them, and the 46 relay modules the hook relay bundles, to src/wsl-guest so the SSH relay can be deleted on its own. Pure renames; the built bundles are byte-identical. Adds a boundary test so nothing outside src/relay imports it except relay tests. * fix(ci): exempt renamed files' existing lint debt in the changed-lines gate * test(relay): keep the cast suppression on the wrapped line * test(relay): only parse files that mention relay in the import boundary check --------- Co-authored-by: m4air <m4air@Mac.localdomain>
* refactor(hosts): host authorities and owner resolution
Adds HostAuthority {endpoint, at} with authorityKey (existing host-id
spellings kept; nested 'SSH target behind server' gets an in-memory key no
host-id parser accepts), HostRoute {target, at}, and resolveOwner, a
focus-free owner resolver over the existing route resolvers. Today's
focus-reading answer is kept behind resolveOwnerWithLegacyFocus, which
counts every answer focus changed. No caller migrates in this PR.
* fix(hosts): resolveOwner keeps nested SSH places and strict active selection
The active workspace's host now resolves through the strict path, so rival
servers proxying one ssh:t stay ambiguous. A folder or repo row on a paired
server that names an SSH connection resolves to that nested target instead
of the server's own machine.
---------
Co-authored-by: m4air <m4air@Mac.localdomain>
Repos, project groups, project host setups and folder workspaces fetched from this app or a paired server were each stamped with their owner by a separate function. They now go through adoptFromEndpoint, one adapter with a per-kind arm. Behavior is unchanged; a characterization test was run against the old stampers before they were deleted. Co-authored-by: m4air <m4air@Mac.localdomain>
* fix(cli): check the runtime source before sending A terminal Orca launches now carries which Orca launched it (ORCA_RUNTIME_SOURCE_ID = the profile's installation id, ORCA_RUNTIME_SOURCE_INCARNATION = the launching runtime id). Before a request is sent, the CLI compares that with the runtime the profile's runtime record names. Same runtime: sent as before. Different runtime: a read-only status.get asks which profile it serves; the same profile (a restart or update) is accepted, anything else is refused before the request reaches it. The vars cross into WSL through WSLENV. The SSH bridge stamps the bridging runtime itself rather than trusting the remote env. The existing orchestration compatibility stamp is untouched. * fix(orcad): drop an inherited runtime source at startup * fix(cli): an explicit switch to another profile is not fenced The stamp also carries the launching runtime's userData path. A CLI that dials a different profile than the one that launched its terminal, and not the platform default an unpinned terminal falls back to, was pointed there on purpose (orca-dev from a packaged Orca's terminal), so the fence does not apply. * refactor(cli): reuse the shared userData path comparison --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…#27223) Worktree change/activation events and the just-created worktree's owner now go through adoptFromEndpoint, and a dev counter reports rows that reach a reader unstamped but get attributed to a non-local host. Co-authored-by: m4air <m4air@Mac.localdomain>
…ined ratchet (stablyai#27218) * refactor(runtime): route adapter, split fences, ownership table, combined ratchet Adds callHostRoute, which calls a host-owned method on the host a HostRoute names and reports a reply whose host identity moved mid-call as unverifiable instead of applying it. Host fences are split: an identity fence (pairing, runtime connection generation, the route's own SSH target) for mutations, and the catalog data fence built on top of it for snapshot reads, so unrelated catalog or SSH-state churn no longer moves a mutation's fence. HOST_OPERATION_OWNERSHIP classifies every runtime RPC namespace. A new ratchet counts getActiveRuntimeTarget( + legacyRouteFromSettings( + settingsForRuntimeOwner( together per renderer file (227). One exemplar, the folder workspace review-note write, moves onto the adapter. * fix(runtime): fence the folder note write on its server; refuse aliased ratchet helpers The folder catalog row lives on the paired server, so its write is fenced on that server's identity, not on the SSH target the folder names. The ratchet now counts spaced calls and value uses, and refuses an aliased import or re-export that would hide calls from the count. * test(ci): pin the owner-routing ratchet step to the static phase --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…tablyai#27224) A CLI launched from an Orca terminal now sends, with each request, the runtime it verified before sending (expectedRuntimeSource: the launching profile's installation id plus the verified runtime id). The host checks it before parsing params or running any handler and refuses a mismatch with runtime_source_mismatch, so a runtime that took over the endpoint between the CLI's check and its send cannot apply the request. Optional field: an old CLI sends none and an old host ignores it (the CLI's pre-send probe stays the fence there). Hosts advertise runtime-source-fence.v1. Co-authored-by: m4air <m4air@Mac.localdomain>
…lyai#27225) * fix(agents): one agent inventory per host and execution context Launch surfaces that pick an agent for a workspace now read and load the agent list through one helper keyed by the workspace's own host, instead of each re-deriving "SSH connection id, else this computer". A paired server's workspace (including one on the server's own SSH target) reads the server's list; this client's own list and its SSH map are never consulted for it. - Source Control AI actions (Resolve with AI, recovery, Fix checks), the new-agent-tab shortcut, Explain commit, session continuation and the checks panel use readDetectedAgentsForWorktree / ensureDetectedAgentsForWorktree. - An old paired server without workspace-scoped detection probes its own SSH target with preflight.detectRemoteAgents instead of answering its default list. - A disconnected SSH host rejects detection instead of answering [], so it is no longer cached as "no agents installed"; Quick Launch says the host is unreachable. - On Windows, an active workspace on another host no longer drops this machine's agent context to the Windows host; it uses the global runtime default. * chore(i18n): add the unreachable-host quick launch copy --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…ost workspace that holds it (stablyai#27226) * fix(files): a paired-server link outside its workspace opens in the host workspace that holds it Links an agent or terminal prints for a paired server's file in another workspace (the main repo, a sibling worktree) failed with "Remote file is outside the owning runtime worktree". The link now asks the host through files.resolveTerminalPath with crossWorkspace, and opens the file in the workspace the host names. A path outside every host workspace is refused with a message that says so; a sibling file the host verified absent reports not found. * fix(files): open the host's spelling of a cross-workspace link path * fix(files): a paired server's path never opens with this computer's default app The client-OS open decision looked at whether the path sat inside the source workspace, so a server path outside it read as local. Decide by owner: any paired-server or SSH workspace downloads first. --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…rt transaction (stablyai#27227) The new-workspace composer addressed a paired server's files by the project path instead of the project's worktree id, so every drop onto a server-owned project was refused with selector_not_found. Pass the repo's main worktree id so the existing import transaction (unique temp, no-clobber commit, fenced cleanup) runs against the right worktree. Fixes stablyai#16558 Co-authored-by: m4air <m4air@Mac.localdomain>
…lient with trusted provenance (stablyai#27234) * fix(files): a link to this computer in a paired-server terminal opens here when the host disowns it * fix(files): keep client-local link tabs on this computer; gate the fallback on host support and native clients --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…tablyai#27222) * [CI] Reduce repeated test imports and unrelated runner allocations * [CI] Exercise macOS packaged CLI invocation receipts * [CI] Unmount workspace hook fixtures before environment teardown * [CI] Wait for replacement Bash readiness before the child command
…e owner (stablyai#27243) * fix(terminals): terminal IDs, agent rows and dashboard rows follow the owner Copy Terminal ID on a paired-server pane copies the owning server's handle instead of asking this desktop's runtime, which has no record of that pane. Sidebar agent rows and dashboard reveals tell the workspace's owning server which tab was opened, as a tab-strip click does. A paired-server dashboard card with no preview says the session is remote instead of claiming its pane closed. * fix(terminals): owner activation keeps the picked pane and yields to later navigation The row and dashboard reveal now send the exact split pane to the owner and record it in the focus intent, guarded by the tab visible at the click, so a later navigation away is never overridden when the tab arrives. --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…r tabs follow the owner (stablyai#27246) * fix(terminals): automation runs, CLI tabs and folder-workspace browser tabs follow the owner - An automation run on a paired server opens its mirrored pane, or asks the server to focus it when the mirror has not loaded it yet, instead of reporting "Run terminal is unavailable." while the server still runs it. - This desktop's CLI browser tab create/close/profile requests are refused only for a workspace a paired server owns, not whenever a paired server is the Active Server. - browser.tabCreate resolves folder workspaces for server-hosted pages, as it already did for client-hosted ones. * fix(terminals): refuse ambiguous browser owners and name a failed run reveal --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…27247) * fix(review): GitLab reads and actions run on the repo's own host; failed reads show as errors GitLab task lists, the item dialog, right-sidebar MR actions and the Checks panel now pick their host from the repo or workspace row: a server-owned repo asks its server over runtime RPC, a local or SSH repo uses this computer's glab. The focused Active Server is never consulted. The runtime arm reuses the web client's gl-over-RPC table, now shared. A failed checks or comments read in the Checks panel renders as an error that names the machine that answered, instead of 'No checks configured'. * fix(review): keep the server for SSH workspaces behind it; pin the MR host for post-launch thread resolves An SSH workspace reached through a paired server keeps ssh:<target> as its host and names the server separately; its GitLab credentials live on that server, so the Checks panel and job-log tab now route there. A comment-resolution launch now records the MR's credential host when it is queued, so the post-launch resolve no longer looks the repo up by a bare id that two hosts can share. --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…i#27248) * fix(review): PR reads and actions follow the repo owner, not a host-less task source A GitHub task source without a runtime host used to spread activeRuntimeEnvironmentId: null over the repo owner's settings, so assignee, reviewer, label, status and merge cells for a runtime-owned repo ran on this desktop. Every PR read and action site now routes through getGitHubRepoRoutingSettings (renamed from the merge-only helper), and the store's source-scoped routing defers to the repo owner the same way. Focus is never a fallback. Fixes stablyai#7623 * fix(review): a host-less source never inherits an ambiguous repo owner Duplicate repo ids across hosts made the host-less source fallback pick a server owner by focus (UI) or by first row (store), so a local item could read or write on a paired server. The owner is now inherited only from the single row with that id; ambiguity stays on the source's own host. * test: drop stale repo-owner mocks from GitHub repository scripts --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…ablyai#27250) * feat(terminals): dashboard terminal previews from the owning host A paired host's agent pane now previews over the same multiplexed terminal stream panes already use, routed by the host named in the pty id. The web client and desktop pop-out no longer render a blank dialog when no preview bridge exists; they show the unavailable message instead. * fix(terminals): hold the preview's snapshot boundary and transport credit A requested snapshot is followed by every chunk the host buffered, covered ones included, so live output is now trimmed against the snapshot's output high-water for as long as the stream lives. Each emitted chunk keeps the host's delivery credit until the preview parses it, so a slow preview applies backpressure instead of overrunning its parser. --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…st (stablyai#27258) * fix(ports): the ports panel scans and stops on the workspace's own host The panel now picks its host from the workspace owner instead of the repo's connectionId and the Active Server. A direct SSH or recipe VM workspace uses the SSH view for its own target; an SSH target behind a paired server is scanned by that server through workspacePorts.scanHost (workspace-ports.host-scoped.v1), and Stop goes through killHost with the host the row was scanned on. An older server is never asked and the panel says to update it; an unknown owner says so instead of scanning another host. * fix(ports): scan recipe VMs through this app's runtime so an unreachable VM reads as unavailable Recipe VM targets publish no connection state to the renderer, so the SSH view cannot tell a reachable VM from one whose relay is reconnecting. Route them through workspacePorts.scanHost on this app's own runtime, which reports a missing relay as unavailable, and keep the SSH view for user SSH targets. * fix(ports): keep the host-scoped panel's host stable without a render-time ref --------- Co-authored-by: m4air <m4air@Mac.localdomain>
* [CI] Reduce test teardown waits and duplicate CI setup * [CI] Map browser ownership to the combined test check
…ilently (stablyai#27261) Discovery skipped every SSH-backed repo without a trace, so the Skills page counted only local folders and never said a repo was left out. Each skipped SSH repo now appears as a source with skippedReason 'remote-repo', which the Skills folder list already renders as 'Remote repo - not scanned'. Co-authored-by: m4air <m4air@Mac.localdomain>
…ost (stablyai#27259) * fix(hosts): agent launch platform and shell come from the execution host Agent startup commands were quoted for this client's OS (and its Windows shell setting) whenever the workspace's repo row had no SSH connection, so a Windows client driving a Linux Orca server sent PowerShell to bash. SSH hosts were guessed from path shape. One resolver now reads the OS from the host that runs the agent: the server's reported hostPlatform, the relay-reported SSH remotePlatform (nested SSH read through its server), WSL as linux, and this client only for local workspaces. A missing fact withholds the launch with a reason. Plain-SSH mode now publishes the OS the runtime ladder detected. * fix(hosts): new-tab and background launches read the worktree's own host Review follow-up: the new-tab resolver reads folder workspace paths (WSL folders), a caller's platform only refines a local launch, background launches resolve the worktree's host (nested SSH) and drop this client's shell setting for remote hosts. * fix(hosts): background launches on an SSH worktree keep the relay CLI name --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…tablyai#27262) * fix(accounts): a server's late account result stays with that server The Accounts pane kept one roster across default-runtime changes, so a select or remove still in flight on the previous server overwrote the new owner's roster when it returned. Key the pane by its account owner so rosters, account ids and in-flight results are scoped to one owner. Co-Authored-By: Claude <noreply@anthropic.com> * fix(accounts): drop a stale owner's result instead of remounting the pane Remounting lost an in-progress local login's spinner and Cancel button and hid an account added after returning to the same owner. Guard each action's result by the owner it was sent to instead. Co-Authored-By: Claude <noreply@anthropic.com> * fix(accounts): keep the stale-owner check on the roster write only The toast, settings refresh and restart prompt describe what happened on the owner the action went to; only the roster belongs to the shown owner. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: m4air <m4air@Mac.localdomain> Co-authored-by: Claude <noreply@anthropic.com>
…lyai#27263) While the Resource Manager is open, each paired server that hosts one of this client's projects is asked for its own process samples through the existing diagnostics.memory method, and those rows render under the server's projects, named by host and without a kill control. A server that cannot answer is named as unknown instead of looking idle. Co-authored-by: m4air <m4air@Mac.localdomain>
stablyai#27265) * feat(settings): host-owned settings panes choose their host explicitly Settings gets a Host menu (this computer or a saved server). Provider accounts, agent detection and terminal capabilities follow it instead of the Active Server setting, which is only the menu's starting value. A server that is no longer saved reads unavailable and never falls back to another host. The provider-account client now takes the owner target instead of settings. * chore(i18n): regenerate runtime-required English catalog * fix(accounts): Codex restart notices follow the host the switch wrote A Settings account switch on the chosen host flagged panes on the focused host instead. markLiveCodexSessionsForRestart and its lane matcher now take the owner target explicitly; Settings passes the picker's host, the status bar its focused target, and local sign-in this computer. --------- Co-authored-by: m4air <m4air@Mac.localdomain>
…7266) * fix(web): the paired server is the web client's only host A paired web client is a browser tab with no PTYs, files, browser or second window of its own, yet owners it read as "local" still routed to it: setup terminals and server-local rows hit the local PTY stub, the dashboard pop-out was a silent no-op, Open in Orca Browser threw an uncaught error, and the macOS traffic-light inset was reserved. Route a transport-less owner through the paired server at the shared owner resolvers, open the in-window dashboard, refuse document previews with a reason, and reserve no traffic-light inset in the web client. Co-Authored-By: Claude <noreply@anthropic.com> * test(web): type the owner fixtures instead of casting Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: m4air <m4air@Mac.localdomain> Co-authored-by: Claude <noreply@anthropic.com>
… host (stablyai#27270) * fix(sources): GitHub Projects boards read from the task page's source host The Projects board, its project picker and unmatched-row edits picked their host from the Active Server setting on their own, while the Tasks header named the selected repositories' hosts. The board now takes the same row-less source host that Linear and Jira use, converted through getTaskSourceRuntimeSettings, and the header names that host in Projects mode. fetchProjectViewTable takes the source explicitly instead of reading settings. The ownership table marks the four board-level GitHub Projects reads as scope-picked. * fix(github-projects): an open unmatched-row dialog keeps writing to its row's host The dialog took the board's live source, so a source change while it was open sent its comment and field edits to a different host than the one the row was loaded from. It now routes by the source encoded in its row's cache key, like the row field edits already do. --------- Co-authored-by: m4air <m4air@Mac.localdomain>
Sync 2026-10-11: merge stablyai/orca main into fork-main. Conflict resolutions are recorded in SYNC-NOTES-2026-10-11.md.
The extraArgs -> agentFlags rename lives on fork-only files that git auto-merged from origin/fork-main. Take the PR15 versions so CLI/RPC/launch agree with the conflict-resolved automation-params types.
Keep extra upstream protocol capabilities and PR #15's fork terminal navigation / agent-launch capability tail. Preflight wire mock stays hostPlatform win32 for the old-Windows-host case.
The PR root-directory guard rejects new top-level files. Keep the notes under docs/audits/ so the landing-page check can pass.
The 2026-10-11 sync imported protocol-version into the mobile agent loader so the page could read preflight.other-runtime-refusal.v1. That hub is its own importer set: the packaged web bundle grew from 78 scripts and 129 assets (PR 15, already at the Phase C envelope) to 79 and 130, one over the derived ceiling for 16 routes and 50 images. Import the two names from a leaf module, the same split agent.launch used. protocol-version still re-exports them and lists the capability. Leave the sweep as measured: the extra asset was protocol-version entering the loader's import graph.
The 2026-10-11 sync left the packaged page at 79 scripts and 130 assets for 16 routes and 50 images. PR 15 sat on the envelope (78 / 129). The extra importer set is past the margin of 4 on the last 74-script sweep, so the last row is re-measured here. Set the swept tree's last row to the 79 this head emits. Derived ceilings move with it: 16-route chunk envelope 83, shell crossing with 42 images stays at 30 routes (256 at 29, 266 at 30). MOBILE_WEB_BUNDLE_MAX_ASSETS stays 256.
Static analysis failed at 301 code lines on two files (cap 300, comments skipped). protocol-version grew when the other-runtime refusal names moved to a leaf; keep only the capability import for RUNTIME_CAPABILITIES. orcad-entry grew by the sync's runtime-source stamp plus session-terminal owner wiring; move the Node app-environment and secret-store adapters to orcad-host-adapters.ts.
The sync added folder-repo-git-upgrade, which stubs GTK showOpenDialog and waits for Open as Folder. This fork browses Add project folders in-app on Linux, so that stub never runs and the confirmation never appears. Share the golden-flow in-app browser helper and use it after Browse folder so the upgrade journey can select the temp directory on Linux CI.
Unit shards failed after the guard started running tests. - pet.speak methods are in the fork RPC catalog; classify the pet namespace so host-operation-ownership covers every method. - AgentIcon now uses the bundled DeepSeek mark for observed dsb sessions, matching agent-catalog. - Automation run-open tests mock tabsByWorktree and getTab, which the synced click path reads.
This was referenced Oct 11, 2026
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
Bring the latest stablyai/orca
maininto this fork's working branch (fork-main), keeping the fork's own features (relay retry, pet speech, automation agent flags, and so on).What Changed
Before:
fork-mainwas 446 commits behind stablyai/orcamain(plus the 2026-10-10 sync that just landed as PR #15).After:
fork-mainwould include stablyai/orcamainthrough5c7c493042(fix(sources): GitHub Projects boards read from the task page's source host), on top of PR #15.Mechanism: merge commit (
git merge --no-ff), not a rebase. Conflict resolutions follow PR #15 for the shared fork-vs-upstream files, then fold in the extra 46 upstream commits. After PR #15 merged, this branch re-synced onto the newfork-main. Details:SYNC-NOTES-2026-10-11.md.Why
A merge commit keeps fork history and upstream history both reachable. Reusing PR #15's resolutions avoids inventing a second set of answers for the same 44 files, then applying only the remaining upstream delta.
Linked Issue
N/A — fork sync; maintainers do not open an upstream issue for this.
Visual Proof
N/A — merge of upstream
maininto the fork working branch; no UI restyle.Testing
tsc --noEmit -p config/tsconfig.tc.cli.json: clean (before and after the PR sync: merge stablyai/orca main (2026-10-10) into fork-main #15 re-sync).vitest
--maxWorkers=1on 12 related files (agentFlags, run-open-target, editor sidebar, relay-auth, install retry, desktop installer, session broker, schedule picker, agent-exec-disposal): 106 passed after the re-sync.Full node/web typecheck, mobile tests, and packaging left to GitHub CI.
Platforms exercised locally: Linux typecheck + unit tests only.
I manually tested these changes locally
Automated tests added/updated, or explained why not below
Focused unit tests cover the conflicted fork files. No new product tests beyond what PR #15 already added.
Review
Agent skill upstream boundary
Notes
Do not merge this PR from automation. Operator decides when it is Latest-ready.
Checklist
N/Awith reasonpnpm lint,pnpm typecheck,pnpm test, andpnpm buildpass (or CI will cover; local preferred)