Commit Graph
4772 Commits
Author SHA1 Message Date
Jinwoo-HandOrca 3577c0116c Address review: worker error handling + awaited shutdown drain (#5308)
- file-watcher-worker: add a .catch to the per-batch stat mapping chain so a
  throwing postMessage/stat surfaces as an error+overflow instead of crashing
  the worker with an unhandled rejection. Factored the error+overflow emit into
  reportWatchError().
- file-watcher-host: the disposer is now async and awaits worker.terminate(),
  so awaitRuntimeFileWatcherUnsubscribes() doesn't resolve until the worker is
  actually down (the shutdown-drain guarantee the tracking machinery provides).

Co-authored-by: Orca <help@stably.ai>
2026-06-13 10:42:01 -07:00
Jinwoo-HandOrca b299d8c6bb Run the file watcher off the main process; make git non-interactive (#5308)
Root-cause replacements for the earlier timeout-based stopgaps.

Watcher: @parcel/watcher's Linux/Windows brute-force backend recursively
walks the whole tree on a libuv threadpool thread before subscribe()
resolves. In the main/serve process that crawl (huge non-git home dir on
NFS) starved the shared 4-thread libuv pool, so static-asset serving and
RPC crypto — everything else needing that pool — hung while the event loop
stayed alive. Move the watcher into a worker thread (file-watcher-worker.ts
+ file-watcher-host.ts), mirroring the existing theme-parser/STT workers.
The crawl now runs on the worker's own libuv pool and cannot starve the
main process by construction — no timeout needed. The per-event stat
fanout stays bounded (8 concurrent) inside the worker; worker crash/error
surfaces an overflow so the client refreshes. SSH watching (remote host)
and the Windows fs.watch path are unchanged.

Git: drop the default timeout; instead force non-interactive execution
(GIT_TERMINAL_PROMPT=0, empty GIT/SSH_ASKPASS, ssh BatchMode=yes) so a
read-path call that hits a credential/host-key prompt fails fast instead
of blocking on stdin forever. BatchMode does not change host trust.

Verified end-to-end against the built worker under the Electron runtime:
native @parcel/watcher loads in the worker, a real fs change is delivered
as an FsChangeEvent, and unsubscribe/terminate is clean.

Co-authored-by: Orca <help@stably.ai>
2026-06-13 01:19:20 -07:00
Jinwoo-HandOrca 4336379f5c Bound the file-watcher initial crawl to prevent threadpool starvation (#5308)
On Linux/Windows @parcel/watcher uses a brute-force backend that
recursively walks the entire tree on a libuv threadpool thread before
subscribe() resolves. Opening a large folder backed by slow storage (a
home directory on NFS) as a worktree and watching it (file explorer) can
make that crawl run for minutes, holding a threadpool slot and starving
every other async fs/crypto op. On the headless serve runtime this wedges
all clients — even a static HTTP asset (which needs fs.stat +
createReadStream on the same pool) returns 0 bytes and times out. This
matches the os:linux + NFS + non-git-home-dir trigger in #5308.

- Race the initial subscribe() against a 15s timeout; on timeout the watch
  fails cleanly (explorer still works via manual reads, just no live
  updates) and the slow subscription is dropped if it ever resolves.
- Bound the per-batch stat() fanout to 8 concurrent calls so an event
  burst can't occupy every threadpool thread at once.

This complements the git-runner default timeout: together they close the
two ways the non-git-folder-as-worktree trigger could starve serve.

Co-authored-by: Orca <help@stably.ai>
2026-06-13 00:27:09 -07:00
Jinwoo-HandOrca 5204a56873 Cap hung read-path git commands with a default timeout (#5308)
A git subprocess that never exits — waiting on a credential/stdin prompt,
or stuck on a wedged NFS/network filesystem under its cwd — left
gitExecFileAsync pending forever. On the headless `serve` runtime these
read-path calls (worktree list, status, rev-parse) pile up with no
timeout, the libuv subprocess slots stay held, and the runtime stops
answering every client. Opening a large non-git folder (e.g. a home dir)
as a worktree and starting an agent in it reproduced this.

Give gitExecFileAsync a 60s default timeout when the caller sets none,
while exempting legitimately long-running network subcommands
(clone/fetch/pull/push/remote/submodule/lfs) so large-repo transfers
aren't killed mid-flight. Explicit caller timeouts (including an explicit
0 opt-out) are honored verbatim.

This also breaks the reconnect boot-loop: a re-hung worktree's git calls
now self-resolve at the ceiling instead of looping forever.

Co-authored-by: Orca <help@stably.ai>
2026-06-13 00:15:32 -07:00
Jinwoo HongandOrca 90121fb518 Add Enable auto-merge action to PR merge dropdown (#5296) (#5309)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 23:57:49 -07:00
Brennan BensonandOrca 970b919035 Align Source Control action buttons (#5305)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 20:31:09 -07:00
Brennan BensonandOrca d09a3e5591 Confirm Linear setup after Re-check (#5300)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 20:22:23 -07:00
Jinwoo HongandOrca c455c576ae Fallback to system SSH on reachability errors (#5303)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 20:06:20 -07:00
github-actions[bot] 0b318882f3 release: v1.4.66-rc.1 v1.4.66-rc.1 2026-06-13 01:24:06 +00:00
Brennan Benson 98465e0f49 Suppress decorative agent title churn (#5294) 2026-06-12 18:22:22 -07:00
Brennan BensonandOrca 5dc05e2bd2 Improve Warp custom theme discovery (#5287)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 18:09:06 -07:00
Jinwoo HongandOrca 71bfbbf840 Fix rich markdown image paste bloat (#5290)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 16:48:09 -07:00
Jinwoo HongandOrca 630bcce530 fix: replace per-5s full-buffer terminal checkpoints with an incremental log (#5292)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 16:31:24 -07:00
a3478c9f1c Add keyboard shortcuts to launch agent tabs (default agent + per-agent bindings) (#5214)
* Add keyboard shortcuts to launch agent tabs

Cmd+T opens a plain terminal tab, but launching an agent in a new tab was
mouse-only (tab bar + menu). This adds:

- tab.newAgent ("New agent tab"): launches the default agent in a new tab
  in the active workspace. Default chord Cmd+Alt+T on macOS; unassigned on
  Windows/Linux (AltGr / desktop-terminal chord conflicts), bindable in
  Settings. Resolves the agent via the configured default when detected
  and enabled, otherwise the shared auto-pick order; a 'blank' default
  falls through to auto-pick since an explicit agent chord wants an agent.
- tab.newAgent.<id>: one bindable action per TUI agent so each enabled
  agent can sit on its own chord. All ship unassigned. Settings →
  Shortcuts shows them in a new "Agents" group, hiding disabled agents;
  a per-agent chord launches its agent even when detection hasn't
  confirmed the binary (explicit request fails visibly in the tab).

Launches go through launchAgentInNewTab (same path as the tab-bar quick
launch) with launch_source 'shortcut'. Agent display names move to a
shared module so the keybinding registry can title the generated actions
without importing renderer code. groupDefinitions moves out of
ShortcutsPane.tsx to keep it under the max-lines lint cap.

* Fix recording Option-composed shortcuts on macOS

On macOS, Option changes the produced character (Cmd+Alt+C reports
key 'ç'), so the shortcut recorder rejected Alt combos with 'Press a
key, not only a modifier'. Capture now falls back to the physical key
code when Alt is held, matching the existing matcher behavior.

* fix: ignore disabled agent shortcuts in conflict checks

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

* fix: align mac option shortcut capture with matching

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-12 16:28:49 -07:00
Jinwoo Hong 5087facefb Fix Windows task issue header overlap (#5295) 2026-06-12 19:27:17 -04:00
Jinwoo Hong bb51bc9ae6 Fix Linux dock window class (#5293) 2026-06-12 19:13:19 -04:00
Jinwoo Hong 55db0ab12e Fix Windows multiline terminal paste (#5291) 2026-06-12 19:12:08 -04:00
Yang,Zhou 74e2c952f1 feat: add Devin CLI as supported TUI agent (#5282)
* feat: add Devin CLI as supported TUI agent

Register Devin across shared agent config, telemetry, desktop/mobile
catalogs, localization, and README. Uses stdin-after-start prompt
delivery with --permission-mode bypass default args.

* test: assert Devin default --permission-mode bypass in startup plans
2026-06-12 16:10:09 -07:00
Jinwoo HongandOrca 6837cca9f3 Fix Tasks PR detail drawer and GitHub attachment videos (#5288)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 16:02:09 -07:00
github-actions[bot] 46dbedff86 release: v1.4.66-rc.0 [rc-slot:2026-06-12-15] v1.4.66-rc.0 2026-06-12 22:36:19 +00:00
d538549bb5 Fix markdown preview links routing to system browser instead of Orca (#5265)
* Fix markdown preview links opening in system browser instead of Orca

In the markdown preview, a plain (or Cmd/Ctrl) click on an http/https link
called window.api.shell.openUrl() directly, which always routes to
shell.openExternal (the OS default browser). It bypassed openHttpLink, so a
plain click could never open in the Orca built-in browser, regressing the
behavior from #987. The Cmd/Ctrl+Shift escape hatch was already correct.

Route both http click paths through openHttpLink via a new
resolveMarkdownPreviewHttpOpenOptions helper that centralizes the
cross-platform modifier decision (Cmd on Mac, Ctrl on Linux/Windows):
- plain / Cmd-click -> { worktreeId } -> Orca browser (per openLinksInApp),
  falling back to the system browser when the setting is off, no worktree is
  known, or a remote runtime is active.
- Cmd/Ctrl+Shift-click -> { forceSystemBrowser: true } -> system browser.

The remote/SSH case is handled inside openHttpLink (http stays on the client
system browser; file:// blocking is unchanged).

Adds a happy-dom interaction test that renders the real component and fires
real modifier clicks, plus full modifier-matrix coverage for the helper.

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

* review: share markdown preview link modifier logic

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-12 15:20:51 -07:00
Brennan BensonandOrca 5f0a4fc5f3 Add left sidebar appearance setting (#5280)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 15:00:28 -07:00
b8a899edb1 fix: browser url preview with arrow navigation [#5113] (#5221)
* fix: browser url preview with arrow navigation

* Fix browser autocomplete preview cancel

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-12 14:44:25 -07:00
Carlos Baraza 1205457d53 feat(mobile): paste clipboard images into terminals (#5264) 2026-06-12 14:37:43 -07:00
Brennan BensonandOrca abb2477efb Fix tab agent identity detection (#5283)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 14:15:27 -07:00
Jinwoo Hong 5f3b61aa65 Fix WSL agent setup to use the distro login shell (#5285) 2026-06-12 17:01:34 -04:00
Jinwoo HongandOrca ebeb12fedc fix: distinguish remote project paths by SSH connection (#5279)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 13:40:51 -07:00
github-actions[bot] 011ea0db34 release: v1.4.65-rc.3 v1.4.65-rc.3 2026-06-12 20:30:18 +00:00
Brennan BensonandOrca 74c961b09f Add Linear write commands for agents (#5165)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 13:29:13 -07:00
github-actions[bot] a2aff47aca release: v1.4.65-rc.2 v1.4.65-rc.2 2026-06-12 19:18:38 +00:00
Jinjing b81f06203d Defer project header pointer capture until drag threshold is crossed (#5278)
This allows simple clicks on the repository header to still reach the
inner collapse handler on pointerup. Additionally, body cursor and
user-select styles are only applied when actual dragging begins,
rather than when the session is armed.
2026-06-12 12:17:50 -07:00
Jinwoo Hong dc8fdf65a3 Update Android mobile release links to 0.0.13
Point Android download links at the published mobile-v0.0.13 release.
2026-06-12 12:02:58 -07:00
Jinjing 18fdcf0b05 fix: clarify Korean terminal link routing label (#5277) 2026-06-12 12:02:15 -07:00
Jinjing d2a3f12baa fix: address review findings (#5275) 2026-06-12 11:43:39 -07:00
github-actions[bot] 528a9292aa release: v1.4.65-rc.1 mobile-v0.0.13 v1.4.65-rc.1 2026-06-12 18:22:56 +00:00
Jinjing 5ca63c85d7 fix: address review findings (#5273) 2026-06-12 11:20:43 -07:00
Jinjing dccea75b0e Fix active tab scrolling and editor keyboard layout on mobile (#5271)
* Improve mobile session tab scrolling and editor keyboard layout

- Auto-scroll the active session tab into view within the horizontal
  tab strip, using a new layout-aware utility with minimal scrolling.
- Use visual viewport measurements in the editor WebView to accurately
  report keyboard insets and lift floating controls above the keyboard,
  as native events can under-report covered areas.

* Fix active tab scrolling and normalize editor keyboard inset

- Ensure the active session tab is scrolled into view immediately when
  its layout finishes to prevent it from remaining hidden off-screen.
- Round, clamp, and validate WebView visualViewport bottom measurements
  to avoid rendering inconsistencies from fractional or invalid insets.
- Trigger an immediate keyboard inset report on script initialization.

* Update tabStripOffsetRef when scrolling mobile tab strip

Ensure the cached offset is updated to match the next scroll position. Without this update, subsequent scroll calculations would use stale offset values.
2026-06-12 11:09:08 -07:00
Jinjing f027a1cb7b Move settings out of help dropdown into dedicated sidebar button (#5272)
- Pulls the Settings option out of the Help dropdown menu and renders it as a standalone button directly in the sidebar.
- Integrates the `useShortcutKeys` hook and `ShortcutKeyCombo` component to display the settings keyboard shortcut in the button's tooltip.
- Updates associated tests to verify the new button's placement, ARIA attributes, and tooltip content.
2026-06-12 10:56:49 -07:00
0021d95796 fix(serve): persist active serve session tab so PTY output doesn't snap focus to the last tab (#5131)
* fix(serve): persist active mobile-session tab so PTY output doesn't snap focus

In `orca serve` (headless host + remote/web client), running a command in a
terminal snapped the active tab back to the last-created tab. The renderer
reconcile forces the client's active tab to the host's reported active
(activeTabId / activeTabType / per-tab isActive), but `activateMobileSessionTab`
only called `focusTerminal` — a no-op for serve tabs no renderer has adopted —
and never persisted the chosen tab into the host's in-memory snapshot. So every
`onPtyData` -> `touchMobileSessionSnapshotsForPty` republish re-emitted the stale
"active = last tab" and the client snapped back on each command.

Persist the activation into the headless snapshot (activeTabId, activeTabType,
exclusive per-tab isActive, rebuilt tabGroups) after the focus dispatch, gated on
`!getAvailableAuthoritativeWindow() && isHeadlessMobileSessionPublication(...)` —
the same guard the hydrate path uses, so renderer-owned snapshots (including
`:headless-merge:`) stay authoritative. No-op when the tab is already active;
adds nothing to the `onPtyData` hot path.

Adds 3 regression tests covering: chosen tab survives a PTY republish, no version
bump on redundant activation, and no server-side persist when a renderer is
authoritative.

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

* fix(serve): exclude :headless-merge: snapshots from headless active-tab persist

After a renderer detaches there is no authoritative window, so the
!getAvailableAuthoritativeWindow() guard alone let merged (:headless-merge:)
snapshots through this path. A merged snapshot still carries renderer-owned
tabs/groups, so a server-side active-tab rewrite could collapse that mixed
group state. Exclude merged epochs from the persist gate; only pure
`headless:` / `headless-hydrated:` publications are persisted server-side.

Adds a regression test: renderer-detach + `:headless-merge:` snapshot ->
the headless persist is suppressed (no snapshot mutation / event).

Addresses the CodeRabbit review on #5131.

* review: clarify headless active-tab persistence guard

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-12 10:47:55 -07:00
Brennan BensonandOrca d93de0935f Add effectiveness telemetry for in-app GitHub stars (#5245)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 10:14:49 -07:00
Neil f31c40cb18 Add Grok sessions to AI Vault (#5258) 2026-06-12 01:38:56 -07:00
github-actions[bot] 290ffc7494 release: v1.4.65-rc.0 v1.4.65-rc.0 2026-06-12 07:40:36 +00:00
Jinjing 030a35a2df Update manual project order notice wording and add translations (#5253)
Correct a minor grammatical issue in the English notice by adding
"the". Additionally, localize FolderWorkspaceComposerDialog and
ProjectOrderManualDefaultNotice in Spanish, Japanese, Korean, and
Chinese to replace the English fallback strings.
2026-06-12 00:18:51 -07:00
Jinjing 9c8d9be8dd Optimize CI checks caching and polling backoff behavior (#5252)
* Optimize CI checks caching and polling backoff behavior

- Prevent backing off the polling interval when no checks are reported
  yet, keeping polling at the baseline rate to detect newly started jobs.
- Reduce empty checks cache TTL to 10 seconds to allow faster recovery
  from a "no checks" state while preserving the 60-second TTL for active jobs.
- Avoid bypassing the GitHub CLI cache on tab entry, reserving forced
  fetches only for explicit manual user refreshes.
- Update "No checks configured" copy to "No checks reported yet" to avoid
  misleading users before their CI pipelines have started running.
- Ensure manual checks refreshes do not inherit in-flight automatic requests
  which might be backed by cached CLI data.
- Lookup head-specific cache keys during PR refresh events to prevent
  incorrectly deriving neutral check statuses.

* Clarify polling reset comment in ChecksPanel

Update the comment to accurately refer to the entry refresh rather
than a forced fetch establishing a fresh baseline.
2026-06-12 00:16:36 -07:00
Jinjing 4278fdc1e8 Constrain right sidebar primary action widths (#5249)
* Constrain right sidebar primary button widths to prevent layout jumps

Introduce min-width constraints, truncation, and content-width layouts
for primary actions in the right sidebar and PR dialogs. This prevents
buttons from shifting layout dramatically when labels morph dynamically
as git and review state changes.

* Fix right sidebar split action overflow
2026-06-12 00:09:26 -07:00
Jinjing d27985e05b Constrain right sidebar primary button widths to prevent layout jumps (#5248)
Introduce min-width constraints, truncation, and content-width layouts
for primary actions in the right sidebar and PR dialogs. This prevents
buttons from shifting layout dramatically when labels morph dynamically
as git and review state changes.
2026-06-11 23:50:25 -07:00
Jinjing 2899a60872 Durable persistence for commit message generation across worktree switches (#5243)
* Persist commit message generation state across worktree switches

Introduce a new global store slice for commit message generation to prevent
in-flight requests from being orphaned or lost when the Source Control
sidebar is unmounted or when switching between worktrees.

- Key commit generation records by worktree ID/path in the Zustand store
- Hydrate completed messages back into the draft input when returning to
  the originating worktree without overwriting active user edits
- Ensure the agent-selection dialog state remains bound to the target
  worktree that initiated the generation
- Wait for the PR composer eligibility check before hydrating completed
  PR field generations on sidebar remounts

* Route cancellations to starting runtime and prune stale worktree records

Ensure commit message and pull request generation cancellation requests
are always routed to the runtime environment that was selected when
the generation started, even if active settings change before
cancellation.

Additionally, prune commit message and pull request generation records
when worktrees are removed to prevent stale records from lingering in
the store.
2026-06-11 23:36:46 -07:00
Jinwoo HongandOrca 0310b032bb Redesign README for clarity and conversion (#5244)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 22:48:41 -07:00
Jinjing 4d0c449378 Support project reordering with groups and add manual-default notice (#5237)
* Support project reordering with groups and add manual-default notice

Refactors the project header drag-and-drop implementation to work correctly
with project groups by tracking ordering within buckets and updating project
group assignments on drop. Also introduces a dismissible sidebar education
card notifying upgraded profiles that manual project ordering is now the default.

* Split oversized translated UI modules

* Fix localized option test regressions
2026-06-11 20:39:39 -07:00
github-actions[bot] bebf087504 release: v1.4.64-rc.2 v1.4.64-rc.2 2026-06-12 03:20:42 +00:00