* Fix automatic branch rename for non-English git locales
A gettext-enabled git (Homebrew git, most Linux distro gits) under a
non-English locale translates every diagnostic, including the `fatal:`
prefix, so Orca's stderr phrase parsers stop matching. The first-message
branch auto-rename was the headline casualty: isNoUpstreamError missed
the translated no-upstream error, branchHasUpstream failed closed to
"has upstream", and the rename settled silently and permanently.
- Force LC_ALL=C on all Orca-spawned machine-parsed git: the local
prompt-guard env chokepoint, the three relay git spawn sites, and both
local clone spawns (progress + failure-message parsing). User
terminals are untouched.
- Replace the boolean upstream check with a tri-state probe: rename
proceeds only on a proven missing upstream; an unreadable probe now
raises the rename-failed badge and retries instead of settling.
Fixes#7808🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* Consolidate untranslated-git-locale into runner and relay primitives
Replace the five per-site LC_ALL=C patches with one shared
UNTRANSLATED_GIT_OUTPUT_ENV (LANGUAGE=en LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8) injected inside the git runner primitives
(promptGuardGitEnv, gitSpawn, gitExecFileSync, gitExecFileAsyncBuffer)
and a relay buildRelayGitEnv() helper, so every current and future
machine-parsed git spawn is covered by construction — including the
fs-handler-git-fallback sites the per-site approach missed. The UTF-8
English locale keeps a UTF-8 LC_CTYPE for hooks git spawns; LANGUAGE is
pinned because gettext consults it before LC_ALL.
WSL-routed git gets the same values as a shell assignment prefix built
in resolveCommand, since spawn env cannot cross the wsl.exe boundary —
closing the WSL gap the first pass accepted.
Also scrub credential-bearing remote URLs from the probe-failed message
surfaced on the worktree card.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* Scrub credential-bearing URLs from clone failure messages
---------
Co-authored-by: Brennan Benson <brennanbenson@Brennans-MacBook-Pro.local>
Co-authored-by: Claude <noreply@anthropic.com>
* feat(source-control): add Fix push failure with AI for pre-push hooks
Detect pre-push hook failures separately from auth/transport errors so
push toasts and inline messages no longer suggest checking repo access.
Mirror the commit-failure recovery flow with a fixPushFailure action,
summary panel, details dialog, and agent launch recipe in Settings.
Fixes#6497
* feat(source-control): add push failure AI recovery
Co-authored-by: dalveytech-vincent <vincent@dalveytech.com>
---------
Co-authored-by: dalveytech-vincent <vincent@dalveytech.com>
110 files carried an eslint/oxlint-disable max-lines directive but are
already under the default max-lines budget (300 .ts / 400 .tsx / 600 .mjs
/ 800 test), so the suppression is dead. Removing it restores real
max-lines coverage on these files with zero behavior change.
Each removed directive had max-lines as its only rule; verified via a
full oxlint run (0 max-lines violations, 0 new errors). Diff is pure
deletions (200 lines, 0 additions) — no code touched.
Co-authored-by: Orca <help@stably.ai>
Enable three unicorn rules — one correctness, two performance — and fix every
existing violation repo-wide so the rules pass as errors.
prefer-number-properties (76 sites)
- parseInt/parseFloat/NaN -> Number.* : safe aliases (autofixed).
- isNaN -> Number.isNaN (12 sites, hand-converted): global isNaN coerces its
argument, Number.isNaN does not. Verified every call site already passes a
number (Number.parseInt results, number-typed fields, Date.getTime()), so the
conversion is behavior-preserving today and guards against a future non-numeric
argument silently coercing.
prefer-array-find (26 sites)
- .filter(pred)[0] -> .find(pred); .filter(pred).at(-1) / .pop() -> .findLast(pred).
Drops the intermediate array and short-circuits.
prefer-array-index-of (5 sites)
- .findIndex(x => x === v) -> .indexOf(v).
Verified: typecheck (node/cli/web) clean, 53 affected suites pass (1679 tests),
oxlint clean repo-wide. mobile/ uses findLast safely (already ships ES2023
.toReversed()); config scripts and e2e helpers run on Node 24.
Replace the hand-rolled `AbortController` + `setTimeout(() => controller.abort())`
+ `clearTimeout` in `finally` pattern with `AbortSignal.timeout(ms)` across the
main-process fetchers, updaters, and hosted-provider clients. This removes a
timer-leak footgun (a thrown/early-returned path that skips the finally leaks the
timer) and ~3-4 lines of bookkeeping per site. `AbortSignal.timeout` is Node
17.3+ (Electron main is Node 22+).
Two sites compose a caller-cancel signal with the timeout via `AbortSignal.any`
(Node 20.3+) instead of a manual abort listener:
- git/fork-sync.ts: also fixes a latent bug — the caller's `options.signal` was
spread into the git options then immediately clobbered by `signal:
controller.signal`, so caller cancellation was silently dropped. `AbortSignal.any`
restores it.
- rate-limits/claude-fetcher.ts (fetchViaOAuth external signal).
hosted-review-api-request.ts: `AbortSignal.timeout()` rejects with a
`TimeoutError`, not an `AbortError`, so the timeout-detection branch is updated
(otherwise `timedOut` would never be set).
minimax-fetcher.test.ts: its timeout test drove the abort with fake timers, which
cannot advance `AbortSignal.timeout`'s internal timer. Rewritten to fire the
timeout with an already-aborted signal so it genuinely exercises the abort path.
Deliberately NOT migrated:
- src/relay/git-handler.ts: the relay targets Node 18 (`build-relay.mjs`,
MIN_NODE_MAJOR = 18); `AbortSignal.any` needs Node 20.3+, and timeout-only would
drop the request context signal.
- ipc/feedback.ts: its timeout-driven fallback is verified with fake timers, which
can't advance `AbortSignal.timeout`; kept on the manual pattern.
* fix(worktrees): fall back from stale default base refs (#7312)
* docs(worktrees): explain base fallback policy
* fix(worktrees): harden stale base fallback edge cases
---------
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
* fix(gitlab): port-aware self-hosted host recognition
Use the URL host (including a non-default web/API port) as the GitLab
host identity instead of the port-less hostname, and match known hosts
port-aware:
- A known-host entry without a port matches any port of the same
hostname (preserves legacy bare-host and gitlab.com recognition).
- A known-host entry WITH a port matches only that exact host:port, so
two services sharing a hostname on different ports (e.g. a GitLab and
a Gitea) are no longer conflated.
- For ssh/git remotes the port is a transport port (e.g. ssh :2222) and
is dropped; for http(s) remotes the port is the endpoint and kept.
- Also capture an optional :port in parseGlabAuthStatusHosts so a
self-hosted GitLab on a non-default port is discovered correctly.
* fix(gitlab): per-connection known-hosts cache + port-aware auth-status parsing
getGlabKnownHosts() was connection-blind and cached process-globally,
and on any failure it cached [gitlab.com] forever — so a repo on an SSH
connection never discovered its self-hosted host once a probe failed
before the tunnel was ready.
- getGlabKnownHosts(connectionId?) now caches per connection so a
connected repo's authenticated hosts don't leak into the local
context (or vice versa).
- The failure fallback (canonical default) is no longer cached, so a
later probe can re-discover the real host once auth/tunnel is ready.
- parseGlabAuthStatusHosts captures an optional :port on both the
'Logged in to <host>' and header-style lines, keeping two services on
the same hostname distinct by port.
* fix(gitlab): isolate unresolvable projects instead of cwd-fallback that hits exit 128
listIssues/getIssue fell back to an unscoped 'glab issue list' / 'glab
issue view' that infers the project from cwd. For a repo on an SSH
connection cwd is not the repo dir, so glab runs git resolution in a
non-repo dir and fails with 'git: exit status 128'. In an 'All projects'
aggregate one such failure could sink the whole issues panel.
When a projectRef cannot be resolved, return a structured, isolated
per-project result (listIssues: { items: [], error: not_found };
getIssue: null) and spawn no glab subprocess. Behavior is unchanged when
a projectRef IS resolved (the scoped '-R' / 'api projects/...' path).
* fix(gitlab): recognize modern /-/work_items/<iid> issue URLs
Modern GitLab emits issue URLs as /-/work_items/<iid> in addition to the
legacy /-/issues/<iid>. The URL classifiers only matched /-/issues/, so
work-item-form issue links went unrecognized.
Extend the gitlab-links parsers (parseGitLabIssueOrMRNumber /
parseGitLabIssueOrMRLink, which also backs isWorkItemLookupText) and
isGitLabIssueUrl to accept /-/work_items/<iid>, mapping it to an issue
work item with the same project-path + iid extraction.
* fix(gitlab): thread connectionId into getGlabKnownHosts call sites
Follow the existing connectionId-threading pattern: pass the repo's
connectionId into every getGlabKnownHosts() call (client.ts,
work-item-details.ts, orca-runtime.ts) so the per-connection known-hosts
cache is keyed correctly and self-hosted hosts are discovered against
the right glab context.
* docs(gitlab): use generic example hosts in comments
* fix(gitlab): pass self-hosted host:port via GITLAB_HOST (glab --hostname rejects ports)
* polish: satisfy oxlint curly + oxfmt on merged gitlab port-recognition code
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Ptah-CT <auctor@xinfty.space>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: Orca <help@stably.ai>
* fix: detect valid repos when git rev-parse can't confirm
isGitRepo() has depended entirely on a successful `git rev-parse`
since 18ed7b27d, with catch blocks that collapse every failure into
"not a git repository". When that subprocess fails for a reason
unrelated to repo-ness — a transient spawn / git-shim hiccup in the
packaged app, main-process resource pressure, or a config-level error —
a real repository is silently downgraded to a plain folder. The folder
scanner already tolerates this via a `.git` marker, so the scan reports
"git_repo" but the subsequent addRepo throws, producing the spurious
"Open as Folder" prompt for a valid repo.
Keep `git rev-parse` as the authoritative positive signal, but on any
non-positive result fall back to a validated `.git` marker instead of
returning false: `.git` dir must contain HEAD, a `.git` file must point
at a gitdir, and bare roots need HEAD + objects/ + refs/. A garbage
`.git` file and an empty `.git/` are still rejected, preserving the
validation 18ed7b27d added. Logs a warning when recovery via the marker
happens so the underlying probe failure stays visible.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: address review feedback on repo detection
- isGitRepo: warn at most once per session when recovering a repo via
the .git marker, so a broken-git scan can't flood main-process logs.
- repo-detection test: delete PATH instead of assigning "undefined" when
it was originally unset, avoiding a corrupted PATH for later tests.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: harden git repo marker fallback
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
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>
* chore(lint): upgrade oxlint to 1.71 and enable 7 new rules
Upgrade oxlint 1.67.0 -> 1.71.0 (1.72 was blocked by the repo's 3-day
minimum-release-age supply-chain guard; nothing here needs it). The
bump is a no-op on the existing config.
Enable 3 error rules (backlog autofixed to zero in this commit) and
4 warn rules (surface signal without gating CI):
error (autofixed, behavior-preserving):
- unicorn/prefer-node-protocol (~1531 sites: bare builtin -> node:)
- typescript/no-import-type-side-effects (~36: all-inline-type -> import type)
- unicorn/no-array-reverse (19: copy-then-reverse -> toReversed)
warn (real signal, current fires are test-only/correct):
- unicorn/no-array-fill-with-reference-type (aliasing footgun guard)
- typescript/no-unsafe-function-type (bans bare Function type)
- unicorn/prefer-array-flat-map (map().flat() -> flatMap())
- unicorn/prefer-regexp-test (.match() in bool ctx -> .test())
mobile/.oxlintrc.json extends root, so it inherits all 7; the autofix
ran from root and covered mobile/ too.
Verification (all green): oxlint 0 errors (root+mobile+aux configs),
oxfmt clean, typecheck (node+cli+web), vitest 22795 passed / 0 failed,
builds (electron-vite + web + cli) succeed. node: rewrites confirmed to
skip embedded SSH/CLI string payloads (AST-only); all toReversed sites
verified to operate on fresh copies or write-once locals.
* chore(lint): bump mobile oxlint to 1.71 so inherited rules parse
mobile/ is a standalone pnpm project pinning its own oxlint@1.67, which
lacks unicorn/no-array-fill-with-reference-type (needs >=1.70). Since
mobile/.oxlintrc.json extends the root config, mobile CI's 'cd mobile &&
oxlint' failed to parse the new rule. Bump mobile to match root (1.71).
Verified in mobile/: oxlint 0 errors, oxfmt --check clean, tsc --noEmit
pass, vitest 978 passed / 0 failed.
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Orca <help@stably.ai>
* feat(source-control): show submodule diffs with lazy expansion
Dirty submodules now expand inline in Source Control to reveal their
inner changes, with file-level diffs that are read-only from the parent
worktree. Inner status is fetched lazily only when a submodule is
expanded, so status polling never recurses into (possibly nested)
submodules. Adds a submodule-status path across local and SSH runtimes
and git providers.
* feat(source-control): add compare-against-current-branch setting
Adds a global setting (default off) that defaults the Source Control
compare base to the current branch's upstream so the panel prioritizes
local changes instead of the full delta versus the repository default
branch. When the branch has no upstream, the compare view falls back to
working-tree-only. This affects only the compare/diff view; the Pull
Request and rebase merge target are unchanged.
* refactor(source-control): extract submodule status hook and entry-action gates
Moves the lazy submodule-expansion state into a useSourceControlSubmoduleStatus
hook and centralizes per-row stage/unstage/discard eligibility into
source-control-entry-actions, shrinking SourceControl.tsx and keeping the
read-only submodule rules consistent across the row UI, bulk actions, and tests.
The hook adds a generation guard so a slow submodule-status response from a
previous worktree (common over SSH) can't write stale status into the current
panel. On the relay side, configured submodule paths are read through a
short-TTL per-instance cache so a burst of diff clicks does not re-read
.gitmodules over the SSH link. Adds tests for the new modules.
* fix(source-control): address submodule/compare review feedback
- Degrade git.submoduleStatus to an actionable reconnect hint when an older
SSH relay lacks the RPC, mirroring clone()/worktreeIsClean fallbacks.
- Keep the branch-compare summary while upstream status is still loading so
it no longer flickers when switching worktrees with prefer-upstream on.
- Mark the compare-base switch as type="button" to avoid form submission.
- Add diff base / source control keywords to the Git settings search catalog.
- Assert the compare-base toggle's own switch state and updateSettings call.
* fix(source-control): address second-round submodule/compare review feedback
- Route submodule inner diffs through resolveSubmoduleWorktreePath so a
crafted .gitmodules path can't escape the selected worktree
- Clear statusReadsInFlight alongside the diff dedupe on git mutations so a
post-mutation getStatus() can't join a stale in-flight read
- Clear the SSH diff dedupe in getSubmoduleStatus to mirror getStatus
- Derive list-view selection from the submodule-injected rows so expanded
submodule children are selectable
- Refresh commit history when the upstream compare base changes
* Support staged submodule expansion and refine default compare base
- Support expanding and diffing staged submodule changes (HEAD vs index) independently of unstaged changes (index vs worktree).
- Track submodule expansion states using a compound key of area and path to prevent conflicts between staged and unstaged listings.
- Update the compare-against-upstream setting to a segmented control for the "Default Compare Base" policy.
- Fall back to the repository default branch when comparing a branch with no upstream, preventing comparison views from unexpectedly disappearing.
* Fix submodule staging behavior, WSL caching, and double-click toggles
- Namespace submodule path cache per WSL distro to prevent cross-distro
collisions.
- Preserve the staged area of child entries when expanding unstaged
submodules so staged inner changes do not open empty diffs.
- Prefix oldPath with the submodule path for renamed inner entries.
- Ignore click events where detail > 1 to prevent double-clicks from
instantly collapsing newly expanded submodules.
* Secure submodule path resolution and prevent stale status updates
* Extract and centralize submodule path validation into a new
`resolveSubmoduleWorktreePath` helper to prevent path traversal
exploits when resolving paths from untrusted `.gitmodules` files.
* Invalidate submodule expansion state and increment the query
generation whenever the active runtime environment or connection
route changes, preventing out-of-order responses from writing
stale data.
* Set git identity via CLI config options in test commits
- Extract test email and name into constants.
- Use `-c` config flags to pass user identity to `git commit` dynamically.
- This ensures commits succeed in submodule checkouts or CI environments
where a local or global identity is not configured.
---------
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
Add Project → Browse folder on a monorepo subfolder (e.g. /tmp/monorepo/packages/web)
stored the subfolder as Repo.path because isGitRepo() uses
`git rev-parse --is-inside-work-tree`, which is true for any subdirectory.
Authoritative worktree resolution then snapped activation back to the repo root,
so the import identity mismatched and the first terminal landed at the repo root
rather than the selected subfolder.
Canonicalize local git imports to the actual repo root via getGitRepoRoot()
(mirroring the SSH import path that snaps to check.rootPath, including its
post-resolution dedup), and preserve the user-selected subfolder as a one-shot
initial terminal cwd consumed only by the first activation-created pane.
Selecting the repo root applies no override, and re-importing a subfolder of an
existing project dedupes.
Supersedes community PR #6362.
Fixes#6336
Co-authored-by: Rod Boev <rodboev@users.noreply.github.com>
* Add test file for workspace delete bug
Co-authored-by: Orca <help@stably.ai>
* Fix Windows workspace deletion runtime resolution
Resolve project-created workspace deletion through the selected project runtime so Windows paths are listed strictly without falsely tripping the unregistered worktree guard.
Design doc: docs/delete-workspace-windows-unregistered.md
---------
Co-authored-by: Orca <help@stably.ai>
* Enable pushing to configured push targets for existing fork reviews
* Resolve push targets using branch.pushRemote, remote.pushDefault,
and URL-valued remotes normalized to matching named remotes.
* Support this push target resolution on both local and relay/SSH
git handlers to prevent drift in SSH worktrees.
* Offer "Push" instead of "Publish Branch" in the Source Control UI
when a linked review exists and a valid push target is available.
* Prevent pushing a feature branch's base branch (e.g. main) directly
to a fork via remote.pushDefault.
* Keep fork push target when contributor branch matches base branch name
Ensure that a fork push target is not incorrectly discarded when its
branch name matches the base branch name on another remote (for example,
targeting fork/main while the base is origin/main).
Previously, the matching logic only compared the branch leaf name, which
treated different remotes as identical and disabled the push target. We
now qualify the ref comparison with the remote name to differentiate them.
* Add Source Control Create PR intent flow
Implements the Source Control Create PR flow described in docs/source-control-create-pr-flow.md.
* Keep Commit visible beside Create PR
* Fix Create PR partial staging action band
* Integrate hosted review creation into Create PR intent flow
- Automatically create the pull or merge request on GitHub/GitLab after
successfully staging, committing, and pushing in the intent flow.
- Introduce a unified `updateCommitDrafts` helper to keep React state and
its ref synchronized, preventing draft-overwrite race conditions.
- Split primary action tests into focused files to satisfy the ESLint
`max-lines` rule.
- Replace hardcoded "Local Mac" strings with dynamic host labels.
* Support Azure DevOps and Gitea PR creation and limit large diffs
Implement automated pull request creation for Azure DevOps and Gitea
repositories. This includes REST API integration, credential checks via
environment variables, template support, and error classification.
Additionally, introduce limits on large diff payloads in git status
extraction to prevent renderer-freezing performance bottlenecks when
loading extremely large files.
* Skip source control refetches when PR creation intent is in flight
Avoid recomputing branch eligibility while isCreatePrIntentInFlight is true.
This prevents tearing down the PR composer or rotating dropdown hints
prematurely if ahead/behind or dirty states are temporarily perturbed
temporarily perturbed mid-flow.
* Expose manual prerequisite actions next to Create PR button
Previously, the Create PR intent only supported "Stage All" as a
sibling action. This expands prerequisite resolution to handle other
intermediate steps such as committing, publishing, and pushing
(including force pushing).
This ensures the edit-commit-push-review loop remains streamlined
directly within the CommitArea by displaying the specific required
next action beside the primary Create PR button.
* Move PR creation actions from CommitArea to sidebar header
- Decouples PR creation and PR intent actions from the local commit area
primary button, ensuring local/remote git actions remain primary.
- Renders a dedicated PR creation button in the source control header
beside the hosted review status.
- Simplifies CommitArea by removing prerequisite split-button rendering
and review composer logic.
* Delete source control create PR flow design document
Remove the design document for the source control create PR flow as the feature has been successfully implemented.
* Display PR creation errors in inline notice
Unify PR/review creation error reporting by replacing the duplicate
createPrErrors state with the shared createPrIntentNotice. Validation
and API errors are now shown directly within the visible inline alert
notice to improve layout consistency and visibility.
Also refactor the execution host platform label lookup to use simple
if statements instead of a switch block.
* Improve Create PR intent flow safety and provider awareness
- Integrate the hosted review composer directly into the Source Control
panel when a direct review creation action is available.
- Abort the in-flight PR creation intent flow early if the current git
branch changes to prevent staging or committing on the wrong target.
- Keep in-flight action labels provider-aware (e.g., "Create MR" on GitLab)
by passing hosted review inputs to the action resolver.
- Omit large diff text payloads from git status responses when line counts
exceed safe rendering limits to avoid UI performance degradation.
- Ensure field generation does not retarget the base branch of a PR/MR without
explicit user confirmation.
* Preserve PR and MR templates in AI pull request generation
- Preload templates (including GitLab merge requests) into the AI
context before generation to prevent bypassing provider-side fallbacks.
- Instruct the AI generator to fill out and preserve existing template
headings, required sections, and checklists instead of deleting them.
- Pass provider and template settings from the renderer to the backend
RPC and runtime handlers.
* Mock DropdownMenuShortcut in tab-title-tooltip test
Add a mock for the DropdownMenuShortcut component in the dropdown menu
mock to prevent test failures.
* Limit large git diff payloads in main process before IPC transfer
Move the large diff rendering limit check to a shared module so that
the main process can evaluate diff sizes before transferring them. If
a diff exceeds the limits, its text content is dropped prior to IPC
serialization, and only the limit metadata is sent. This prevents the
application from freezing or crashing when loading massive diff files.
* Gracefully handle and prune oversized files in diff viewer
Prevent UI freezes and out-of-memory errors when viewing or editing
extremely large diffs or files. Working-tree files above 10MB and git
buffer overflows are treated as binary. Text diffs exceeding safe
rendering limits have their contents pruned before IPC transport, and
the UI is updated to show fallback states and disable invalid saves.
* Document save action check for large diffs and fix test import
Explain why saveContentAvailable is required for oversized diffs, as
stripped text bodies before IPC prevent complete saves. Also update the
large-diff-render-limit import in E2E tests to use the shared path.
* feat: rename worktree folder to match branch on first work
When the first agent message auto-renames a freshly created creature branch to a
short, work-derived name, also align the on-disk worktree folder and the sidebar
display name with it. Re-key every worktree-scoped slice of state — renderer
store maps plus the persisted main-process state — through the resulting id
change so the live worktree survives the rename instead of being treated as a
deletion (its tabs, terminals, browser panes, and git status all follow).
The rename is best-effort and local-only: a skip or failure (remote runtime,
Windows lock, destination taken) leaves the folder as-is and never undoes the
branch/display rename that already landed.
Squashed from the original PR #4743 commits, rebased onto upstream/main to drop
accumulated merge commits and i18n formatting churn so the branch carries only
the feature diff:
- Rename worktree folder to match branch on first work
- migrate renamed worktree session ids
- keep the live worktree alive through a folder rename
- address PR review feedback
* Address PR review feedback (#4743)
- orca-runtime: emit in-process worktreesChanged client event on folder rename, mirroring notifyBranchRenamed so onClientEvent listeners aren't left stale
- worktrees: re-key rightSidebarExplorerViewByWorktree and activeWorkspaceKey through a worktree-identity rename (both were worktree-scoped but missed by buildWorktreeRenameState)
- branch-name-from-work: treat prefix-only model output as an empty slug so the caller skips the rename instead of producing a doubled prefix
- worktree-folder-rename-target: document why posix.dirname is safe (Windows filtered out earlier)
- tests for each of the above
* Extract branch rename test helpers to a separate harness file
Move git responders, mock builders, and test event fixtures out of
first-work-branch-rename.test.ts into a new test harness file. This
reduces file length and removes the max-lines ESLint disable directive,
complying with project style guidelines.
* Wrap entire OnboardingFlow in TooltipProvider
Enable the use of tooltips anywhere within the onboarding flow, rather
than restricting them to the step indicators.
---------
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
* feat: expandable commits and actions in the git history panel
Expand a commit row in the Commits panel to see its changed files inline; click a file to open that file's commit diff. Author and date surface on expand, so the dense row itself stays subject-only.
Right-click a commit for: open in the in-app browser, copy hash, copy message, and explain changes (spawns the default agent seeded with the commit context).
Open-in-browser resolves the provider commit URL in the main process via a new remoteCommitUrl resolver (GitHub/GitLab/Bitbucket), mirroring the existing remoteFileUrl chain end-to-end (repo, IPC, SSH provider, runtime RPC, preload) so it works for local and SSH/remote workspaces.
Layout: subject-first single-line rows with a tighter graph, refs moved inline, and local/remote ref pills deduped when they point at the same commit.
* fix: address git history review feedback
* fix: address PR review feedback on the git history panel
- Trim commit SHA before building the remote URL so whitespace input returns null instead of an invalid %20 URL.
- Gate commit-row expansion on the file loader (onLoadCommitFiles) so a row can't expand into a perpetual loading state.
- Harden the explain prompt: treat the commit subject and diff as untrusted data and run git show --no-ext-diff.
- Keep ambiguous multi-segment remote refs instead of mis-deduping them against a local branch.
- Use standard 10-char i18n keys for the new commit-history strings and translate them into es/ja/ko/zh.
* refactor: extract commit-history actions into useGitHistoryCommitActions hook
Moves the commit load/open/context-menu action callbacks (and the per-commit compare cache) out of SourceControl.tsx — which already carries a max-lines disable — into a focused hook, addressing the PR review nitpick. Behavior is unchanged.
* Refine git history row rendering, ref deduplication, and OID validation
- Prevent deduplication of remote branch badges in the history view
when multiple remotes exist or when a ref is explicitly preserved.
- Render GitHistoryRow as an accessible button with dynamic ARIA labels
for expansion states.
- Add double-click handler on commit files to open them permanently.
- Validate commit SHAs as full 40-character Git object IDs before
requesting remote commit URLs.
---------
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
* Prevent main-process crash on huge git status output
git status on a repo with an enormous un-ignored folder could emit a
listing large enough that buffering it into one string exceeded V8's
max string length, throwing an uncatchable RangeError inside Node's
execFile exit handler and crashing the main process (and blocking
mobile). The runner also forwarded an undefined maxBuffer straight to
execFile, which silently disabled the cap entirely.
- runner: apply a non-bypassable default maxBuffer so no git call can
buffer without a bound.
- status: stream porcelain-v2 output through an incremental parser and
kill git the moment the changed-entry count crosses a limit
(default 10,000); skip numstat/upstream probe when limited. Apply the
same limit to the relay/SSH status path.
- UX: surface a 'too many changes' state, pause auto status polling
while a repo is over the limit, and offer to .gitignore a detected
huge folder.
Co-authored-by: Orca <help@stably.ai>
* Address review: validate inputs, fix stream decoding, localize copy
- huge-folder-ignore: restrict folderName to the known-folder allowlist
before writing .gitignore (reject path-sep/newline injection).
- gitStreamStdout: decode stdout/stderr with StringDecoder so multibyte
UTF-8 split across chunk boundaries isn't corrupted; flush on cleanup.
- gitStreamStdout: wrap the onStdout callback in try/catch so a throwing
parser rejects the promise instead of crashing the main process.
- status/relay: validate the status limit as a non-negative integer.
- SourceControl: localize the 'too many changes' banner and the
.gitignore warning toast via translate() with placeholder params.
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Orca <help@stably.ai>
* 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>
Detect when git push operations fail due to un-pushed or out-of-sync
submodules, and extract the specific submodule name to provide clear,
actionable guidance to the user.
Additionally, update the Source Control error UI to allow better text
wrapping and word-breaking for detailed error alerts.
- 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.
* Suggest enabling local-main freshness when a new workspace finds it stale
Adds a "Keep Local Main Up to Date" suggestion path: when the setting is
off and a new workspace's local base branch is behind its remote, Orca
surfaces a one-time, dismissible toast nudging the user to enable it. The
toast is sticky (no auto-expire) so it can't be missed, with explicit
Turn On / Dismiss actions; dismissing (button, close X, or swipe) persists
localBaseRefSuggestionDismissed so the nudge — and its backend probe —
never runs again.
Also refactors the refresh logic so the advisory and mutating paths share
one fast-forward-safety evaluator, adds an SSH relay RPC for the ref
mutation, and fixes remote-tracking base parsing for fully-qualified refs.
Co-authored-by: Orca <help@stably.ai>
* fix: restore update-ref fast-forward for un-checked-out local base ref
The refactor that split refresh into evaluate + mutate dropped the
non-owner case: a local base branch checked out in no worktree was left
stale (return undefined) instead of fast-forwarded. Restore it across all
three layers — local evaluator/mutator, SSH evaluator, and relay handler
(which also removes the dead duplicated throw) — using the expected-old-OID
compare-and-swap form of update-ref so a concurrent ref move is a no-op.
The suggestion toast now also fires for this case.
Co-authored-by: Orca <help@stably.ai>
* refactor: restore resultBase spread in local-base-ref mutators
The evaluate/mutate split spelled out { baseRef, localBranch, status }
literally in the mutating paths; main used a resultBase spread. Restore
that pattern in both the local and SSH mutators — behavior-preserving,
collapses two identical skipped_error returns.
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Orca <help@stably.ai>