* 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.
When a worktree delete fails, users may want to inspect the worktree
to understand why. Add a "View" button that navigates to the worktree
via activateAndRevealWorktree on all delete failure toasts.
⌘⇧N conflicts with the well-known "New Window" convention in VS Code
and Chrome. ⌘⇧M is a clear mnemonic for Markdown and doesn't clash
with any existing shortcut. Also adds New Browser Tab and New Markdown
entries to the Settings keyboard shortcuts pane.
tabsByWorktree can retain entries for worktrees deleted outside Orca or
whose cleanup didn't complete. This caused phantom agents to appear in
the titlebar count. Now both countWorkingAgents and
getWorkingAgentsPerWorktree filter against worktreesByRepo as the source
of truth.
Increase gap between last tab and the "+" button (ml-0.5 → ml-2),
add more vertical padding to dropdown menu items (py-0.5 → py-1.5),
and align dropdown to open rightward (align end → start).
Add two workarounds for Chrome/ProseMirror drag-selection breakage:
1. DragSelectionGuard extension — suppresses selectionchange → selectionToDOM
during active drags, blocks CellSelection transactions from prosemirror-tables,
and restores native selection post-mouseup to preserve table-cell highlighting.
2. safeReactNodeViewRenderer — patches handleSelectionUpdate so selectNode/
deselectNode only fire for actual NodeSelections, preventing React re-renders
mid-drag that disrupt native selection tracking (Tiptap #7647).
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.
closeFile() only removed the file from openFiles and picked the next
active file by array position. Terminal and browser closes already went
through closeUnifiedTab() which uses pickNeighbor(group.tabOrder) for
visual neighbor selection. Add the same closeUnifiedTab() call to
closeFile() so editor, diff, and conflict-review tab closes behave
consistently.
Also update the /electron skill with Orca-specific CDP launch recipe
and broader trigger keywords for more reliable invocation.
* fix: return error objects from IPC repo handlers instead of throwing
Electron IPC does not preserve Error objects across the process boundary,
so throwing from main-process handlers can result in opaque failures on
the renderer side. Switch repos:add and repos:addRemote to return
{ repo: Repo } | { error: string } discriminated unions, and update all
call sites to check for the error variant.
* fix: address review findings
- Add explicit return type to repos:add handler for type safety
- Log errors in NonGitFolderDialog catch block (direct IPC call
bypasses store toast handling)
* fix: show toast on remote folder add failure
The NonGitFolderDialog calls addRemote directly (bypassing the store),
so errors were silently swallowed. Show a toast so the user sees feedback.
Reset defaultBaseRef to null on repo change so effectiveBaseRef becomes
falsy until the IPC resolves, preventing branch compare from firing with
a stale cross-repo value. Also fix loading→error→loading flicker by only
resetting to loading state on first request or when base ref changes.