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.
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.
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.
* 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.
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.
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.
* Refine workspace composer controls
* Working repo autofocus
* after selects
* Simplify workspace quick create dialog
* Refine quick create form focus flow
* autofocus fix
* normal dialog
* base dialogs
* Wire Use button to launch workspace directly
Skips the composer modal for the common case: creates the workspace,
activates it, launches the default agent, and pastes the work-item URL
into the agent's input as a reviewable draft. Falls back to the modal
when setupRunPolicy is 'ask' or no compatible agent is detected.
* Stretch combobox dropdowns to trigger width
Repository and Agent rows in the quick-create dialog now span the full
dialog width like the Workspace Name input, and their dropdown popovers
inherit the trigger width so the entries align edge-to-edge with the
trigger instead of clipping to a fixed 288/320px.
* feat(settings): add dedicated Agent Browser Use setup in Browser pane
Adds a guided 3-step onboarding card (enable Orca CLI, install skill,
import cookies) to the Browser settings pane with a local enable toggle,
search-query integration, and a shortcut to the Session & Cookies block
for multi-profile users.
* fix(settings): scope browser-use completion to default profile and gate skill toggle
Track step-3 completion from the default profile only, since that is the
profile agents use. Disable the "I ran it" toggle when the CLI step is
incomplete so the visual gating matches behavior.
Ensures the new-workspace composer opens even when focus is inside a
contentEditable surface (markdown rich editor) or a browser-guest
webContents, both of which bypass the renderer's window-level keydown.
Cmd+Shift-click "Check for Updates" (menu or Settings > General) opts
into the RC release channel by switching the feed to the github provider
with allowPrerelease=true for the rest of the process.
Cmd+Shift-click the Experimental sidebar entry reveals a "Hidden
experimental" group with an orange-tinted header and a disabled
placeholder toggle — the slot for future unfinished/staff-only options.
Also reword the Experimental description to something less alarmist:
"New features that are still taking shape. Give them a try."
Adds File > Export as PDF... menu item (Cmd+Shift+E) and an overflow
menu entry that renders the active markdown preview through a sandboxed
Electron BrowserWindow and writes it to disk via printToPDF.
- New main-side IPC handler (src/main/ipc/export.ts) and html-to-pdf
helper that loads a CSP-locked HTML document in a sandboxed, context-
isolated window with javascript enabled only for image-ready polling.
- Renderer helpers clone the rendered markdown subtree, inline all
computed styles through a curated allowlist, and ship the resulting
HTML fragment over IPC.
- Ref-counted listener registration so split-pane layouts install
exactly one IPC subscription and survive panel churn.
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).
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.
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.
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.
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.