Commit Graph
3741 Commits
Author SHA1 Message Date
Brennan BensonandNeil d6f3f514d6 Fix agent session row drag restore (#6463)
Co-authored-by: Neil <neil@stably.ai>
2026-06-28 11:58:02 -07:00
Brennan BensonandOrca e58a5e9e17 Simplify Appearance settings (#6459)
Co-authored-by: Orca <help@stably.ai>
2026-06-28 11:50:29 -07:00
Brennan BensonandOrca 5c3ba7be91 Improve inactive workspace cleanup UX (#3600)
Co-authored-by: Orca <help@stably.ai>
2026-06-28 11:38:23 -07:00
Brennan BensonandOrca a71b865867 Show PR status for branch worktrees at a merged PR head (#6607)
Co-authored-by: Orca <help@stably.ai>
2026-06-28 11:22:07 -07:00
211138e643 Stop PermissionRequest/blocked/waiting hook states from firing agent-task-complete (#6540)
* Stop PermissionRequest/blocked/waiting hook states from firing agent-task-complete

'waiting' (e.g. a Claude PermissionRequest) and 'blocked' (e.g. a Copilot
elicitation dialog) occur mid-turn while the agent is still alive, yet
isCompletionHookState treated them as completion and dispatched a false
agent-task-complete. Restrict completion to a genuine 'done' and add an
isAttentionHookState early return that also cancels a pending done-quiet
timer when an attention pause arrives first. The 'needs you' notification
for these states is raised separately (smart-attention), so it is unaffected.

Fixes #5698

* Preserve attention notifications for waiting hooks

---------

Co-authored-by: brennanb2025 <brennanb2025@users.noreply.github.com>
Co-authored-by: Neil <neil@stably.ai>
2026-06-28 01:50:08 -07:00
Brennan BensonandNeil 112b6e51ca fix: preserve pasted Windows terminal paths (#6604)
Co-authored-by: Neil <neil@stably.ai>
2026-06-28 01:12:08 -07:00
JinjingandOrca de1ed81d15 fix: address review findings (#6602)
Co-authored-by: Orca <help@stably.ai>
2026-06-28 01:08:40 -07:00
Jinjing 8a39450b18 refs/heads/handle-mobile-pull-request-issues (#6598)
* feat(mobile): add commit failure recovery panel with AI fix action

- Surfaces a "Commit failed" panel with a one-tap AI fix button when a
  git commit fails in the source control view or PR creation flow
- Detects commit failures specifically during the committing progress
  step and captures staged entries and commit message for context
- Extracts commit failure summary and prompt logic into
  `src/shared/source-control-commit-failure.ts` and PR checks prompt
  into `src/shared/pr-checks-fix-prompt.ts` so both desktop and mobile
  share the same implementations
- Adds auto-find of an available Metro port starting from 8081 and
  extracts expo CLI bootstrap into `mobile-expo-cli.mjs` shared by
  `start-emulator` and a new `start-expo.mjs` wrapper

* Share source-control AI prompts and simplify mobile PR actions

- Extract conflict, check-fixing, and commit-failure prompt builders
  to shared modules for reuse by both desktop and mobile.
- Configure Metro in the mobile package to watch and bundle modules
  from the repository-root shared directory.
- Remove the desktop-style merge method picker from the mobile PR
  actions panel, opting to use repository defaults automatically.
- Refactor mobile hosted review creation and git preparation logic
  into dedicated helper files.
2026-06-28 00:58:17 -07:00
Brennan Bensonandbrennanb2025 e47b3364d9 Preserve terminal scrollback when restoring a hidden alternate-screen pane (#6532)
* Preserve terminal scrollback when restoring a hidden alternate-screen pane

On Windows, an alternate-screen TUI pane (Claude Code) could lose scroll-up
after being hidden (tab/worktree switch or app backgrounded) and shown again.

Root cause: on hidden->visible restore, applyMainBufferSnapshot
unconditionally wrote a destructive clear (\x1b[2J\x1b[3J\x1b[H) before
replaying the snapshot, wiping xterm's scrollback. The attach/reattach path
already guards this same clear behind !isAlternateScreen (pty-transport.ts);
the snapshot path did not.

Thread an alternateScreen flag from the backend headless serialization
through the pty:getMainBufferSnapshot IPC + preload types into
applyMainBufferSnapshot, and skip the destructive clear when restoring an
alternate-screen buffer. Add a regression test asserting the clear is NOT
emitted for an alt-screen restore (and the existing normal-buffer test still
asserts it IS).

Fixes #5723

* test: account for alternateScreen flag in empty headless snapshot assertions

The alt-screen scrollback fix threads an alternateScreen flag through the
headless snapshot return type. Two sibling empty-buffer tests used exact
toEqual() assertions that did not include the new (legitimately false) key.
Update them to reflect the correct snapshot shape.

---------

Co-authored-by: brennanb2025 <brennanb2025@users.noreply.github.com>
2026-06-28 00:57:56 -07:00
JinjingandOrca 1e187f56a8 Improve failed CI check details panel (#6599)
Extract Annotations and Jobs sections into dedicated components, add
clickable annotation locations that open files at a line, and bucket job
steps with collapsible passing/skipped summaries.

Co-authored-by: Orca <help@stably.ai>
2026-06-28 00:55:33 -07:00
Brennan Bensonandbrennanb2025 b75eed7e02 Fix phantom/overwritten characters when typing into Claude Code on Windows (#6544)
Claude Code echoes prompt keystrokes by redrawing the input line in
place (CR + CHA + reprint + erase-line) WITHOUT DEC 2026 synchronized
output, split across ConPTY chunks. On native Windows ConPTY the xterm
buffer ends up correct, but its DOM renderer paints these rapid rewrites
one frame late, leaving a phantom first char or an overwritten cell
("zzzx" rendered as "zzx") until a window resize forces a repaint.

The existing foreground render-settle forces a single synchronous
refresh for in-place rewrites, but that races the late DOM paint. Only
the DEC 2026 cursor-restore and viewport-scroll cases scheduled a
follow-up next-frame repaint. Extend that follow-up to the native
Windows in-place rewrite pattern so the column desync self-corrects
without the user jiggling the window. Scoped to native Windows ConPTY
foreground in-place rewrites, so plain shells, SSH/remote panes, and
non-Windows renderers are unaffected.

Fixes #5656
Fixes #5653

Co-authored-by: brennanb2025 <brennanb2025@users.noreply.github.com>
2026-06-28 00:49:39 -07:00
3d22d69d03 feat(terminal): add "Copy Context" to the terminal context menu (#6267)
* feat(terminal): add "Copy Context" to the terminal context menu

Copying an agent session's captured context required opening the Fork
Agent Session dialog and clicking its "Copy context" button — two steps
for something you often just want on its own (e.g. to paste elsewhere).

Add a "Copy Context" item to the terminal right-click menu, right under
"Fork Agent Session…". It reuses the existing capture + clipboard path
(prepareAgentSessionForkFromPane → copyAgentSessionForkContext), so the
copied text is identical to the dialog's, just one click away and without
opening the dialog.

Fixes #5020

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

* fix(terminal): copy plain context, not the fork prompt

Copy Context now copies the bounded, cleaned transcript on its own with a
neutral 'Context copied' toast, instead of reusing the fork prompt (with its
'this is a fork… acknowledge and wait' framing) and the fork-copy toast. That
framing is noise when pasting into another tool, which is the issue's use case.

Extracts buildBoundedSessionTranscript() from the fork-prompt builder and adds
copyAgentSessionContextFromPane(); the fork dialog's own copy button is
unchanged.

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

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-28 00:13:36 -07:00
Brennan BensonandOrca a9ef6f9168 Recover frozen terminal panes after a backgrounded agent exits (#6514)
Co-authored-by: Orca <help@stably.ai>
2026-06-28 00:09:07 -07:00
Neil 5712cf9f48 Fix right-click paste in the Monaco editor (#6549)
Monaco's context-menu Paste reads navigator.clipboard.readText(), which is blocked in Orca's sandboxed renderer, so right-click Paste did nothing while Cmd/Ctrl+V and right-click Copy worked.

Register a higher-priority implementation on Monaco's PasteAction that reads the clipboard through Orca's trusted IPC bridge (window.api.ui.readClipboardText) and dispatches Monaco's native paste. Falls through for read-only/unfocused/non-editor targets so Cmd/Ctrl+V is untouched, and routes oversized pastes through the existing chunked inserter to preserve the too-large guard for both paste paths.

Verified with unit tests (incl. read-only fall-through, empty/too-large/focus-lost/oversized) and end-to-end in the Electron app.
2026-06-27 23:11:45 -07:00
Jinjing b45cb545c5 fix: shorten mobile toolbar labels (#6553) 2026-06-27 22:59:55 -07:00
Jinjing bffe436aeb fix: address review findings (#6551) 2026-06-27 22:51:33 -07:00
Brennan Benson bed50606f2 Launch and detect Qwen Code via its qwen executable (#6530) 2026-06-27 22:02:52 -07:00
Siddiqui QamarandJinjing e40ad6a93a fix(source-control): refresh branch compare after upstream changes (#6522)
* fix(source-control): refresh branch compare after upstream changes

- Refresh branch compare when upstream status changes for the same worktree and base ref

- Prevent stale Create PR eligibility from remaining clickable while a newer preflight is loading

- Add regression coverage for upstream-driven compare refreshes and stale Create PR loading precedence

* fix(source-control): preserve review provider during preflight refresh

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-06-27 20:54:24 -07:00
Jinjing 14f0096077 Omit unsupported combined diff tabs from mobile session snapshots (#6520)
Combined diff tabs (such as branch, commit, or uncommitted changes)
use display labels as relative paths and require the desktop-only
combined renderer. Excluding these tabs from the mobile snapshots
prevents mobile clients from incorrectly attempting to read them
via files.read.
2026-06-27 15:56:21 -07:00
Jinjing 32542a8e93 Pass PTY ID directly to terminal restore to prevent race conditions (#6519)
* Pass ptyId directly to restorePaneTerminalFit to avoid race conditions

Avoid re-reading the pane transport after a mobile disconnect race,
which could otherwise restore a recycled pane instead. Passing the PTY
ID directly ensures the correct terminal is restored.

* Prevent reclaiming terminal if PTY ID does not match current pane

Avoid restoring a terminal with a stale PTY ID if a different terminal
has already reused the pane slot. Trigger a state override tick to make
stale portals disappear instead.
2026-06-27 15:27:55 -07:00
Jinjing a94d692cd5 Update quick command button to use plus icon and clearer label (#6517)
Replace the play icon with a plus icon and update the label from
"Command" to "Add Quick Command…" (including localizations).
This provides clearer visual and textual cues that the action creates
a new command rather than running an existing one.
2026-06-27 14:40:33 -07:00
867c57b93c fix(renderer): answer OSC color queries from active terminal theme (#6502)
* fix(renderer): answer OSC color queries from active terminal theme

- reply to OSC 10/11 foreground/background queries using the resolved xterm theme

- suppress replayed OSC color replies to avoid leaking escape output into fresh shells

- cover theme-derived color replies and replay suppression with focused tests

* test(renderer): cover terminal OSC color query replies

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-27 09:30:29 -07:00
Jinjing 6729f683f6 Fix Orca CLI path resolution and improve registration UI (#6484)
* fix Orca CLI path resolution and improve registration UI

- Hydrate the shell PATH before running installer actions on macOS to
  match the user's terminal instead of launchd.
- Resolve the active macOS command path dynamically against shell PATH
  candidates, ignoring broken symlinks and non-executable files.
- Detect and report conflicts with unmanaged executables shadowing the
  configured command path.
- Add "Preparing..." and "Registering..." loading states to the settings
  and setup panels during preflight checks.

* Fix Orca CLI detection and installation path conflict checks

- Allow detecting a managed Orca command located later in PATH when the
  default path entry is missing or non-executable.
- Avoid raising installation conflicts for unmanaged commands located
  after the default install path, as they will be safely shadowed.
- Translate terminal setup and Orca CLI registration strings for
  Spanish, Japanese, Korean, and Chinese locales.

* Only open terminal when pre-install checks succeed

Prevent the terminal from opening and setting the terminal command if
onBeforeOpenTerminal or refreshPreInstallNotice throws an error.
2026-06-27 02:05:23 -07:00
Jinjing e32a62b913 Force viewport refresh for Windows CJK input (#6488)
When committing East Asian text (e.g., via Microsoft Pinyin) on Windows,
the local terminal renderer can leave newly printed glyphs blank until
a repaint is triggered.

This detects CJK, Korean, and fullwidth Unicode ranges and forces a
viewport refresh when such output is received immediately following
active terminal input on Windows clients.
2026-06-27 02:04:29 -07:00
Jinjing 0cd46ad21e Dim and transition the Create More label on hover (#6479)
Change the "Create more" switch label to use muted foreground by default
and transition to foreground on group hover.
2026-06-27 00:39:44 -07:00
360ce673e7 Fix wobbling session-history loading spinner (#6464)
The "Scanning sessions" loader sat in a `flex items-center gap-2` row
next to a plain text span with no flex-1/min-w-0 sibling to absorb
slack. Both items default to flex-shrink: 1, so the SVG could be
compressed below its 14px width while keeping 14px height — a
non-square box shifts the rotation pivot off center, making the icon
drift instead of spinning in place.

Add `shrink-0`, matching every other text-adjacent spinner in the app.

Co-authored-by: Neil <neil@stably.ai>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 20:19:42 -07:00
1f968b92c9 Fix browser pane stuck in HTML fullscreen (#6442) (#6451)
* Fix browser pane stuck in HTML fullscreen (#6442)

Guest content in a browser pane could enter HTML fullscreen but not
exit it: requestFullscreen() resized the host BrowserWindow into native
fullscreen, and exitFullscreen() had nothing to restore, leaving the
pane stuck.

Set the webview's disableHtmlFullscreenWindowResize preference so HTML
fullscreen is contained to the <webview> element. Exit then works and
fullscreenchange fires as guests expect.

* Apply browser guest fullscreen policy consistently

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

---------

Co-authored-by: Wolfgang Schoenberger <221313372+wolfiesch@users.noreply.github.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-26 20:05:47 -07:00
66b54c4f49 fix(pet): shrink overlay drag area to hug the pet content (#6437)
* fix(pet): shrink overlay drag area to hug the pet content

The pet overlay's `pointer-events-auto` handle used `size-full`, so the
entire `size × size` box (default 180px) was draggable even where the pet
was transparent. Non-square pets left a large dead-zone: the bundled
Claudino (320×180) renders 180×101 in the box, leaving a ~79px empty but
draggable band; OpenCode/Gremlin (252×320) render 142×180, leaving ~38px
on the left.

Restructure the overlay into three layers: the outer box and a new
centering layer stay `pointer-events-none`; only an innermost
`w-fit`/`h-fit` wrapper opts back into pointer events and carries the drag
handlers, cursor, bob animation, and `touch-action`. A `min-w`/`min-h`
floor keeps it grabbable during the image-load window when the wrapper
would otherwise collapse to 0×0.

Also size the `DetectedSpriteFrame` canvas to one fixed footprint bounding
the largest scaled frame (instead of the full box) so detected sprites
tighten too, with frames re-centered within that footprint.

Drag math, viewport clamping, and persisted position are unchanged — they
remain keyed to the outer box, so dragging, edge-clamping, and saved
positions behave exactly as before.

* fix(pet): cap the img fallback at the pet size

The w-fit/h-fit drag wrapper is fit-content, so the img's max-w/h-full had
no fixed box to resolve against and rendered at intrinsic size, overflowing
the persisted size box that clamping still assumes. Cap explicitly with
maxWidth/maxHeight: size. Addresses CodeRabbit review on #6437.

* test(pet): cover overlay hit area render branches

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-26 19:55:02 -07:00
Brennan BensonandOrca 5fd9f0c62c Prevent mobile worktree selection from focusing desktop (#6461)
Co-authored-by: Orca <help@stably.ai>
2026-06-26 19:34:33 -07:00
Brennan Benson d03e99c89a Show accurate PR status for local worktrees (#6460) 2026-06-26 18:51:51 -07:00
Brennan BensonandOrca d18cdc693f Reset agent sleep after terminal visits (#6450)
Co-authored-by: Orca <help@stably.ai>
2026-06-26 17:41:12 -07:00
Brennan BensonandOrca e1f93238d1 Align mobile review actions with desktop (#6444)
Co-authored-by: Orca <help@stably.ai>
2026-06-26 17:35:32 -07:00
Brennan Benson 8c81c30f6a Keep merged PRs visible after refreshes (#6456) 2026-06-26 17:15:14 -07:00
Brennan Benson 5578ffe318 Show the correct agent icon for terminal helpers (#6455) 2026-06-26 15:51:50 -07:00
Brennan Benson 949b30ea1f Prevent stale terminal redraw fragments (#6449) 2026-06-26 15:03:41 -07:00
Brennan Benson ccb09db440 Keep interrupted Claude turns from appearing active (#6452) 2026-06-26 15:01:55 -07:00
Brennan Benson cdda9fd16d Restore automatic usage tracking for default accounts (#6240) 2026-06-26 14:37:16 -07:00
Jinwoo HongandOrca 4904ffda9a Fix Remote Host downloads and agent status parity (#6436)
* Fix remote host downloads and agent status parity

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

* Address remote download review comments

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

* Avoid inefficient SSH chunk fallback

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-26 14:28:16 -07:00
Brennan Benson d5b1ca7fcd Keep restored terminal panes typeable after sleep (#6447) 2026-06-26 14:12:32 -07:00
Jinwoo Hong 59def7474a Revert Windows terminal clear repaint fix
Manual Windows testing still reproduces displaced input after Ctrl+K.
2026-06-26 14:05:09 -07:00
Jinwoo Hong daab519c5c Fix Windows terminal clear repaint (#6382) 2026-06-26 16:59:00 -04:00
Brennan Benson 996ab4a224 Preserve terminal output after hidden recovery fallback (#6435) 2026-06-26 12:39:28 -07:00
Jinwoo HongandOrca a3ce2692dd Disambiguate sidebar project setup groups (#6430)
Co-authored-by: Orca <help@stably.ai>
2026-06-26 12:24:27 -07:00
Brennan Benson af52e418ea Keep sleeping agent panes resumable in place (#6411) 2026-06-26 12:10:08 -07:00
Brennan BensonandNeil 1293ed0f78 Reduce push target upstream polling churn (#6413)
* Reduce push target upstream polling churn

* Fix push target upstream cache recovery

---------

Co-authored-by: Neil <neil@stably.ai>
2026-06-26 11:45:12 -07:00
Jinjing 479cbee98b Avoid IME punctuation listeners off macOS (#6421) 2026-06-26 03:46:48 -07:00
lvfenandJinjing 3cd7193446 Fix macOS Chinese IME full-width punctuation and window-switch input (#6417)
* Fix macOS Chinese IME full-width punctuation and window-switch input

Two macOS IME regressions in the terminal:

- Full-width punctuation (,。?!) was sent as half-width ASCII. With
  kitty keyboard on, xterm encodes+sends the ASCII symbol on keydown and
  preventDefaults it, dropping the IME's committed glyph from the input
  event. Bypass those punctuation keydowns/keypress/keyup so the native
  input pipeline runs, then forward the committed glyph to the PTY.

- After switching windows, the IME stayed stuck in ASCII with no way back
  to CJK. macOS+Chromium leaves a stale NSTextInputContext on the still
  focused helper textarea after reactivation (electron#32307/#34952).
  Force a blur -> next-frame refocus on window focus to rebuild it.

Both paths are macOS-scoped where relevant and covered by unit tests.

* Tighten macOS IME punctuation handling

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-06-26 03:43:39 -07:00
Neil fa00464df9 Fix noisy Grok tool notifications (#6306) 2026-06-26 02:19:25 -07:00
19ab395a26 fix(browser): keep webview guests alive across worktree switches (#6408)
* fix(browser): keep webview guests alive across worktree switches

Electron <webview> guests are destroyed when their DOM parent is removed.
When switching worktrees, BrowserPane chrome unmounts and previously tore
down the webview, forcing a reload on return.

Introduce persistent page viewports inside overlay slots so webviews stay
in a stable parent without keeping the full React chrome mounted. On
worktree switch, park hidden viewports instead of destroying guests;
explicit close paths still call destroyPersistentWebview.

Fixes stablyai/orca#6385

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(browser): harden persistent webview viewports

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-06-26 00:55:09 -07:00
Jinjing dd0fa77882 Enhance PR auto-merge controls and switch to GraphQL mutation (#6405)
- Centralize and align auto-merge eligibility logic across web and
  mobile clients.
- Use the `enablePullRequestAutoMerge` GraphQL mutation instead of
  `gh pr merge --auto` to prevent immediate merges on clean branches.
- Fall back to `gh pr merge --auto` when a merge queue is required on
  the base branch.
- Hide the auto-merge control when only optional checks are pending.
2026-06-25 22:00:34 -07:00