Commit Graph
4758 Commits
Author SHA1 Message Date
Brennan Benson fb80f91921 Clear stale terminal selection during pane recovery (#13677)
* fix(terminal): forward copy to TUI selections

* fix(terminal): narrow recovery selection cleanup
2026-08-10 15:52:25 -07:00
Brennan Benson 84bd306949 perf: Stop unchanged worktree refresh churn (#13662)
* fix: stop unchanged worktree refresh churn

* fix: preserve smart sort telemetry recomputations

* fix: preserve duplicate worktree host identities

* perf: skip reconciled catalog traversal

* test: strengthen worktree refresh regressions
2026-08-10 15:44:05 -07:00
makoto-developerandBrennan Benson 0b5c5d6e74 fix(i18n): restore identifiers and commands machine translation localized in ko/zh/es (#13124)
* fix(i18n): restore identifiers and commands machine translation localized

39 values in ko, zh and es are code rather than copy — shell commands, CSS
class strings, git-style identifiers, sample filenames and hostnames — and had
been machine-translated. pnpm install read pnpm 설치, text-foreground read
文本前景, pr-view read PR视图, and localhost:3000 read 本地主机:3000.

pnpm install is the font-mono placeholder of the setup-script input, and
gh auth login / glab auth login are the commands the integration panes tell the
user to run, so the translated forms are shown to users as text to type.

Catalog-only. Running repair-locale-catalog.mjs over these locales fixes the
same values but rewrites several hundred unrelated ones, because the catalogs
are stale against the current policy.

* fix(i18n): restore the zh code strings found by call-site context

@smwbev scanned by where a translate() renders — inside <code> or a font-mono
element — rather than by value shape, and found nine more in zh: upstream read
上游 in the base-ref picker, nbformat read nb格式, orca.yaml read Orca.yaml,
LIN-329 read 林-329, GH #1799 lost its space, and orca · zsh read Orca·zsh.

The matching NEVER_TRANSLATE_VALUES entries landed with #12934.

* test(i18n): guard restored technical literals

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 15:43:36 -07:00
闲人andBrennan Benson 72184b75fd fix(settings): widen font size input so values are fully visible (#11585)
* fix(settings): widen font size input so values are fully visible

The number input for terminal font size was too narrow (w-14) to display
two-digit values cleanly. Changed to w-24 to ensure 10-24px values fit.

* fix(settings): hide the native spin buttons clipping the font size value

The overlapping webkit spinner was what cut off the second digit, not the
box width. Adopt the number-input-clean idiom every other numeric settings
input already uses; the spinner also duplicated the -/+ steppers.

* fix(settings): keep font size stepper compact

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 15:32:50 -07:00
Brennan Benson fe0ab305c4 Avoid synchronous webview URL IPC during browser pane render (#13646)
* perf(browser): avoid synchronous URL IPC during render

* fix(browser): sync live URL after CDP navigation
2026-08-10 14:57:44 -07:00
ax-dfcorpandBrennan Benson 1fafbe65f5 fix(sidebar): dispatch workspace delete intent after menu close (#11646)
* fix(sidebar): keep delayed workspace delete target stable

* fix(sidebar): report a stale workspace list instead of a silent delete no-op

runWorktreeDelete fails closed when the clicked row is no longer in the store
(concurrent delete, state reset, or a runtime re-pair that drops live rows).
The guard is right, but it returned with no feedback, so Delete looked broken.

Report the miss with the stale-list toast runWorktreeBatchDelete already uses,
extracted to a shared module so both paths share one description string.

* fix(sidebar): dispatch delete intent after menu close

* fix(sidebar): validate batch delete identities

* fix(sidebar): preserve delete identity through confirmation

* test(sidebar): follow delete status boundary extraction

* fix(sidebar): bound delete status hydration

* test(sidebar): register current parallel delete targets

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 14:32:37 -07:00
Jinwoo HongandNeil ec7e3ea477 fix(terminal): prevent paired activity renderer starvation (#13508)
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-08-10 14:32:08 -07:00
Jinjing c0c893d171 fix(pty): bound cooked reply queue (#13422)
* fix(pty): bound cooked reply queue

* fix(pty): bound cooked reply queue

Implement bounded storage for cooked-echo-safe replies: 64 pending
replies and 4096 UTF-16 code units. Shed oldest replies on overflow,
never ordinary input. Add drain failure containment with generation
fencing to prevent stale operations from clearing fresh input after
clear() reuse.

* fix(pty): report pty id in drain failures

When the async drain yields, the owner may rebind to a different PTY
before the failure surfaces. Pass the failing pty id so the transport can
ignore stale failures from a rebound owner. Also tighten the pending
reply queue size bound to prevent half-written entries.
2026-08-10 12:17:21 -07:00
Neil a63df91790 perf(renderer): gate remote session mirror scans (#13544) 2026-08-10 02:36:19 -07:00
Neil d15a554f62 perf(renderer): gate unread badge scans (#13554) 2026-08-10 02:34:54 -07:00
Neil 6cdd019367 docs(mobile): keep Android links on published release (#13565) 2026-08-10 02:22:35 -07:00
Neil bbcf89e221 chore(mobile): prepare 0.0.43 releases (#13549) 2026-08-10 01:49:33 -07:00
Neil eacb9a9fa4 perf(automations): keep output snapshot appends linear (#13469) 2026-08-10 01:36:08 -07:00
Brennan Benson 9060a88dde fix: contain unbroken dialog failure output (#13531) 2026-08-10 01:24:54 -07:00
hwantageandBrennan Benson 14dc499aa5 fix(ai-vault): preserve agent metadata header on session row expansion (#10920)
* fix(ai-vault): preserve agent metadata header on session row expansion

* chore(tests): remove redundant comment in AiVaultSessionRow test

* test(ai-vault): add happy-dom environment and window.api shim to AiVaultSessionRow tests

* test(ai-vault): assert the expanded session row via the rendered row

Replaces the parallel static-markup harness and second fixture with the
file's existing Testing Library row render, so both suites share one
session fixture and one prop list. Raw HTML substring matches are gone:
the identity assertions now run inside the metadata grid, because the
details-toggle button's aria-label repeats the agent name and made the
old check pass with the fix reverted.

Tags the grid with a data-testid like the row's other query anchors
rather than walking up from a text node, adds cleanup() — the suite has
no globals: true, so rows leaked across tests — and guards that the
worktree badge renders once when expanded. SessionWorktreeLine loses an
export the row no longer imports.

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 01:07:17 -07:00
ce3ec4d5ce fix(repo-icon): keep a renamed fork's own owner avatar (#12271)
* fix(repo-icon): keep a renamed fork's own owner avatar

Fork repos always took the upstream owner's avatar, so a renamed fork
showed its parent project's logo. Same-name forks (personal copies)
still prefer the upstream owner; renamed forks now keep their origin
owner across auto-detect, the startup backfill, and the settings
avatar refresh.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(repo-icon): re-read repo state before backfill avatar write

The startup backfill computed icon updates from a pre-loop snapshot, so
an icon chosen in settings while the upstream/origin probes were pending
could be clobbered. Re-read the repo after the probes and only migrate
an icon that is still the auto-detected GitHub avatar.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(repo-icon): own the fork avatar rule in one shared selector

The renamed-fork rule was written out twice — once in the main-process
auto-detect and once in the renderer refresh — so the two copies could
drift. Move it next to `githubAvatarIcon` as `githubAvatarSlug`, which
collapses the renderer resolver to a single unbranched path.

Also stop swallowing a rejected origin probe: it cannot tell a renamed
fork from a same-name one, so degrading to the upstream owner would flip
a renamed fork's stored avatar back to the parent's. Letting it propagate
keeps the stored icon, matching how the non-fork path already behaved.

Adds coverage for the startup backfill, the third decision point the fix
claims, which had none.

* test(repo-icon): cover pending backfill icon change

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 01:06:32 -07:00
Brennan Benson 4e536a5232 Improve Agent Map hover and presence motion (#13407)
* feat(agent-map): improve hover and presence motion

* fix(agent-map): derive exiting popover state

* fix(agent-map): bound exit motion lifecycle

* perf(agent-map): avoid duplicate motion commits
2026-08-10 01:03:09 -07:00
Neil 75f5e2d964 perf(renderer): reuse prepared native chat messages (#13519) 2026-08-10 01:00:20 -07:00
Brennan Benson 66aed16974 refactor(ui): consolidate toggle switches (#13432)
* refactor(ui): consolidate toggle switches

* fix(ui): label consolidated switches
2026-08-10 00:54:30 -07:00
Mark XianandBrennan Benson 80f23e31cb fix(file-explorer): open symlink files when stat fails (#11670)
* fix(file-explorer): open symlink files when stat fails

* fix(file-explorer): grant symlink targets path access on activation

Following a symlink out of the workspace was denied by the main-process
path allow-list, so both the stat and the file read failed. Activating the
row is explicit intent, so authorize the target the way terminal links and
Quick Open already do.

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 00:53:54 -07:00
Doyoon LeeandBrennan Benson 33dad13e64 fix: wrap unbroken auto-rename failure output (#12317)
* fix: wrap unbroken auto-rename failure output

* test(sidebar): cover unbroken auto-rename failure containment

happy-dom does no intrinsic sizing, so assert the two declarations that
keep an unbroken token from widening DialogContent's grid column. The
test fails when either min-w-0 or overflow-wrap:anywhere is reverted.

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-10 00:24:00 -07:00
Neil c498d763cd perf(renderer): unmount closed jump palette content (#13525) 2026-08-10 00:18:54 -07:00
Brennan Benson 8a3f704bd1 fix(agent-dashboard): highlight agents awaiting input (#13523)
* fix(agent-dashboard): highlight agents awaiting input

* test(agent-dashboard): cover status halo boundaries
2026-08-10 00:16:54 -07:00
Brennan Benson 0fa3a5bd1d Show directional lineage in agent map (#13503)
* Show directional lineage in agent map

* Route agent lineage links diagonally

* Guard agent map lineage path bounds

* Avoid chevrons in undersized lineage gaps
2026-08-10 00:16:21 -07:00
Neil abd160fadd perf(renderer): defer terminal quick command host work (#13517) 2026-08-09 23:43:58 -07:00
Jinjing f5d934a3f5 3c5f0060 (#13496)
* refactor(runtime): extract pure path-candidate, review-branch, and folder-workspace helpers from orca-runtime.ts

Mechanical move of three closed, pure module-scope clusters out of
orca-runtime.ts (37,608 -> 37,207 lines) into domain-named siblings:

- terminal-output-path-candidates.ts: PTY output path harvesting and the
  recent-candidate history bound (3 entry points + 15 private callees).
- selected-review-branch.ts: forge-agnostic selected-review predicates and
  lookup hints (GitHub/GitLab/Bitbucket/Azure DevOps/Gitea).
- runtime-folder-workspace.ts: folder-workspace id math and the repo+meta
  -> Worktree projection.

Bodies are token-identical to their previous form; the only production
changes are the moves, the new import statements, and `export` keywords.
The no-control-regex suppression travels with the path-candidate scanning
that needs it. No max-lines suppression was added and the ratchet is
unchanged.

Adds characterization tests for the two clusters that had no direct
coverage; the path-candidate cluster keeps its existing tests, repointed
at the new module.

* fix flaky timer on CI
2026-08-09 23:37:33 -07:00
Neil 016df33f00 fix(github): complete PR reactions for CodeRabbit reviews (#13456)
* feat(github): add PR comment reaction controls

* feat(github): add full PR comment reaction picker

* fix(github): cover all reactable PR comment paths

* fix(github): reconcile comment reactions with main

* fix(github): preserve focus on failed reaction removal
2026-08-09 23:14:17 -07:00
Neil 7dce0442ab Add Caffeinate controls to the status bar (#13480)
* feat: add caffeinate status controls

* refactor: compact caffeinate status

* fix: harden caffeinate readiness
2026-08-09 22:52:11 -07:00
Neil f2b2ece831 perf(renderer): reuse locale collators (#13444) 2026-08-09 22:24:09 -07:00
Jinwoo HongandJinwoo-H 158212b8b3 feat(github): add PR comment reactions (#13470)
* feat(github): add PR comment reactions

* fix(github): harden comment reaction updates

---------

Co-authored-by: Jinwoo-H <Jinwoo-H@users.noreply.github.com>
2026-08-09 22:11:54 -07:00
Jinwoo Hong d9e84d88ef fix(persistence): salvage corrupt workspace session entries (#13431) 2026-08-09 21:39:24 -07:00
Neil 4cca31f36f fix(quick-open): compact Cmd+P file rows (#13454) 2026-08-09 21:21:18 -07:00
Neil 9ccec550c3 Add emoji picker to workspace editing and search (#13429)
* Add emoji picker to workspace editing and search

* fix(sidebar): scope sticky headers by host

* fix: address emoji picker review findings
2026-08-09 20:25:15 -07:00
OrcaWinandOrcaWin bdd763188f Fix Windows AI Vault resumes using the wrong shell (#13420)
* fix: use project shell for AI Vault resumes

* fix: preserve WSL cwd fallback semantics

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-08-09 19:52:16 -07:00
Jinwoo Hong ce8c3267b7 feat(terminal): add anchored link action popovers (#13414) 2026-08-09 19:27:01 -07:00
Jinwoo Hong a3ca887a3c fix(workspaces): start task agents on remote hosts (#13412) 2026-08-09 19:09:49 -07:00
Neil 8a33ce2536 [leas code] Simplify boolean guards (#13401)
* refactor: remove unreachable code

* refactor: simplify boolean guards
2026-08-09 19:04:05 -07:00
Jinjing 3b1017c4fb Add nightly cut (#13410)
* Add daily macOS dev build release channel

Publish once-daily signed macOS builds from main at a dedicated cadence,
separate from hourly (too noisy) and release branches (too infrequent).
Builds are notarized and installable via the updater, but unvetted —
published to stablyai/orca-daily rather than the main repo to avoid
evicting stable/RC entries from the releases feed.

* fix lint

* fix commit

* Add third token mint to daily macOS build workflow

The upload step's 2x45m retry budget can outlive the one-hour token, so a third
is minted after it for verify and cleanup operations. Release notes are moved to
a file to ensure consistency between draft creation and publish. Daily channel
description updated with specific UTC release time.
2026-08-09 19:01:35 -07:00
Neil 8a38e2f3f8 refactor(renderer): reuse existing control paths (#13425) 2026-08-09 18:50:56 -07:00
JinjingandOrca b075a95b06 Strip liveness gate from AI Vault session delete (#13279)
* Strip liveness gate from AI Vault session delete

Delete now requires only path validation + user confirmation — no process
roster, no liveness check, no quiescence, no ownership ledger.

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

* Remove obsolete AI Vault liveness delete reliability gate

Session delete no longer checks process liveness, so drop the
manifest entry that still referenced the deleted test files.

* minor fix

---------

Co-authored-by: Orca <help@stably.ai>
2026-08-09 18:40:01 -07:00
cb6069ceea fix(ui): align toggle switch handle symmetrically in on state (#9714)
* fix(ui): align toggle switch handle symmetrically in on state

The switch handle (translate-x-4 / 16px) left a 6px gap on the right
in the on state while the off state had only a 2px gap on the left.
Accounting for border-box sizing (1px border each side reduces content
width to 34px), the correct on-position is translate-x-4.5 (18px) so
both sides have a 2px inset.

* docs: add JSDoc to exported functions in changed files for docstring coverage

* fix(ui): align toggle switch handle symmetrically in on state

The `h-5 w-9` switch track is `border-box` with a 1px border, leaving 34px
of content for the 14px `size-3.5` handle. `translate-x-0.5` insets the off
state by 2px, so the on state needs 34 - 14 - 2 = 18px. It used
`translate-x-4` (16px), leaving 4px on the right against 2px on the left.

Adds a boundary test so the offset cannot drift again across the 26
hand-rolled switch call sites, and drops the docstrings the original patch
added to satisfy a coverage bot (the surrounding files carry none).

Original patch by @sei0.

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

* test(ui): widen the switch-handle alignment guard to every h-5 w-9 track

Scan the renderer with the readdirSync walk and TypeScript AST already used by
no-top-level-translate.test.ts instead of shelling out to `git grep`, and find
each knob inside its own track rather than by scanning source text forward.

Why: gating on `role="switch"` silently skipped ClaudeUsageLoadingState.tsx (a
loading skeleton, so a div with no role) and HiddenExperimentalGroup.tsx, so
regressing the loading-state handle back to translate-x-4 left the guard green.

The guard now also fails when the premise behind 34 - 14 - 2 = 18px stops
holding: a track that loses its 1px border or gains padding, a conditional whose
two branches no longer pair off/on, and a track whose knob moved into a child
component where the scan would otherwise just stop seeing it.

---------

Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-09 18:34:05 -07:00
Neil 1e72534709 refactor: deduplicate repository search entries (#13415) 2026-08-09 18:31:36 -07:00
Neil 65a5e8470a refactor: share GitHub link normalization (#13409) 2026-08-09 18:31:16 -07:00
Neil ced2719b26 refactor: remove unreachable code (#13400) 2026-08-09 18:29:32 -07:00
Wooseong KimandBrennan Benson ac830689c4 fix(composer): autosize Create Worktree note on PR prefill (#10580)
* fix(composer): autosize Create Worktree note on PR prefill

The Note textarea only grew on onInput, so programmatic PR title prefills
left the box at one row with overflow hidden. Resize whenever the note
value changes and allow scroll under max-height (fixes #10575).

* review: size the composer note with field-sizing instead of a measure pass

The prefill bug is the failure mode of imperative sizing: the height is only
recomputed at the events someone remembered to hook, so a programmatic setNote
(and a pane resize, and a font reflow) leaves it stale. Let the layout engine
own the height, matching NativeChatComposerField and LinearIssueTextEditor.

Drops the extracted helper and its unit test — that test asserted the two
assignments it wrote and stayed green with the bug present. The composer test
now pins the class contract and goes red on the pre-fix markup.

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-09 17:47:28 -07:00
TaeHwan JungandBrennan Benson f155c47d14 fix(editor): map .jsp/.jspf to the html language id (#12402)
* fix(editor): map .jsp/.jspf to the html language id

* docs(editor): mark the jsp html mapping as a markup-only stopgap

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-09 17:14:44 -07:00
Brennan Benson 7aae88cd21 Fix terminal select-all and copy in Kitty-enabled TUIs (#13388)
* fix(terminal): handle select-all in Kitty TUIs

* fix(terminal): preserve popout native selection
2026-08-09 16:52:13 -07:00
Brennan Benson 5df2ddbc9c perf(ai-vault): isolate tab title resolution (#13377)
* perf(ai-vault): isolate tab title resolution

* fix(ai-vault): preserve background scan caches

* fix(ai-vault): resolve nested worker from chunks
2026-08-09 16:45:52 -07:00
Brennan Benson a1f61ef8c0 feat(agents): add Prime Agent status hooks (#13384) 2026-08-09 16:45:27 -07:00
7c05c8c72e fix(repo-icon): center emoji glyph within its sized icon box (#12057)
* fix(repo-icon): center emoji glyph within its sized icon box

The emoji glyph span in RepoIconGlyph received a fixed-size box via
iconClassName but had no self-centering, so the outer flex only
centered the box itself while the glyph sat top-left inside it —
most visible in the settings preview (size-10 box, size-5 icon).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ewCWxSox2WHN8T78AT7T4

* test(repo-icon): cover emoji centering in its sized icon box

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-09 16:35:39 -07:00