Commit graph

967 commits

Author SHA1 Message Date
Jinjing
6b3617586a
fix(editor): eliminate ~10s freeze when loading large markdown files (#870)
The rich-mode unsupported-content check ran canRoundTripRichMarkdown()
unconditionally — synchronously creating a throwaway TipTap Editor,
parsing the entire document, and serializing it back — all on the main
thread during React render. For a 120KB file this blocked for ~10s.

Redesign: run cheap regex checks first (reference links, footnotes,
HTML). If no unsupported syntax is detected, allow rich mode immediately
without any round-trip. The expensive round-trip is now only invoked
when HTML is detected and the file is under 50K chars.
2026-04-20 13:30:01 -07:00
Jinjing
a4bfeef8a3
fix: support Cmd+N and Esc on the tasks page (#868)
Move the Cmd+N handler above the new-workspace early-return so the
shortcut opens the composer modal from the tasks page. Add an
activeModal guard to the page-level Esc handler so it yields to the
composer modal's own Esc dismissal.
2026-04-20 12:49:45 -07:00
Jinjing
781bc9fd62
fix(quick-open): exclude sibling worktree files from Cmd+P results (#867)
When the active worktree is the repo root, linked worktrees are nested
subdirectories. rg --files listed files from every worktree instead of
just the active one. Pass sibling worktree paths as --glob exclusions.

Also wrap scroll-to-top in rAF so it runs after cmdk's scroll-into-view.
2026-04-20 12:27:08 -07:00
github-actions[bot]
f422174d1b release: 1.3.7-rc.0 [rc-slot:2026-04-20-03] 2026-04-20 10:30:07 +00:00
Neil
c6f6300bcf
feat(terminal): add "Copy on Select" clipboard setting (default off) (#862)
Adds an opt-in terminal setting that automatically copies the current
selection to the system clipboard as the user selects, mirroring X11 /
gnome-terminal behavior. xterm.js has no native option for this, so the
renderer hooks `onSelectionChange` per pane and writes via the existing
clipboard IPC. Defaults to false so existing users keep the explicit
Cmd/Ctrl+Shift+C copy flow.

Closes #860
2026-04-20 00:28:29 -07:00
Jinjing
c47b651f2d 1.3.6 2026-04-19 23:31:51 -07:00
Jinjing
3d00734f6e 1.3.6-rc.1 2026-04-19 22:10:23 -07:00
Jinjing
db96479a5d
fix(editor): prevent cursor jump to end when typing during autosave in markdown editor (#855)
Autosave writes to disk echo back as fs:changed events that were treated as
external edits, triggering a setContent reload mid-typing that reset the TipTap
selection to the document end (and could drop unsaved keystrokes). Stamp each
self-write in a registry so useEditorExternalWatch ignores its own echo, and
preserve selection when genuine external edits do arrive.
2026-04-19 22:05:52 -07:00
Jinwoo Hong
8e88fdae33
fix: preserve terminal scroll position when splitting panes (#817) 2026-04-19 20:35:37 -07:00
Brennan Benson
0ef3a65635
fix(terminal): Cmd+Left/Right jump to start/end of line (#851) 2026-04-19 20:24:17 -07:00
Jinwoo Hong
ac39899e90
fix(terminal): clear screen before daemon restore to prevent duplicated output (#853) 2026-04-19 19:56:30 -07:00
Jinwoo Hong
8dcb234d22
feat(browser): multi-profile session management with per-tab switching (#823) 2026-04-19 19:48:26 -07:00
Jinwoo Hong
096c1818f3
fix: improve assertManagedHomePath error for cross-environment accounts (#848) 2026-04-19 17:32:04 -07:00
Brennan Benson
6893923c73
feat: double-click tab to rename (inline edit) (#844)
Co-authored-by: heyramzi <ramzi@upsys-consulting.com>
2026-04-19 17:22:30 -07:00
Brennan Benson
08b0a3058a
test(e2e): cover worktree lifecycle and tab-close navigation (#846) 2026-04-19 15:50:19 -07:00
github-actions[bot]
a8fe60932f release: 1.3.6-rc.0 [rc-slot:2026-04-19-15] 2026-04-19 22:05:43 +00:00
Jinwoo Hong
c294a4d49e
fix(codex-accounts): stop overwriting auth.json when no managed account is active (#847) 2026-04-19 14:56:44 -07:00
Neil
9d56108e89
fix(agents): detect all user-installed CLIs by hydrating PATH from login shell (#843)
* fix(agents): detect opencode/pi CLIs installed under ~/.opencode/bin and ~/.vite-plus/bin

Packaged Electron inherits a minimal PATH without shell rc files, so
agent install-script fallback dirs stay invisible to `which` probes —
the Agents settings page then shows OpenCode/Pi as "Not installed"
even when the user can run them from Terminal.

Add ~/bin, ~/.opencode/bin, and ~/.vite-plus/bin to the packaged PATH
augmentation so preflight detection matches shell behavior.

Fixes #829

* feat(agents): hydrate PATH from user's login shell + Agents Refresh button

Packaged Electron inherits a minimal launchd PATH that misses whatever
the user's shell rc files append — ~/.opencode/bin, ~/.cargo/bin, nvm
shims, pyenv, custom tool dirs. The preceding commit hardcoded two known
install locations; this replaces that whack-a-mole pattern with a
generic approach.

On packaged startup (non-Windows), spawn `${SHELL} -ilc 'echo $PATH'`
with a 5s timeout, parse the delimited PATH, and prepend any new
segments to process.env.PATH. The result is cached for the app session
so we pay the shell-init cost at most once.

Surface a Refresh button in Settings > Agents that forces a re-probe
and re-detects installed agents — handy right after installing a new
CLI, no restart needed.

Live-verified that a `zsh -ilc` spawn with a minimal launchd-style env
still resolves the user's full PATH (32+ segments including the
rc-appended dirs).

* refactor(hydrate-shell-path): simplify dedup with Set + Set.difference

Set preserves insertion order, so PATH first-match-wins semantics are
preserved without manual tracking. Set.prototype.difference (Node 22+)
expresses the new-segments calculation in mergePathSegments as the
set-difference operation it always was.
2026-04-19 14:36:30 -07:00
Brennan Benson
660b5f4149
ci: run E2E tests on every PR, surface on release (non-blocking) (#842) 2026-04-19 13:48:27 -07:00
Neil
76d4b9a435 1.3.5 2026-04-19 13:04:46 -07:00
Jinjing
818a355098
feat(tasks): add New GitHub issue dialog to tasks page (#841)
Adds a + button on the tasks page that opens a dialog to create a new
GitHub issue in the selected repository. Wires createIssue through the
main/preload IPC using gh api, and refreshes the tasks list after
creation so the new issue shows up immediately.

Also clears a stray Radix pointer-events lock on GitHubItemDrawer mount
so Close/open-in-GitHub buttons remain clickable after the New Issue
dialog closes.
2026-04-19 12:52:24 -07:00
Brennan Benson
222d70e063
feat: add idempotent E2E test suite with headless Electron support (#671) 2026-04-19 12:09:32 -07:00
Neil
dd85228096 1.3.5-rc.2 2026-04-19 12:08:05 -07:00
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