* fix(workspaces): add collision-safe worktree identity
* fix(workspaces): read worktree metadata per host and repair ambiguous identities
The canonical identity store landed write-only: getWorktreeMetaForHost had no
production callers while setWorktreeMetaForHost kept the legacy projection only
for the first known owner, so a second host's edits persisted and were never
read back. Wire the listing paths through host-qualified reads.
An ambiguous alias was also unrecoverable — reads returned undefined and writes
threw forever, and the throw escaped the detected-worktree loop, emptying the
whole repo's sidebar. Fail open onto the most recently active instance instead.
- collapse ambiguous aliases deterministically and persist the repair
- reclaim identity rows in the metadata GC so they cannot outlive their locator
or resurrect onto a worktree recreated at the same path
- drop every host's rows when a locator is removed outright, not just the owner's
- honour an explicit instanceId so the stale-lineage rotation guard still works
- scope a rename to the moving host; other hosts keep their own locator
- prefer the project host setup matching the repo's own execution host, so a
repoId registered on two hosts no longer stamps the wrong one durably
- reject an unencoded `|` in a host id, the invariant the alias delimiter needs
- drop the never-populated hostGeneration from the canonical key
* fix(workspaces): close remaining identity review gaps
* fix(workspaces): close remaining review gaps
* fix(workspaces): address review and CI regressions
* test(workspaces): update host-qualified metadata expectations
* fix(workspaces): preserve ambiguous identity records
* fix(workspaces): snapshot metadata during listing
* test(workspaces): mirror listing metadata snapshot in windows fixture
* fix(workspaces): preserve identity routing for metadata writes
* fix(workspaces): scope stale metadata cleanup by host
* fix(workspaces): rekey identities on SSH readoption
* fix(workspaces): fail closed for ambiguous board ids
* perf(workspaces): snapshot metadata across catalog listing
* fix(workspaces): retain neighboring manual order updates
* test(workspaces): cover ambiguous board id index
* fix(persistence): harden host-qualified worktree metadata
* refactor(shared): split project host setup lookup
* refactor(workspaces): simplify host-qualified metadata
Document that Git worktree removal may also delete the checked-out local branch, while clarifying that --force does not force branch deletion and that Orca retains branches whose changes cannot be proven merged.
Fixes STA-5076.
list-issues capped at 50 by default and hard-clamped at 250, with hasMore buried
under result.meta and no stderr warning for --json, so a page that stopped early
read as a complete answer. Omitting --limit now walks Linear's pages until they
run out (meta.limit is null), and --limit <n> is the only cap, paging past
Linear's 250-per-request maximum to reach it. result.truncated sits next to
result.issues and is set only when a cap actually held results back; human output
prints "truncated: showing N".
The read still has to fit the CLI's 60s RPC budget, so a 20s wall-clock deadline
and a 200-page ceiling stop the walk early and report truncated with a
continuation cursor rather than failing the command.
Also:
- issued --cursor values bind the resolved workspace, so call -> nextCursor ->
call works without --workspace; raw Linear cursors still need one and now carry
nextSteps
- issued cursors whose payload smuggles back `all` or an empty workspace are
rejected at decode, since either would widen the read past the bound workspace
- JSON issue rows carry priorityLabel (none/urgent/high/medium/low), matching
orca linear priority set
- truncated and priorityLabel are optional on the wire, so a host that predates
either is not read as "complete"; readers fall back to meta.hasMore
- the truncation line prints the rows actually rendered, so a remote result with
no meta.returned cannot print "showing undefined"
* fix(cli): resolve host names across both kinds, and stop ssh: answering empty
`--host ssh:<id>` was never validated. An unknown target filtered to nothing and
returned ok:true with an empty list — the same silent wrong-machine answer that
unknown `runtime:` ids gave before they were rejected. And because SSH target
ids are machine-generated (`ssh-<timestamp>-<random>`) while the name anyone
actually knows is the label, this fired on the ordinary spelling rather than a
rare typo: every human-typed SSH name missed.
The two kinds of remote machine are also reached on different axes. A paired
Orca server is a connection (`--environment <name>`); an SSH target is a machine
the connected host reaches (`--host ssh:<id>`). A caller only knows "the machine
called X", so naming X on the wrong axis was the common failure and produced
either an empty answer or a dead-end "unknown environment".
Now: `ssh:` resolves labels as well as ids and rejects an unknown target with the
known ones listed; `runtime:` accepts the environment name as well as its id,
matching --environment, and canonicalizes to the id so stored host ids still
compare; and when a name misses on one axis but exists on the other, the error
says which and gives the exact flag. Candidates ride along in error.data so an
agent can recover without parsing prose.
`orca host list` is the discovery surface that was missing entirely — nothing in
the CLI listed SSH targets, so a caller told to use one had nowhere to look. It
prints this machine, the SSH targets registered on the connected host, and the
paired servers, each with the selector to use.
* fix(cli): give --environment the same cross-kind hint, and validate the ssh host on setup-create
Two gaps a follow-up survey found in the first pass.
`--environment openclaw` still dead-ended with a bare "Unknown environment"
while an SSH target by that name sat right there — the inverse of the case just
fixed, and the direction the report actually hit. The store's own error cannot
carry the hint: translateStoreError forwards code and message and drops data. So
the selector is resolved before the client is built, where the payload survives.
Only the explicit flag is asserted eagerly; an ambient ORCA_ENVIRONMENT stays
lazy, because failing local-only commands over stale background config would be
a regression.
`project setup-create` records independent metadata and, unlike the other setup
paths, is not covered by the runtime's ssh rejection — so an unknown target
persisted a row pointing at a machine that does not exist. It now resolves the
host. `local` and `runtime:` still pass through untouched: this is also the
provisioning path, where a runtime host legitimately may not exist yet when its
metadata is written.
`setup-existing-folder` and `setup-clone` deliberately keep the unresolved id.
The runtime rejects every ssh host for those operations regardless of whether it
exists, so resolving first would answer "no such target" and imply the command
would have worked with the right id.
* fix(cli): refuse an ambiguous host name instead of resolving the first match
Name lookup took the first match while the environment store itself refuses an
ambiguous name rather than guessing. That put the guess back, in the selector
whose entire purpose is to stop a command reaching a machine the caller did not
choose — and it applied to both spellings: two SSH targets sharing a label, and
two paired servers sharing a name.
Both now resolve to nothing and report every candidate with its id, so the
caller picks. An exact id still resolves past a colliding name, since an id is
never ambiguous.
Also pins the property that makes accepting a name safe at all: `runtime:<id>`
is a persisted token that lands in ProjectHostSetup.hostId and is embedded in
generated setup ids, so the name is canonicalized to the id before anything
downstream sees it. A test now asserts a name never reaches the wire.
* fix(cli): fall back to the older ssh listing so an old host is not read as having no targets
Hosts predating ssh.listTargetSummaries still answer ssh.listTargets, and both
are served by the same summariser. Swallowing the method_not_found made such a
host indistinguishable from one with no SSH targets registered, which would
reject a target id that is valid there — a new-client/old-host regression on a
path that previously passed the id through unvalidated.
* perf(runtime): gate terminal.list visual layouts and stop the false writable claim
visualLayouts is ~31% of a large terminal.list payload (44,208 B of 137,412 B on a live 134-terminal remote runtime) and has exactly one consumer: the human-readable CLI formatter. Gate it behind an includeVisualLayouts request param that defaults to included, so pre-flag clients are unaffected, and have every --json/internal caller opt out.
Also drop the record-backed builder's writable, which was a verbatim copy of connected. terminal.show now states writability explicitly as exactly what terminal.send's PTY gate enforces.
* test(runtime): type the payload-size fixture arrays for tsc
* fix(runtime): preserve terminal list compatibility
* test(runtime): guard terminal list optimization
* fix(cli): preserve agent access to terminal layouts
* feat(cli): add `orca account add` / `account list` for headless hosts
The desktop "Add account" UI is disabled when the renderer drives a remote
runtime (isRemoteAccountScope === kind:'environment'), so a headless server
reached from a remote desktop/web client has no way to register managed
Claude accounts. Add a host-local CLI path that reuses the existing capture
logic:
- ClaudeAccountService.addAccountFromConfigDir(): register a managed account by
capturing credentials from an already-authenticated CLAUDE_CONFIG_DIR instead
of spawning the interactive browser login (extracted persist/rollback helpers
shared with the existing add flow)
- RPC accounts.addClaudeFromConfigDir, bridged via OrcaRuntime; rejected for
mobile device tokens (host-local only)
- `orca account add` runs `claude login` in the user's own terminal into a temp
CLAUDE_CONFIG_DIR, then registers it via the local runtime; `orca account list`
lists managed accounts
Switching (select) already works from a remote client; only adding was blocked.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(cli): support Codex in `orca account add` / `account list`
Mirror the Claude headless-account CLI for Codex:
- CodexAccountService.addAccountFromHome(): register a managed Codex account by
importing auth.json from an already-authenticated CODEX_HOME, reusing a shared
persist helper extracted from doAddAccount (no interactive login spawned here)
- RPC accounts.addCodexFromHome + OrcaRuntime.addCodexAccountFromHome bridge,
rejected for mobile device tokens (host-local only)
- `orca account add --agent claude|codex` (default claude); `orca account list`
now renders both Claude and Codex managed-account blocks
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test: cover headless account-add capture paths (Claude + Codex)
- ClaudeAccountService.addAccountFromConfigDir: registers a managed account by
capturing an authenticated CLAUDE_CONFIG_DIR; rejects and rolls back when the
dir has no .credentials.json
- CodexAccountService.addAccountFromHome: imports auth.json from an
authenticated CODEX_HOME into a managed account; rejects when auth.json is
missing
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: address CodeRabbit review on headless account-add flows
- CLI login spawn uses a shell on Windows so `.cmd` agent shims resolve without
ENOENT (args are fixed literals, no injection risk)
- Claude capture skips the `.credentials.json` precheck on macOS, where creds
live in the Keychain and captureAuthFromConfigDir reads them
- Claude add rollback is best-effort: a failed rematerialization no longer skips
managed-auth cleanup or masks the original add error
- Codex persist restores the prior account/selection if a post-write sync or
rate-limit refresh fails, so a failure can't leave a dangling managed account
- Codex sync passes the account's selection target (correct runtime for WSL)
- Add JSDoc to the new public service methods and CLI functions
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(cli): harden headless account capture
* fix(cli): correct account command flag surface and interrupt cleanup
- `account` commands no longer accept or advertise the browser `--page`
flag; `supportsBrowserPageFlag` allow-listed them by omission, so
`orca account list --page x` was silently accepted and `--help`
rendered a browser-only option
- account specs declare GLOBAL_FLAGS, so `--help`/`--json` render in the
Options block like every other command
- `--agent` on `account add` documents the account provider instead of
the terminal TUI-agent meaning inherited from the shared flag table
- a SIGINT/SIGTERM during the interactive login now removes the temp
login dir (and restores the macOS Keychain item) before exiting 130;
Node terminates without unwinding `finally`, which stranded live OAuth
credentials on disk
* perf(cli): stop `account list` forcing a provider usage refresh
`accounts.list` awaited refreshAccountsForMobile(), which runs
fetchAll({ force: true }) — bypassing both the poll throttle and the
per-provider Retry-After gate — then O(N) serial per-account round
trips. `orca account list` renders only emails and the active ids, so
all of that work was discarded. The RPC now takes `refreshUsage`
(default true, so mobile and web keep the forced lane) and the CLI opts
out. Older hosts declare `params: null` and ignore the field, so a newer
CLI degrades to the previous behavior rather than failing.
Also documents on `account list` that `--environment` does not retarget
it, matching the host-local behavior of shouldIgnoreRemoteSelection.
* fix(cli): survive repeated and hangup signals during account add
withInterruptCleanup latched cleanup behind a boolean, so a second signal
got an already-resolved promise and its process.exit fired while the first
cleanup was still inside a Keychain call (3s each) — the temp dir's OAuth
credentials and the swapped macOS Keychain item both survived. Memoize the
cleanup promise so every signal awaits the same run, and register with
`on` instead of `once` so a second Ctrl-C cannot fall through to Node's
terminate-immediately default mid-cleanup.
Handle SIGHUP too. This flow exists for headless/SSH hosts, where the most
likely interrupt is the connection dropping, which hangs up the login's
terminal and previously ran no cleanup at all.
Warn when the interrupt lands after sign-in completed: the runtime finishes
the add independently of this process, so exiting 130 silently would tell
the user it was cancelled when the account may exist.
Reject a valueless `--agent`; the parser turns it into boolean true, which
silently ran a full OAuth login for Claude when the user asked for another
provider.
Also lock two behaviors the refactor changed but left uncovered: a WSL Codex
add must sync the WSL runtime lane rather than the default host lane, and
rename the account-spec help test to describe the Options block it actually
asserts rather than the usage string it never reads.
* fix(build): bundle the main modules the account CLI imports
electron-vite cleans out/main and emits only its declared entries, and
`build:desktop` runs it after `build:cli`, so the tsc-emitted copies of
`claude-accounts/keychain`, `codex-cli/command` and `win32-utils` were
deleted before packaging. Both `orca account add` and `orca account list`
then died at require time with "Cannot find module
'../../main/claude-accounts/keychain'" — reproduced against a real
`--serve` host. `agent-hooks/managed-agent-hook-controls` already carried
an entry for exactly this reason; these three were missing.
Adds a parity test so any future CLI import of a `src/main` module fails
in CI rather than at a user's shell after packaging.
* test: cover the desktop add-path behavior this PR changes
Both changes ride in the persist/rollback helpers the existing GUI add
flow shares with the new headless path, and neither had coverage:
- Claude: rollbackAddAccount now guards forceMaterializeCurrentSelection-
ForRollback, so a rejecting rematerialization no longer replaces the
real add error nor skips safeRemoveManagedAuth. Asserts the original
error surfaces and the throwaway auth dir is gone.
- Codex: the desktop add now passes the account's selection target to
syncForCurrentSelection, matching reauthenticate and select. Asserts
the host target alongside the existing WSL assertion.
Both fail when the corresponding change is reverted.
* fix(cli): close the remaining account-add interrupt and preflight gaps
The round-1 interrupt fix detached the signal handlers before running the
finally-path cleanup, so the very window it was meant to protect — the two
serial 3s `security` calls plus rmSync on the success/error path — was
still covered only by Node's terminate-immediately default. Both review
lanes reproduced it independently. Await cleanup first, detach in a nested
finally, and stop a cleanup failure from replacing the error that actually
explains why the add failed.
Do not burn the interactive login when the runtime is unreachable. The
RuntimeClient is lazily constructed and the first call was the registration
RPC itself, so "Requires the Orca runtime to be running" was discovered
only after the user completed a full OAuth round trip. Preflight with the
now-cheap `accounts.list { refreshUsage: false }`.
Reject `--environment` / `--pairing-code` on `account add`.
shouldIgnoreRemoteSelection pins account commands to the local runtime, so
`orca account add --environment homelab` silently registered the account on
the laptop instead of the headless host it names.
Survive a daemon that cannot spawn `claude`. `allowFailure` is honored in
onClose but not onError, and unlike the GUI flow nothing has run `claude` in
the daemon before this point — so a launchd/systemd daemon with a minimal
PATH hard-failed an add the user had already signed in for, even though
identity resolves fine from the config dir's oauthAccount.
Also align the `--agent` help description with the global flag column.
* fix(cli): reject runtime selectors on `account list` too
`orca account list --environment homelab` was accepted and silently
listed the LOCAL machine's accounts, because shouldIgnoreRemoteSelection
pins account commands to the local runtime. Documenting that in --help
does not reach someone who already typed the flag, and answering with the
wrong host's accounts is the specific wrong answer they would act on.
`account add` already errors; this makes the new command group internally
consistent. The other groups in shouldIgnoreRemoteSelection keep their
existing silent-ignore behavior — changing those is not this PR's job.
* test: harden account-add signal tests and cover cleanup failure
- Identify the handler under test by set difference instead of
`process.listeners(sig).at(-1)`. Vitest installs its own once-wrapped
SIGINT teardown, so the positional lookup could grab the wrong listener;
the helper also asserts exactly one new listener was added.
- Mock rmSync while keeping the real implementation by default, so the
temp-dir assertions elsewhere stay honest.
- Cover that a cleanup failure in the `finally` does not replace the error
explaining why the add failed. Fails when that guard is removed.
Completes the review loop's final round; the loop died on an API error
before it could commit this, and its `import()` type annotation would
have failed oxlint.
* fix(cli): harden interactive account add
* test(cli): make account cancellation coverage portable
* fix(cli): preserve merged skills runtime modules
---------
Co-authored-by: Dominik <marketing@gavaplast.sk>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
Adds `orca skills install` and `orca skills update` so skills can be set up without the GUI — SSH hosts, containers, CI. Previously `orca skills` had only `list` and `get`, so there was no headless path.
**Agent targeting is scoped explicitly rather than delegated to detection.** The `skills` CLI decides which agents to install into, and with `-y` and zero detected agents it takes `targetAgents = validAgents` — all ~75. That is not a corner case for a headless CLI: a fresh SSH box or container with no agent installed is the normal starting state. Measured on a bare host, the unscoped command created **52 top-level agent directories and 54 junctions** (one real payload in `~/.agents/skills`, the rest links) on Windows, and 52/53 on macOS.
The CLI now passes `--agent` derived from Orca's own detection, mapped to the `skills` key namespace, plus `universal`. Supplying `--agent` makes `runAdd` use it directly and never call `detectInstalledAgents()`, so the fan-out branch is unreachable. On a bare host it now refuses with `No coding agent detected on this host` and exit 1, creating nothing. Same command with scoping: **1 directory, 0 junctions.**
`universal` alone would under-install — Claude Code is not in that set, and 19 of 28 mapped keys write agent-private homes `universal` never touches. `--agent '*'` is the bug itself. The mapping is hedged three ways: `null` for any agent whose key could not be confirmed, `satisfies Record<TuiAgent, …>` so a new Orca agent is a compile error, and a test pinning every mapped key against the CLI's own valid list.
Fixed during review — two holes that each restored the full fan-out through a different door:
- `--agent ','` trimmed to nothing, which skipped the refusal *and* emitted no `--agent`.
- `--agent -y` passed an emptiness check, and the vendor CLI silently drops `-`-leading values, re-emptying its list.
The real invariant is argument *shape*, not emptiness, and it is now enforced at the choke point in `buildAgentFeatureSkillInstallArgs`, so no caller can emit `-y` without a usable target. `*` remains allowed — asking for every agent explicitly is a choice, not an accident. Verified with 51 hostile inputs through the built binary, each recorded argv replayed through the vendor's own parser.
Also fixed: the `ORCA_CLI_CWD` refusal now runs before target resolution (it was quoting the wrong host's agent list), and `--dry-run` is refused in a forwarded shell rather than printing a command naming the wrong machine.
Validated on a real Windows host across PowerShell 7, PowerShell 5.1, cmd.exe and Git Bash: `.cmd` shims route through `cmd.exe` and `.exe` shims spawn directly (proved with instrumented shims, not inferred), the ENOENT path produces an actionable error rather than a silent failure, and `skills update` genuinely restores a corrupted skill byte-for-byte.
Known, not addressed here — both upstream behaviours this only forwards: a partial install failure exits 0, and "no installed skills found" exits 0. Both are invisible to the headless callers this feature exists for.
Co-authored-by: scastanoh21 <scastanoh21@gmail.com>
* Add version-matched bundled skill guides
* Clarify skill freshness rollout PRs
* Add canonical skills show alias
* fix(skills): address guide review feedback
* fix(skills): make guide commands cross-platform
* fix(skills): apply the ORCA convention to the emulator guides
Review follow-up: the emulator guides still instructed literal
`orca emulator ...` in sh fences with no Linux disambiguation, so on
unmanaged Linux they could launch the GNOME screen reader — the exact
failure the executable-selection preamble prevents. Both emulator
guides now carry the preamble and ORCA placeholder across fences,
tables, and prose, and the cross-platform safety test covers all four
converted guides. Also replaces computer-use's "unless a block names a
shell" carve-out, which contradicted its own POSIX example, with the
unconditional placeholder rule.
* fix(runtime): explain full worktree id selectors (#7432)
* Fix full worktree id selectors for bare repo ids and doc guidance
- Reject bare repo-id selectors up front via a shared validator instead
of relying on worktree-list scanning, so RPC callers no longer trigger
an unnecessary rescan just to detect the mistake
- Propagate the structured worktree_id_requires_full_path code through
RPC error mapping so callers get a typed error, not just a message
- Update orca-cli, orca-emulator, and orchestration skill docs to show
the full `<repo-id>::<path>` id shape and stop implying a bare repo
id is a valid worktree selector
---------
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
* feat(cli): make the CLI self-correcting and self-describing for agents
Agents build a generalized model of how CLIs work and apply it to every
tool. When orca diverged — `rm` where git uses `remove` — a reasonable
first guess (`orca worktree remove`) dead-ended on a bare "Unknown
command" with no path forward. This makes the CLI degrade gracefully when
the orca-cli skill isn't loaded in context.
- First-class CommandSpec.aliases, resolved to the canonical path before
dispatch (no new handler registrations). `worktree remove`/`delete` now
resolve to `rm`; the ad-hoc `terminal focus` duplicate spec/handler is
migrated onto the mechanism.
- Did-you-mean suggestions on unknown commands and unknown flags, ranked
by edit distance over the live registry, surfaced in both stderr and
--json error.data (reusing the existing nextSteps channel).
- `orca agent-context [--json]`: a versioned, machine-readable dump of the
command schema. Pure local read (no RPC), so it works over SSH and when
the app isn't running.
- CI guards: specs<->handlers parity, and a vocabulary policy that fails
on new off-policy deletion/read verbs (existing ones grandfathered).
* Address PR review feedback (#6303)
- agent-context now emits each command's effective flag set (globals +
conditional --page), not just allowedFlags, so the schema no longer
under-reports --json/--help. Shared as effectiveAllowedFlags() between
validation and the schema.
- Collision check now covers alias paths too, so a duplicate alias that
would silently shadow a real command fails the build.
* fix(cli): harden agent recovery and introspection
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
Introduce optional `task-title` and `display-name` parameters for orchestration tasks, persisting them in the database and propagating them through the RPC and Orca runtime.
This allows the CLI, dashboard, activity page, and sidebar to display concise, user-friendly labels for dispatched worker agents instead of verbose, raw system preambles.
- Document and update the CLI help, specs, and tests to explicitly guide
users toward `orca terminal create --worktree active --command <agent>`
to launch a fresh agent session in the current checkout.
- Update orchestration and orca-cli skills to prefer active-worktree
terminals when dependent on uncommitted files or active branch state,
distinguishing them from separate worktree creation.
* Restore the outlined server card for host headers
Feedback: the bordered card with the server glyph made it clearer that
a host section is a separate machine, not just another group. Bring
that back while keeping the recent quieting: no status dot when
healthy (marks only for connecting/blocked/error/disconnected), no
'This computer' detail on the local host, and collapse/menu/count
behavior unchanged.
Co-authored-by: Orca <help@stably.ai>
* Anchor host badge to its label, indent rows under host cards
Sidebar polish from review:
- The count badge sat in dead space between the label and the
hover-only chevron/menu; it now hugs the label like repo headers
- Rows under a host card get a left inset so projects and workspaces
visibly belong to the machine above them
- A host whose only visible row is a collapsed repo group counted 0
while the group badge said 9; host counts now fall back to header
counts for groups contributing no visible items
Co-authored-by: Orca <help@stably.ai>
* Two-tier sticky headers: pinned host card above pinned group header
When scrolling inside a host section, the host card now stays pinned at
the top (z-30) while project/status group headers hand off beneath it
(z-20, offset by the pinned card height). The host is the outer
hierarchy level, so it is the most persistent context — previously the
first repo header replaced it, losing 'which machine am I on' exactly
when it mattered. The pinned card keeps its collapse/menu/warning
affordances. Handoff rules: the next host card pushes the previous one
out at the viewport top; a group pins only once it reaches the slot
beneath the host card, and a previous host's group can never pin under
the next host. Without host sections the logic degrades to the original
single-tier behavior.
Co-authored-by: Orca <help@stably.ai>
* Revert host-section row indent
The two-tier sticky host card now provides continuous 'inside this
machine' context at any scroll depth, making the static indent
redundant — and it cost 12px of sidebar width on every row while
making multi-host layouts misalign with single-host ones. Host cards
bracketing their sections plus the pinned header carry the ownership
signal on their own.
Co-authored-by: Orca <help@stably.ai>
* Checkpoint multi-host sidebar and project-first notes
Co-authored-by: Orca <help@stably.ai>
* Add project-first compatibility persistence
Co-authored-by: Orca <help@stably.ai>
* Expose project host setup APIs
Co-authored-by: Orca <help@stably.ai>
* Group sidebar rows by project setup
Co-authored-by: Orca <help@stably.ai>
* Document project-first host model discussion
Co-authored-by: Orca <help@stably.ai>
* Resolve workspace creation through project host setups
Co-authored-by: Orca <help@stably.ai>
* Stamp workspace ownership with project host setup
Co-authored-by: Orca <help@stably.ai>
* Add project host setup existing folder API
Co-authored-by: Orca <help@stably.ai>
* Summarize project-first host model discussion
Co-authored-by: Orca <help@stably.ai>
* Add project host setup CLI commands
Co-authored-by: Orca <help@stably.ai>
* Allow CLI worktree creation by project host setup
Co-authored-by: Orca <help@stably.ai>
* Add workspace host setup picker
Co-authored-by: Orca <help@stably.ai>
* Add project host setup settings summary
Co-authored-by: Orca <help@stably.ai>
* Make project host setup settings navigable
Co-authored-by: Orca <help@stably.ai>
* Stabilize project host setup settings selector
Co-authored-by: Orca <help@stably.ai>
* Add project host existing-folder setup form
Co-authored-by: Orca <help@stably.ai>
* Update project host model implementation status
Co-authored-by: Orca <help@stably.ai>
* Keep projects outermost in default sidebar view
Co-authored-by: Orca <help@stably.ai>
* Update project-first sidebar status
Co-authored-by: Orca <help@stably.ai>
* Show host context in project sidebar groups
Co-authored-by: Orca <help@stably.ai>
* Show unavailable hosts in workspace run target
Co-authored-by: Orca <help@stably.ai>
* Import missing project host from composer
Co-authored-by: Orca <help@stably.ai>
* Clone project host setup from composer
Co-authored-by: Orca <help@stably.ai>
* Persist project host setup method
Co-authored-by: Orca <help@stably.ai>
* Clone project hosts over SSH
Co-authored-by: Orca <help@stably.ai>
* Improve SSH clone cancellation cleanup
Co-authored-by: Orca <help@stably.ai>
* Backfill workspace project host ownership
Co-authored-by: Orca <help@stably.ai>
* Gate project host setup runtime capability
Co-authored-by: Orca <help@stably.ai>
* Preserve independent project host setups
Co-authored-by: Orca <help@stably.ai>
* Add project host setup update API
Co-authored-by: Orca <help@stably.ai>
* Add project host setup delete API
Co-authored-by: Orca <help@stably.ai>
* Add project host setup create API
Co-authored-by: Orca <help@stably.ai>
* Expose project host setup lifecycle in renderer store
Co-authored-by: Orca <help@stably.ai>
* Handle independent project host setups in settings
Co-authored-by: Orca <help@stably.ai>
* Add pending host setup action in project settings
Co-authored-by: Orca <help@stably.ai>
* Show pending project host setup status in composer
Co-authored-by: Orca <help@stably.ai>
* Report pending setup state in workspace target resolution
Co-authored-by: Orca <help@stably.ai>
* Use shared host registry for project setup choices
Co-authored-by: Orca <help@stably.ai>
* Add settings clone flow for project host setups
Co-authored-by: Orca <help@stably.ai>
* Gate unavailable project host setup options
Co-authored-by: Orca <help@stably.ai>
* Gate unavailable project setup hosts in settings
Co-authored-by: Orca <help@stably.ai>
* Stream SSH clone progress to renderer
Co-authored-by: Orca <help@stably.ai>
* Update project host model status notes
Co-authored-by: Orca <help@stably.ai>
* Add CLI project host setup clone command
Co-authored-by: Orca <help@stably.ai>
* Make add project host aware
Co-authored-by: Orca <help@stably.ai>
* Complete project host setup validation
Co-authored-by: Orca <help@stably.ai>
* Recover floating workspace terminal WebGL atlas on reopen (#5069)
Co-authored-by: Orca <help@stably.ai>
* Fix stale terminal daemon spawn health (#5064)
Co-authored-by: Orca <help@stably.ai>
* Suspend floating workspace terminal WebGL while the panel is closed (#5073)
Co-authored-by: Orca <help@stably.ai>
* Fix source control branch compare base (#5074)
Co-authored-by: Orca <help@stably.ai>
* Fix workspace-creation tour panel clipped by the Create Worktree dialog (#5078)
* Fix workspace-creation tour panel clipped by the composer dialog
The tour panel portals into dialog/sheet content that clips overflow, but
its position was clamped against the window viewport. With the Project
field spanning nearly the dialog's full width, the panel landed past the
dialog's right edge and overflow-hidden cut it down to a sliver. Clamp
hosted panels within the host's bounds instead, so the panel flips below
the target and stays fully visible.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Add JSDoc docstrings to satisfy CodeRabbit docstring coverage check
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Test hosted contextual tour overlay positioning
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
* release: v1.4.56
* Handle buffer overflows gracefully and truncate diffs fairly (#5083)
- Gracefully fall back to file-name summaries when staged diffs exceed
node/ssh execution maxBuffer limits, preventing generation failures.
- Split oversized diffs by file and allocate budget via water-filling,
ensuring single huge files do not starve smaller human changes.
- Clip truncated diff sections on line boundaries to avoid half-lines.
* Wrap AI generation controls with tooltips and clean i18n dependencies (#5087)
- Wrap the AI generation button in a tooltip so users can see the
disabled reason or the action description on hover.
- Add unit tests verifying tooltip triggers and aria-label safety.
- Simplify memo dependencies in settings metadata and worktree palette
by using 'useTranslation()' to handle language-change rerenders
directly without needing 'i18n.language'.
* fix: address review findings (#5088)
* Fix localization in repository hooks and base ref suggestion toast (#5089)
* Fix localization in base ref toast and custom hook description
- Localize the "commit"/"commits" plural nouns in the base ref toast.
- Translate missing suggestion toast strings for JA, KO, and ZH locales.
- Pass `{{artifact_url}}` as a literal template variable to translate
calls to prevent i18next from treating it as a dynamic placeholder.
* Fix localization reactivity in RepositoryHooksSection
Move static variables containing translation calls into helper functions
and subscribe to translation updates using useTranslation. This ensures
that localized options, descriptions, and error messages refresh
dynamically when the user changes the UI language.
* Fix task page labels after language changes (#5086)
Co-authored-by: Orca <help@stably.ai>
* release: v1.4.57
* Fix automation tabs showing a shell instead of the live agent (#5099)
* Fix automation tabs showing a shell instead of the live agent
Opening a background automation's terminal tab showed a bare shell while
the agent (Claude) kept running headless — the sidebar updated but the
pane was attached to the wrong PTY.
On first mount the restored ptyId equals the tab ptyId, and
isSessionOwnedByWorktree() returns true for it, so connectPanePty routed
the still-live eagerly-spawned PTY into the daemon-reattach branch
(transport.connect({ sessionId })), which spawns a fresh shell and
orphans the live agent PTY instead of adopting it via attach()+replay.
Part A: gate the deferred reattach on the absence of a live eager buffer.
A live eager buffer means the PTY is a still-running local session to
adopt (attach + replay), not a daemon session to re-connect. Daemon
reattach and remote PTYs are unaffected (gated on the eager buffer).
Part B: publish never-mounted background automation tabs into the runtime
graph (gated on a live eager buffer) so the live agent PTY binds to its
real tab instead of surfacing as an orphan `pty:<id>` terminal — fixing
`orca terminal list`, the CLI, and automation session-reuse.
Adds a characterization test (fails on the old code, passes now) and a
runtime-graph publish test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Harden eager PTY tab adoption
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
* Fix i18n label spacing in menus and settings (#5108)
* fix i18n label spacing
* Fix localized account runtime labels
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
* Improve localization catalog sync workflow (#5110)
Co-authored-by: Orca <help@stably.ai>
* Add Warp terminal theme import (#4714)
Co-authored-by: Orca <help@stably.ai>
* release: v1.4.58
* Tidy README badge layout
* Handle integration credential decrypt failures (#4683)
Co-authored-by: Orca <help@stably.ai>
* Fix git repo telemetry for repo adds (#5121)
Co-authored-by: Orca <help@stably.ai>
* Add feature interaction usage bucket telemetry (#5119)
Co-authored-by: Orca <help@stably.ai>
* Reset WebGL glyph atlases globally to stop cross-terminal glyph corruption (#5122)
Co-authored-by: Orca <help@stably.ai>
* perf(windows): fix 60s startup ACL walk and OpenCode streaming freeze, with benchmark harnesses (#5124)
* release: v1.4.59-rc.0
* Fix packaged shell PATH order (#5125)
Co-authored-by: Orca <help@stably.ai>
* Add Floating Workspace contextual tour (#5062)
* Add floating workspace contextual tour
Co-authored-by: Orca <help@stably.ai>
* Clarify floating workspace tour intro copy
Co-authored-by: Orca <help@stably.ai>
* Differentiate floating workspace tour steps instead of repeating examples
Co-authored-by: Orca <help@stably.ai>
* Lead floating workspace tour with the user benefit
Co-authored-by: Orca <help@stably.ai>
* Pitch floating workspace tour around cross-repo agents
Co-authored-by: Orca <help@stably.ai>
* Refine floating workspace tour step 1 copy
Co-authored-by: Orca <help@stably.ai>
* Anchor floating workspace tour step 2 on the minimize control
Co-authored-by: Orca <help@stably.ai>
* Restore floating workspace tour step 2
Co-authored-by: Orca <help@stably.ai>
* Anchor floating workspace tour steps on New Terminal and New Markdown Note
Co-authored-by: Orca <help@stably.ai>
* Retitle floating workspace tour step 2 as scratchpad
Co-authored-by: Orca <help@stably.ai>
* Add why-comments for tour selector fallback and placement flipping
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Orca <help@stably.ai>
* Fix source control compare base ambiguity (#5127)
Co-authored-by: Orca <help@stably.ai>
* release: v1.4.59-rc.1 [rc-slot:2026-06-10-15]
* release: v1.4.59
* Default-driven create-project flow: name-first form with sensible defaults (#5115)
Co-authored-by: Orca <help@stably.ai>
* Redesign Connect integrations (#4531)
Co-authored-by: Orca <help@stably.ai>
* Expose E2E store via build mode
* File search match counts (#5085)
* Add matchCount to SearchFileResult for accurate per-file hit counts
Co-authored-by: Orca <help@stably.ai>
* Add file search match count design
* rm design doc
---------
Co-authored-by: Orca <help@stably.ai>
* fix: address review findings (#5139)
* perf(windows): avoid blocking daemon pid checks (#5137)
* release: v1.4.60-rc.0
* release: v1.4.60
* Preserve core workflow terms in English and apply CJK spacing (#5141)
* Preserve core workflow and product terms in English across locales
Update translation policy to prevent localization of key terms such as
"Agent", "Commit", "Markdown", and "Terminal". This ensures consistent
jargon and product branding.
Introduce CJK-Latin term spacing to keep these Latin terms legible
when combined with CJK text, while adjusting Korean particle spacing.
Also add overrides to prevent network proxy settings from being
mistranslated as "Agent".
* Preserve repo terminology in English and localize source control labels
Treat "repo" and "repos" (and their capitalized forms) as brand terms
that should remain in English/Latin across CJK and Spanish locales.
Update translation files and policies to replace translated words like
"repositorio" or "リポジトリ" with "repo"/"repos", and fix an issue where
latin brand terms could be incorrectly matched as substrings in larger
words during cleanup.
Additionally, externalize and localize the "Staged Changes", "Changes",
and "Untracked Files" section labels in the source control sidebar.
* UX (#5143)
* UX/copy tweaks (#5142)
* UX/copy tweaks
* UX/copy tweaks
* Fix missed star UI translations (#5148)
* fix: make windows ssh relay deploy survive session teardown (#5136)
* Add option to remove child projects when deleting repo groups (#4702)
Co-authored-by: Orca <help@stably.ai>
* fix: remove checks panel response badge (#5147)
* Add read-only `orca linear` CLI with trusted launch-prompt pointer (V1) (#5126)
Co-authored-by: Orca <help@stably.ai>
* Add AI Vault session history
## Summary
- add AI Vault session scanning and resume command construction
- add the Agents sidebar panel with filtering, grouping, copy/open actions, and local resume launch
- support dragging saved sessions onto terminal split panes
## Validation
- pnpm run lint
- pnpm run typecheck
- pnpm exec vitest run --config config/vitest.config.ts src/main/ipc/register-core-handlers.test.ts src/main/ai-vault/session-scanner.test.ts src/renderer/src/components/right-sidebar/ai-vault-session-filters.test.ts src/renderer/src/lib/ai-vault-session-drag.test.ts src/renderer/src/lib/launch-ai-vault-session.test.ts
* Default agent launches to yolo permissions mode (#5145)
* Default agent launches to yolo mode
* test: update launch default validations
* Fix Claude usage refresh error copy (#5155)
Co-authored-by: Orca <help@stably.ai>
* Move workspace board to sidebar bottom toolbar (#5146)
Co-authored-by: Orca <help@stably.ai>
* Rebuild contextual tour positioning on floating-ui; fix hosted dialog placement and arrow seam (#5154)
Co-authored-by: Orca <help@stably.ai>
* Fix missing spaces in cross-repo switch dialog (#5158)
* Fix Ctrl+Tab switcher selection on release (#5116)
* Fix additional i18n spacing regressions from #4995 (#5159)
* Refine add project selection styling (#5160)
Co-authored-by: Orca <help@stably.ai>
* improve chinese localization (#5162)
* Fix floating workspace needing two clicks after app switch (macOS) (#5128)
* Autofocus feedback textarea when Send Feedback dialog opens (#5164)
* fix: address pr-bug-scan validated finding from #4683 (#5151)
Isolated CredentialDecryptionError per-item in Linear getClients (client.ts:518) and Jira getClients (client.ts:373) on the 'all' selection so one bad credential no longer collapses healthy workspaces
Co-authored-by: orca-bug-scan-bot <orca-bug-scan-bot@stably.ai>
* fix: enable claude agent teams by default (#5168)
* Refresh Jira and Linear status after credential errors (#5169)
* fix: address pr-bug-scan validated finding from #4683
Isolated CredentialDecryptionError per-item in Linear getClients (client.ts:518) and Jira getClients (client.ts:373) on the 'all' selection so one bad credential no longer collapses healthy workspaces
* Refresh Jira and Linear status to clear stale credential errors
Ensure stale credential decryption errors are cleared from the store
status once a successful API read completes. By updating the check in
shouldRefreshStatusAfterRead to trigger when a credentialError is
currently set, successful issue or list fetches will trigger a status
check and remove stale error flags.
---------
Co-authored-by: orca-bug-scan-bot <orca-bug-scan-bot@stably.ai>
* Hide internal context from AI Vault titles (#5175)
* Fix detached HEAD publish actions (#5173)
* Keep freshly split terminal pane mounted if newborn PTY exits early (#5171)
Prevent a newly split pane from collapsing immediately if its PTY exits
during initial setup before any output is received or input is sent.
This ensures a failed startup session remains visible to the user.
* Route task PR queries by upstream source (#5176)
* Route task PR queries by upstream source
Implements the routing described in docs/tasks-pr-upstream-source.md so task PR and issue queries stay scoped to the selected source.
* rm design doc
* Prevent stale PR refreshes from restoring unlinked review state (#5180)
- Pass `worktreeId` to `fetchPRForBranch` to track active worktree context
- Ignore inflight or queued PR fetches if the worktree has been unlinked
- Include linked PR/MR metadata in the checks panel snapshot key to trigger updates immediately on link/unlink events
* Fix Claude agents management status detection (#5179)
Co-authored-by: Orca <help@stably.ai>
* fix: address review findings (#5177)
* Allow resolving selected review comments with AI (#5184)
* Allow resolving selected PR/MR review comments with AI
Users can now select specific unresolved review comments or threads in
the Checks panel sidebar, queue them, and trigger an AI agent to address
them, marking resolved threads on the host upon agent launch.
- Adds checkboxes and action/send buttons to select and queue comments.
- Builds a structured, robust prompt with sanitized comment metadata.
- Optimistically marks threads resolved on launch with rollback on error.
- Supports both GitHub PRs and GitLab MRs.
* Consolidate PR comment selection state and eliminate effects
Combine independent selection states and context-tracking into a single
state object. Derive active selection data and prune ineligible comments
during render using useMemo instead of relying on asynchronous
useEffect synchronization hooks.
* Improve source control action dialog layout and recipe saving UX (#5153)
* Improve source control agent action dialog layout and recipe UX
- Constrain dialog and scroll area heights to prevent viewport overflow.
- Add variable chips to easily insert the base prompt with tooltip previews.
- Keep the recipe save controls visible when a recipe is already saved, showing informational status text instead of hiding them.
- Update localized copy across multiple languages and reduce textarea rows.
- Add unit tests for the variable chip preview and save target visibility.
* Fix recipe-saved check in source control action dialog
* Evaluate only the selected save target instead of checking all available targets, as the action only writes to the selected target.
* Update daemon PTY adapter test fake PID to prevent collision with real host OS processes during runtime directory lookups.
* fix: remove unsupported agent launch defaults (#5185)
* Update Chinese and Japanese translations for worktrees and fixes (#5187)
- Correct awkward Chinese translation of "fix" ("使固定") to "修复" and "基本的" to "主工作树" (main worktree).
- Improve Japanese translation of "fix" from physical repair ("修理") to software correction ("修正").
* Embed hosted review creation composer directly in Checks panel (#5140)
* Embed hosted review creation composer directly in the Checks panel
- Replaces the modal pull request/merge request creation dialog with an
inline composer embedded in the empty state of the Checks sidebar.
- Extracts and moves pull request generation state to a dedicated store
slice so AI-generated details are persisted across sidebar unmounts.
* Fix hosted review composer feedback
* Combine file search and file explorer right sidebar tabs (#5182)
Unifies file discovery and tree navigation under a single Explorer domain, simplifying the right sidebar activity bar and reducing tab clutter.
* Replaces the standalone 'search' activity bar tab with a nested 'search' subview inside the File Explorer tab
* Introduces 'rightSidebarExplorerView' ('files' | 'search') state to manage the active subview inside the Explorer
* Adds a search button to the File Explorer toolbar and a back button to the search subview for seamless transition
* Exposes 'showRightSidebarFiles' and 'showRightSidebarSearch' store actions to route and seed search queries/include patterns
* Adapts file explorer keybindings, git status polling, and external workspace watchers to respect the active subview
* Maps legacy persisted search tab state to the new explorer search view for backward compatibility
* release: v1.4.61-rc.1
* Add multi-repo folder workspaces (v1) (#5172)
Co-authored-by: Orca <help@stably.ai>
* release: v1.4.61-rc.2
* Hide unavailable project hosts in worktree composer
Co-authored-by: Orca <help@stably.ai>
* Remove inline project host setup from composer
Co-authored-by: Orca <help@stably.ai>
* Mark imported project host setup methods
Co-authored-by: Orca <help@stably.ai>
* Fix rebase merge fallout
Co-authored-by: Orca <help@stably.ai>
* Disable unavailable Add Project hosts
Co-authored-by: Orca <help@stably.ai>
* Compact Add Project host selector
Co-authored-by: Orca <help@stably.ai>
* Hide redundant SSH target chooser
Co-authored-by: Orca <help@stably.ai>
* Browse SSH clone destinations
Co-authored-by: Orca <help@stably.ai>
* Avoid local clone defaults for SSH hosts
Co-authored-by: Orca <help@stably.ai>
* Polish host-aware Add Project flows
Co-authored-by: Orca <help@stably.ai>
* Polish remote host add project flows
Co-authored-by: Orca <help@stably.ai>
* Remove redundant host kind chips
Co-authored-by: Orca <help@stably.ai>
* Fix remote project setup UX gaps
Co-authored-by: Orca <help@stably.ai>
* Fix multihost workspace composer project identity
Co-authored-by: Orca <help@stably.ai>
* Finish host context merge repair
Co-authored-by: Orca <help@stably.ai>
* Continue host context checklist implementation
Co-authored-by: Orca <help@stably.ai>
* Route Linear and Jira tasks by source context
Co-authored-by: Orca <help@stably.ai>
* Preserve Linear task source context in history
Co-authored-by: Orca <help@stably.ai>
* Scope task retry state by source context
Co-authored-by: Orca <help@stably.ai>
* Route GitHub drawer reads by source context
Co-authored-by: Orca <help@stably.ai>
* Guard GitLab selectors with repo context
Co-authored-by: Orca <help@stably.ai>
* Guard GitHub metadata selectors
Co-authored-by: Orca <help@stably.ai>
* Route GitHub task row actions by source context
Co-authored-by: Orca <help@stably.ai>
* Update GitHub source-context checklist status
Co-authored-by: Orca <help@stably.ai>
* Show host ownership for CLI provider accounts
Co-authored-by: Orca <help@stably.ai>
* Persist GitLab task detail source context
Co-authored-by: Orca <help@stably.ai>
* Show host scope for provider API budgets
Co-authored-by: Orca <help@stably.ai>
* Preserve Jira task source context
Co-authored-by: Orca <help@stably.ai>
* Scope Jira optimistic task patches
Co-authored-by: Orca <help@stably.ai>
* Resolve task PR bases on run host
Co-authored-by: Orca <help@stably.ai>
* Record Jira task workspace usage
Co-authored-by: Orca <help@stably.ai>
* Scope Linear optimistic task patches
Co-authored-by: Orca <help@stably.ai>
* Scope GitHub optimistic task patches
Co-authored-by: Orca <help@stably.ai>
* Clean host copy in onboarding flows
Co-authored-by: Orca <help@stably.ai>
* Preserve automation CLI run context
Co-authored-by: Orca <help@stably.ai>
* Add automation CLI source context selector
Co-authored-by: Orca <help@stably.ai>
* Clarify unavailable task source hosts
Co-authored-by: Orca <help@stably.ai>
* Surface host model runtime capability skew
Co-authored-by: Orca <help@stably.ai>
* Use SSH host copy in reconnect dialog
Co-authored-by: Orca <help@stably.ai>
* Show host context in task source picker
Co-authored-by: Orca <help@stably.ai>
* Mark task source display complete
Co-authored-by: Orca <help@stably.ai>
* Clarify provider account host selection
Co-authored-by: Orca <help@stably.ai>
* Guard task source switching boundary
Co-authored-by: Orca <help@stably.ai>
* Mark task source diagnostics persisted
Co-authored-by: Orca <help@stably.ai>
* Mark base resolution host boundary
Co-authored-by: Orca <help@stably.ai>
* Clarify external automation source states
Co-authored-by: Orca <help@stably.ai>
* Harden project host compatibility projection
Co-authored-by: Orca <help@stably.ai>
* Finish host copy audit
Co-authored-by: Orca <help@stably.ai>
* Add provider host scope controls
Co-authored-by: Orca <help@stably.ai>
* Show task source account labels
Co-authored-by: Orca <help@stably.ai>
* Show automation run context in CLI
Co-authored-by: Orca <help@stably.ai>
* Scope Jira task cache lookups by source
Co-authored-by: Orca <help@stably.ai>
* Seed workspace creation from task source context
Co-authored-by: Orca <help@stably.ai>
* Explain disabled external automation actions
Co-authored-by: Orca <help@stably.ai>
* Surface task source runtime capability gaps
Co-authored-by: Orca <help@stably.ai>
* Persist automation run context from UI saves
Co-authored-by: Orca <help@stably.ai>
* Require workspace run capability for setup hosts
Co-authored-by: Orca <help@stably.ai>
* Disable automation runs for stale host setup
Co-authored-by: Orca <help@stably.ai>
* Route GitHub drawer metadata by source host
Co-authored-by: Orca <help@stably.ai>
* Guard runtime project setup mutations by host model
Co-authored-by: Orca <help@stably.ai>
* Route PR page metadata by repo host
Co-authored-by: Orca <help@stably.ai>
* Route PR mention metadata by repo host
Co-authored-by: Orca <help@stably.ai>
* Route GitHub Project edits by view source
Co-authored-by: Orca <help@stably.ai>
* Clarify runtime automation disabled states
Co-authored-by: Orca <help@stably.ai>
* Guard runtime automation backend dispatch
Co-authored-by: Orca <help@stably.ai>
* Preserve GitLab task source identity
Co-authored-by: Orca <help@stably.ai>
* Remove redundant SSH target row in add project
Co-authored-by: Orca <help@stably.ai>
* Add task source provider availability reasons
Co-authored-by: Orca <help@stably.ai>
* Surface task provider preflight availability
Co-authored-by: Orca <help@stably.ai>
* Record local GitHub task source verification
Co-authored-by: Orca <help@stably.ai>
* Record Linear task source verification
Co-authored-by: Orca <help@stably.ai>
* Show automation source context in details
Co-authored-by: Orca <help@stably.ai>
* Record remote capability negotiation coverage
Co-authored-by: Orca <help@stably.ai>
* Record local add project create verification
Co-authored-by: Orca <help@stably.ai>
* Scope Linear cached task reads by source
Co-authored-by: Orca <help@stably.ai>
* Preserve PR generation host ownership
Co-authored-by: Orca <help@stably.ai>
* Route git operations by owner host
Co-authored-by: Orca <help@stably.ai>
* Route delete warnings by worktree owner
Co-authored-by: Orca <help@stably.ai>
* Route editor drops by worktree owner
Co-authored-by: Orca <help@stably.ai>
* Route agent draft paste by tab owner
Co-authored-by: Orca <help@stably.ai>
* Route file explorer requests by worktree owner
Co-authored-by: Orca <help@stably.ai>
* Document remaining host context gaps
Co-authored-by: Orca <help@stably.ai>
* Check runtime task source provider auth
Co-authored-by: Orca <help@stably.ai>
* Validate automation source availability
Co-authored-by: Orca <help@stably.ai>
* Route remaining UI requests by owner host
Co-authored-by: Orca <help@stably.ai>
* Route quick open file listing by worktree owner
Co-authored-by: Orca <help@stably.ai>
* Route typed GitHub lookups by source host
Co-authored-by: Orca <help@stably.ai>
* Centralize automation run identity fallback
Co-authored-by: Orca <help@stably.ai>
* Surface unsupported task source providers
Co-authored-by: Orca <help@stably.ai>
* Document automation legacy repo compatibility
Co-authored-by: Orca <help@stably.ai>
* Record live host model verification
Co-authored-by: Orca <help@stably.ai>
* Quiet disconnected SSH polling
Co-authored-by: Orca <help@stably.ai>
* Verify task drawer source boundaries
Co-authored-by: Orca <help@stably.ai>
* Verify GitLab repo source selectors
Co-authored-by: Orca <help@stably.ai>
* Route automations through owning host
Co-authored-by: Orca <help@stably.ai>
* Update host context verification checklist
Co-authored-by: Orca <help@stably.ai>
* Run remote automations headlessly in serve mode
Co-authored-by: Orca <help@stably.ai>
* Keep setup guide entry stable during refresh
Co-authored-by: Orca <help@stably.ai>
* Keep setup script prompt stable during host switches
Co-authored-by: Orca <help@stably.ai>
* Deduplicate Tasks project picker sources
Co-authored-by: Orca <help@stably.ai>
* Use project identity for Tasks picker dedupe
Co-authored-by: Orca <help@stably.ai>
* Add Tasks source host switcher
Co-authored-by: Orca <help@stably.ai>
* Refine Tasks source picker disclosure
Co-authored-by: Orca <help@stably.ai>
* Polish Tasks source picker hover
Co-authored-by: Orca <help@stably.ai>
* Open Tasks source menu on hover
Co-authored-by: Orca <help@stably.ai>
* Match Tasks source submenu hover behavior
Co-authored-by: Orca <help@stably.ai>
* Open Tasks source submenu from project row hover
Co-authored-by: Orca <help@stably.ai>
* Group automation project hosts
Co-authored-by: Orca <help@stably.ai>
* Tighten automation project picker density
Co-authored-by: Orca <help@stably.ai>
* Show selected host in Tasks project picker
Co-authored-by: Orca <help@stably.ai>
* Hide host labels for single-host project pickers
Co-authored-by: Orca <help@stably.ai>
* Use saved remote server names in host pickers
Co-authored-by: Orca <help@stably.ai>
* Use standard add project start for remote servers
Co-authored-by: Orca <help@stably.ai>
* Use saved host labels in workspace surfaces
Co-authored-by: Orca <help@stably.ai>
* Route remote browser tabs through runtime hosts
Co-authored-by: Orca <help@stably.ai>
* Keep sidebar project-first across grouping modes
Co-authored-by: Orca <help@stably.ai>
* Polish multi-host remote runtime UX
Co-authored-by: Orca <help@stably.ai>
* Fix CI lint and remove design notes
Co-authored-by: Orca <help@stably.ai>
* Fix CI test failures
Co-authored-by: Orca <help@stably.ai>
* Fix Windows CLI path expectation
Co-authored-by: Orca <help@stably.ai>
* Fix CI renderer test expectations
Co-authored-by: Orca <help@stably.ai>
* Fix remaining verify test failures
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: Bryant Ung <bryant.ung@outlook.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
Co-authored-by: Borja <3930245+BorjaLL@users.noreply.github.com>
Co-authored-by: Parker Rex <me@parkerrex.com>
Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
Co-authored-by: Trevin Chow <trevin@trevinchow.com>
Co-authored-by: buf0-bot[bot] <252831055+buf0-bot[bot]@users.noreply.github.com>
Co-authored-by: orca-bug-scan-bot <orca-bug-scan-bot@stably.ai>
The `worktree.set` RPC already accepts `workspaceStatus`, but the CLI
handler never forwarded it, so the board status could not be changed
from the command line. Pass the flag through, document it in the spec
and root help, and add a CLI test mirroring the existing --comment case.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>