* fix: persist sidebar collapsed groups across navigation and restart
The sidebar's collapsed-group state was stored as local React state in
WorktreeList, so the Sidebar unmount/remount triggered by navigating into
Settings discarded it — returning to the main view re-expanded every
previously collapsed group. Lift the state into the UI slice alongside
groupBy/sortBy/filterRepoIds and persist it via the existing ui:set IPC
so collapse state also survives app restarts.
* fix: clear collapsed groups when switching groupBy mode
Prevents stale keys from accumulating across mode switches and avoids
cross-mode key collisions that could leave groups unexpectedly collapsed.
---------
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Change the default setupScriptLaunchMode from 'split-vertical' to
'new-tab' so setup output runs in a background Setup tab by default
instead of crowding the primary terminal pane. Users can still opt
back into split-vertical or split-horizontal in Terminal settings.
* feat: add Ghostty-style macOS Option key mode setting
Disable xterm's macOptionIsMeta by default so non-US keyboard layouts
can compose characters (e.g. @ on German, € on French). Add a
user-facing "Option as Alt" setting with four modes — Both, Left,
Right, Off — mirroring Ghostty's macos-option-as-alt. Core readline
shortcuts (Option+B/F/D) are automatically compensated when Option is
in compose mode. The setting applies live to existing terminal panes.
* fix: track Option key location from modifier keydown, not character key
KeyboardEvent.location on a character key (e.g. Period) reports that
key's own position (always 0), not which modifier is held. Left/right
Option mode was broken because we read location from the character
event. Fix by recording the Option key's location from its own
keydown/keyup events and passing it as a separate parameter.
Adds a Terminal settings control for where the repo setup script runs
on workspace create: vertical split (default, preserves prior behavior),
horizontal split, or a separate "Setup" tab that does not steal focus
from the primary terminal.
* New workspace page with agent catalog, composer modal, and terminal integration
* fix lint
* better blank state
* fix: resolve typecheck errors in new-workspace flow
- widen activateAndRevealWorktree's issueCommand to accept direct
command shape used by NewWorkspacePage, not just the main-process
runner-script variant
- use a ref object in pty-connection tests to dodge TS narrowing the
captured callback to never across the mock closure boundary
* fix: bound worktree name auto-suffix loop to prevent OOM in tests
The auto-suffix loop in createLocalWorktree had no termination cap.
When tests (or a misconfigured env) mocked getBranchConflictKind /
getPRForBranch to always return a collision, the loop ran forever and
the vitest worker crashed with "Ineffective mark-compacts near heap
limit".
Cap the search at 100 suffixes, and if all fail, fall back to the
original specific error messages (branch already exists / PR already
owns the name) instead of a generic failure.
Update the two tests that asserted the old throw-on-first-conflict
behavior to verify the new auto-suffix path end-to-end.
Unregister PTY data handlers before killing PTYs during worktree
shutdown so the final data flush cannot trigger bell/agent-status
notifications. Also cancels accumulated closure state (staleTitleTimer,
agent tracker) via teardown callbacks, and adds a hasLivePtys guard
at notification dispatch time as a belt-and-suspenders check.
* refactor: enable split groups
* Fix split groups terminal host rollout
* refactor: remove split groups from add-tab menu
* refactor: dark-launch split groups with correctness fixes
* 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.
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
* Add richer feedback dialog
* Keep anonymous submission client-side only
* Use lowercase feedback API host
* Fallback feedback submission when api host is unavailable
* 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
* 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.