Commit Graph

4757 Commits

Author SHA1 Message Date
Jinwoo Hong bb51bc9ae6
Fix Linux dock window class (#5293) 2026-06-12 19:13:19 -04:00
Jinwoo Hong 55db0ab12e
Fix Windows multiline terminal paste (#5291) 2026-06-12 19:12:08 -04:00
Yang,Zhou 74e2c952f1
feat: add Devin CLI as supported TUI agent (#5282)
* feat: add Devin CLI as supported TUI agent

Register Devin across shared agent config, telemetry, desktop/mobile
catalogs, localization, and README. Uses stdin-after-start prompt
delivery with --permission-mode bypass default args.

* test: assert Devin default --permission-mode bypass in startup plans
2026-06-12 16:10:09 -07:00
Jinwoo Hong 6837cca9f3
Fix Tasks PR detail drawer and GitHub attachment videos (#5288)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 16:02:09 -07:00
github-actions[bot] 46dbedff86 release: v1.4.66-rc.0 [rc-slot:2026-06-12-15] 2026-06-12 22:36:19 +00:00
Borja d538549bb5
Fix markdown preview links routing to system browser instead of Orca (#5265)
* Fix markdown preview links opening in system browser instead of Orca

In the markdown preview, a plain (or Cmd/Ctrl) click on an http/https link
called window.api.shell.openUrl() directly, which always routes to
shell.openExternal (the OS default browser). It bypassed openHttpLink, so a
plain click could never open in the Orca built-in browser, regressing the
behavior from #987. The Cmd/Ctrl+Shift escape hatch was already correct.

Route both http click paths through openHttpLink via a new
resolveMarkdownPreviewHttpOpenOptions helper that centralizes the
cross-platform modifier decision (Cmd on Mac, Ctrl on Linux/Windows):
- plain / Cmd-click -> { worktreeId } -> Orca browser (per openLinksInApp),
  falling back to the system browser when the setting is off, no worktree is
  known, or a remote runtime is active.
- Cmd/Ctrl+Shift-click -> { forceSystemBrowser: true } -> system browser.

The remote/SSH case is handled inside openHttpLink (http stays on the client
system browser; file:// blocking is unchanged).

Adds a happy-dom interaction test that renders the real component and fires
real modifier clicks, plus full modifier-matrix coverage for the helper.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* review: share markdown preview link modifier logic

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>
2026-06-12 15:20:51 -07:00
Brennan Benson 5f0a4fc5f3
Add left sidebar appearance setting (#5280)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 15:00:28 -07:00
Jingyue Wu b8a899edb1
fix: browser url preview with arrow navigation [#5113] (#5221)
* fix: browser url preview with arrow navigation

* Fix browser autocomplete preview cancel

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-12 14:44:25 -07:00
Carlos Baraza 1205457d53
feat(mobile): paste clipboard images into terminals (#5264) 2026-06-12 14:37:43 -07:00
Brennan Benson abb2477efb
Fix tab agent identity detection (#5283)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 14:15:27 -07:00
Jinwoo Hong 5f3b61aa65
Fix WSL agent setup to use the distro login shell (#5285) 2026-06-12 17:01:34 -04:00
Jinwoo Hong ebeb12fedc
fix: distinguish remote project paths by SSH connection (#5279)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 13:40:51 -07:00
github-actions[bot] 011ea0db34 release: v1.4.65-rc.3 2026-06-12 20:30:18 +00:00
Brennan Benson 74c961b09f
Add Linear write commands for agents (#5165)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 13:29:13 -07:00
github-actions[bot] a2aff47aca release: v1.4.65-rc.2 2026-06-12 19:18:38 +00:00
Jinjing b81f06203d
Defer project header pointer capture until drag threshold is crossed (#5278)
This allows simple clicks on the repository header to still reach the
inner collapse handler on pointerup. Additionally, body cursor and
user-select styles are only applied when actual dragging begins,
rather than when the session is armed.
2026-06-12 12:17:50 -07:00
Jinwoo Hong dc8fdf65a3
Update Android mobile release links to 0.0.13
Point Android download links at the published mobile-v0.0.13 release.
2026-06-12 12:02:58 -07:00
Jinjing 18fdcf0b05
fix: clarify Korean terminal link routing label (#5277) 2026-06-12 12:02:15 -07:00
Jinjing d2a3f12baa
fix: address review findings (#5275) 2026-06-12 11:43:39 -07:00
github-actions[bot] 528a9292aa release: v1.4.65-rc.1 2026-06-12 18:22:56 +00:00
Jinjing 5ca63c85d7
fix: address review findings (#5273) 2026-06-12 11:20:43 -07:00
Jinjing dccea75b0e
Fix active tab scrolling and editor keyboard layout on mobile (#5271)
* Improve mobile session tab scrolling and editor keyboard layout

- Auto-scroll the active session tab into view within the horizontal
  tab strip, using a new layout-aware utility with minimal scrolling.
- Use visual viewport measurements in the editor WebView to accurately
  report keyboard insets and lift floating controls above the keyboard,
  as native events can under-report covered areas.

* Fix active tab scrolling and normalize editor keyboard inset

- Ensure the active session tab is scrolled into view immediately when
  its layout finishes to prevent it from remaining hidden off-screen.
- Round, clamp, and validate WebView visualViewport bottom measurements
  to avoid rendering inconsistencies from fractional or invalid insets.
- Trigger an immediate keyboard inset report on script initialization.

* Update tabStripOffsetRef when scrolling mobile tab strip

Ensure the cached offset is updated to match the next scroll position. Without this update, subsequent scroll calculations would use stale offset values.
2026-06-12 11:09:08 -07:00
Jinjing f027a1cb7b
Move settings out of help dropdown into dedicated sidebar button (#5272)
- Pulls the Settings option out of the Help dropdown menu and renders it as a standalone button directly in the sidebar.
- Integrates the `useShortcutKeys` hook and `ShortcutKeyCombo` component to display the settings keyboard shortcut in the button's tooltip.
- Updates associated tests to verify the new button's placement, ARIA attributes, and tooltip content.
2026-06-12 10:56:49 -07:00
Lesley Murfin 0021d95796
fix(serve): persist active serve session tab so PTY output doesn't snap focus to the last tab (#5131)
* fix(serve): persist active mobile-session tab so PTY output doesn't snap focus

In `orca serve` (headless host + remote/web client), running a command in a
terminal snapped the active tab back to the last-created tab. The renderer
reconcile forces the client's active tab to the host's reported active
(activeTabId / activeTabType / per-tab isActive), but `activateMobileSessionTab`
only called `focusTerminal` — a no-op for serve tabs no renderer has adopted —
and never persisted the chosen tab into the host's in-memory snapshot. So every
`onPtyData` -> `touchMobileSessionSnapshotsForPty` republish re-emitted the stale
"active = last tab" and the client snapped back on each command.

Persist the activation into the headless snapshot (activeTabId, activeTabType,
exclusive per-tab isActive, rebuilt tabGroups) after the focus dispatch, gated on
`!getAvailableAuthoritativeWindow() && isHeadlessMobileSessionPublication(...)` —
the same guard the hydrate path uses, so renderer-owned snapshots (including
`:headless-merge:`) stay authoritative. No-op when the tab is already active;
adds nothing to the `onPtyData` hot path.

Adds 3 regression tests covering: chosen tab survives a PTY republish, no version
bump on redundant activation, and no server-side persist when a renderer is
authoritative.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(serve): exclude :headless-merge: snapshots from headless active-tab persist

After a renderer detaches there is no authoritative window, so the
!getAvailableAuthoritativeWindow() guard alone let merged (:headless-merge:)
snapshots through this path. A merged snapshot still carries renderer-owned
tabs/groups, so a server-side active-tab rewrite could collapse that mixed
group state. Exclude merged epochs from the persist gate; only pure
`headless:` / `headless-hydrated:` publications are persisted server-side.

Adds a regression test: renderer-detach + `:headless-merge:` snapshot ->
the headless persist is suppressed (no snapshot mutation / event).

Addresses the CodeRabbit review on #5131.

* review: clarify headless active-tab persistence guard

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>
2026-06-12 10:47:55 -07:00
Brennan Benson d93de0935f
Add effectiveness telemetry for in-app GitHub stars (#5245)
Co-authored-by: Orca <help@stably.ai>
2026-06-12 10:14:49 -07:00
Neil f31c40cb18
Add Grok sessions to AI Vault (#5258) 2026-06-12 01:38:56 -07:00
github-actions[bot] 290ffc7494 release: v1.4.65-rc.0 2026-06-12 07:40:36 +00:00
Jinjing 030a35a2df
Update manual project order notice wording and add translations (#5253)
Correct a minor grammatical issue in the English notice by adding
"the". Additionally, localize FolderWorkspaceComposerDialog and
ProjectOrderManualDefaultNotice in Spanish, Japanese, Korean, and
Chinese to replace the English fallback strings.
2026-06-12 00:18:51 -07:00
Jinjing 9c8d9be8dd
Optimize CI checks caching and polling backoff behavior (#5252)
* Optimize CI checks caching and polling backoff behavior

- Prevent backing off the polling interval when no checks are reported
  yet, keeping polling at the baseline rate to detect newly started jobs.
- Reduce empty checks cache TTL to 10 seconds to allow faster recovery
  from a "no checks" state while preserving the 60-second TTL for active jobs.
- Avoid bypassing the GitHub CLI cache on tab entry, reserving forced
  fetches only for explicit manual user refreshes.
- Update "No checks configured" copy to "No checks reported yet" to avoid
  misleading users before their CI pipelines have started running.
- Ensure manual checks refreshes do not inherit in-flight automatic requests
  which might be backed by cached CLI data.
- Lookup head-specific cache keys during PR refresh events to prevent
  incorrectly deriving neutral check statuses.

* Clarify polling reset comment in ChecksPanel

Update the comment to accurately refer to the entry refresh rather
than a forced fetch establishing a fresh baseline.
2026-06-12 00:16:36 -07:00
Jinjing 4278fdc1e8
Constrain right sidebar primary action widths (#5249)
* Constrain right sidebar primary button widths to prevent layout jumps

Introduce min-width constraints, truncation, and content-width layouts
for primary actions in the right sidebar and PR dialogs. This prevents
buttons from shifting layout dramatically when labels morph dynamically
as git and review state changes.

* Fix right sidebar split action overflow
2026-06-12 00:09:26 -07:00
Jinjing d27985e05b
Constrain right sidebar primary button widths to prevent layout jumps (#5248)
Introduce min-width constraints, truncation, and content-width layouts
for primary actions in the right sidebar and PR dialogs. This prevents
buttons from shifting layout dramatically when labels morph dynamically
as git and review state changes.
2026-06-11 23:50:25 -07:00
Jinjing 2899a60872
Durable persistence for commit message generation across worktree switches (#5243)
* Persist commit message generation state across worktree switches

Introduce a new global store slice for commit message generation to prevent
in-flight requests from being orphaned or lost when the Source Control
sidebar is unmounted or when switching between worktrees.

- Key commit generation records by worktree ID/path in the Zustand store
- Hydrate completed messages back into the draft input when returning to
  the originating worktree without overwriting active user edits
- Ensure the agent-selection dialog state remains bound to the target
  worktree that initiated the generation
- Wait for the PR composer eligibility check before hydrating completed
  PR field generations on sidebar remounts

* Route cancellations to starting runtime and prune stale worktree records

Ensure commit message and pull request generation cancellation requests
are always routed to the runtime environment that was selected when
the generation started, even if active settings change before
cancellation.

Additionally, prune commit message and pull request generation records
when worktrees are removed to prevent stale records from lingering in
the store.
2026-06-11 23:36:46 -07:00
Jinwoo Hong 0310b032bb
Redesign README for clarity and conversion (#5244)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 22:48:41 -07:00
Jinjing 4d0c449378
Support project reordering with groups and add manual-default notice (#5237)
* Support project reordering with groups and add manual-default notice

Refactors the project header drag-and-drop implementation to work correctly
with project groups by tracking ordering within buckets and updating project
group assignments on drop. Also introduces a dismissible sidebar education
card notifying upgraded profiles that manual project ordering is now the default.

* Split oversized translated UI modules

* Fix localized option test regressions
2026-06-11 20:39:39 -07:00
github-actions[bot] bebf087504 release: v1.4.64-rc.2 2026-06-12 03:20:42 +00:00
Jinjing f72c22532a
Support GitLab MR unlinking and AI generation in ChecksPanel (#5204)
* feat: support GitLab MR unlinking and AI generation in ChecksPanel

Integrate GitLab merge request actions alongside GitHub pull requests in
the sidebar checks panel. This includes unlinking GitLab MRs, enabling
AI-driven title and body generation for GitLab, and dynamically adapting
menu labels (e.g. "More MR actions" vs "More PR actions") depending on
the active provider.

* fix: handle null base ref in hosted review creation and add tests

Co-authored-by: Orca <help@stably.ai>

* Extract sub-components and hooks from renderer components

To improve component focus and maintainability, extract large inline
sub-components, custom hooks, and logic helpers into dedicated files:

- Extract `HeroPaired` from `MobileHero` to `MobileHeroPairedDevices`.
- Move `ChromePreview` from `ThemeStep` to `theme-chrome-preview`.
- Refactor `HostedReviewActions` to use `useHostedReviewActions` hook.
- Move MCP config loading from `McpConfigSection` to helper file.

* Refactor usage panes to extract shared formatters and tables

Extract duplicated formatting utilities to a shared helper module. Move
the large, inline recent sessions tables into dedicated sub-components to
reduce duplication and simplify the parent pane components.

* Support self-hosted GitLab instances for MR creation eligibility

* Extract and check the remote host against `glab auth status` to
  dynamically recognize and authenticate self-hosted GitLab instances
  without requiring them to be in a hardcoded list.
* Refactor stats usage panes by extracting reusable breakdown sections
  and sessions tables to eliminate duplication.
* Suggest Linear prompts only if the launcher can resolve the CLI.

* Extract GitLab project ref tests and update usage stats translations

- Move GitLab project ref parsing tests into a dedicated test file to
  keep modules focused and add tests for candidate parsing.
- Add missing translations for the usage sessions table and breakdown
  section across multiple locales.

* Optimize GitLab ref parsing, deduplicate formatters, and add locales

- Clean up GitLab ref parsing by extracting normalized known hosts.
- Fix an escaped newline sequence in the self-hosted GitLab mock test.
- Deduplicate stats helper functions into a single shared file.
- Translate path status message strings across ES, JA, KO, and ZH.

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-11 20:18:28 -07:00
Jinwoo Hong b09d7124c4
Persist agent provider sessions at quit and resume them on cold restore (#5240)
Agent provider session ids lived only in the in-memory
agentStatusByPaneKey map, so a daemon/session death while the app was
closed (reboot, crash, update kill) left nothing to resume from -
terminals cold-restored as plain shells with no Claude/Codex/Gemini
session (#5232, Bug 2).

The quit flush now captures resumable live agents into the persisted
sleeping-session map with origin 'quit'. Quit-origin records are
consumed only by the pane-level cold-restore resume (which injects the
agent's resume command into the replacement shell); worktree activation
skips them so a warm-reattached agent never gets a duplicate resume
tab. Sleep-origin behavior is unchanged, and a warm reattach clears the
record on the agent's next status event.

Co-authored-by: Orca <help@stably.ai>
2026-06-11 20:17:23 -07:00
Jinwoo Hong 4df412f18e
Keep restored terminals on daemon PTYs when startup is slow (#5234)
The 12s first-window timeout used to abort daemon init and open the PTY
spawn gate, so a slow (but succeeding) daemon start flipped restored
panes onto LocalPtyProvider fallback terminals. Those are killed on app
quit and their numeric ids overwrite the persisted daemon session ids,
permanently orphaning the live daemon sessions (#5232, Bug 1).

The window still fails open at 12s, but the PTY gate now waits for the
service attempts themselves and only fails open (aborting the services)
at a 60s deadlock backstop. Failure fallback is unchanged: a daemon init
that errors still resolves the gate onto the local provider.

Co-authored-by: Orca <help@stably.ai>
2026-06-11 20:17:15 -07:00
Jinjing 36e439907a
Implement GitHub issue close reasons and tabbed comment composer (#5235)
- Support closing GitHub issues with specific reasons ('completed', 'not planned', or duplicate) via main-process mutations and gh CLI wrappers.
- Replace the legacy comment composer with a tabbed layout supporting a real-time markdown preview, image/attachment inputs, and state transition buttons.
- Refactor assignee and label popovers into dedicated reusable components to clean up the item dialog.
2026-06-11 19:49:41 -07:00
Jinjing 04f394c17a
Use outline variant for merge abort buttons (#5236)
Change the abort action button variant for merge operations from destructive
to outline, aligning it with rebase abort. This uses a quieter,
non-destructive treatment for aborting operations.
2026-06-11 19:47:16 -07:00
Jinjing 868b024dbe
Fix localized strings getting stuck on language switch (#5150)
* Fix localized strings getting stuck on language switch

Replace static module-level translation evaluations with property
getters and i18n hooks to ensure UI elements update dynamically when
the active language changes.

- Convert static configuration properties to dynamic getters.
- Call `useTranslation()` to trigger re-renders on language updates.
- Recreate Tiptap editor extensions when the active language changes
  to refresh frozen placeholder configurations.

* Evaluate localized strings dynamically in static UI structures

- Use ES6 getters with `translate()` in static object maps (such as SSH
  connection status, usage ranges, and feature tour copy) to evaluate
  strings on demand when the language changes.
- Add the `useTranslation()` hook to `LinearIssueMarkdownToolbar` so it
  subscribes directly to translation updates.
- Extract markdown slash command primitives to a separate file to keep
  catalog configuration clean.

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-11 19:45:50 -07:00
Brennan Benson 18ca691977
Update create project dialog design (#5231)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 19:45:01 -07:00
Jinjing bf9a542d4f
Refine terminal fit restore settings typing and add failure tests (#5233)
* Use undefined instead of null for terminal fit restore settings.
* Extract restoreFailedResult helper to handle failed restore attempts.
* Add remote RPC restore failure test to terminal-fit-restore.test.ts.
* Translate "Resize all terminals" string to Chinese.
* Add assertion to verify driver state map contents before clearing.
2026-06-11 19:12:12 -07:00
Jinjing 73593e5c3d
Allow restoring all terminals to desktop size from mobile overlay (#5228)
Provides a "Resize all terminals" button to bulk-restore all
mobile-held terminals to desktop dimensions, avoiding the need to
reclaim each pane individually.

- Extract local and remote PTY restore logic to a shared helper
- Query all active drivers to identify mobile-controlled terminals
- Update localization bundles with the new resize-all label
2026-06-11 19:08:41 -07:00
Jinjing 74b61881e4
Hide saved source control launch dialog (#5229)
* Hide saved source control launch dialog

* rm design doc

* rm design doc
2026-06-11 19:03:37 -07:00
github-actions[bot] f796121bf9 release: v1.4.64-rc.1 2026-06-12 02:02:17 +00:00
Jinwoo Hong 0b19195fd9
Remove startup PTY spawn health probe and guard daemon replacement with live-session check (#5230)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 19:00:44 -07:00
Brennan Benson 6762a10f3f
Enable first-input rename for folder workspaces (#5227)
Co-authored-by: Orca <help@stably.ai>
2026-06-11 18:24:44 -07:00
Jinjing 1f6bfe0503
Improve error messaging for git submodule push failures (#5226)
Detect when git push operations fail due to un-pushed or out-of-sync
submodules, and extract the specific submodule name to provide clear,
actionable guidance to the user.

Additionally, update the Source Control error UI to allow better text
wrapping and word-breaking for detailed error alerts.
2026-06-11 17:32:49 -07:00
Jinjing 08456103cb
Persist PR comment queue selection and clear it when sent to agent (#5208)
- Retain selected comment groups in memory by context key to prevent
  them from being lost when switching contexts or when the list remounts.
- Clear the persisted queue once comments are submitted to the AI agent
  for thread resolution so the queue is spent.
- Make the PR comments list header sticky to keep action buttons visible.
- Simplify translation strings by removing dynamic review kind parameter.
2026-06-11 17:15:23 -07:00