Commit Graph
16062 Commits
Author SHA1 Message Date
OrcaWinandOrcaWin 4d22306d25 test: remove workflow string checks and strengthen provider assertions (#33017)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-23 20:17:20 -07:00
cedce2aa9f feat(cli): add orca ports to list a workspace's detected ports (#33016)
* feat(cli): add orca ports to list a workspace's detected ports

Scripts and agents had no way to read the ports Orca already detects for
a workspace, so finding a dev server on a random port meant redoing the
lsof scan by hand. `orca ports` reuses the host-scoped
workspacePorts.scanHost RPC, keeps the rows owned by the current (or
--worktree) workspace, and prints port, pid, process, connect host,
protocol, how the owner was matched, and the advertised URL. --all shows
every listener on that host. An older runtime without scanHost gets an
"update Orca" error instead of a raw method_not_found.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(cli): resolve folder workspaces in orca ports and match rows by path

Run inside a native folder, `orca ports` failed with selector_not_found
(or picked an enclosing git worktree) because it only searched the
worktree list. It now resolves the cwd like `agent launch`, native
folders first, and shows that host's listeners. Rows are matched on the
owner's path instead of its id, so every instance of a repo-backed
folder workspace keeps its ports even though attribution names only the
first instance as owner. `--all` adds the worktree id when two owners
share a display name, and the skill guide notes that only workspace
rows carry `owner` and `advertisedUrl`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(cli): refuse orca ports for folder workspaces without --all; document the command

Co-authored-by: Manuel Meurer <manuel@meurer.io>

* fix(cli): recognise native folder path selectors in orca ports; note SSH scan limits

Co-authored-by: Manuel Meurer <manuel@meurer.io>

* fix(cli): refuse a folder path shared by several folder workspaces in orca ports

Co-authored-by: Manuel Meurer <manuel@meurer.io>

* fix(cli): refuse a path a worktree and a folder workspace share in orca ports

Co-authored-by: Manuel Meurer <manuel@meurer.io>

---------

Co-authored-by: Manuel Meurer <manuel@meurer.io>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 20:05:47 -07:00
OrcaWinandOrcaWin e12e8bafef test: strengthen hook lifecycle and transcript boundaries (#33015)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-23 19:56:27 -07:00
Neil 82534d0183 refactor: colocate remote runtime passthrough socket (#33009) 2026-10-23 19:46:31 -07:00
OrcaWinandOrcaWin 1fd5020739 test: exercise real platform, provider, and spool boundaries (#33010)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-23 19:40:55 -07:00
Kelvin Amoaba 117e186147 fix(browser): remote tunnel matches Chromium for IPv6 bypass rules and <-loopback> (#32665) 2026-10-24 02:35:00 +00:00
Kelvin Amoaba 33bd67e057 fix(notifications): tapping a phone push opens the agent that sent it (#31773) 2026-10-24 02:34:14 +00:00
de37a4cbe8 fix(workspace-board): close the board when a right-sidebar tab is clicked (#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>
2026-10-24 02:32:00 +00:00
OrcaWinandOrcaWin 3b380ddfcf fix: reset Muse hook state and strengthen regression tests (#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>
2026-10-23 19:25:11 -07:00
Neil 4975e2451e fix(git): preserve binary output through termination barriers (#32633) 2026-10-23 19:21:53 -07:00
NeilandArnobrizwan 1c0acb65fe fix(explorer): preserve opened folder links across refreshes (#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 #29069.

Co-authored-by: Arnobrizwan <147672066+Arnobrizwan@users.noreply.github.com>
2026-10-23 19:21:48 -07:00
b6d1f63e01 fix(editor): resume media previews from their last playback position (#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>
2026-10-23 19:21:44 -07:00
NeilandCubatica c1d980c111 fix(runtime): retire predecessor exit evidence on replacement (#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 #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>
2026-10-23 19:21:40 -07:00
Ibrahem MahyobandNeil 8a63b4344a fix(terminal): focus the neighboring pane when a split pane closes (#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>
2026-10-23 19:21:36 -07:00
d11208c2f1 fix(terminal): shape Bengali and other Indic clusters in the WebGL renderer (#32210)
* fix(terminal): shape Bengali and other Indic clusters in the WebGL renderer

xterm gives each Brahmic spacing vowel sign its own cell (matching
wcwidth/string-width, which TUIs align on), and the WebGL renderer draws
every cell in isolation. Pre-base vowels and conjuncts were never
composed, so Bengali rendered as detached marks on dotted circles.

Join each multi-cell Indic cluster through the existing lazy character
joiner so the browser shapes it as one run. Cell widths are unchanged,
so TUI layout and borders keep aligning.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* test(terminal): drop redundant Indic predicate test, make fresh-array test meaningful

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(terminal): stop Indic joiner over-joining Tamil/chillu and registering for non-joining text

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(terminal): keep a trailing Indic cluster prefix between lazy-joiner writes

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:21:32 -07:00
ba9eb7fcae fix(editor): let Cmd/Ctrl +/- zoom an open image (#32184)
* fix(editor): let Cmd/Ctrl +/- zoom an open image

The zoom shortcut on an image tab changed the hidden editor font zoom,
because only PdfViewer took the app zoom request. ImageViewer in the
command-owning pane now takes it too: it zooms the popup while that is
open and the inline image otherwise. Intrinsic-layout images in a
combined diff keep editor font zoom. The request module gets a
viewer-neutral name now that it serves PDFs and images.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(editor): zoom a combined-diff image's popup from the shortcut

Intrinsic-layout images skipped the app zoom request even while their
popup was open, so Cmd/Ctrl +/- left the popup unchanged in a combined
diff. Skip them only while the popup is closed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(editor): let Cmd/Ctrl +/- zoom an open image

The zoom shortcut on an image tab changed the hidden editor font zoom,
because only PdfViewer took the app zoom request. ImageViewer in the
command-owning pane now takes it too: it zooms the popup while that is
open and the inline image otherwise. Intrinsic-layout images in a
combined diff keep editor font zoom. The request module gets a
viewer-neutral name now that it serves PDFs and images.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(editor): zoom a combined-diff image's popup from the shortcut

Intrinsic-layout images skipped the app zoom request even while their
popup was open, so Cmd/Ctrl +/- left the popup unchanged in a combined
diff. Skip them only while the popup is closed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(editor): give image popups exclusive app zoom

* fix(editor): scope viewer zoom to the focused workspace surface

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:21:28 -07:00
Chris BornandNeil 24431a201b fix(mobile): start dictation from agent chat tabs (#32105)
* fix(mobile): start dictation from agent chat tabs

The mobile mic only started dictation when a terminal was active. An
agent chat tab has no terminal handle, so a tap there returned without
starting, opening setup, or showing an error.

A chat transcript goes to the chat composer, not a terminal, so chat
tabs now only need a connected desktop. Terminal tabs keep the
terminal input gate.

Fixes #26003

* test(mobile): verify dictation delivery and reconnect safety

* test(mobile): satisfy dictation React Doctor checks

---------

Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:21:23 -07:00
Steve FranciaandNeil 004ad7525d fix(floating-terminal): hide orchestration setup prompt when CLI registration is unsupported (#32085)
Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:21:19 -07:00
Dave ChoiandNeil 60c58ea7e2 fix(runtime): collapse mirrored Markdown aliases with shared backing identity (#31984)
* fix(runtime): collapse mirrored editor tab variants that differ only by environment

A snapshot that already lists one file under several per-environment host tab ids
(editor:<worktree>:<env>:<path> or the bare path) fanned out into one mirrored tab
per variant. Keep one minted variant per (worktree, mode, path) when building
mirrored editor tabs; tabs with opaque ids (deliberate splits) are untouched.
Protects receivers from older peers that still republish mirrored files and from
snapshots that are already polluted.

* fix(runtime): match encoded editor tab ids and keep the navigation target when collapsing variants

Host tab ids come from buildOwnedEditorFileId, which URL-encodes the worktree,
environment and path, so the raw-path predicate never matched a real variant.
Each candidate is now checked by rebuilding it with buildOwnedEditorFileId, and
the tab a pending focus/follow intent targets wins its bucket ahead of an active
one. Tests build their ids the same way.

* fix(runtime): preserve editor identity while collapsing aliases

* test(runtime): keep headless mirror regression across project boundaries

---------

Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:21:14 -07:00
zhangxaochenandNeil c91a40c43d Keep mobile agent icons visible on retained routes (#31948)
* fix(mobile): preserve agent icons across stacked routes and tab updates

Closes #31939

* fix(renderer): address review feedback on mobile agent icon stability

* fix(renderer): fall back to customTitle when saved leafTitle is blank

* Keep mobile agent icons painted across retained routes

Use instance-specific OMP gradients and preserve bundled icon fallback during web image reload failures. Add a real mobile-web route-retention pixel regression.

Adapted from zhangxaochen’s scoped rendering fixes in #31948; unproven session equality and title changes are excluded.

Co-authored-by: zhangxaochen <zhangxaochen@163.com>

---------

Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:21:08 -07:00
Samuel VilaandNeil 46a0844c99 fix(markdown-preview): preserve requested line across Preview teardown (#31676)
* fix(markdown-preview): keep the #L line when a link opens a file in another worktree

The Preview scheduled the line reveal on frames it cancels when it unmounts, and opening a file in another worktree unmounts it. Schedule the reveal through the store-level helper Rich mode already uses.

* test(markdown-preview): assert the cross-worktree reveal carries the opened file's id

The editor applies a pending reveal only when its fileId matches the open
record, so register an owner-qualified record from openFile and check the
reveal targets it rather than the path fallback.

* fix(markdown-preview): preserve line reveals across preview teardown

Adopt Samuel Vila’s app-owned editor reveal scheduling and strengthen teardown and superseding-navigation coverage.

Co-authored-by: Samuel Vila <svila.smr@gmail.com>

---------

Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-10-23 19:21:03 -07:00
fancivezandNeil 2fb3de3405 fix(git): close subprocess stdin for SSH-signed commits (#30961)
Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:20:58 -07:00
eb9b225695 fix(history): retain session row measurements while hidden (#30751)
* fix(ai-vault): prevent virtualized session rows from collapsing to 0px and overlapping

* fix: preserve measured vault row sizes while hidden

* test: cover vault estimates receiving real measurements

* fix(history): retain session row measurements while hidden

Use the existing hidden-row measurer so native zero-size notifications cannot corrupt cached session geometry or move the restored list. Adapt the original regression to cover measured expanded and collapsed offsets across hidden notifications and subsequent visible sizes.

Co-authored-by: Xulin Wu <wuxulin@bytedance.com>

---------

Co-authored-by: Xulin Wu <wuxulin@bytedance.com>
Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:20:53 -07:00
アンソヌandNeil 3368edd111 fix(github): keep submitted comments cleared (#29533)
* fix: clear GitHub comment composer after submission

* docs: document comment composer and submission harness

* fix(github): keep submitted comments cleared

Suppress Tiptap content updates caused only by editability changes, and
exercise actual comment submission, failures, retries and external values.

Co-authored-by: s34485 <an_sunwoo@cyberagent.co.jp>

* Type the comment composer test store selector

Derive the named test owner settings from AppState while retaining the same runtime fixture. Fix the anti-slop no-object-parameters CI failure.

---------

Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:20:49 -07:00
Kyle PandNeil 9ff0b53ec6 fix(markdown): keep readable documents after traversal errors (#27774)
* Keep readable Markdown documents after traversal errors

* Document partial Markdown listing behavior

---------

Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:20:42 -07:00
221eb1ce8b fix(computer-use): trust the dev app's bundle id in the helper's peer check (#26500)
pnpm dev launches the app as com.stablyai.orca.dev, but the macOS helper's
isTrustedOrcaApplication only trusted com.stablyai.orca, com.github.Electron
and ids starting with com.stablyai.orca.dev. (with the trailing dot). Every
computer-use request from a dev build failed with "computer-use agent peer is
not authorized".

Move the bundle id rule into TrustedOrcaApplication in
OrcaComputerUseMacOSCore so it is tested, and trust com.stablyai.orca.dev
exactly as well. Look-alikes such as com.stablyai.orca.devtools stay
untrusted.

Fixes #26498

Co-authored-by: petersindex <287557875+petersindex@users.noreply.github.com>
Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:20:38 -07:00
Suat KocarandNeil ad4c25cda2 fix(linear): list issue comments oldest first (#25622)
Linear returns an issue's comments newest first and getIssueComments
passed that order through, so the activity feed showed the newest comment
on top while comments posted from Orca were appended at the bottom and
jumped to the top on reload. Sort by createdAt, oldest first, like the
GitLab notes path does.

Fixes #25573

Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-10-23 19:20:34 -07:00
Wooseong KimandNeil fea8bb7f5b fix(cli): preserve runtime recovery steps (#24800)
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-10-23 19:20:30 -07:00
actureandNeil 339397829e fix(i18n): correct Chinese technical mistranslations (#24174)
Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:20:26 -07:00
hwantageandNeil f00a2800b2 fix(ui): align multiline filter toggle row text and icons to top-left (#16054)
* fix(ui): align multiline filter toggle row text and icons to top-left

- Add `text-left` and `items-start` to FilterToggleRow button and label wrapper.

- Add `mt-0.5` top margin to icon and switch indicator for optical alignment with multiline text.

- Resolves center-aligned wrapped text and vertically misaligned toggles under long localized labels (Korean, Japanese, Spanish, etc.).

* fix(ui): align multiline filter toggle labels with their controls

---------

Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:20:21 -07:00
JeongUk ParkandNeil 95e18f519a fix(sidebar): resume workspace cycling after closing the last tab (#10555)
* fix(sidebar): keep Cmd+Shift+Arrow cycling in place after closing a workspace

Closing a workspace's last tab clears activeWorktreeId (landing fallback), so
cycling had no anchor and re-entered the sidebar from its far end — every
subsequent Cmd+Shift+Down/Up restarted there instead of continuing from where
the user was.

Resolve the anchor from the nav-history cursor when nothing is selected. A
selection that is present but uncyclable still passes through untouched, so a
row inside a collapsed group keeps entering from the matching end (#10513).
History is read via getState() at press time; subscribing would re-render the
virtualized sidebar on every visit.

* fix(sidebar): include folder workspaces in Cmd+Shift+Arrow cycling

getCyclableWorktreeIds dropped every non-item row, so a folder workspace sitting
in the sidebar could not be reached with the arrow chord even though Cmd/Ctrl+1-9
already numbers it. Cycling also activated through activateAndRevealWorktree,
which has no route for a `folder:` key.

Build the rotation with getRenderedWorktreesInSidebarOrder — the helper Cmd+1-9
already uses, so both shortcuts cover the same rows in the same visual order —
and activate through activateAndRevealWorkspace, which dispatches on the key.
Rows still come from what the sidebar rendered, so collapsed groups stay out.

* fix(sidebar): keep the cycle anchor host-qualified after a close clears the selection

Closing a workspace's last tab nulls both the selection and its host, and
nav history stores no host, so the history anchor cycling falls back to
resolved to the first rendered row with that id. With the same worktree
id on two hosts, closing the twin on the second host made the shortcut
cycle from the first host's row.

The keyboard hook now remembers the last selected (workspace, host) pair
and hands that host to the anchor when the anchor is that workspace. Any
other history anchor stays host-less as before. Nav history is persisted,
so its entry format is left alone.

---------

Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-10-23 19:20:17 -07:00
e4f5e1ddf1 fix(gitea): treat HTTP 404 as no-PR in the hosted-review branch lookup (#10411)
* fix(gitea): treat HTTP 404 as no-PR in throwing hosted-review lookup

hostedReview:forBranch always uses the throwing Gitea lookup variant, and
requestJsonAtBase threw on any non-OK status. A 404 (PR deleted, repo absent
on the forge, or Gitea masking a private repo) rejected the IPC handler and
spammed the main-process log on every refresh for every unaffiliated branch.

404 means the resource is absent — an accepted "no PR", not a transport or
auth failure. Map it to null even with throwOnFailure; 401/403/5xx/network
errors still throw so creation eligibility keeps reporting 'unavailable'.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(gitea): scope the 404 no-PR exemption to the linked-PR fetch

A blanket status !== 404 exemption in the shared request helper also
covered the repo-level /pulls scan, where a 404 means a wrong API base
URL, a repo absent from the forge, or a token without scope. Collapsing
that to "no PR" would make a misconfigured Gitea host look permanently
PR-less instead of surfacing reviewLookupOutcome: 'unavailable'.

Gate the exemption on an explicit allowNotFound request option, set only
on the single-resource /pulls/{n} fetch.

Co-authored-by: Orca <help@stably.ai>

* test(gitea): pin the 200-with-empty-list no-PR shape alongside the 404 case

Co-authored-by: Orca <help@stably.ai>

* fix(gitea): preserve deleted linked pull request absence handling

Refresh the original Donach PR and its prior maintainer correction on current main, keeping the HTTP404 exemption limited to the linked pull resource.

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: Orca <help@stably.ai>
2026-10-23 19:20:13 -07:00
39fc4f7688 fix(editor): render authored Markdown breaks as rich-editor line breaks (#8995)
* fix(editor): render <br> in markdown table cells as line breaks in rich mode

The rich Markdown editor encoded every inline HTML tag — including `<br>` and
`<br/>` — into an inert raw-HTML atom that displayed the literal tag text. In a
table cell, where a blank-line break is impossible, this meant `<br>` showed up
as raw "<br>" instead of breaking the line.

Render `<br>`/`<br/>` raw inline nodes as real break elements while keeping
`renderMarkdown` emitting the verbatim tag, so the value round-trips exactly on
save. A native hardBreak is intentionally not used: it serializes to a space
inside table cells and would silently drop the tag. The raw-source node's
parse/render DOM logic is extracted into a dedicated module to keep it cohesive
and within the file's line budget.

Closes #8838

* fix(editor): validate preserved break source

Use the editor model's supported DOM parse-rule type instead of a private duplicate. Exercise the rendered-DOM round trip and reject forged preservation attributes before they can become hidden Markdown source.

* test(editor): assert forged break marker exists

* test(editor): preserve authored rich markdown break spelling

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:20:09 -07:00
831c394797 fix(gitlab): label hosted reviews per provider in the space-manager panel (#7655)
The workspace space-manager rendered every hosted review as "PR #N", so a
GitLab merge request showed as "PR #5" instead of "MR !5". The cached review
already carries its provider (HostedReviewInfo.provider) — the panel's local
input type just narrowed it away. Thread provider through and format via the
same localizedHostedReviewCopy / '!' vs '#' helpers the rest of the app uses.

Extract the label formatting into hosted-review-label.ts (a pure module, away
from the panel's heavy React/store imports) so it can be unit-tested directly,
and add hosted-review-label.test.ts covering github / gitlab / azure-devops /
gitea and the status suffix.

linkedPR stays "PR #N" — it is the GitHub-specific workspace field, distinct
from linkedGitLabMR.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:20:05 -07:00
Minsu LeeandNeil 6fd0682ac1 fix(review): show Remove Project label in PR panel for main worktree (#6605)
* fix(review): show Remove Project label in PR panel for main worktree

When a merged PR is linked to the main worktree (the project root /
default branch), the PR sidepanel delete button now reads "Remove
Project" instead of "Delete Workspace", matching the project-removal
dialog that runWorktreeDelete already opens for the main worktree.

Adds the b1a767b1ae i18n key (Remove Project) across en/ko/ja/zh.

* chore(i18n): apply AI code review suggestions

Rename the newly added HostedReviewActions key from the codemod-style
content hash b1a767b1ae to the intent-named id removeProject, per the
message ID policy in config/i18n-translation-source.md: new keys must
use intent-named IDs, and hash IDs minted after 2026-07-30 are not
grandfathered.

---------

Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-10-23 19:20:00 -07:00
b0cb24d2d5 fix: address pr-bug-scan validated finding from #6484 (#6511)
findActivePathCommand now .catch(()=>null)s inspectSymlink so an execute-only foreign PATH `orca` is skipped instead of rethrowing EACCES; blocks the readFile EACCES at cli-installer.ts:551.

Co-authored-by: orca-bug-scan-bot <orca-bug-scan-bot@stably.ai>
Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:19:55 -07:00
8f1c203181 fix: address pr-bug-scan validated finding from #4761 (#5760)
Added [@media(hover:none)]:ml-0/max-w-5/opacity-100 touch reveal to REPO_HEADER_ACTION_REVEAL_CLASS so repo/group header action buttons show on touch devices.

Co-authored-by: orca-bug-scan-bot <orca-bug-scan-bot@stably.ai>
Co-authored-by: Neil <neil@stably.ai>
2026-10-23 19:19:51 -07:00
8ef0e99a7c fix(ui): use focusable tooltip menu triggers (#9595)
* fix(ui): use focusable tooltip menu triggers

* test(tooltips): give each menu surface its own remount check

Keep all hover, focus, description, keyboard, pointer and two-remount
assertions while avoiding a shared 120-second budget across three surfaces.
The failed CI trace passed five full exercises before global teardown.

---------

Co-authored-by: Yuris Auzins <zuz666@users.noreply.github.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-10-23 19:19:45 -07:00
2b33fed6a5 fix(composer): retain the imported project group target (#9551)
* fix(composer): keep the imported group as the target after a grouped nested import

Grouped folder imports create a ProjectGroup, but the hosted Add Project
handoff selected only the first imported repo, dropping the group the user
explicitly chose. Carry the root group id through the completion path and
select the group's folder-workspace target in the composer, falling back to
the single-project handoff when no group was created or it is no longer
selectable. Sidebar default-checkout and separate imports are unchanged.

Part A of #9529.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(sidebar): document the CompleteGitRepoAdd handoff contract

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: just-zzp <264744947+just-zzp@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-10-23 19:19:41 -07:00
Neil b46be798ed fix(orchestration): refuse sends to a Run whose home is another computer (#33005)
* fix(orchestration): refuse send to a Run whose home is another computer

A remote Dispatch's Run id also names a mirror row on the worker's host. Once the
worker lost its link to the home, send --to run:<id> wrote into that mirror and the
message reached no one. Now the host refuses with run_home_unreachable, and a linked
worker that names its own Run home is delivered there.

Reported by @cookapps-jhlee8 in #32292.

* fix(orchestration): refuse only mirror Runs, and answer coordinator mail at its Run home

A loopback runtime's attachment names a real local Run, so the refusal now keys on the
Run row's remote home, not on any attachment. A reply to coordinator mail imported under
a remote Run relays to the home through the replying pane's Dispatch link, and is refused
with run_home_unreachable when that link is gone.

* fix(orchestration): a remote reply answers only mail sent to the replier's own Dispatch
2026-10-23 19:09:54 -07:00
OrcaWinandOrcaWin 3286f3b259 [comment audit] Clean up IPC, host lifecycle and native-chat comments (#32966)
* [comment audit] Tighten watcher lifetime and file-write constraints [skip ci]

* [comment audit] Clarify IPC routing and notification comments [skip ci]

* [comment audit] Shorten watcher, preflight and PTY comments [skip ci]

* [comment audit] Clarify PTY delivery and restore ownership [skip ci]

* [comment audit] Tighten PTY environment and flow-control rationale [skip ci]

* [comment audit] Clarify IPC spawn and stable-pane guarantees [skip ci]

* [comment audit] Tighten PTY provider and filesystem ownership rationale [skip ci]

* [comment audit] Clarify clone ownership and remote runtime recovery [skip ci]

* [comment audit] Condense upload, settings and SSH lifecycle comments [skip ci]

* [comment audit] Shorten shutdown, preview and worktree watcher rationale [skip ci]

* [comment audit] Clarify worktree identity, remote ownership and copy limits [skip ci]

* [comment audit] Shorten worktree catalog, removal and WSL routing rationale [skip ci]

* [comment audit] Tighten Linear credential, pagination and export comments [skip ci]

* [comment audit] Condense managed-server activation, snapshot and launch rationale [skip ci]

* [comment audit] Trim runtime installation and managed-server lifecycle comments [skip ci]

* [comment audit] Simplify managed tunnel, memory and menu comments [skip ci]

* [comment audit] Condense integration, model catalog and attachment rationale [skip ci]

* [comment audit] Shorten journal persistence, replay and queue rationale [skip ci]

* [comment audit] Condense journal ordering and timeline lifecycle comments [skip ci]

* [comment audit] Trim timeline and subscriber delivery explanations [skip ci]

* [comment audit] Shorten Stop, child-exit and recovery contracts [skip ci]

* [comment audit] Simplify handover and host recovery comments [skip ci]

* [comment audit] Trim queue delivery and provider startup commentary [skip ci]

* [comment audit] Clarify restart and rewind safety comments [skip ci]

* [comment audit] Trim status, Stop and completion commentary [skip ci]

* [comment audit] Simplify transcript lookup and visual containment comments [skip ci]

* [comment audit] Trim transcript reader, watcher and WSL transport commentary [skip ci]

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-23 19:07:32 -07:00
OrcaWinandOrcaWin b4fa75e954 test: replace self-fulfilling checks with production boundary assertions (#33006)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-23 19:01:22 -07:00
Neil 9c262ffe36 refactor: colocate remote runtime connect bound (#33004) 2026-10-23 18:53:38 -07:00
OrcaWinandOrcaWin 5672185e59 test: tighten hook and relay coverage and consolidate launcher checks (#32998)
* test: replace process and subagent status waits with controlled clocks

* test: establish permission waits and deliverable stale results

* test: consolidate launcher checks and require retained relay state

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-23 18:39:50 -07:00
Neil f3ffc4dbb8 fix(ssh): keep a paired server's SSH access link across its restarts, and let it relink (#33001)
* fix(ssh): keep a paired server's SSH access link across its restarts, and let it relink

orcad mints a new runtimeId at every start. A linked server refused to record it,
and an unlinked one hid its sidecar entry behind the stale id, so relinking failed.
A new paired device or a pending link is still refused.

Fixes #32957. Reported by @badaz.

* fix(ssh): keep SSH access operations valid across a server restart

runtimeId is per-process, so it no longer binds an SSH access operation. A lost
completion retry now checks the runtime the link verified, and a pending unlink no
longer refuses a restarted runtime.
2026-10-23 18:36:21 -07:00
Neilandray3w 4095b64243 fix(terminal): restored SSH terminals recover after password sign-in (#32275)
* fix(terminal): recover restored SSH terminals after password sign-in

* fix(terminal): also recover after a cancelled SSH sign-in, and share the in-progress copy

A restored pane refused because the user cancelled the password prompt
stayed frozen after a later successful sign-in too. Treat that refusal like
the other pending sign-in states, and share the in-progress wording with
main so the renderer match cannot drift.

Co-authored-by: ray3w <61264633+ray3w@users.noreply.github.com>

---------

Co-authored-by: ray3w <61264633+ray3w@users.noreply.github.com>
2026-10-23 18:36:01 -07:00
Jinwoo Hong 15c3f0866d feat(connectors): cancel a conversation's queued work and stop its agent, behind experimentalConnectors (B4) (#32961)
* feat(connectors): cancel a conversation's queued work and stop its agent, behind experimentalConnectors (B4)

* test(connectors): drop a type assertion from the interrupt test

* fix(connectors): interrupt only a running main-agent turn, never background-only work

* chore(connectors): shorten the interrupt comment

* fix(connectors): fence cancel and prompt keys at transport handoff

* fix(connectors): clear the prompt Claude restores after our cancel, and end a turn our cancel rejected

* fix(connectors): require stronger evidence for cancel cleanup and settlement

* fix(connectors): cancel waits for a published agent's link, keeps cancel headroom in a full backlog, and pastes nothing after an unsettled clear

* fix(connectors): bound cancellation settlement and preserve unresolved lanes

* refactor(connectors): drop the leftover-prompt clear after cancel; keep the rejected-turn end
2026-10-23 21:34:48 -04:00
OrcaWinandOrcaWin b1f395425e refactor(agent-status): reuse the shared bounded-string guard (#32989)
The alias, store and fact codecs each carried a private copy of the same
nonempty/trimmed/length-bounded/no-control-character check. Use the existing
isBoundedString from agent-status-child-work-value-guards instead.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-23 18:31:23 -07:00
OrcaWinandOrcaWin 4ed7424c85 test: strengthen retirement controls and remove redundant waits (#32995)
* test: require live delivery controls in OMP retirement cases

* test: consolidate nonblocking status persistence coverage

* test: drive Codex transcript lifecycle with controlled clocks

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-23 18:18:54 -07:00
Neil 55a45491be refactor(shared): colocate remote runtime Tailscale guidance (#32992) 2026-10-23 18:18:19 -07:00