Commit Graph
1707 Commits
Author SHA1 Message Date
ac3ab72b52 fix(jira): surface issue-search failures instead of a misleading empty list (#5958)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-06-22 20:27:38 -07:00
1f164daf71 Reduce git trace and branch compare polling churn (#6002)
* fix: bound git trace volume

* fix: reduce branch compare polling churn

* test: add benchmark artifact comparison tooling

* fix: address benchmark and polling review comments

* fix: keep branch compare fresh and harden benchmark reports

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

* Tighten benchmark annotations and polling cleanup

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

* Handle missing git status heads in Source Control tests

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

---------

Co-authored-by: Wolfgang Schoenberger <221313372+wolfiesch@users.noreply.github.com>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
2026-06-22 19:13:32 -07:00
Ricardo Sawir cea8d97aec Stop directory pickers creating typed prefixes (#6114) 2026-06-22 19:09:45 -07:00
Ricardo Sawir 4df2b800b6 Support SSH file copy to OS clipboard (#6110)
* Support SSH file copy to OS clipboard

* Address SSH clipboard staging feedback
2026-06-22 18:36:37 -07:00
ae3d088e5e fix: Persist custom macOS dock icon (#6088)
* Persist custom macOS dock icon

* Warn on dock icon metadata clear failures

* Harden macOS dock icon persistence

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-22 18:01:37 -07:00
Neil c2353fd98c Tune terminal scroll defaults (#6068)
* Tune terminal scroll defaults

* Align TUI mouse wheel scrolling

* Add terminal scroll speed controls
2026-06-22 17:30:50 -07:00
44935d4ccb Fix remote Node.js detection for nvm, mise, asdf, and volta (#6037)
* Fix remote Node.js detection for nvm, mise, asdf, and volta

Remote Node resolution failed when node was installed via a version
manager (nvm with custom NVM_DIR, mise, asdf, volta) or when the user's
login shell was zsh/fish rather than bash.

Root cause: the SSH exec transport runs every command under /bin/sh,
which never sources shell init files. The only init-aware path was a
hardcoded `bash -lc` fallback that missed zsh/fish users and was never
reached for the newer version managers. nvm was handled by guessing
~/.nvm (breaking custom NVM_DIR), and mise/asdf/volta had no probes at
all. There was also no version gate, so nvm's highest-version glob
could return Node 8/10/12 and crash the relay on launch.

Fix: resolve via the user's own $SHELL as a login shell first (the only
path that runs nvm.sh / mise activate / asdf.sh init hooks), then fall
back to direct path probes for all major managers (nvm respecting
$NVM_DIR, fnm, mise, asdf, volta, n) plus system locations. Every
candidate is version-checked against the relay's Node 18+ requirement
before being accepted.

* Address CodeRabbit review: probes-first, no || short-circuit

- Reorder to path-probes first (deterministic, doesn't depend on shell
  rc-file semantics where bash -lc skips .bashrc and zsh -lc skips
  .zshrc — exactly where nvm/mise/asdf hooks live).
- Join probes with newlines instead of || so an empty
  `ls | sort -V | tail -1` (exit 0) doesn't mask later probes.
- Deduplicate candidate paths before version-checking.
- Drop unreachable mock and fix misleading $SHELL-unset test name.
- Login shell is now a fallback for custom ~/.profile PATH setups.

* Fix remote Node path probing portability

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-22 16:46:47 -07:00
Jinwoo Hong a0d9505ba5 Fix SSH terminal replay artifacts
Fix SSH reconnect replay ownership and add a Docker-backed regression harness for terminal replay artifacts.
2026-06-22 16:42:20 -07:00
Jorge SilvaandJinwoo Hong 1fde7f553c fix(agent-hooks): wrap Windows hook commands in cmd.exe to survive spaces in profile path (#6078) (#6083)
* fix(codex): wrap Windows hook command in cmd.exe to survive spaces in profile path (#6078)

Windows splits raw hook commands on whitespace, so a user profile path
like `C:\Users\Jane Doe` made Codex hooks exit with code 1. Add a
wrapWindowsHookCommand helper that invokes the .cmd through
`cmd.exe /d /c call "..."` and use it in getManagedCommand.

* fix(agent-hooks): wrap Windows hook command in cmd.exe for all agents with raw .cmd path (#6078)

Apply the wrapWindowsHookCommand helper to cursor, command-code, gemini,
grok, and droid, which shared the same raw-scriptPath-on-Windows pattern
as codex. A user profile path with a space (e.g. `C:\Users\Jane Doe`)
used to split at the space and fail with exit code 1.

Agents that already handle spaces correctly are left untouched:
- claude/openclaude (Git Bash + forward slashes)
- copilot (PowerShell with quoted path)
- kimi (Git Bash + forward slashes)
- antigravity (event-specific wrapper .cmd files)
- devin (already wraps via `cmd /d /s /c ""...""`)

Each fixed agent gets a Windows-only test asserting the cmd.exe wrapping
survives spaces in the profile path.

* fix(claude): wrap Windows hook command in cmd.exe to survive spaces in profile path (#6078)

Claude Code runs hooks through Git Bash on Windows. The previous
forward-slash trick only works when the path has no spaces — Git Bash
splits `C:/Users/Jane Doe/...` at the space and tries to execute
`C:/Users/Jane` as a command. Use wrapWindowsHookCommand so the .cmd is
invoked through `cmd.exe /d /c call "..."`, which Git Bash treats as one
argument. Applies to both Claude and OpenClaude (shared getManagedCommand).

* Harden Windows agent hook launcher

---------

Co-authored-by: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com>
2026-06-22 16:04:01 -07:00
185175a198 fix(jira): send non-browser User-Agent to avoid XSRF 403 on issue search/create (#5957)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-06-22 15:36:54 -07:00
b98fd2ff8b feat: copy a file from the explorer to the OS clipboard (#5990)
* feat: copy a file from the explorer to the OS clipboard

Add a "Copy" action to the file explorer context menu that puts the
actual file on the system clipboard, so pasting in Finder/Explorer/a
file manager drops the file itself instead of its path as text.

- macOS: write a public.file-url buffer; Finder synthesizes the legacy
  file types it needs for paste.
- Windows: Set-Clipboard -LiteralPath populates the CF_HDROP file drop
  list that Explorer pastes as a file.
- Linux: best-effort, picked by desktop — text/uri-list on KDE,
  x-special/gnome-copied-files on GNOME-family — via wl-copy or xclip.
- Local files only; the action is hidden for remote/SSH files and the
  web client, where no OS clipboard reference is possible.

The platform logic never throws: failures resolve to a structured
result and the renderer surfaces an error toast.

* Review copy-file clipboard safety

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-22 15:02:38 -07:00
Jinwoo HongandOrca 5549ed9c87 Fix open-in launcher path classification (#6098)
Co-authored-by: Orca <help@stably.ai>
2026-06-22 13:49:08 -07:00
Brennan Benson 3cc610bcc3 Keep closed tab agents from reappearing (#6095) 2026-06-22 13:36:05 -07:00
65e2bd0557 Fix floating workspace terminal selector_not_found on a remote runtime (#5946)
* Fix floating workspace terminal selector_not_found on a remote runtime

resolveWorktreeSelector threw selector_not_found for the floating-terminal
sentinel id (global-floating-terminal) because it is a repo-less synthetic
session with no entry in the worktree catalog. A remote client paired to this
serve sends that sentinel, so the normal id: lookup failed and the floating
pane rendered black. Resolve the sentinel (bare and id:-prefixed) to a virtual
ResolvedWorktree rooted at the serve user's home so the PTY spawns in a real
existing dir; unknown id selectors still throw selector_not_found. Adds two
regression tests.

Rebased onto current main (was 75 commits stale); net delta unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Scope floating terminal selector to terminal launches

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>
2026-06-22 13:33:37 -07:00
JinHyeok Jeong e253d46e72 Harden mobile session tab sync
Harden mobile session-tab snapshot reconciliation and terminal creation. Rejects stale mobile snapshots, tombstones locally closed tabs until the publisher catches up, rolls back half-created terminal tabs when their surface never appears, and scopes terminal-create idempotency by worktree.
2026-06-22 13:31:10 -07:00
Jinjing 36f8056446 Resolve and clear push targets for linked hosted reviews (#6092)
* Resolve push targets for linked hosted reviews

Automatically resolve and persist push targets for linked GitHub PRs
and GitLab MRs to align source control actions with the review branch.

- Add `ensureHostedReviewPushTarget` to hydrate missing push targets
- Implement GitLab MR push target resolution alongside GitHub PRs
- Block actions from fallback to unrelated upstreams while resolving
- Prevent duplicate concurrent API lookups with in-flight tracking

* Clear stale review push targets when unlinking or replacing reviews

- Ensure unlinking a hosted review or replacing it with another provider
  properly clears the previously associated push target, preventing pushes
  from being steered to outdated review heads.
- Encode explicit push target clears as null over JSON-RPC to bypass the
  automatic omission of undefined properties during transit, then map them
  back to undefined in the main runtime database.
- Add stricter validation to ensure pull request and merge request IDs are
  positive integers, ignoring invalid or dummy numbers like zero.
2026-06-22 11:15:09 -07:00
Jinwoo Hong c6ff9751fa Hide Codex worker sessions from history (#6062) 2026-06-22 05:22:06 -04:00
Jinwoo HongandOrca 24000561b4 Classify Claude CLI usage shell failures (#6065)
Co-authored-by: Orca <help@stably.ai>
2026-06-22 00:58:32 -07:00
Jinwoo Hong a2e0bbc5f6 Fix early PTY startup output races (#6015) 2026-06-22 02:48:45 -04:00
Jinwoo Hong 52f45b3559 Handle literal Codex hook trust keys (#5872) 2026-06-21 23:33:57 -07:00
Jinjing fc254deef5 Default new worktree card style on for fresh profiles (#6047)
Enable `experimentalNewWorktreeCardStyle` by default on new profiles where
onboarding is open, or when creating a brand-new config file.

- Avoids visual disruption for existing users who already completed
  onboarding by keeping the old style active for them.
- Preserves explicit user opt-outs during migrations and CLI updates.
- Ensures the offline CLI handler mirrors this logic when creating the
  initial configuration file before the desktop client loads.
2026-06-21 22:35:48 -07:00
Jinwoo Hong d9b2d89406 Fix Windows NeoVim open-in launcher (#6026) 2026-06-21 21:57:33 -04:00
Brennan BensonandOrca 36bdd06aa8 Prevent duplicate startup command echoes (#6023)
Co-authored-by: Orca <help@stably.ai>
2026-06-21 18:51:44 -07:00
Brennan BensonandOrca 8228155e4d Improve preserved branch cleanup after squash merges (#6014)
Co-authored-by: Orca <help@stably.ai>
2026-06-21 18:48:59 -07:00
Jinwoo Hong 551b370085 Fix WSL agent session history (#6010) 2026-06-21 17:23:42 -07:00
Brennan BensonandOrca fe8fe16c83 Preserve agent settings when sleeping sessions resume (#5916)
Co-authored-by: Orca <help@stably.ai>
2026-06-21 16:44:58 -07:00
Brennan BensonandOrca d517bb7250 Restore agent history after worktree renames (#6000)
Co-authored-by: Orca <help@stably.ai>
2026-06-21 15:48:33 -07:00
Jinwoo HongandOrca 32e6ab7655 Fix mobile workspace list parity (#6001)
Co-authored-by: Orca <help@stably.ai>
2026-06-21 15:11:55 -07:00
Jinwoo HongandOrca 530f98d945 Improve Claude usage refresh fallback behavior (#5995)
* Match CodexBar Claude usage fallback behavior

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

* Remove external tracker references from Claude usage changes

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

* Allow CLI fallback when Claude Keychain is unavailable

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

* Stabilize updater prerelease promotion test

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-21 13:10:25 -07:00
Jinjing 954fa0a65e Prevent auto-reloading diff views when status area shifts (#5951)
* Avoid auto-reloading single-file diff tabs if their status row has
  moved to a different area (e.g. from unstaged to staged).
* Prevent auto-reloading combined uncommitted diffs when they are
  backed by an uncommitted entries snapshot.
* This preserves the open tab's original diff context as staging and
  commit status changes, preventing useful context from being lost.
2026-06-20 18:52:04 -07:00
Jinjing 89eb4b3f55 fix: show merged PR for current branch head (#5877) 2026-06-20 17:56:38 -07:00
Jinjing 16347ab799 Handle clean local merges when hosting provider reports conflicts (#5942)
When the hosting provider (GitHub) reports conflicts but a local merge
simulation is clean, we now mark the conflict summary as locally clean.

This state is surfaced in both the desktop and mobile sidebars with a
clear explanation and a copyable set of commands to trigger a remote
mergeability recalculation via an empty commit and push.
2026-06-20 17:08:58 -07:00
Jinjing fe7cf01c51 Track update check attempts and handle stalls (#5904)
* Track update check attempts to prevent stale races and handle stalls

- Sequence each update check with an attempt ID to prevent stale event handlers (like async changelog fetches) from overwriting newer check states.
- Introduce a 45-second timeout to gracefully fail or retry hung update checks that stall before reaching updater events.
- Settle checks with a brief grace period when the updater promise resolves without firing a terminal event.

* Ignore update-available events when no active check attempt exists

Prevents processing stale events from the auto-updater after a silent
background check has already settled, which could otherwise overwrite
more recent check states or trigger unexpected status transitions.

* Ignore stale electron-updater events from previous check attempts

Introduce attempt tracking to bind emitted updater events to the active
update check. This prevents stale events (such as checking, available,
not available, or errors) from previous checks or preflight stages
from triggering false state transitions or duplicate status updates.

- Track the launched and active attempt IDs during update preflight
- Ignore events if their attempt ID does not match the active check
- Allow error events to propagate during active download/install phases
- Clear pending nudge campaigns on silent follow-up checks settling to not-available
2026-06-20 16:39:42 -07:00
Jinjing 404e45f022 Improve built-in browser downloads (#5940)
* Improve built-in browser downloads

Implements docs/browser-normal-download-behavior.md with automatic OS Downloads saving, collision-safe destinations, and renderer download controls.

* Clean up browser downloads on tab closure and guest destruction

- Cancel and drop pending download records when webview guests are destroyed or closed to prevent memory leaks and dangling state.
- Purge tracking entries for cancelled downloads lacking an active tab.
- Document filename normalization and reservation assumptions in download builder.
- Translate "Copy Terminal ID" context menu action in Spanish and Chinese locales.
2026-06-20 16:33:20 -07:00
Siddiqui Qamar 8c6ce31036 fix: narrow rate-limit provider config
Narrow RateLimitService provider config wiring so OpenCode Go receives provider-specific config while Gemini keeps its OAuth-enabled setting through a separate resolver.\n\nValidated locally with the full src/main/rate-limits test suite and typecheck.
2026-06-20 15:28:12 -07:00
Jinjing 97dc6d63e3 Accept merged fallback PRs during branch lookup (#5908)
Ensure that when a visible fallback PR has been merged (e.g., outside
Orca with a deleted head branch), it is still accepted and refreshed by
branch lookup instead of being discarded as an implicit merged PR.

* Add `acceptMergedFallbackPR` option to GitHub branch lookups
* Enable this option during manual and background refreshes of fallback PRs
* Plumb the new option through preload APIs, IPC handlers, and RPC protocols
2026-06-20 03:30:18 -07:00
Jinjing 1419193bea Add explicit task title and display name to orchestration tasks (#5901)
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.
2026-06-20 03:29:21 -07:00
JinjingandOrca 553d47bf4f Fix Windows workspace deletion runtime resolution (#5888)
* 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>
2026-06-20 03:16:29 -07:00
Jinjing dd8c78c129 Revert "Show worktree delete icon on sidebar row hover" (#5874)
This reverts commit ce253354fe.
2026-06-19 20:48:57 -07:00
Brennan BensonandOrca 8264cd2416 Send notes to working agents (#5748)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 20:30:51 -07:00
Brennan Benson d6cb38b45a Keep Codex terminal transcripts readable during redraws (#5858) 2026-06-19 19:49:54 -07:00
067c88fe55 feat(source-control): make group order configurable (#2188)
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-06-19 18:50:05 -07:00
Jinwoo HongandOrca 7320c1e8ba Show Codex reset credit expiry (#5865)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 18:49:22 -07:00
Trevin Chow ce253354fe Show worktree delete icon on sidebar row hover
Reveals the standard workspace delete action from sidebar rows on hover or keyboard focus, while keeping primary/main worktrees protected.

Maintainer follow-up:
- prevent hidden delete buttons from receiving pointer events
- merge latest main and resolve localization conflict

Validated with CI PR Checks plus local typecheck, lint, Vitest, and Electron hover/focus/delete-confirmation checks.
2026-06-19 17:43:12 -07:00
Jinwoo Hong 972078f2c4 Fix paste ownership, input bounds, and IPC validation
Supersedes #5745, #5746, and #5747.
2026-06-19 17:14:55 -07:00
slashdevcorpseandbrennanb2025 6f6664e744 Validate shell openPath targets (#5830)
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-06-19 17:10:43 -07:00
Jinwoo HongandOrca 8ef8596ba1 Fix remote browser/editor tab props persistence (#5847)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 17:01:10 -07:00
Prethish Kumar 21d0391881 fix(kimi): map AskUserQuestion to waiting and expose hook status
Maps Kimi AskUserQuestion PreToolUse events to waiting, exposes the Kimi hook status IPC/preload surface, and hardens Kimi session parsing plus remote hook path construction.
2026-06-19 16:45:34 -07:00
Neil 4eb3e75b9e feat(kimi): Kimi Code sessions in AI Vault + agent status hooks
Adds Kimi Code session parsing for AI Vault and managed Kimi agent status hooks.
2026-06-19 16:42:59 -07:00
Jinwoo HongandOrca 3afed388fc fix: expose terminal visual layout and copyable handles (#5845)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 15:42:13 -07:00