Commit Graph
1057 Commits
Author SHA1 Message Date
4f7b488d22 feat(cli): add terminal create, split, rename, focus, close, tui-idle wait (#734)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
2026-04-22 17:51:32 -07:00
Neil c07db38dfe fix terminal resize flicker during pane drag (#962) 2026-04-22 17:50:14 -07:00
Jinjing 91b7f04594 1.3.12-rc.3 v1.3.12-rc.3 2026-04-22 16:47:42 -07:00
Jinjing 5eb50c47ba fix(updater): throttle wake/focus update checks to daily cadence (#955)
* fix(updater): throttle wake/focus update checks to daily cadence

* fix: close 24h gate synchronously in wake/focus check

* refactor: dedupe background checks via in-memory launch flag
2026-04-22 16:30:17 -07:00
dependabot[bot] 3f474ab278 build(deps): bump dompurify from 3.2.7 to 3.4.1 (#947)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-22 15:42:09 -07:00
Kelvin Amoaba f1f9ac3ddb feat(file-explorer): double-click empty space to create new file (#889) 2026-04-22 15:41:44 -07:00
Neil 0ace379c9e Revert "feat(terminal): record shell integration (OSC 7 cwd + OSC 133 marks)" (#957) 2026-04-22 15:40:45 -07:00
Jinwoo Hong 228699d48a feat(editor): add Cmd+F find-in-page for PDF viewer (#899) 2026-04-22 15:39:36 -07:00
Jinwoo Hong 4860e9ab7a fix(editor): debounce rich markdown search and eliminate redundant doc walk (#953) 2026-04-22 15:23:17 -07:00
github-actions[bot] 38d5ade901 release: 1.3.12-rc.2 [rc-slot:2026-04-22-15] v1.3.12-rc.2 2026-04-22 22:12:43 +00:00
Neil 953a6cdb4a feat(terminal): record shell integration (OSC 7 cwd + OSC 133 marks) (#956)
Wire the two escape sequences that TUIs and modern shells use to tell
the terminal about state that xterm.js doesn't handle natively:

- OSC 7  — shell emits its current working directory on every `cd`.
- OSC 133 — FinalTerm / iTerm semantic prompt marks (A/B/C/D with
  optional exit code on D).

Parsing lives in a new pure `shell-integration.ts` helper with 21 unit
tests covering URI decoding, Windows UNC / drive-letter paths, all four
OSC 133 letters, the `key=value` hint suffix some emitters append, and
the ring-buffer cap on recorded marks.

Wiring follows the DEC 2031 / OSC 52 pattern from #896 and #952:

- Handlers registered per-pane in onPaneCreated, disposed symmetrically
  in onPaneClosed.
- Two new refs (`paneCwdRef`, `paneSemanticMarksRef`) live on
  TerminalPane and are passed through UseTerminalPaneLifecycleDeps.
- Semantic marks record the absolute buffer row (`baseY + cursorY`) so
  future block-navigation consumers can scroll to them.
- A 10 000-entry ring buffer caps per-pane memory.

Shipped consumer: the terminal context menu grows a platform-aware
"Reveal in Finder / Show in Explorer / Open Folder" item that opens
the shell's current directory in the native file manager. The item
is hidden when no OSC 7 has been received, consistent with how other
terminal emulators surface shell-integration-dependent features.

No consumer yet for OSC 133 — recording is cheap and the consumer UX
(block-nav keybinds, exit-code gutters) deserves its own design pass.
2026-04-22 15:07:33 -07:00
Neil 2819cdc081 feat(terminal): opt-in OSC 52 clipboard writes from TUIs (#952)
xterm.js ships with no OSC 52 handler, so tmux, Neovim, fzf, and ripgrep
running inside Orca — locally or over SSH — silently fail to copy to the
system clipboard. Add an opt-in handler gated behind a new setting
`terminalAllowOsc52Clipboard` (default off because untrusted output
piped into the terminal can silently overwrite the clipboard).

Implementation mirrors the DEC 2031 wiring from PR #896: extract parsing
into a pure helper (parseOsc52) with a full unit-test suite, register
the handler in onPaneCreated and dispose it symmetrically in
onPaneClosed, and read the gate from settingsRef at fire time so the
toggle takes effect without recreating panes.

Clipboard *queries* (Pd = "?") are intentionally dropped — answering
them would leak the user's clipboard to any process writing to the
PTY — along with malformed payloads, oversized payloads (>128KB),
and payloads using unknown selection letters.
2026-04-22 14:45:26 -07:00
Neil d56fcff469 feat(terminal): set TERM_PROGRAM_VERSION on PTY env (#951)
TUIs feature-gate on TERM_PROGRAM_VERSION (Neovim's terminal
autodetection, bat/delta styling hints, etc). We already set
TERM_PROGRAM=Orca but left the version unset, so tools can't distinguish
Orca builds or tell when version-gated features are safe to enable.

Seed process.env.ORCA_APP_VERSION from app.getVersion() at main startup
and read it from both PTY spawn sites (main-side local-pty-provider and
the daemon-side pty-subprocess, which inherits env via fork). Keeps
providers/local-pty-provider.ts free of electron imports.
2026-04-22 14:42:19 -07:00
Brennan Benson 89b85b828b feat(nav): workspace back/forward navigation (#945) 2026-04-22 13:40:38 -07:00
Neil 0d1037f659 1.3.12-rc.1 2026-04-22 12:12:55 -07:00
Kelvin AmoabaandNeil 9a8d716aca feat(terminal): broadcast theme changes to PTYs via DEC mode 2031 (#896)
* feat(terminal): broadcast theme changes to PTYs via DEC mode 2031

Claude Code's /theme auto reads Orca's background via OSC 11 at startup
(xterm.js answers that natively), so claude matches the terminal on
launch. But when Orca's theme flips mid-session, claude had no signal:
Orca never told running TUIs anything changed, so auto-theme stayed
stuck wherever it started.

This wires the DEC private mode 2031 + CSI 997 protocol that Neovim,
tmux, Kitty, and Ghostty use. A TUI sends CSI ?2031h to subscribe;
when the theme flips, the terminal pushes CSI ?997;1n (dark) or
CSI ?997;2n (light). The TUI then re-queries OSC 11 and repaints.

- Per-pane subscription flag and last-emitted mode live on TerminalPane.
- The CSI ?2031 h/l handlers are installed in onPaneCreated before the
  PTY attaches so the child's initial subscribe is captured, and an
  immediate push on enable seeds the current mode without a query.
- applyTerminalAppearance only emits CSI 997 when the resolved mode
  actually flipped, so font/size/opacity tweaks that re-run the same
  effect don't spam subscribed TUIs.

* refactor(terminal): extract mode 2031 helpers and add spam-gate tests

Pull the CSI 997 sequence builder and the subscribe/flip gate out of
applyTerminalAppearance so the appearance path and the subscribe-time
seed path in the lifecycle hook share one source of truth. Annotate the
?h / ?l parser handlers to make it explicit they observe (return false)
rather than suppress — compound DEC sequences like `?25;2031h` must
still flow to xterm's built-in handler. Adds unit coverage for the
no-op-on-no-flip gate, reconnect path, and per-pane tracking.

---------

Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-04-22 12:06:30 -07:00
Jinwoo Hong c8dd14be23 fix(ui): enable scroll-wheel in CommandList inside Dialog (#948) 2026-04-22 12:04:05 -07:00
Ramzi d73d259105 build(deps): bump electron from 41.1.0 to 41.2.2 (#938) 2026-04-22 11:58:17 -07:00
Jinwoo Hong 7c717e2903 fix(ssh): register relay roots on connect and retry file explorer load (#946) 2026-04-22 11:42:22 -07:00
Jinwoo Hong 6feb93ab78 fix(terminal): guard PTY native calls against dead-process Napi::Error crash (#916) 2026-04-22 11:16:43 -07:00
Jinjing 245b29d604 refactor(editor): render front-matter banner inside rich editor shell (#943)
Pass FrontMatterBanner as headerSlot into RichMarkdownEditor so it renders
between the toolbar and the editor surface, keeping formatting controls at
the top of the pane.
2026-04-22 11:05:48 -07:00
Jinjing 0bbf2d7a8f feat: cross-repo issues view in new workspace page (#942)
* feat: cross-repo issues view with multi-repo selection

- Add multi-repo selection via RepoMultiCombobox with persisted defaultRepoSelection setting (null = sticky-all)
- Stamp repoId on GitHubWorkItem at the renderer fetch boundary; merge items from all selected repos with per-repo failure tracking
- Extract task-query helpers (tokenize/strip/parseTaskQuery) to src/shared and add unit tests
- Refactor NewWorkspacePage row to <div role=button> to allow nested interactive elements without invalid-HTML hydration errors
- fix(repo-combobox): toggle all-repos selection on repeat click

* fix(tasks): route Use CTA to item's own repo in cross-repo view

handleUseWorkItem previously referenced a removed 'repoId' state; use item.repoId so launching from a merged cross-repo list targets the correct repo.

* test(e2e): add tasks page smoke test
2026-04-22 10:58:18 -07:00
Jinjing 46423cede7 fix(quick-open): don't clear Cmd+P input on unrelated store updates (#941)
* fix(quick-open): don't clear Cmd+P input on unrelated store updates

The file-load effect depended on excludePaths, a new array reference
produced on any worktreesByRepo update. Each such update re-ran the
effect and called setQuery(''), wiping input the user was typing.
Split the open-reset into its own effect keyed on `visible`.

* fix(quick-open): remove manual scroll-to-top that fought user scroll

The rAF scrollTo(0,0) ran on every query/visible change, which meant
scrolling down and then typing (or any re-render that touched the
effect) snapped the list back up. The clipping issue it was papering
over is already solved by CommandList's p-2 padding, and cmdk's own
scrollIntoView handles keeping the selected item visible.

* fix(quick-open): stop refetching on unrelated worktreesByRepo updates

The excludePaths memo returned a new array reference on every
worktreesByRepo mutation, even when neither the active worktree's
path nor its siblings changed. That re-ran the file-load effect,
cleared files, and blinked the list on focus/scroll. Memoize on a
stable joined-string key instead.
2026-04-22 10:11:20 -07:00
Jinjing 00fdb8e8cc ci: check out PR head instead of merge ref in e2e workflow (#940)
The e2e reusable workflow defaulted to github.ref, which on
pull_request events is refs/pull/N/merge. GitHub does not compute
that ref when the PR has conflicts or before the merge commit is
ready, causing actions/checkout to fail with "couldn't find remote
ref refs/pull/N/merge" for reasons unrelated to the code.

Pass github.event.pull_request.head.sha from pr.yml so e2e checks
out the PR head directly.

Motivating failure: https://github.com/stablyai/orca/actions/runs/24768962365
Seen on #937.
2026-04-22 09:59:27 -07:00
github-actions[bot] c31d382e9f release: 1.3.12-rc.0 [rc-slot:2026-04-22-03] v1.3.12-rc.0 2026-04-22 10:26:13 +00:00
Neil cfe1714e61 1.3.11 v1.3.11 2026-04-22 01:45:47 -07:00
Neil 0c74cdca2f Revert "fix(terminal): add proportional scroll fallback for sidebar resize" (#937) 2026-04-22 01:43:07 -07:00
Neil 7ae95cd3d0 fix(terminal): layout-aware default for macOS Option-as-Alt (#903) (#909) 2026-04-22 00:32:11 -07:00
Neil 5266eaed5f 1.3.10 v1.3.10 2026-04-21 23:57:21 -07:00
Jinjing 5b8e933904 feat(tab-bar): add quick-launch CLI buttons (#933)
Introduce a dedicated detected-agents store slice that replaces the
module-scoped detect-agents-cached cache, with a shared useDetectedAgents
hook driving AgentsPane, composer, and the new QuickLaunchButton in
TabBar. Extracts launchAgentInNewTab helper to share the startup-command
path used by the tab bar's + button.
2026-04-21 23:14:22 -07:00
Neil 5a97525d5c all same tiptap (#934) 2026-04-21 23:13:59 -07:00
Neil 8129ebc55d 1.3.10-rc.1 v1.3.10-rc.1 2026-04-21 23:09:05 -07:00
Neil f36daf93ad 1.3.10-rc.0 2026-04-21 23:09:03 -07:00
Neil 51eabf9011 fix(browser): make address bar Enter match typed intent, not Google Search (#932)
Previously the dropdown's last row was always a "[input] — Google Search"
fallback, which the auto-select-first effect highlighted when no history
matched. Enter then navigated to Google even for URL-like inputs like
"www.example.com" — opposite of Chrome/Firefox behavior.

Now the top row mirrors what normalizeBrowserNavigationUrl would do:
for URL-like input it's the typed URL (Open URL), for bare queries it's
the search. The synthetic row is suppressed when a history row already
targets the same URL.
2026-04-21 23:08:11 -07:00
Jinwoo Hong 7a64ee3a11 Revert "fix(terminal): add proportional scroll fallback for sidebar resize (#901)" (#930)
This reverts commit 2ab2db9132.
2026-04-22 00:44:37 -04:00
Jinwoo Hong 2ab2db9132 fix(terminal): add proportional scroll fallback for sidebar resize (#901) 2026-04-21 21:28:56 -07:00
Brennan Benson f724510f4e fix(markdown): improve task-list checkbox contrast in dark mode (#927) 2026-04-21 18:57:39 -07:00
Neil 3a38e7207a fix(terminal): open .html/.htm paths directly in the embedded browser (#925)
Cmd/Ctrl+click on an HTML file path in the terminal now renders the page
in a new browser tab instead of loading its source into Monaco. Mirrors
PR #908's "Open Preview to the Side" entry point and matches how we
already route http(s) URLs into Orca's browser.

The hover tooltip now shows a distinct "open in browser" hint for HTML
paths so the different behavior is discoverable.
2026-04-21 18:39:31 -07:00
Neil 4192d9db26 fix(tasks): rename NewWorkspacePage to TaskPage and give it a proper titlebar (#921)
* fix(tasks): rename NewWorkspacePage to TaskPage and unblock Close on collapsed sidebar

Rename the full-page work-item view to TaskPage (file, component, store
actions, and the `activeView` literal) so the name matches the surface the
user sees. Also fix a regression where the page's Close button was
unreachable in workspace view with the sidebar collapsed — the floating
titlebar-left strip (traffic lights + sidebar toggle + agent badge)
overlapped the Close button, leaving the user stuck. Mirror the
TabGroupPanel fix by reserving `var(--collapsed-sidebar-header-width)` of
left padding on the Close row, which App.tsx already keeps in sync with the
live measured width of that floating header.

* fix(tasks): give TaskPage its own 42px titlebar and drop Close below it

Rather than cramming the Close button into the same horizontal band that
App.tsx uses for the floating traffic-lights/sidebar-toggle strip, give
TaskPage its own 42px "Tasks" titlebar (matching the sidebar header and
tab rows) and move the Close (X) button into a dedicated row below it.
The titlebar is drag-region so the window stays movable from this band.
Skipped in non-workspace mode where App.tsx already owns the full-width
titlebar, to avoid a duplicate band.

* fix(tasks): keep sidebar-expand toggle visible over TaskPage titlebar

When the left sidebar is collapsed, App.tsx floats the titlebar-left strip
(traffic lights, sidebar-expand toggle, agent badge) over the top-left of
the page at z-10. TaskPage's own 42px strip sat at the same stacking level
and painted later in DOM, so its solid background hid the expand toggle.
Split the strip: keep the reserved region transparent so the floating
controls show through, and only paint bg/border on the remainder. The
floating titlebar-left already carries the matching bg + border-bottom,
so the two segments still read as one continuous band.

* fix(tasks): let clicks reach sidebar toggle under TaskPage titlebar

The reserved spacer in TaskPage's titlebar strip sits on top of App.tsx's
floating titlebar-left (which hosts the sidebar-expand toggle and agent
badge). Two things were swallowing clicks meant for the toggle:

1. The outer strip carried WebkitAppRegion='drag', so Electron treated the
   whole 42px row as window-drag — even the transparent reserved region.
2. The transparent div itself absorbed pointer events before they reached
   the underlying toggle.

Scope the drag region to just the painted "Tasks" segment, and mark the
reserved spacer pointer-events-none with an explicit no-drag override.

* fix(tasks): stop TaskPage wrapper from blocking sidebar-expand toggle

The TaskPage's inner column had z-10, the same z-index as App.tsx's
floating titlebar-left cluster (traffic lights, sidebar toggle, agent
badge) that hovers in the top-left when the sidebar is collapsed. Tie
on z-index + later in DOM meant TaskPage painted over titlebar-left,
so clicks on the reserved spacer region fell through pointer-events-none
into the wrapper behind the spacer rather than reaching the toggle.

Dropping z-10 from the inner column lets titlebar-left paint above the
page content and receive clicks cleanly, without changing the visual
layout.
2026-04-21 18:11:19 -07:00
Jinjing 76b69baa2c fix(sidebar): make Pinned section visually distinct (#924)
Add a Pin icon to the Pinned header and introduce a sibling "All"
header (with LayoutList icon) for unpinned items when groupBy='none',
replacing the faint divider so the two sections read as peer groups
instead of a single continuous list.
2026-04-21 18:07:02 -07:00
Neil ed32ca2c21 fix(worktrees): fail loudly when no default base ref is resolvable (#922) 2026-04-21 17:40:27 -07:00
Neil 4a702a4c14 1.3.9 v1.3.9 2026-04-21 17:24:36 -07:00
Neil c9babd28cf 1.3.8 2026-04-21 17:06:13 -07:00
Jinjing 55d15f44b4 fix(composer): larger fonts, Enter-to-advance in new-workspace dialog (#920)
Bumps labels to text-xs and inputs to text-sm/h-9 so fields aren't
cramped in the Cmd+N composer. Enter on the Workspace Name field now
moves focus to the Agent combobox; Enter on the Agent trigger (closed)
submits via new optional onTriggerEnter prop, guarded by createDisabled.
2026-04-21 16:47:32 -07:00
Neil a086eae06b fix(settings): trigger RC channel and hidden-experimental via plain Shift (#919) 2026-04-21 16:41:46 -07:00
Brennan Benson b32996d50f fix: clarify Sleep tooltip to mention browser tabs (#915) 2026-04-21 16:27:06 -07:00
Jinwoo Hong 995b2affaf fix(editor): focus find input on Cmd+F when search is already open (#910) 2026-04-21 16:22:04 -07:00
Neil 4fd5d95a41 fix(tasks): drop redundant title-adjacent type icon on work-item rows (#918) 2026-04-21 16:20:29 -07:00
Neil ab2f831d1b fix(sidebar): make pinned-group divider visible in both themes (#917) 2026-04-21 16:16:20 -07:00
Neil 67105278e4 1.3.8-rc.4 v1.3.8-rc.4 2026-04-21 16:09:13 -07:00