Commit Graph
2191 Commits
Author SHA1 Message Date
Jinwoo Hong 42e04268fb fix: harden SSH connection reliability and add passphrase prompt (#636) 2026-04-14 18:29:50 -07:00
Brennan Benson 741974c59c refactor: add split group model foundations (#644) 2026-04-14 14:39:01 -07:00
Jinwoo Hong 170610d1b2 fix: resolve Windows freeze when switching worktrees with right sidebar open (#628) 2026-04-14 00:45:04 -07:00
Jinjing 0ad3fda397 fix: harden active agent hovercard (#621) 2026-04-13 22:49:15 -07:00
Jinjing 130c3e9697 feat: scope terminal shell history per worktree (#620)
* feat: scope terminal shell history per worktree

Each worktree gets its own HISTFILE so ArrowUp only surfaces commands
from the current worktree. Integrates with the new LocalPtyProvider
architecture: history env injection runs after buildSpawnEnv but before
spawnShellWithFallback, and onBeforeFallbackSpawn keeps HISTFILE in
sync when the shell falls back.

* fix: align preload type declaration with implementation

Add missing command field to PtyApi.spawn in index.d.ts to match
the runtime index.ts signature, fixing TS2769 overload conflict.

* chore: remove terminal-history-scope-design.md from tracked files

* fix: mock terminal-history in worktrees test

The deleteWorktreeHistoryDir import pulls in electron's app module.
Add a vi.mock so the test doesn't hit the real electron export.
2026-04-13 22:42:53 -07:00
75ce59c3c9 fix: paste on right-click in Windows terminals (#571)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com>
2026-04-13 22:24:28 -04:00
Jinwoo Hong cc66e120eb feat: Add SSH remote support (beta) (#590) 2026-04-13 19:23:09 -07:00
Jinwoo Hong e7f6344e89 Browser v2: workspace model, session profiles, and cookie import (#577) 2026-04-13 10:03:32 -07:00
Jinjing f9e803082c feat: implement on-demand update notification nudge (#570)
* wip

* feat: implement on-demand update notification nudge

* fix: address CI lint failures
2026-04-12 21:30:15 -07:00
Brennan Benson 71a0069910 Revert "Split-screen tab groups with canonical group/item model" (#551) 2026-04-12 15:20:31 -07:00
Neil 1395b6f516 Support Pi titlebar status tracking (#530) 2026-04-12 01:20:20 -07:00
Brennan Benson 839d87181b Split-screen tab groups with canonical group/item model (#520) 2026-04-12 01:10:32 -07:00
Neil 5041afb052 fix: keep OpenCode activity and notifications in sync (#527) 2026-04-12 00:10:52 -07:00
Jinjing fd33d9cc2d feat: make titlebar agent status configurable (#526)
Add a `showTitlebarAgentActivity` setting under Appearance > Titlebar
that lets users toggle the agent activity badge in the titlebar.

- Add `showTitlebarAgentActivity` to GlobalSettings (default: true)
- Add toggle in AppearancePane under a new "Titlebar" sub-section
- Upgrade badge from Tooltip to HoverCard with per-worktree breakdown
- Show dimmed idle state when no agents are active
- Fix badge/tab overlap when sidebar is closed (min-w-0 + conditional shrink-0)
- Extract countWorkingAgentsForTab helper for reuse by per-worktree counter
2026-04-11 23:52:21 -07:00
Neil c4aabcc4e5 fix: audit terminal shortcut interception (#519) 2026-04-11 23:24:04 -07:00
Jinjing 3a0ba5c4e0 feat: replace update toasts with update card (#514)
* fix(UpdateCard): align downloading state layout to prevent height jumping

* feat: replace update toasts with update card

* test: update async updater expectations after merge

* test: align updater tests with card flow
2026-04-11 22:11:02 -07:00
Jinwoo Hong 331e7dedb8 Add usage status bar and Codex account switching (#483) 2026-04-11 11:23:44 -07:00
Neil ca041b66fe Add richer in-app feedback dialog (#468)
* Add richer feedback dialog

* Keep anonymous submission client-side only

* Use lowercase feedback API host

* Fallback feedback submission when api host is unavailable
2026-04-11 00:52:53 -07:00
Jinjing a6b12e9672 fix: address review findings (#467)
- Guard Cmd+C handler to skip text inputs (address bar, etc.)
- Wrap capturePage in try/finally to always restore grab overlay
- Clear grab toast timer on component unmount
- Fix lint: add curly braces, remove useless return
2026-04-10 22:39:28 -07:00
Jinjing a666ecb347 feat: enable open-links-in-app by default (#460) 2026-04-10 20:27:33 -07:00
Jinjing 0f819032a0 feat: auto-refresh File Explorer via filesystem watcher (#456)
* fix: address review findings

* feat: add filesystem watcher for auto-refreshing File Explorer

Adds @parcel/watcher-based filesystem watching so the File Explorer
automatically reflects external changes (creates, deletes, renames)
without manual refresh.
2026-04-10 19:50:14 -07:00
Jinwoo Hong 4389c65876 Add browser context grab feature (#451) 2026-04-10 14:13:35 -07:00
Brennan Benson 7b63288f68 feat: GitHub issue command automation for worktree creation (#441)
* feat: add shared issue command config and worktree automation

- Add shared top-level issue command support in orca.yaml with per-user .orca override read/write paths
- Surface the issue command in repository settings and the create-worktree dialog
- Queue issue-command terminal splits independently from setup-runner splits
- Preserve user checkbox state and repo-switch draft saves for issue command configuration
- Add parser, activation, and terminal-state test coverage for the new flow

* fix: clarify custom issue command settings label

* docs: clarify issue command effect behavior

* docs: unify issue command examples

* fix: keep issue command examples on one line

* style: use direct useEffect import in add worktree dialog
2026-04-10 13:52:46 -07:00
Jinwoo Hong 1b3719cb4c Add Codex usage tracking (#444) 2026-04-10 10:04:57 -07:00
Jinwoo Hong c6ff6da3a8 Add in-app browser tabs (#430) 2026-04-10 00:04:42 -07:00
Alexander 7a7d287ed2 feat: focus-follows-mouse setting for terminal panes (#389) 2026-04-09 17:02:01 -07:00
Jinwoo Hong 4d5da8c0a9 Add Claude usage tracking analytics (#417) 2026-04-09 12:28:59 -07:00
Jinjing 265c2ddd68 Remove macOS notification permission checking (#404)
* fix: address review findings

* fix: mock process.platform as darwin in system-denied test

The test exercises the macOS notification permission gate, which only
checks systemPreferences.getNotificationSettings on darwin. Without
mocking the platform, Linux CI takes the non-darwin path and the
assertion fails.

* chore: remove stale test files

* refactor: remove macOS notification permission checking

The systemPreferences.getNotificationSettings() check added friction
without meaningful benefit — macOS handles permission prompting natively
when a notification is posted, making the manual check redundant.
Removes getPermissionStatus(), the system-denied dispatch reason,
the IPC handler, the renderer permission-blocked banner, and all
related tests.
2026-04-08 20:59:49 -07:00
Neil b60341ff0c Revert "fix: prevent terminal reset when splitting tab groups" (#403) 2026-04-08 20:45:23 -07:00
Jinjing 01f3483b21 feat: structured notification dispatch results and startup permission registration (#400)
* fix: address review findings

* fix: mock process.platform as darwin in system-denied test

The test exercises the macOS notification permission gate, which only
checks systemPreferences.getNotificationSettings on darwin. Without
mocking the platform, Linux CI takes the non-darwin path and the
assertion fails.

* chore: remove stale test files
2026-04-08 20:36:01 -07:00
Jinjing 08e7274d31 feat: improve markdown file typing speed (#396)
* fix: address review findings

- Add try/catch to debounced serialization timer callback for consistency
  with flushPendingSerialization (prevents crash if editor is destroyed
  during the 300ms debounce window)
- Use TextEncoder.encodeInto() with pre-allocated buffer instead of
  encode() to avoid allocating a new Uint8Array on every render
- Extract keyboard handler to rich-markdown-key-handler.ts to stay under
  the 400-line file limit

* feat: improve markdown file typing speed

- Debounce ProseMirror getMarkdown() serialization (300ms) to eliminate
  the dominant typing-speed bottleneck on large markdown files
- Add 300KB size limit that falls back to Monaco source mode for files
  too large for ProseMirror's in-memory document tree
- Expose flushPendingEditorChange() bridge so autosave, quiesce, and
  restart flows capture debounced edits without data loss
- Signal dirty state immediately via onDirtyStateHint so close prompts
  and beforeunload guards don't miss edits during the debounce window
2026-04-08 20:04:21 -07:00
Matheus Nogueira da7ddb0792 fix: prevent terminal reset when splitting tab groups (#393)
- Always render through TabGroupSplitLayout (even single groups) to prevent TerminalPane unmounts that kill PTY processes
- CSS Grid flat rendering keeps TabGroupPanels as stable keyed siblings across layout changes
- Use effectiveVisibleRef in pty-connection so split-but-visible terminals receive PTY output
- Eagerly initialize layout in createUnifiedTab before first split
- Keep layout leaf when collapsing to single group (prevent unmount)
- Prevent Monaco model disposal with keepCurrentModel so split editors share models safely
- Keep titlebar spacer visible in split mode for right sidebar toggle positioning
2026-04-08 22:40:37 -03:00
Jinwoo Hong d38d240e86 feat: persist last-active terminal tab per worktree (#392)
When switching between worktrees, the active terminal tab was reset to
the first tab because activeTabId was global. This adds a per-worktree
map (activeTabIdByWorktree) mirroring the existing pattern used for
editor files, so users return to the same terminal tab they left.
2026-04-08 15:18:42 -07:00
Brennan BensonandClaude Opus 4.6 ee9bb15b54 fix: fast-forward local base branch when creating worktrees (#374)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 13:57:01 -07:00
Jinwoo Hong 9f317e9870 feat: prompt cache timer for Claude agents (#390) 2026-04-08 12:49:38 -07:00
Matheus Nogueira 82941850b6 Reapply "feat: unified tabs system with titlebar integration (#371)" (#384)
This reverts commit 72890a3c89.
2026-04-08 15:58:32 -03:00
Brennan BensonandClaude Opus 4.6 c533784d65 feat: add custom title support for terminal panes (#382)
* WIP: Changes before auto-review fixes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add custom title support for terminal panes

Users can set a custom title on individual terminal panes via the
right-click context menu ("Set Title...") or by clicking an existing
title. Titles display as a minimal floating label at the top of each
pane with inline editing (Enter to save, Escape to cancel). An X
button on hover removes the title.

Titles persist across restarts via titlesByLeafId in
TerminalLayoutSnapshot, piggybacking on the existing session:set flow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: address review findings for pane title feature

- Guard rename input against double-submit on Enter/Escape + blur race
- Memoize persistLayoutSnapshot with useCallback to prevent keyboard
  listener re-registration on every render
- Eagerly update paneTitlesRef in onPaneClosed so persistLayoutSnapshot
  sees correct data before React flushes state
- Document portal rendering's implicit dependency on paneTitles state

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: write pane titles in shutdown snapshot even when buffers are empty

captureBuffers had an early return when no terminal scrollback content
existed, which skipped writing titlesByLeafId to the layout snapshot.
This caused titles to be lost on restart for fresh or cleared panes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: remove design doc from PR

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 00:02:12 -07:00
Jinjing 72890a3c89 Revert "feat: unified tabs system with titlebar integration (#371)" (#384) 2026-04-07 23:56:17 -07:00
Jinwoo Hong beb62ff580 feat: add PR comments to checks panel (#376) 2026-04-07 17:58:40 -07:00
Matheus NogueiraandClaude Opus 4.6 9e431e6ca7 feat: unified tabs system with titlebar integration (#371)
* feat: add unified TabsSlice and tab bar UX improvements

Introduce content-agnostic Tab/TabGroup model (Step 1 of unified tabs
migration). TabsSlice coexists alongside legacy TerminalSlice/EditorSlice
and provides unified CRUD, neighbor selection, preview replacement, pin
support, and session hydration from both legacy and unified formats.

Also fixes several tab bar UX issues:
- Tab bar always visible (even with 1 tab)
- New terminal tabs appear at end of tab bar, not index 0
- Closing last terminal with editor files open switches to editor view
  instead of deactivating the worktree
- New terminal tabs receive focus immediately

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: extract tabs-helpers, tabs-hydration, and reconcile-order modules

Split tabs.ts (503 countable lines) and useTerminalTabs.ts (325 countable
lines) to stay under the max-lines lint limit without eslint-disable:

- tabs-helpers.ts: pure lookup/update functions + generic patchTab helper
- tabs-hydration.ts: session hydration for unified and legacy formats
- reconcile-order.ts: shared tab order reconciliation (was duplicated in
  TabBar.tsx, useTerminalTabs unifiedTabs memo, handleNewTab, and
  handleCloseTabsToRight)

Includes tests for all three extracted modules (29 new tests).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: move tab bar into the titlebar row

Render the TabBar inside the titlebar via a React portal, sharing the
same row as the "Orca" title. The left section of the titlebar matches
the sidebar width so tabs start exactly where the sidebar ends.

This saves ~36px of vertical space by eliminating the separate tab bar
row. Empty space after tabs remains window-draggable; individual tabs
and the "+" button opt out with -webkit-app-region: no-drag.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: prevent middle-click paste when closing tabs

Close tabs on auxclick instead of mousedown for middle-click. Closing on
mousedown removed the tab element before mouseup fired, causing the
mouseup to fall through to the terminal canvas and trigger an X11
primary selection paste on Linux.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: extract terminal tab actions to fix lint errors

Memoize `tabs` and `worktreeFiles` to fix useMemo unstable dependency
warnings. Extract action callbacks (close, activate, create, etc.) into
terminal-tab-actions.ts to bring useTerminalTabs.ts under the 300-line
max-lines limit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 16:33:25 -03:00
Jinjing c652990bb5 refactor: replace allowPrerelease workaround with generic feed URL (#365)
* fix(renderer): fix unescaped quote lint error in GeneralPane

* refactor: replace allowPrerelease workaround with generic feed URL

Use electron-updater's generic provider pointed at GitHub's
/releases/latest/download/ so the manifest always comes from the latest
stable release. This eliminates the client-side RC filtering, the GitHub
releases API fallback, and the manual-download path entirely.
2026-04-07 00:16:19 -07:00
NeilandClaude Opus 4.6 c0b6687e13 feat: add native desktop notifications (#180)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 23:24:02 -07:00
Jinwoo HongandClaude Opus 4.6 9b2b85c59d feat: add non-git folder support (#356)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 22:54:02 -07:00
Jinjing e5f10f8092 feat: preserve opened editor files across app restarts (#355)
Persist edit-mode files in the workspace session so they are restored
on restart. Diffs and conflict views are intentionally excluded as they
depend on transient git state.
2026-04-06 20:48:52 -07:00
Matheus Nogueira 132e033292 Scope zoom shortcuts to editor content outside terminal tabs (#348) 2026-04-06 21:07:08 -03:00
Jinjing 6c423f15f0 feat: improve terminal font compatibility across platforms (#342)
* feat: improve terminal compatibility with default fonts across platforms

Add cross-platform monospace font fallback chain (SF Mono, Menlo, Monaco,
Cascadia Mono, Consolas, DejaVu Sans Mono, Liberation Mono) so the terminal
renders correctly on macOS, Windows, and Linux out of the box.

- Platform-aware default font in settings (SF Mono / Cascadia Mono / DejaVu)
- buildFontFamily deduplicates user font against full fallback chain
- Error handling for pty spawn failures with user-facing error banner
- Zero-dimension diagnostic when terminal container has no layout
- WebGL context loss / unavailability logging for debugging

* feat: improve terminal font fallback and pty error handling

- Add cross-platform terminal font fallbacks
- Surface pty spawn errors to terminal UI
- Fix max-lines eslint error in TerminalPane
- Fix curly braces eslint error in constants.ts
2026-04-06 14:33:33 -07:00
Jinjing 51f26d1ca8 feat: extract headless autosave controller and bypass beforeunload during updater restart (#330)
Move editor autosave/save-queue logic out of EditorPanel into a
standalone controller that survives tab switches without keeping
the full editor UI mounted. Add updater lifecycle events so
beforeunload guards step aside during quitAndInstall, preventing
stale dirty-file prompts from blocking app restarts.
2026-04-06 11:59:08 -07:00
Jinwoo HongandClaude Opus 4.6 3211c1e15d feat: restore active terminals on app restart (#328)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 11:32:20 -07:00
Jinwoo HongandClaude Opus 4.6 1e95418122 Fix Orca CLI runtime bootstrap recovery (#324)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 11:32:16 -07:00
Jinjing 541dfebc70 feat: save dirty editor files before auto-update quitAndInstall (#327)
* feat: save dirty editor files before auto-update quitAndInstall

Dispatch a custom event from the preload quitAndInstall to flush unsaved
editor buffers before Electron's quitAndInstall bypasses the normal close
sequence. The EditorPanel claims the event, saves all dirty files via the
existing queueSave path, and resolves/rejects so the updater knows whether
it is safe to proceed.

* fix: address review findings

- Wrap save-before-update in try/catch so a save failure never silently
  prevents the update from installing
- Move detail.claim() inside try/catch to prevent promise hang on
  unexpected errors
- Add duplicate dirty tab detection to reject when the same file is
  dirty in multiple tabs (prevents silent write races)
2026-04-06 09:17:42 -07:00