Commit graph

976 commits

Author SHA1 Message Date
Jinjing
3a0fa521be
feat(editor): support clicking anchor links to jump to headings (#879)
Anchor-only links (#heading) now scroll to the matching heading in both
the markdown preview and rich editor. Preview uses rehype-slug to stamp
heading ids; the rich editor walks headings with the same stateful
GithubSlugger for parity (including duplicate-heading suffixes).
2026-04-20 18:35:28 -07:00
Brennan Benson
b3361569b4
fix(tabs): raise selected tab contrast so it stands out from hover (#877) 2026-04-20 17:30:07 -07:00
Jinjing
889dbb23cb
fix: Cmd+F search in rich markdown editor now scrolls to active match (#876)
Merge decoration update and selection into a single ProseMirror
transaction so scrollIntoView is not lost. After dispatch, manually
scroll the outer flex container using coordsAtPos since
tr.scrollIntoView cannot reach the non-overflowing editor wrapper.

Also change active match highlight from orange to blue for better
contrast.
2026-04-20 17:25:04 -07:00
Brennan Benson
288322cac4
feat(sidebar): rename Shutdown to Sleep with explanatory tooltip (#875) 2026-04-20 17:21:06 -07:00
Jinjing
a02fce9106 1.3.7 2026-04-20 17:20:44 -07:00
Brennan Benson
202f3d638f
test(e2e): stabilize terminal-shortcuts Cmd+W and Escape steps (#873) 2026-04-20 15:36:35 -07:00
github-actions[bot]
29a73353ce release: 1.3.7-rc.2 [rc-slot:2026-04-20-15] 2026-04-20 22:11:54 +00:00
Brennan Benson
57b0617e37
perf(terminal): remove 3-minute periodic scrollback save (#869) 2026-04-20 14:56:06 -07:00
Jinjing
249af27389 1.3.7-rc.1 2026-04-20 13:33:23 -07:00
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