Commit Graph
8878 Commits
Author SHA1 Message Date
Brennan Benson 230297b430 Improve unread workspace contrast in the sidebar (#5866) 2026-06-19 19:35:23 -07:00
Brennan Benson 3f3a9ef94b Keep Source Control AI generation available when actions are hidden (#5859) 2026-06-19 19:16:05 -07:00
Brennan Benson 202827ecfa Prevent tab icons from briefly showing the wrong agent (#5860) 2026-06-19 19:07:16 -07:00
github-actions[bot] c43571c68c release: v1.4.82 v1.4.82 2026-06-20 02:01:23 +00:00
Jinjing 294089212f Refactor project header drag-and-drop to support project groups (#5867)
- Enable project header manual reordering when project groups are present.
- Restrict dragging to the project icon handle instead of the entire row.
- Integrate autoscrolling during sidebar drags via requestAnimationFrame.
- Fix drop index comparison in drag-commit logic to handle filtered sibling indices correctly.
- Modularize drag contract, initialization, and measurement helpers.
2026-06-19 19:00:37 -07:00
067c88fe55 feat(source-control): make group order configurable (#2188)
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-06-19 18:50:05 -07:00
Jinwoo HongandOrca 7320c1e8ba Show Codex reset credit expiry (#5865)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 18:49:22 -07:00
Jinjing 2a42a4e9ab Relax Source Control git action availability (#5853)
* Relax source control action availability

Implements the behavior described in docs/lift-git-action-restrictions.md: keep eligible git and review actions clickable so existing git/provider errors can surface, preserve partially staged commit availability, and show a readable inline notice when Create Review is blocked.

* Address source control review follow-ups

* rm design doc
2026-06-19 18:24:51 -07:00
Brennan Benson 5a85528b28 Test restored terminal pane titles (#5861) 2026-06-19 18:15:44 -07:00
Jinjing d063e8d5cb fix: address review findings (#5862) 2026-06-19 18:11:12 -07:00
Brennan BensonandOrca 6c941d8e75 Fix terminal pane title focus handling (#2756)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 17:50:16 -07:00
Trevin Chow ce253354fe Show worktree delete icon on sidebar row hover
Reveals the standard workspace delete action from sidebar rows on hover or keyboard focus, while keeping primary/main worktrees protected.

Maintainer follow-up:
- prevent hidden delete buttons from receiving pointer events
- merge latest main and resolve localization conflict

Validated with CI PR Checks plus local typecheck, lint, Vitest, and Electron hover/focus/delete-confirmation checks.
2026-06-19 17:43:12 -07:00
Jinjing b3bd785da6 fix: address review findings (#5857) 2026-06-19 17:41:40 -07:00
Brennan Benson b212c2b87b Stabilize Windows raw emoji terminal golden (#5852) 2026-06-19 17:23:47 -07:00
Jinwoo Hong 972078f2c4 Fix paste ownership, input bounds, and IPC validation
Supersedes #5745, #5746, and #5747.
2026-06-19 17:14:55 -07:00
Brennan BensonandOrca a5920b2183 Improve Settings integrations readability (#5851)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 17:11:51 -07:00
357d293bb0 Reduce renderer listener churn (#5831)
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-06-19 17:11:17 -07:00
slashdevcorpseandbrennanb2025 6f6664e744 Validate shell openPath targets (#5830)
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-06-19 17:10:43 -07:00
Jinwoo HongandOrca 8ef8596ba1 Fix remote browser/editor tab props persistence (#5847)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 17:01:10 -07:00
Jinwoo HongandOrca 0562240a92 fix: handle tall workspace drag previews (#5849)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 16:53:30 -07:00
github-actions[bot] 02ffbf7a8e release: v1.4.81-rc.6 v1.4.81-rc.6 2026-06-19 23:53:22 +00:00
Brennan BensonandOrca 8bed35aa29 Refine experimental worktree card status visuals (#5848)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 16:49:00 -07:00
Devin345458 bb0e98fcd1 fix(quick-open): restore panel focus when dismissing the Go to file dialog
Restore focus to the active panel when dismissing QuickOpen, including terminal, editor, simulator, local browser, and remote browser surfaces.

Reviewed-by: Codex
2026-06-19 16:47:27 -07:00
Prethish Kumar 21d0391881 fix(kimi): map AskUserQuestion to waiting and expose hook status
Maps Kimi AskUserQuestion PreToolUse events to waiting, exposes the Kimi hook status IPC/preload surface, and hardens Kimi session parsing plus remote hook path construction.
2026-06-19 16:45:34 -07:00
Neil 4eb3e75b9e feat(kimi): Kimi Code sessions in AI Vault + agent status hooks
Adds Kimi Code session parsing for AI Vault and managed Kimi agent status hooks.
2026-06-19 16:42:59 -07:00
Neil 9600e15757 fix(shortcuts): redesign keyboard shortcut settings with per-binding rows (#5850) 2026-06-19 16:41:05 -07:00
41b54c4d75 fix(settings): surface relative-path behavior in Workspace Directory helper (#5692)
* fix(settings): surface relative-path behavior in Workspace Directory helper

The global Workspace Directory field's helper text only duplicated the
section description, so the per-project relative-path behavior was
undiscoverable: a relative value resolves under each repo root, an absolute
value is one shared location (worktree-logic.ts resolveWorkspaceDirForRepo).
The per-repo "Worktree Location" field already explains this; the global one
didn't. Replace the redundant line with a helper stating both modes, under a
new i18n key across all five locales.

Also translate the host-scope strings in this block (Client default, Apply
to, Overrides/Inherits client default, Reset) that were still English in
zh/ko/ja/es.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M3VivWTrvHx31HdobBmPQ1

* fix(i18n): use 'Restablecer' for Reset action in es locale

'Reiniciar' reads as restarting Orca; 'Restablecer' is the correct
verb for resetting a setting to its default.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BnKfKNJJskzs7eWE7MyJDF

---------

Co-authored-by: Daniil Zinenko <dzinenko@welmi.ai>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-19 16:19:58 -07:00
JinHyeok Jeong b346717234 fix(i18n): correct Korean mistranslations
Correct Korean locale mistranslations, preserve cross-locale overrides while splitting KO data, and add regression coverage for key-specific localization repairs.
2026-06-19 15:52:05 -07:00
Jinwoo HongandOrca b17d8fc293 Share iOS releases with TestFlight peeps (#5841)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 15:49:00 -07:00
Jinwoo HongandOrca abbfb6d53f fix: handle macOS terminal command arrow scrolling (#5846)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 15:48:03 -07:00
Jinwoo HongandOrca c9460ed636 Put the orca CLI on PATH at install time for headless hosts (#5842)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 15:46:29 -07:00
Jinwoo HongandOrca 3afed388fc fix: expose terminal visual layout and copyable handles (#5845)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 15:42:13 -07:00
Brennan BensonandOrca c442f3aa00 Keep new workspace cards consistent after compact upgrades (#5843)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 15:34:46 -07:00
Jinwoo HongandOrca 4f4d520149 fix: support Android terminal IME and scroll gestures (#5844)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 15:27:53 -07:00
github-actions[bot] 0ed080dc59 release: v1.4.81-rc.5 [rc-slot:2026-06-19-15] v1.4.81-rc.5 2026-06-19 22:25:04 +00:00
Jinwoo Hong f92f12eb79 Fix mobile pending terminal tabs and prepare 0.0.15
Fix mobile pending terminal tab hydration and bump Orca Mobile to 0.0.15.
2026-06-19 14:12:09 -07:00
OrcaWinandNeil 4ea550bbef fix(release): sign Windows installers with SignPath
Co-authored-by: Neil <neil@stably.ai>
2026-06-19 14:06:21 -07:00
Brennan BensonandOrca 1a7c579df0 feat(worktree): assign parent worktrees from sidebar (#4908)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 14:05:32 -07:00
Brennan BensonandOrca e780d2980e Rename experimental agent sleep setting (#5837)
Co-authored-by: Orca <help@stably.ai>
2026-06-19 13:52:19 -07:00
Trevin ChowandCursor 8e524dfd33 fix(source-control): expand file context menu and shell-based Open in apps (#5825)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-19 12:54:21 -07:00
NeilandOrca ef45305aa4 fix(runtime): evict ClaudeAgentTeams team on natural leader PTY exit (#5823)
createLaunchEnv adds a team (with nested panes map) per agent-team leader,
keyed by a fresh teamId. The only eviction (removeTeamForLeaderHandle) ran
solely from closeTerminal (explicit user-close). The natural-exit paths
onPtyExit and dropDisconnectedPtyRecord tore down every other per-pty map
but never the team, so a leader exiting on its own leaked the team + panes
map permanently.

Evict via the leader handle (handleByPtyId.get(ptyId)) in both onPtyExit
and dropDisconnectedPtyRecord, mirroring the closeTerminal call. Add
getActiveTeamCount for assertability.

Regression test drives the real onPtyExit/dropDisconnectedPtyRecord: fails
before the fix (teams leak) and passes after.

Co-authored-by: Orca <help@stably.ai>
2026-06-19 12:34:53 -07:00
NeilandOrca 3b4dc246d8 fix(terminal): evict lastCompletionIdentityByPaneKey on genuine pane teardown (#5822)
dispatchCompletion writes a per-paneKey entry into the module-scoped
lastCompletionIdentityByPaneKey on every completion. paneKey is a
never-reused ${tabId}:${leafUUID}. The map is module-scoped so it survives
a live-stream remount (dispose-then-recreate, isLive() still true), but
dispose never evicted it, so genuine teardown (PTY gone) leaked one entry
per closed pane.

Evict in dispose only when !options.isLive() — the same discriminator the
cross-remount dedup tests rely on (remount disposes with isLive() true).

Regression test fails before the fix (identity survives teardown, 200 leak)
and passes after; the existing cross-remount dedup suite still passes.

Co-authored-by: Orca <help@stably.ai>
2026-06-19 12:34:50 -07:00
NeilandOrca 3db65e8d9a fix(stats): refuse AgentDetector pty-map resurrection after onExit (#5820)
onData creates+sets a pty record before the stopped-state guard, and onExit
deletes the record instead of leaving a tombstone. A data chunk arriving
after onExit (the exit-then-data race in pty.ts shutdown) resurrected a
fresh record that nothing ever deleted, and double-counted the session.
ptyId is a fresh per-spawn UUID, so the three ptyId-keyed maps grew
unbounded.

Track exited ids in a bounded FIFO and refuse onData resurrection for them.

Regression test fails before the fix (record resurrected, 200 leaked) and
passes after.

Co-authored-by: Orca <help@stably.ai>
2026-06-19 12:34:47 -07:00
NeilandOrca 77633809c6 fix(crash-reporting): bound coalescedBreadcrumbs with TTL prune + LRU cap (#5818)
recordCoalescedCrashBreadcrumb set entries keyed by agent:${agentType}:${state}
with no prune and no cap. agentType is an open string (length-trimmed only,
never enum-checked) over the relay/SSH/OSC ingest paths, so the map grew
unbounded over a long multi-agent session — the sibling breadcrumbs array
is capped at 30, but this map was not.

Prune entries past their suppression window and LRU-cap to 128, mirroring
ProcessGoneDedupe's prune/maxKeys idiom.

Regression test fails before the fix (1000 keys) and passes after.

Co-authored-by: Orca <help@stably.ai>
2026-06-19 12:34:44 -07:00
NeilandOrca 4a1107a4b2 fix(daemon): clear disabledSessions on normal terminal exit in closeSession (#5816)
handleWriteError adds a sessionId to disabledSessions on any best-effort
history write failure. closeSession (the normal PTY-exit teardown) deleted
the writer but never the disabled flag; the only other deletes are on id
reuse (never happens) and explicit user-kill. A session poisoned by a
transient mid-life write error then exiting normally leaked its id in
disabledSessions forever.

Delete the flag in closeSession after writers.delete. Add isSessionDisabled
and disabledSessionCount test accessors.

Regression test fails before the fix (50 ids leak) and passes after.

Co-authored-by: Orca <help@stably.ai>
2026-06-19 12:34:41 -07:00
NeilandOrca 275869f310 fix(store): purge all per-worktree maps on project removal via purgeWorktreeTerminalState (#5815)
removeProject hand-deleted only a handful of per-worktree maps and never
called the canonical purgeWorktreeTerminalState/buildWorktreePurgeState,
so ~30 worktree-scoped maps (unified tabs, groups, layout, git status,
browser, everActivatedWorktreeIds, …) retained an entry per worktree of
every removed repo with no reaper to recover them.

Route removeProject through purgeWorktreeTerminalState before its
repo-scoped set() (which still handles repo-level keys). The purge is a
pure state reducer with no PTY side effects.

Regression test fails before the fix (entries survive) and passes after.

Co-authored-by: Orca <help@stably.ai>
2026-06-19 12:34:37 -07:00
NeilandOrca 093f38e342 fix(store): evict the per-worktree and per-page maps the worktree-removal paths miss (#5804)
Three worktree-keyed maps (remoteStatusesByWorktree,
recentlyClosedEditorTabsByWorktree, defaultTerminalTabsAppliedByWorktreeId)
were re-keyed on rename but purged by neither removal path. Five
page/workspace-keyed browser maps (browserAnnotationsByPageId,
remoteBrowserPageHandlesByPageId, pendingAddressBarFocusByPageId/ByTabId,
recentlyClosedBrowserPagesByWorkspace) were cleaned only on the single
removeWorktree path; the bulk authoritative-scan reconcile missed them.
worktreeId / workspace id / page id are unbounded ephemeral key spaces,
so every removed worktree leaked entries for the session.

buildWorktreePurgeState now collects doomed page ids and omits all eight
maps; the single removeWorktree reducer deletes the three worktree-keyed
ones. A stale comment claiming purge already dropped them is corrected.

Regression test fails before the fix (entries survive removal) and passes
after.

Co-authored-by: Orca <help@stably.ai>
2026-06-19 12:34:33 -07:00
NeilandOrca b0a4d04fbf fix(store): cap prRefreshStates the same way prRefreshSequences is capped (#5802)
* fix(store): cap prRefreshStates the same way prRefreshSequences is capped

prRefreshStates is keyed by the same unbounded PR cache key
(execution-host/repo/branch) as prRefreshSequences, but was committed
uncapped one line below the capped sequences map. Status-only events
(paused/skipped) and upstream-error outcomes add entries that no prune
path ever removes, so it grew monotonically over a long session.

Bound it by insertion order via a shared capRecordByInsertionOrder helper
(capPrRefreshSequences now delegates to it), and delete-then-set the
touched key in the status writer so only idle keys are evicted.

Regression test fails before the fix (map grows past the cap) and passes
after.

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

* test(store): fix prRefreshStates leak-test types for tsc/tsgo

The leak test ran under vitest (esbuild strips types) but failed tsgo:
the status-event helper widened literals and the seeded entries typed
reason as string. Annotate the helper as GitHubPRRefreshEvent (in-flight
variant) and type seeded values' reason as GitHubPRRefreshReason.

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

* fix(store): make prRefreshStates eviction status-aware to prevent UI regression

prRefreshStates backs visible status pills, so a plain insertion-order cap
could drop an in-progress (in-flight/queued/paused) indicator under a large
working set. Raise the bound to 2000 (well above any realistic tracked-branch
count) and evict settled statuses (error/skipped) first; active entries are
dropped only as a last-resort hard bound. Evicted entries self-heal on the
next refresh event.

Test asserts settled-before-active eviction and that the bound holds; still
fails on the un-capped (main) behavior.

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-19 12:34:30 -07:00
Neil d90366f720 fix(tab-bar): search agents by prefix and make the open-entry list keyboard-navigable (#5817)
The "Open any file, URL, agent, ..." new-tab entry had two gaps:

1. Agents were not really searchable. findMatchingTabAgentLaunchOptions only
   matched on exact alias equality, so a partial name ("gemin", "clau") surfaced
   no agent. It now scores prefix/token matches (exact alias wins; otherwise every
   query token must prefix an alias token; mid-string and single-char hits are
   rejected so agents — which rank above file results — don't noisily hijack the
   list). The tokenizer is shared with the create-menu matcher via
   query-token-match.ts.

2. Arrow keys didn't navigate the list. Navigation only ran when there were >1
   result rows, and the just-opened (empty-query) state trapped focus in the input
   so the static create/agent list below was unreachable. Arrows now move the
   highlight for any result count, and with no result rows focus routes into the
   enclosing Radix menu; ArrowUp on the first item returns to the search box so
   the trip isn't one-way.

Also adds combobox/listbox + aria-activedescendant semantics so the highlight is
exposed to assistive tech, and splits the row presentation and option types into
focused modules to keep the component under the line cap.
2026-06-19 12:33:17 -07:00
Jinjing bc2f5145da Allow deleting downloaded speech models on desktop and mobile (#5794)
* Allow deleting downloaded speech models on desktop and mobile

Implement safe deletion of local speech models across desktop and
mobile platforms.

- Add a shared helper to coordinate STT service teardown, file deletion,
  and voice settings cleanup.
- Prevent deleting speech models that are currently in use or starting.
- Update desktop and mobile settings UIs to expose the delete action.

* Track multiple pending model deletions and update action disabling

- Replace the single pending delete ID string state with a Set of IDs on desktop settings to track multiple concurrently deleting models.
- Switch the desktop delete action to use the standard themed Button component.
- Disable all row interactions on the mobile voice model list when any model action is busy.
- Add unit test coverage verifying that individual row delete button disabled states behave correctly.
2026-06-19 12:31:11 -07:00