Commit Graph
6253 Commits
Author SHA1 Message Date
Jinjing 008ad62d3f Add HTML preview-to-side support for single unstaged/staged diffs (#8018)
- Move the preview button before the single-diff tooltip in the header
- Extend canOpenPreviewToSide to allow single diffs (not commit diffs)
  when the modified file still exists on disk, since the preview
  renders the working-tree file rather than diff content
- Add tests covering HTML edit tabs, unstaged diffs, deleted files,
  commit diffs, and non-HTML diffs
2026-07-09 21:57:38 -07:00
79abeeaa2a fix(browser): allow CDP browser target attach (#7033) (#7891)
* fix(browser): allow CDP browser target attach (#7033)

* review: preserve nested CDP session identity

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-09 21:57:01 -07:00
Jinjing 44d5ed0439 1.4.131 rc2 release prep (#8020)
* Support WSL Codex settings promotion and harden config write-back

- Enable settings promotion for WSL runtimes using per-distro baselines.
- Create parent directories if missing to prevent promotion ENOENTs.
- Keep restrictive permissions (0600) and follow symlinks on promote.
- Respect CRLF line endings when inserting keys into CRLF config files.
- Skip redundant baseline file writes when settings are unchanged.
- Include the release scan report for the 1.4.131-rc2 prep.

* Refactor sleeping agent wake flow and fetch rate limits via backend

- Background-mount only targeted terminal tabs during passive wake to
  prevent spawning unnecessary PTYs for unvisited tabs.
- Latch edge-triggered wake requests that arrive mid-hibernation and
  track active claims to prevent double-resuming a provider session.
- Query the ChatGPT wham usage backend API directly with fetch for
  rate limits, avoiding launching Codex or WSL login shells.
- Asynchronously probe and serialize WSL auth files with timeouts to
  prevent synchronous I/O from stalling Electron's main process.
- Fix config promotion edge cases such as missing parent directories,
  dangling symlinks, and atomic write permission widening.

* Support WSL dotfile-symlink write-back and lengthen redeem timeout

- Preserve symlinked Codex config on WSL by writing through the
  existing file instead of atomic-rename, since \\wsl$ symlink
  metadata isn't reliably detected and rename would clobber the link.
- Tighten new ~/.codex directory creation to 0700 (holds auth.json).
- Give explicit reset-credit redemption a 30s backend timeout instead
  of the 10s background-poll default, since it's user-triggered.
- Read sleeping-agent session state from the worktree's actual
  execution-host partition instead of always the local one, so the
  headless-wake check works correctly for SSH-hosted worktrees.
- Isolate serve-sim watcher tests from the real $TMPDIR/serve-sim
  state file to avoid leaking unrelated events.
2026-07-09 21:54:22 -07:00
Jinjing d280a7cbe8 Make sidebar reveal always jump instantly instead of smooth-scrolling (#8019)
- Removes the `behavior`/`sidebarRevealBehavior` plumbing throughout
  activation and reveal call sites now that every reveal jumps
  immediately, eliminating the need to special-case newly created
  worktrees.
- Reworks worktree-sidebar-reveal.ts to center the target row within
  the viewport and temporarily pad list boundaries so first/last rows
  can still center instead of clamping to the edge.
- Drops the reduced-motion e2e workaround since reveals no longer
  animate.
2026-07-09 21:50:03 -07:00
BingZ 946eb52e6b fix(terminal): make xterm scrollbar gutter transparent (#7876)
* fix(terminal): style xterm scrollbar gutter

* fix(terminal): reuse the canonical scrollbar style
2026-07-09 21:35:01 -07:00
Brennan BensonandOrca 7a733862cb Harden cleanup removal review findings (#8010)
- Fail queued removals that reveal concrete git risk (dirty files or
  unpushed commits) discovered after an unverifiable force approval.
- Clear a failed row's queued-for-deletion sidebar overlay as soon as the
  row fails instead of when the whole batch settles (new onRowFailed).
- Skip the auto-scan on dialog reopen while a removal batch is running;
  the removal's scan invalidation would discard it immediately.

Co-authored-by: Orca <help@stably.ai>
2026-07-09 21:22:06 -07:00
Brennan BensonandBrennan Benson feac6a5104 Prevent continuous git status scanning in large repositories (#8005)
* Prevent continuous git status scanning in large repositories

On repos where `git status --untracked-files=all` takes tens of seconds,
the background status poll restarted a fresh scan 3s after the previous
one finished, keeping a git process at high CPU almost continuously
while the workspace sat idle (#7983).

The coalesced poll runner now paces reruns by the previous run's
duration, split by trigger class:

- Evidence-free timer ticks wait 5x the last refresh duration (capped
  at 5 minutes), bounding idle polling to ~1/6 duty cycle.
- Change signals (file-watch events, repo metadata pushes, finished
  terminal commands, window reveal after hidden) wait only 1x, so real
  changes in a slow repo still surface promptly; a change signal can
  pull an already-scheduled tick run earlier, and the strongest pending
  trigger wins for trailing reruns.
- Backoff-deferred scans are skipped while the window is hidden; the
  becoming-visible run catches up on the short lane.

Fast repos keep the exact 3s cadence (the multiplier never drops the
gap below the existing floor), and user-triggered refreshes are
unaffected (they bypass the poll runner). The stale-conflict poll gets
the same pacing, which also spaces slow remote SSH probe chains.

Fixes #7983

* Skip hidden-window stale-conflict probes like the status poll

---------

Co-authored-by: Brennan Benson <brennanbenson@Brennans-MacBook-Pro.local>
2026-07-09 21:06:00 -07:00
Jinjing 3a7eb8f312 fix(mobile): drop smart-dash write-back recovery that kills iOS dictation (#8008)
The longer-hyphen recovery path (#5222) reconstructed runs by writing a
value that differed from the native field text. After #7933 stores raw
field text and normalizes only on send/PTY, that recovery is unreachable
and any write-back would reintroduce dictation kill. Map each smart dash
to exactly "--" with a single-arg normalizer.
2026-07-09 20:38:17 -07:00
Brennan BensonandBrennan Benson 5662bf49d8 Restore Linear agent-skill setup prompt and add provider-card install CTA (#7990)
PR #5071 (36277801e) accidentally dropped the LinearAgentSkillSetupPrompt
modal from WorktreeCard, orphaning the component. Restore the exact
wiring: render on the active worktree when it has a linked Linear issue.

Also surface the decoupled orca-linear agent skill on the Linear task
provider settings card: install state via useInstalledAgentSkillNames,
copyable install/update command resolved for the agent runtime, and a
remote-setup note when a runtime environment is active. The legacy-aware
update-command selection moves into a shared lib module so the sidebar
prompt and the new CTA stay in sync.

Co-authored-by: Brennan Benson <brennanbenson@Brennans-MacBook-Pro.local>
2026-07-09 20:06:47 -07:00
Jinwoo Hong f55d753721 fix(codex): use WSL login shell for account setup (#7993) 2026-07-09 19:40:11 -07:00
Jinwoo Hong 27f30c2548 fix(windows): open WSL workspaces in VS Code remote (#7982) 2026-07-09 22:37:40 -04:00
Jinwoo HongandOrca 6731773e4e Route provider account surfaces through the active Remote Orca Server (#7999)
Co-authored-by: Orca <help@stably.ai>
2026-07-09 19:30:23 -07:00
Jinjing 43f639ddda Consolidate mobile source control into a single tabbed hub (#7923)
* Consolidate mobile source control into a single tabbed hub

Unify the changes list, pull request details, and commit history into
a single multi-segment panel. This improves navigation and state sharing
across different lenses of a worktree's source control.

- Add a segmented control to switch between Changes, PR, and History
- Introduce a persistent branch status card with an integrated PR chip
- Redirect standalone PR and history routes to the new unified hub
- Extract reusable UI and logic for the history list and PR summary

* Keep mobile source control tabs mounted to preserve view state

* Keep PR and History segments mounted (using display: 'none' when hidden) to preserve fetch, scroll, and expand states during tab switches.
* Decouple the History list from blocking on Git status loading.
* Support deep linking directly into the history tab of the main panel instead of using a standalone route.
* Enable retrying failed loads by reviving the transport loop if parked.
* Fix PR chip accessibility label and comment check.

* Optimize and integrate mobile PR view within source control hub

- Lazy-load heavy PR comments and descriptions (Phase 2) only when the
  PR tab is active, using fast metadata (Phase 1) for the branch chip.
- Unmount the PR body when inactive to avoid unnecessary comment tree
  re-renders and preserve WebView resources during commit text editing.
- Implement soft-refresh on HEAD advancement to keep the ready UI
  visible while re-fetching checks post-commit.
- Display the "Aborting..." label only when a merge or rebase abort
  is actively in flight.
- Memoize the git history list and skip branch identity RPCs when
  gating the dock icon.

* Improve mobile git views and concurrent rendering safety

- Pass the `origin` parameter through history and PR redirect routes.
- Move source control panel ref updates to `useEffect` to prevent side
  effects during concurrent renders.
- Resolve commit file changes to empty if disconnected to avoid a stuck
  loading spinner.
- Standardize PR sidebar header button styling and accessibility labels.

* Resolve PR repo probe without active branch to avoid forever spinner

Previously, checking if a repository is a GitHub remote required an
active branch. In a detached HEAD or mid-rebase state (where the branch
is null), the probe never resolved, leaving the PR panel on a forever
spinner.

Decouple the repository probe from the branch presence so the panel
can correctly display the "Current branch unavailable" state. Also,
hide the PR status chip when no branch is active to avoid a spinner
on the chip.
2026-07-09 19:23:36 -07:00
Jinwoo HongandOrca e8c84bb704 fix: propagate hook-only agent status to Remote Orca Server clients (#7970) (#7998)
* fix: propagate hook-only agent status to Remote Orca Server clients

On a headless Remote Orca Server, agent-status hooks (OSC 9999) updated the
retained row map but never republished PTY-backed session snapshots — only
terminal *title* changes did. Paired desktop/web/mobile clients therefore
kept a stale agent state (e.g. opencode working/idle) until relaunch, and
even title-driven updates carried an empty prompt and no agent identity
because the snapshot builder only used the title heuristic (#7970).

- retainAgentRowSnapshot reports client-visible changes (state, prompt,
  agent type, tool, interactive prompt, interrupted) so handlePtyData can
  republish snapshots on hook-only transitions without fanning out a
  rebuild per repeated same-state hook ping.
- buildPtyMobileAgentStatus prefers the fresh retained hook payload over
  the title-only fallback, so clients see the real state/prompt/agentType
  and interactive prompts. The non-agent-title suppression (#1437 stuck
  spinners) still wins unless the hook shows a live tool/question signal,
  and it now also covers leaf-backed panes with no PTY record.

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

* fix: refetch remote projects when the client-events stream replays

worktreesChanged/reposChanged emitted during a transport gap are lost, not
queued. A quick drop can replay without flipping the environment
unreachable, so the reachability-transition refetch never runs and a
server-created worktree stays invisible until relaunch (#7970). Request a
debounced project refresh on the replay tag, mirroring the SSH-state
refetch that already rides it.

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-07-09 19:21:55 -07:00
github-actions[bot] 4baaca601a Update README downloads badge 2026-07-10 00:58:53 +00:00
Jinwoo Hong 4ead072a16 Fix Codex WSL runtime status hooks (#7969)
* Fix Codex WSL runtime status hooks

* Harden Codex WSL hook restart handling

* Harden Codex WSL hook path handling

* Fix Codex hook CLI type boundary
2026-07-09 17:16:49 -07:00
BingZandJinwoo Hong 5b1b8cc61f fix(preflight): resolve WSL/SSH agent paths past shell aliases (#7867)
* fix(preflight): resolve WSL/SSH agent paths past shell aliases

LeanCTX and similar tools wrap claude/codex as interactive shell aliases.
command -v then returns alias text, which fails absolute-path detection and
hides installed agents (#7816).

Prefer bash type -P, then zsh type -p, then command -v for dash/sh fallback
in WSL agent discovery, WSL isCommandOnPath, and remote relay probes.

* fix(preflight): harden alias-safe PATH lookup chain

Require non-empty results between type -P, type -p, and command -v so bash
type -p empty success cannot skip later lookups.

* fix(preflight): resolve agent executables directly from PATH

---------

Co-authored-by: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com>
2026-07-09 17:08:35 -07:00
e7ee15f4b2 Improve workspace cleanup list (#7053)
* Improve workspace cleanup list

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

* Address workspace cleanup review feedback

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

* Fix workspace cleanup perf findings

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

* Avoid stale cleanup progress cache

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

* Complete workspace cleanup perf fixes

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

* Fix worktree list option forwarding

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

* Address workspace cleanup review nits

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

* Fix workspace cleanup removal review findings

- Fail a queued removal that now needs a force the user never approved
  (confirm-time approvedCandidates snapshot compared in preflight)
- Reword the 120s removal timeout to say removal continues in background
- Wire suppressPreservedBranchToast into cleanup removals
- Stop statting a repo after the first activity metadata timeout
- Document the WSL 9P best-effort stat gap; drop unused locale key

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

* Split workspace-cleanup slice test to satisfy max-lines

Rebasing onto latest main pushed the combined store-slice test over the
800-line cap. Extract shared fixtures into a test harness and split the
suite into scan-progress and removal-preflight files instead of adding a
forbidden max-lines suppression.

---------

Co-authored-by: Orca <help@stably.ai>
Co-authored-by: Brennan Benson <brennanbenson@Brennans-MacBook-Pro.local>
2026-07-09 16:24:20 -07:00
Jinwoo HongandOrca 9c111fd7aa mobile: per-host connection log screen with copy-diagnostics (#7984)
The rpc-client has always emitted a detailed connection lifecycle log
(dials, timeouts, close codes, handshake steps, retries) via onLog, but
only the pairing screen wired it up — for long-lived host connections
everything went to console.log, invisible to users. Debugging reports
like #7824/#6928 meant asking reporters for facts the app already knew.

- connection-log-buffer: bounded (200/host) module-level ring buffer with
  referentially-stable snapshots for useSyncExternalStore; survives
  client swaps and provider remounts.
- client-context: wire onLog for every shared host client.
- connection-log screen: live per-host log (reuses the pairing
  ConnectionLog component), host picker, and a Copy Diagnostics button
  that bundles app/platform versions, endpoint (flagged if Tailscale),
  state, attempt count, last-connected, and the event log into one
  shareable blob.
- troubleshoot: 'View connection log' entry point.

Co-authored-by: Orca <help@stably.ai>
2026-07-09 16:20:07 -07:00
Jinjing 69befad13e Harden layout validation, watcher lifecycle, and connection robustness (#7924)
* Harden layout validation, watcher lifecycle, and connection robustness

- Throw instead of silently skipping when the packaged daemon-entry is
  missing, preventing layout regressions from passing build checks.
- Terminate idle parcel-watcher processes to reclaim native handles and
  avoid crash-prone native node module teardowns on shutdown.
- Bind the persisted WS fallback port first to prevent orphaning active
  mobile pairings when the preferred port becomes free again.
- Cap concurrent disk reads for restored dirty tab verification at three
  to prevent startup connection bottlenecks on remote SSH workspaces.

* Queue file IDs instead of snapshots in restored conflict scans

This avoids using stale file snapshots (e.g., outdated disk signatures)
if a tab is saved, closed, or re-baselined while waiting in the queue
behind the concurrency limit. The live state is now fetched from the
store and validated immediately before initiating the disk read.
2026-07-09 16:09:09 -07:00
Jinwoo HongandOrca 73f1bbfc94 mobile: recover from wedged Tailscale tunnels and say 'check Tailscale' when it's the likely culprit (#7980)
A wedged Tailscale tunnel (known iOS failure mode) produces no AppState
or network-type transition, so no revival nudge ever fires and the
reconnect loop parked permanently at its give-up cap — users had to
toggle Tailscale off/on just to force a transition (#7824).

- rpc-client: past the give-up cap, drop to a 90s trickle dial instead
  of parking so the session self-heals once the tunnel recovers.
- host screen: nudge the shared client on focus so opening the host
  retries immediately instead of waiting out a backoff/trickle timer.
- connection-health: warning/unreachable verdicts on 100.64/10 or
  *.ts.net endpoints now carry a 'check Tailscale' hint, shown on the
  home host list and the in-session status line after ~3 failed
  attempts.
- troubleshoot: 'Cannot reach <tailnet-ip>' now says to check
  Tailscale, adds a dedicated Tailscale section, and stops telling
  Tailscale users to disable their VPN (that advice killed their only
  route to the host); sections extracted to
  troubleshoot-common-issues.tsx to stay under the max-lines cap.

Co-authored-by: Orca <help@stably.ai>
2026-07-09 15:56:25 -07:00
Jinwoo Hong e537953d8f Fix GitLab auth diagnostic waking WSL (#7967) 2026-07-09 18:06:30 -04:00
Jinwoo Hong 20ed764211 Fix WSL source control path separators (#7966) 2026-07-09 18:04:06 -04:00
github-actions[bot] 6964bfb23b release: v1.4.131-rc.2 v1.4.131-rc.2 2026-07-09 21:53:22 +00:00
Jinjing ad43dd19ed Disable experimental new worktree card style by default (#7977) 2026-07-09 14:52:03 -07:00
Rod BoevandJinwoo Hong 33f59ad99e fix(rate-limits): recover WSL Codex usage RPC refresh (#7567) (#7658)
* fix(codex): launch WSL usage RPC through interactive shell (#7567)

* fix(codex): harden WSL usage RPC shell startup

---------

Co-authored-by: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com>
2026-07-09 14:47:28 -07:00
Brennan BensonandOrca 1b0febc4cc Wake slept agents when opening a worktree on mobile (#7906)
Co-authored-by: Orca <help@stably.ai>
2026-07-09 13:05:32 -07:00
github-actions[bot] 41edc493b8 release: v1.4.131-rc.1 v1.4.131-rc.1 2026-07-09 19:37:51 +00:00
Jinwoo HongandOrca 94662c8445 feat(codex): write in-Codex setting changes back to ~/.codex config (#7960)
Co-authored-by: Orca <help@stably.ai>
2026-07-09 12:17:35 -07:00
github-actions[bot] ff661a7ab2 release: v1.4.131-rc.0 v1.4.131-rc.0 2026-07-09 18:39:27 +00:00
Brennan Benson 1534edc073 Separate pane identity from liveness in the tab-agent resolver (fixes OMP tab flicker) (#7860) 2026-07-09 11:38:26 -07:00
OrcaWin 81e4f0fa68 fix(sidebar): only show the projects scrollbar when the list overflows (#7845) 2026-07-09 11:21:35 -07:00
github-actions[bot] 8adfef4ff8 Update README downloads badge 2026-07-09 13:23:13 +00:00
Jinjing 6fb3036464 Fix iOS native keyboard dictation in mobile terminal inputs (#7933) 2026-07-09 05:02:39 -07:00
Jinjing b32924bf59 Chunk offline audio decoding to prevent ONNX SIGTRAP crashes (#7932) 2026-07-09 05:00:58 -07:00
Jinjing 775fa956ce Remove mobile driver overlay preview file 2026-07-09 03:57:54 -07:00
github-actions[bot] 31378023ff release: v1.4.130 v1.4.130 2026-07-09 10:51:24 +00:00
github-actions[bot] 148478e488 release: v1.4.130-rc.0 v1.4.130-rc.0 2026-07-09 10:12:37 +00:00
JinjingandOrca 52c7de1adb fix(terminal): guard PTY handler unregistration against detach/attach remount races (frozen pane) (#7894)
Co-authored-by: Orca <help@stably.ai>
2026-07-09 03:11:27 -07:00
Jinjing ee823b766c Move notification status helper to Contents/MacOS (#7931)
On macOS 26, UNUserNotificationCenter aborts when executables are run
from Contents/Resources because bundleProxyForCurrentProcess returns
nil.

Moving the orca-notification-status helper to Contents/MacOS next to
the main Electron executable ensures proper bundle resolution and
avoids immediate crashes.
2026-07-09 03:07:05 -07:00
Brennan BensonandOrca 7e85db4130 Update mobile 0.0.25 Android download links (#7917)
Co-authored-by: Orca <help@stably.ai>
2026-07-09 02:44:52 -07:00
NeilandOrca 06afbc4a4b Add optional Orca account sign-in (#7515)
* auth v1

* fable review

* lint

* Account menu with org membership management

Default UX is a compact account menu (sign in, organization selection, sign
out) that renders only when cloud auth is configured; adds an organization
members dialog (invite, role, remove) gated on server-side role checks. The
multi-profile switcher UI is preserved behind ORCA_MULTI_PROFILE_UI=1.

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

* Gate the optional account sign-in UI to dev builds

The account switcher stays hidden in packaged builds while the feature is
in progress. Dev builds still show it when the client env vars are set, and
a dev-only Settings > Dev Tools > Orca Cloud section mirrors it.

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-07-09 02:13:13 -07:00
Brennan BensonandBrennan Benson 24d7f6b790 Align per-workspace environment toggle (#7908)
Co-authored-by: Brennan Benson <brennanbenson@Brennans-MacBook-Pro.local>
2026-07-09 00:47:25 -07:00
Neil 7efbe10394 fix(onboarding): dismiss on notifications step + drop skipped steps from stepper (#7909)
Two onboarding-screen bugs:

- The final "notifications" step blocked click-off/Escape dismissal, unlike
  every other step. Remove the notifications-only guard so the skip
  confirmation opens on all steps; the footer "Skip to project setup" stays
  hidden there since the primary button already hands off to Add Project.
- A skipped "integrations" step (GitHub CLI already installed) still rendered
  as a dead, disabled stepper dot the user skipped past on Continue. The
  stepper now drops all skipped steps (integrations + Windows terminal)
  entirely instead of showing an unreachable dot.

Allowing dismissal on the last step let a click-off race the "Add your first
project" completion handoff (both call closeWith) and double-write onboarding
state / double-fire telemetry. Make closeWith idempotent with a first-wins
latch. Also map the displayed step index through resolveStepIndex so a
momentarily-skipped resume step can't flash "1 of N".

Verified: onboarding unit tests, full onboarding e2e spec (rewritten
notifications test locks in the new dismiss behavior), typecheck, lint, and
live Electron.
2026-07-09 00:46:03 -07:00
Jinjing 946810cfa7 rm unused files 2026-07-09 00:39:26 -07:00
Brennan BensonandOrca d1cc78d5c5 fix(mobile): bump Android versionCode to 6 for the 0.0.25 release (#7907)
Co-authored-by: Orca <help@stably.ai>
mobile-android-v0.0.25
2026-07-09 00:29:42 -07:00
Jinwoo HongandOrca 2c20089080 fix(codex): stop 'hooks pending review' from reappearing on every Orca-launched Codex session (#7896)
Co-authored-by: Orca <help@stably.ai>
2026-07-08 23:05:40 -07:00
github-actions[bot] 5ba408b506 release: v1.4.129-rc.7 v1.4.129-rc.7 2026-07-09 05:38:32 +00:00
Jinwoo Hong da0f03fc2a Sign Windows inner binaries during release (fail-open two-request SignPath flow) (#7866) 2026-07-09 01:29:10 -04:00
Brennan BensonandOrca ed529a011b fix(updater): restore Windows update signature verification (#7861)
Co-authored-by: Orca <help@stably.ai>
2026-07-08 22:28:13 -07:00