Commit graph

944 commits

Author SHA1 Message Date
Jinwoo Hong
037acf64db
fix(terminal): refresh WebGL canvas after resume to prevent frozen terminal (#837) 2026-04-19 12:07:49 -07:00
Jinjing
7734cf9bef
fix(browser): debounce find-in-page query to stop per-keystroke flash (#836)
* fix(browser): debounce find-in-page query to stop per-keystroke flash

Why: findInPage re-highlights the active match on every call, which flashed
as the user typed. Debounce (200ms) so the highlight only re-runs once typing
settles. Enter still uses the live query for immediate next/previous nav.

* fix(browser): auto-select top suggestion, preserve address-bar typing

- Top history suggestion is auto-selected so Enter navigates to the best
  match without an extra ArrowDown keypress.
- URL syncs from the store and webview navigation events no longer clobber
  the address bar while the user is actively typing in it. Previously,
  opening a fresh tab and starting to type could be overridden when the
  configured default URL (e.g. google.com) finished resolving.
2026-04-19 11:38:50 -07:00
Jinjing
bd52741efc
fix(editor): debounce tombstone to avoid flash on macOS atomic writes (#835)
Why: macOS atomic writes (Claude Code Edit, vim :w, VSCode save) deliver
a delete followed by a same-path create in back-to-back fs:changed
payloads. The tab flashed struck-through for one render tick before the
follow-up create cleared it.

Debounces only the 'deleted' signal by 75ms, keyed by absolute path. A
same-path create in the next payload cancels the pending tombstone
before it paints. Naked deletes still resolve to 'deleted' after the
window; single-payload rename correlation is unchanged.
2026-04-19 11:08:22 -07:00
Honglei Liu
f8a1a57825
fix(sidebar): sort Recent mode by lastActivityAt, not sortOrder (#825)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 10:36:27 -07:00
Jinjing
57635731b1 1.3.5-rc.1 2026-04-19 10:04:02 -07:00
Jinjing
02611e97ed
fix(editor): don't highlight mark-toggle toolbar buttons either (#834)
Extends the prior fix — bold, italic, strike, and link were still
rendering with an active highlight. Per the same rationale, toolbar
buttons are action triggers, not style indicators, so none of them
should surface active state.
2026-04-19 10:00:30 -07:00
Jinjing
6c249eec2b
fix(editor): don't highlight block-type toolbar buttons as active (#833)
Block buttons (paragraph, headings, lists, blockquote) are action
triggers that transform the current block — they aren't status
indicators. Highlighting them as "active" was misleading. Only mark
toggles (bold, italic, strike, link), which represent styles applied
to a selection, continue to expose active state.
2026-04-19 09:58:10 -07:00
Jinjing
6b933d7faa
fix(editor): contain rich editor crashes and dedupe external reloads (#832)
* fix(editor): contain TipTap render crashes and dedupe split-pane reloads

Addresses issue #826 (renderer blackouts under split-pane external reload):
- Wrap RichMarkdownEditor in an error boundary to contain ProseMirror
  transaction crashes to the affected pane.
- Swallow setContent/normalizeSoftBreaks exceptions so they can't escape
  to the React root.
- Debounce ORCA_EDITOR_EXTERNAL_FILE_CHANGE_EVENT dispatch per
  (worktreeId, relativePath) to coalesce atomic-write bursts.
- Deduplicate concurrent fs/git IPC reads across split panes so a single
  external change doesn't fan out into N identical round-trips.

* test(cli): stabilize stale bootstrap pid check
2026-04-19 09:52:37 -07:00
Jinjing
82bbc48932
fix(sidebar): raise contrast on 'Don't ask again' checkbox in delete worktree dialog (#831) 2026-04-19 09:40:11 -07:00
Andreas Parusel
b8b773e892
fix(editor): improve rich markdown table readability (#827)
* fix(editor): improve rich markdown table readability

Show borders and subtle striping for rich markdown tables so cell boundaries stay legible in the formatted editor.

* fix(editor): keep rich table headers sentence case

Keep the new table styling readable without forcing header text to uppercase.

* style(rich-md): fix table striping against Tiptap tbody-only DOM

Switch zebra striping to nth-child(odd) so the shaded row doesn't sit
directly under the header, and drop the compounding th font-size.

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-04-19 09:22:19 -07:00
github-actions[bot]
897ba4a3dc release: 1.3.5-rc.0 [rc-slot:2026-04-19-03] 2026-04-19 10:11:08 +00:00
Neil
d320b51a89 1.3.4 2026-04-19 00:17:49 -07:00
Neil
5cfda881cc Revert "1.4.0"
This reverts commit 886bc864cc.
2026-04-19 00:17:08 -07:00
Neil
886bc864cc 1.4.0 2026-04-19 00:14:38 -07:00
Neil
0f43ab02e6
fix(sidebar): drop top margin on first worktree group header (#824)
The worktree search bar already provides spacing above the list, so the
first group header doesn't need its own mt-2 offset. Secondary headers
still get the margin to separate groups.
2026-04-19 00:13:54 -07:00
Neil
75f68a0a84 1.3.4-rc.3 2026-04-18 23:41:22 -07:00
Neil
233a4827ce
fix(linux): skip Vulkan/SkiaGraphite/WebGPU on Linux Wayland sessions (#822) 2026-04-18 23:41:08 -07:00
Jinwoo Hong
4bc01346fd
fix(editor): delete untitled markdown files from disk when closed without edits (#821)
Cmd+Shift+M creates an empty untitled-{x}.md on disk eagerly so the
editor has a real path to bind to. If the user closes the tab without
typing anything, the file was left behind as clutter. Now closeFile()
and closeAllFiles() delete the on-disk file when the tab is untitled,
not dirty, and has no editor draft. These throwaway files are also
excluded from the recently-closed stack since reopening a deleted path
would fail.
2026-04-19 02:23:57 -04:00
Neil
419617d8ef 1.3.4-rc.2 2026-04-18 23:08:50 -07:00
Neil
775bd6dacd 1.3.4-rc.1 2026-04-18 23:08:47 -07:00
Neil
a1c6889d26
fix(worktrees): collapse internal '..' in sanitized branch names (#820) 2026-04-18 23:08:20 -07:00
Neil
34ebcbf8a0
fix: restore terminal focus after context menu copy/paste (#819) 2026-04-18 23:07:08 -07:00
dependabot[bot]
45aadd5556
build(deps): bump dompurify from 3.3.3 to 3.4.0 (#720)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-18 22:55:28 -07:00
Qi Neng
613c5abf1c
fix(rate-limits): route Claude OAuth usage fetch through HTTP proxy (#803)
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
2026-04-18 22:54:37 -07:00
Neil
d0ef5fe4ec
feat(sidebar): consolidate group-by + filter controls (#818)
* feat(sidebar): move group-by control into view options menu

Consolidates the standalone Group by segmented control into the view
options dropdown alongside Sort by and Show properties, and opens the
menu to the right of the trigger so it no longer covers the worktree
list.

* feat(sidebar): combine active + repo filter into single filter control

Replaces the separate Active toggle and repo dropdown trigger in the
search bar with a single ListFilter icon button that opens a unified
dropdown covering Status (Active only) and Repositories. The button
expands with an inline summary and accent background when any filter
is applied, making the active state obvious, and exposes a Clear
filters action.
2026-04-18 22:53:23 -07:00
Shamoun
6543e3dd3d
fix: prompt to save or discard when quitting with dirty files (#789)
* fix: prompt to save or discard when quitting with dirty files

* fix: guard against race conditions and improve error handling in quit-with-dirty-files flow

- Ignore duplicate quit signals when a close sequence is already in-flight
- Wrap requestEditorSaveQuiesce in try/catch so discard path can't leave user stuck
- Reduce save-wait timeout from 120s to 10s for faster failure feedback

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
2026-04-19 01:20:55 -04:00
Shamoun
f8ffc1fb35
fix: pass SSH connectionId for fs:listFiles (#790) 2026-04-18 21:49:41 -07:00
Neil
77bee67035 1.3.4-rc.0 2026-04-18 21:46:42 -07:00
Neil
c86721f434
fix(new-workspace): clean up backgrounds, contrast, and loading UX (#816)
- fix(new-workspace): clean up backgrounds, contrast, and loading UX

Address feedback on the NewWorkspacePage: drop the LightRays backdrop, repo
badge-color radial gradient, and custom dark bg override so the page uses
standard bg-background. Switch card surfaces from translucent bg-background/X
to bg-muted/50 so cards read as distinct from the page in both themes. Give
the unselected source toggles a visible bg+border. Size the task list card to
its content (capped at viewport) instead of always stretching. Add a 3-row
shimmer skeleton while the initial fetch is in flight (only when nothing is
cached).
2026-04-18 21:34:25 -07:00
Drakontia
82fe59fc23
fix: correct IME candidate window position when typing Japanese in terminal (#798)
* fix: correct IME candidate window position when typing Japanese in terminal

Two fixes for the IME candidate window appearing offset from the cursor:

1. CSS: Add \left: 0\ to \.xterm .xterm-helpers\ in terminal.css.
   xterm.css sets position:absolute;top:0 but omits left, leaving
   left:auto. In Electron's Blink this can resolve to a non-zero value
   and shift the IME window away from the cursor.

2. JS: Add a capture-phase compositionstart listener in openTerminal().
   xterm.js repositions the textarea on compositionupdate but not on
   compositionstart. The OS reads the textarea's screen rect at
   compositionstart to place the IME candidate window, so the window
   can appear at a stale position. The listener force-syncs the textarea
   to the exact cursor pixel position before the OS opens the window.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: remove compositionstart listener on pane disposal to prevent memory leak

Store the handler reference in ManagedPaneInternal.compositionHandler so
disposePane() can call removeEventListener with the exact same function
reference, preventing the closure from holding the terminal alive after
the pane is closed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* refactor(terminal): derive IME cell dimensions from public xterm API

Computes cell width/height from the .xterm-screen element's bounding
rect and uses terminal.textarea (public) instead of reaching into
terminal._core. Avoids the `any`-cast access to xterm internals so
future xterm.js upgrades don't silently regress the IME position fix.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-04-18 21:24:37 -07:00
Kelvin Amoaba
ab81f04fae
persist sidebar collapsed groups across navigation and restart (#722)
* 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>
2026-04-19 00:23:52 -04:00
keiju-fujiwara
5d985a6563
fix: suppress Enter submit during IME composition in workflow creation popup (#804)
* fix: guard Enter submit against IME composition in workflow creation popup

Pressing Enter during Japanese IME conversion was triggering workflow
submission instead of only confirming the candidate. Extract
shouldSuppressEnterSubmit() and check event.isComposing before submit
in NewWorkspaceComposerModal, NewWorkspacePage, and the task search
handler. Fixes #742.

* fix: use nativeEvent.isComposing for React SyntheticEvent in task search handler

* refactor: move new-workspace-enter-guard to src/renderer/src/lib

---------

Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-04-18 21:17:24 -07:00
Jinjing
159081c2e6
style(rich-md): show pointer cursor on links only while modifier held (#814)
Rich markdown links open on Cmd/Ctrl-click (plain click must place the
caret inside contenteditable). Toggle a root class on keydown/keyup of
the platform modifier so the pointer cursor appears only while the
modifier is held, matching VS Code's link affordance.
2026-04-18 21:13:00 -07:00
Jinwoo Hong
58b43e0d17
fix(github): Needs My Review tab returns no results (#815) 2026-04-18 21:12:45 -07:00
Jinjing
d45755274f
Squashed commits (#813)
- style: update markdown preview cursor styles for link interactions

- feat(editor): open in-worktree .md links as preview edit tabs

Cmd/Ctrl-click on a markdown link now routes through a shared classifier
and dispatcher. Links resolving to .md files inside the active worktree
open as preview tabs; external URLs and non-markdown files delegate to
the OS handler. Cmd/Ctrl+Shift-click is preserved as the OS escape hatch
with existence precheck and a toast for dangling targets.

Supports #L10 / #L10C5 and trailing :line:col anchors by flipping the
target to source view before reveal. Preview replacement is scoped to
the active tab group, and evicted previews are pushed onto the
recently-closed stack so Cmd/Ctrl+Shift+T restores them.
2026-04-18 20:51:17 -07:00
Neil
c409904453
fix(feedback): include app version + OS metadata in submissions (#812) 2026-04-18 20:20:37 -07:00
Jinwoo Hong
301ce7aea4
fix: resolve Radix Dialog accessibility warnings and duplicate React key (#810)
Add visually-hidden DialogTitle and DialogDescription to
NewWorkspaceComposerModal and ImageViewer to satisfy Radix UI's
accessibility requirements for screen readers.

Remove duplicate 'copilot' entry in AGENT_CATALOG that caused
React's "two children with the same key" warning.
2026-04-18 22:28:11 -04:00
Jinjing
ffcc144a75
fix(source-control): do not reset defaultBaseRef on worktree switch (#811)
The defaultBaseRef resolver is repo-scoped, not worktree-scoped. Resetting
it to 'origin/main' on every worktree switch within the same repo clobbered
the correct value (e.g. 'origin/master'), causing persistent 'Branch compare
unavailable' errors.
2026-04-18 19:02:14 -07:00
Neil
eacdc2b946 1.3.3 2026-04-18 18:05:21 -07:00
Jinjing
1f1c66e59a
ci(release): retry electron install/publish on transient CDN failures (#809)
Wrap the dependency install and release-artifact publish steps with
nick-fields/retry@v3 so GitHub CDN 504s don't require a manual
re-run of the release workflow.
2026-04-18 17:57:27 -07:00
Neil
a68e9838fc 1.3.3-rc.2 2026-04-18 17:51:53 -07:00
Neil
c0066c3710 1.3.3-rc.1 2026-04-18 17:51:49 -07:00
Jinjing
756a7fa7b9
fix(quick-open): reset scroll and add padding so top result isn't clipped (#808)
The Cmd+P dialog's first result sometimes appeared flush against (or
behind) the input's bottom border. cmdk moves selection to the first
result on query change but never resets the list's scrollTop, and the
list had no padding buffer between the input border and the first item.

- reset scrollTop on query/visible change (mirrors WorktreeJumpPalette)
- add p-2 padding so the selection highlight never touches the border
2026-04-18 17:51:21 -07:00
Jinjing
828b1412d9
fix(sidebar): keep resize stable when dragging over PDF viewer (#807)
Chromium's native PDF <embed> captures pointer events internally, so
mouseup never reaches the window and the sidebar keeps following the
cursor. Mount a transparent full-viewport overlay during drag so events
propagate to the window listeners.
2026-04-18 17:50:44 -07:00
Jinwoo Hong
5ec70ed539
fix: gracefully handle EPERM during PTY overlay creation on Windows (#752) 2026-04-18 16:37:46 -07:00
Jinwoo Hong
e8b8b5f96e
fix(terminal): prevent WebGL context leak and atomic generation bump (#806) 2026-04-18 16:35:26 -07:00
Matt Van Horn
3918e4cfcf
fix(terminal-search): make Cmd+F match highlights high-contrast (#756)
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
2026-04-18 15:20:15 -07:00
github-actions[bot]
c57c55b9b8 release: 1.3.3-rc.0 [rc-slot:2026-04-18-15] 2026-04-18 22:05:29 +00:00
Jinwoo Hong
669dbbe83f
feat(browser): add profile picker for multi-profile cookie import (#805) 2026-04-18 14:59:39 -07:00
Neil
c33023ddc0 1.3.2 2026-04-18 14:07:17 -07:00