* Add Cmd-J tab session search
References docs/cmd-j-tab-session-search.md for the design.
* Support searching and activating all editor-family tab types
- Index and search editor, diff, conflict-review, and check-details tabs when their backing files are open.
- Deduplicate tab activation logic to ensure exact unified tab IDs are targeted correctly.
- Update palette placeholder texts and localized labels to use "tab title" and "agent prompt" instead of "page title" and "emulator".
- Localize missing tab error strings in Spanish, Japanese, Korean, and Chinese locales.
- Ensure cross-platform path compatibility in search tests using path.join.
* fix(window): remove double title bar on Linux
On Linux the BrowserWindow titleBarStyle fell through to undefined, so
the native WM title bar stayed and stacked on top of Orca's own
renderer-drawn titlebar — two title bars. macOS (hiddenInset) and
Windows (hidden) already suppress the native one.
Drop the native frame on Linux (frame: false) and extend the renderer's
Windows-only custom-titlebar branches (logo/menu anchor, app-name
hiding, window-controls spacer + CSS vars, and the WindowControls
min/max/close cluster) to Linux via a shared `hasCustomTitleBar` flag,
so Linux gets one title bar with working window controls — matching the
Windows custom-titlebar path.
Fixes#5724
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* review: harden Linux custom titlebar gating
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
* fix: dismiss stuck browser address bar autocomplete on webview click
Electron webview guests never dispatch outside pointer events to the
renderer, so the address bar history dropdown could stay open after
clicking the page. Close it on guest focus, window blur, and Escape.
Co-authored-by: Cursor <cursoragent@cursor.com>
* test: cover browser address bar dismiss paths
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
Speed up Windows CLI launch by delivering short startup commands through shell args, falling back to stdin for oversized commands, and moving Codex historical session bridging into an incremental background task. Includes review fixes for Windows symlink and WSL test reliability.
* fix(mobile): sync non-markdown editor files to mobile session tabs
A regression stopped non-markdown files opened on desktop from reaching the
mobile session-tab list: the group projection order surfaced markdown tabs but
dropped plain file tabs. Append any open editor file for the worktree that the
projection didn't emit, keyed by relativePath, so plain files show up on mobile
again (markdown still syncs via the projection).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(mobile): preserve recovered editor session tab identity
Co-authored-by: Orca <help@stably.ai>
* fix(mobile): tolerate legacy active tab metadata
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
* fix(mobile): downscale oversized clipboard images so paste no longer fails
Pasting a large clipboard image (high-res screenshot or photo) failed with
'Image too large to paste' because the re-encoded PNG exceeded the 24 MiB
base64 upload cap, with nothing shrinking it first.
Now an oversized image is downscaled to fit the budget before upload:
- computeMobileClipboardImageDownscale() picks target dimensions by area
(~sqrt(budget/actual)), with a bounded retry loop since PNG size is nonlinear.
- prepareMobileClipboardImageBase64() drives the loop with an injected resizer,
so the byte/dimension logic is unit-tested without native modules.
- The resizer stages the image to a temp file and hands ImageManipulator a
file:// URI; the iOS native loader (Data(contentsOf:)) cannot decode large
base64 data URIs, so a data URI made renderAsync throw.
Adds expo-image-manipulator and expo-file-system.
* fix(mobile): fail fast when resized clipboard image has no base64
Empty base64 from saveAsync would pass the downstream base64 check and
upload a corrupt image; throw instead so the paste surfaces an error.
Addresses CodeRabbit review on #5601.
* Fix mobile clipboard image resize cleanup
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
* refactor(sidebar): give repo and group names priority over header chrome
Repo and group headers no longer show the workspace-count badge or the
collapse chevron, and the trailing action buttons (project menu, add
workspace) now collapse to zero width until the row is hovered, focused,
or its menu is open. The name takes the full row width by default and
only truncates once the actions reveal.
The count was secondary and the chevron was redundant -- the whole
header is already clickable to expand/collapse -- so both were spending
horizontal space better given to the name. The now-unused count field
and its subtree-counting logic are removed from the header row model.
* refactor(sidebar): drop the rename-pending badge from workspace rows
With auto-rename on, every freshly created workspace carried a "rename
pending" badge beside its name until the first agent message landed.
It was persistent clutter on the element we most want legible -- the
workspace name -- so remove it and the no-longer-needed handler.
* Remove unrelated formatting from PR 4761 merge
---------
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
* Prevent stale branch compare results on Git HEAD updates
Track the status HEAD for each worktree to prevent race conditions
where a background branch compare request finishes after Git HEAD has
moved. Stale compare results are now rejected, and the compare state
is invalidated on status HEAD changes to avoid rendering incorrect
diffs. Also allows preserving the prior summary during refresh
requests to reduce UI flicker.
* Match '(initial)' status head with null branch compare head OID
Map the '(initial)' HEAD reported by git status for unborn branches
to a null head OID in branch compare results. This prevents false
mismatch positives during validation and state transitions, ensuring
unborn branch comparisons are accepted and stale ones are correctly
rejected.
* memoize hostedReview in SourceControl and extract support search
- Wrap the hostedReview calculation in useMemo in SourceControl to avoid redundant object recreation and re-renders.
- Move the general support search entries to their own dedicated file for improved code organization.
* fix: improve mobile terminal glyph rendering
Align the mobile companion WebView terminal with the desktop xterm setup so Claude output renders correctly on iOS.
- Upgrade the embedded xterm CDN stack to the desktop beta line
- Load Unicode 11 before replaying terminal bytes
- Enable WebGL rendering with context-loss fallback
- Preserve Claude status dots as text presentation
- Add regression coverage for the mobile terminal setup
* Fix mobile status dot normalization edge cases
Co-authored-by: Orca <help@stably.ai>
---------
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
* Highlight the open file in the Source Control sidebar
Pending (uncommitted) rows had no persistent indicator for the file
currently open in the editor: a plain single click cleared the bulk
selection and only opened the diff, leaving no visual cue for which row
was active.
Derive the active editor file for the worktree from the store and mark
its Source Control row as the current row (full bg-accent + data-current),
outranking the lighter bulk-selection tint. Matching is area-aware so a
partially staged file lights up only the row that is actually open, and
the highlight clears when the visible tab is not an editor.
Extract the row-key mapping into source-control-active-open-file-keys.ts
and cover it with unit tests plus render tests for the highlight wiring.
* Update src/renderer/src/components/right-sidebar/SourceControl.open-file-highlight.test.tsx
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Refine source control open-file highlighting
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
The empty-workspace landing screen showed an alarming "Missing
dependencies — GitHub CLI is not installed" banner even for users
whose registered projects are all GitLab-backed, where `gh` is never
used. `gh` only powers GitHub PRs/issues/checks, so this is a false
alarm for GitLab-only users (#5670).
Treat the GitHub CLI prompt as a soft, provider-scoped setup nudge
rather than a global missing-dependency error:
- Quiet the banner styling (muted surface, no amber frame) and cap its
width so it reads as a soft nudge, not an error state.
- Add a persistent dismiss to the gh / gh-auth nudges. Git stays pinned
as a hard global dependency.
- Dismissal snapshots the set of GitHub-backed project identity keys;
the nudge re-surfaces only when a genuinely new GitHub-backed project
is added (set-based, so remove+re-add of the same project doesn't
retrigger, and GitLab/folder repos never do).
Adds isGitHubBackedRepo() to the host-setup projection (reusing the
existing GitHub-identity detection) plus unit tests for both the
predicate and the dismissal logic.
Co-authored-by: Orca <help@stably.ai>