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.
* 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
* refactor: eliminate useEffect anti-patterns across 5 components
- MonacoEditor, RichMarkdownEditor: assign callback/prop refs directly
during render instead of via useEffect, so ProseMirror and Monaco
handlers always read the current closure rather than a one-render-
stale copy.
- SettingsFormControls (FontAutocomplete): replace useEffect that reset
highlightedIndex on filteredSuggestions/open changes with the
"adjusting state during render" pattern (track prevOpen /
prevFilteredSuggestions), so the correct item is highlighted on the
same paint as the dropdown opens or the filter updates.
- ChecksPanel: replace useEffect that reset 5 local state fields on
activeWorktreeId change with the "adjusting during render" pattern
(track prevActiveWorktreeId), so stale title/loading UI from the
previous worktree is cleared before the first paint of the new one.
- SshPassphraseDialog: split one useEffect that both reset form state
and focused the input into (a) during-render state reset and (b) a
focused DOM-only useEffect, so the cleared input is visible
immediately rather than after a post-paint effect flush.
* fix: resync font autocomplete highlight on value change
The debounced onUpdate serialization feeds back through the content prop,
and if the user types between the debounce firing and the useEffect
running, the stale prop triggers setContent — resetting the cursor.
Skip the destructive setContent when the content prop matches our own
last serialization (lastCommittedMarkdownRef).