Commit Graph

5420 Commits

Author SHA1 Message Date
Siddiqui Qamar 8b32cc00a9
fix: handle native Windows skill update flow for Orca setup (#6307)
* fix: handle native Windows skill update flow for Orca setup

- Rewrite npx skills update <skill> --global to the repo reinstall path on native Windows hosts.
- Keep the WSL runtime path unchanged so Linux/WSL setup behavior stays intact.
- Update the affected runtime helper tests to cover the Windows fallback.
- Adjust the orchestration pane test expectation to match the Windows-host command rewrite.
- Scope the change narrowly to the issue path to avoid impacting unrelated skill setup flows.

* fix: cover Windows skill update fallbacks

---------

Co-authored-by: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com>
2026-06-25 16:16:26 -07:00
github-actions[bot] 4a4d774986 release: v1.4.98-rc.3 [rc-slot:2026-06-25-15] 2026-06-25 22:35:19 +00:00
Jinwoo Hong cbfb36b566
fix(tabs): activate clicks when pointer release has no button (#6386)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 15:04:53 -07:00
Erik 73255f3c59
Fix renderer freeze (ReDoS) from terminal link detection on ngrok/ConPTY output (#5970) (#6373)
* Fix ReDoS in terminal file-path link detection that froze the app (#5970)

A full-screen TUI such as ngrok, run through Windows ConPTY, emits its
dashboard as a single newline-free logical line that is almost entirely
alignment spaces. xterm accumulates it into one ~150k-char logical line,
and on every hover/redraw Orca's file-path link providers scan that line.

The spaced-path lookaheads (SPACED_PATH_WITH_SEPARATOR_REGEX and
LINE_ENDING_SPACED_PATH_REGEX) began with `[^...]*\s+`, where the negated
character class also matches whitespace. That overlap let the engine split
a long run of spaces in exponentially many ways before failing, so a
~5k-char prefix took ~25s and pegged the renderer main thread, freezing
the whole app. macOS uses a normal PTY and never builds that line, so it
was unaffected; disabling terminal GPU acceleration did not help.

Anchor the first lookahead segment at the first whitespace (add `\s` to
the negated class) so it can no longer overlap the following `\s+`. The
matches are identical; the scan drops from ~25,000ms to ~4ms.

Adds a regression test asserting extraction stays roughly linear on long
space-heavy lines.

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

* Fix terminal link ReDoS guards

* Trim terminal link padding

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com>
Co-authored-by: Neil <neil@stably.ai>
2026-06-25 15:04:24 -07:00
Damir Vandic e21ddd378c
Fix pending remote terminal tab creation (#6353)
* Adopt pending terminal tab reveals

* Materialize pending remote terminal tabs

Wait for mobile terminal creates to produce a ready PTY handle before resolving. If the renderer only publishes a pending tab shell, materialize a headless PTY into the same tab/leaf identity so later renderer focus adopts it instead of duplicating the tab.

Add a pane-key spawn reservation shared by runtime materialization and renderer pty:spawn so focus racing fallback reuses the winning PTY, including when SSH env stripping removes ORCA_PANE_KEY. Cover the pending-surface fallback and both overlapping spawn race directions with regression tests.

* Settle pane spawn reservation on any post-spawn failure

The per-paneKey spawn reservation was only settled on spawn error, persist
error, or final resolve. A throw in the post-spawn region (seedHeadlessTerminal,
registerPty, rememberPaneKeyForPty, track) rejected the IPC promise but left the
reservation in paneSpawnReservationsByPaneKey forever, so every later spawn for
that pane awaited a promise that never settled and hung.

Wrap each post-reservation body (both spawn paths) in a catch-all that rejects
the reservation with the real error and rethrows; reject is a no-op once
resolved. Remove the now-redundant inner reject calls. Add regression tests for
both paths.

* Tear down runtime-owned headless tabs on mobile session close

The renderer-attached branch of closeMobileSessionTab closed the renderer's
pane but never pruned mobileSessionTabsByWorktree or dropped the persisted
binding. For runtime-owned headless terminals — serve/SSH materialized, or a
pending shell the renderer never adopted, all introduced by the pending-surface
materialize fallback — syncMobileSessionTabs then re-hydrates the closed tab
from the persisted session, resurrecting it with a live PTY. "Close others" on
a paired client showed closed remote tabs reappearing with their sessions still
running.

Add isRuntimeOwnedHeadlessMobileTab (serve/SSH-owned, or no live PTY and absent
from the renderer graph). When the whole parent of such a tab is closed, route
through closeHeadlessMobileTerminalTab to kill the PTY, remove the persisted
binding, and prune+emit, then best-effort notify the renderer so no adopted
pane is left dead. Genuinely renderer-owned tabs and exact split-leaf closes
keep the existing path. Cover the serve parent close, renderer-published vs
runtime-unadopted pending tabs, and the serve split-leaf case with regressions.

* Tear down only headless tabs the renderer never published on mobile close

The close-others teardown discriminator returned false for any resolved
non-serve/ssh PTY, so headless tabs carrying a daemon session id
(<worktreeId>@@<shortUuid>) that the host materialized but the renderer never
published leaked into the session snapshot and the client mirrored them
(confirmed live: host published 5 tabs for a worktree the renderer showed 1 for).

That id shape is ALSO minted for ordinary renderer-owned daemon-backed local
terminals, so it can't classify ownership by shape — the renderer graph
(this.tabs) does. Classify a tab as runtime-owned when it is serve/ssh (always,
they're preserved + re-hydrated) or when the renderer graph never published it
(a leaked/unadopted shell); delegate everything the renderer graph lists,
including ordinary @@ local terminals and pending tabs.

Regression tests: renderer-owned @@ tab is delegated (not de-persisted); leaked
@@ tab the renderer never published is torn down + de-persisted.
2026-06-25 14:36:35 -07:00
github-actions[bot] 15996c4617 release: v1.4.98-rc.2 2026-06-25 20:48:56 +00:00
Wolfie 8ed4218aa9
perf(git-status): throttle trailing refreshes and coalesce main-process reads (#6341)
Co-authored-by: Neil <neil@stably.ai>
2026-06-25 13:48:07 -07:00
Brennan Benson 1016087368
Repair stale split terminal PTY focus (#6379) 2026-06-25 13:47:04 -07:00
Brennan Benson bf9fde16d5
Fix split terminal tab focus target (#6375)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 13:33:16 -07:00
Brennan Benson d16082015a
Make permission attention indicators consistent (#6384)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 13:22:42 -07:00
Brennan Benson 5d589d5038
Remove split pane toolbar button (#6372)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 13:18:00 -07:00
Jinwoo Hong 5f8b04e0f1
Fix image paste in Remote Host terminals (#6380)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 13:16:08 -07:00
Brennan Benson c10b77d160
Reduce Git refresh subprocess fanout (#6324)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 13:00:44 -07:00
github-actions[bot] ca1cea2558 Update README downloads badge 2026-06-25 18:59:14 +00:00
Brennan Benson e8533f32ca
Keep PR checks status in sync (#6328)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 11:44:25 -07:00
Jinjing f6ad569cc8 docs: add TestFlight and WeChat links 2026-06-25 04:12:36 -07:00
github-actions[bot] 8acc531a2d Update README downloads badge 2026-06-25 10:43:38 +00:00
Jinjing 03f605825b
feat: support h4 and h5 markdown headings (#6349) 2026-06-25 02:35:51 -07:00
github-actions[bot] 830d04f185 release: v1.4.98-rc.1 2026-06-25 08:51:35 +00:00
Brennan Benson c37ab96b57
Remove split terminal from onboarding checklist (#6340)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 01:49:56 -07:00
Brennan Benson eca6e18679
Unify terminal theme settings (#6329)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 01:37:29 -07:00
Neil 75af84bf92
Fix diff tab reselect after opening file tab (#6311) 2026-06-25 01:28:59 -07:00
Jinjing 35c3f86c82
Style commit text area to match input tokens and fix disabled state (#6339)
* Style commit text area to match input tokens and fix disabled state

- Update borders and shadows to match standard input tokens.
- Style the disabled state explicitly to prevent Chromium's user-agent
  styles from washing out the field outline.
- Add dark mode background styling overrides.

* Improve timeline items assertions in work-item-details test

Extract timelineItems to a local variable and add an explicit null check to prevent TypeScript compilation errors when calling the .at method.
2026-06-25 01:18:31 -07:00
github-actions[bot] f864fc5bc6 release: v1.4.98-rc.0 2026-06-25 07:30:08 +00:00
Jinjing 9f0770da2b
Enhance AI Vault sessions with worktree resume and jump actions (#6338)
- Add support for resuming agent sessions in their corresponding worktree
  instead of defaulting exclusively to the active workspace.
- Implement "Jump to Original Pane" and "Jump to Worktree" actions to
  quickly navigate to the session's workspace or terminal pane.
- Display worktree metadata and statuses (current, active, archived, or
  unavailable) on session cards and inline details.
- Refactor launch actions, original pane lookup, and worktree mapping into
  dedicated modules with comprehensive unit tests.
- Update internationalization files for all supported locales.
2026-06-25 00:28:13 -07:00
Jinjing f55154143b
Update mobile Android APK links
Point mobile Android APK links at the published mobile-android-v0.0.16 release.
2026-06-25 00:17:57 -07:00
Jinjing 151cc05fae
Localize workspace creation and update multi-language translations (#6334)
- Internationalize workspace/worktree creation button labels
- Add and improve translations for Spanish, Japanese, Korean, and
  Chinese locales across settings, terminal, and agent descriptions
2026-06-24 23:46:35 -07:00
Jinjing 1439a52603
Validate entry metadata when matching cached combined diff sections (#6333)
Extract combined diff cache matching logic to a dedicated module and enhance it to verify status, area, old path, and added/removed counts. This prevents restoring cached diff content when the underlying files have changed or been renamed.
2026-06-24 23:33:50 -07:00
Jinjing 56bf9eb333
Add GitHub issue timeline activity feed to details dialog (#6330)
* Add GitHub issue timeline activity feed to details dialog

Fetch and display issue timeline events (assignments, mentions, closes,
reopenings, and project board column moves) in a unified activity tab
within the GitHub item details dialog.

- Query the GitHub REST timeline endpoint up to a bounded 300 items.
- Merge comments and timeline events into a single sorted conversation.
- Render tailored icons, links, and localizable messages per event.
- Ensure issue reply targets are not incorrectly filtered by stale PR state.
- Correctly update local item state from details payload.

* Cap issue timeline pagination by supported activities

Count only mapped, supported timeline items instead of raw REST events
when checking the maximum item threshold. This prevents pagination from
stopping early when pages contain many unsupported event types.
2026-06-24 23:22:42 -07:00
Jinjing 2d0325fd33 docs: add X badge to README 2026-06-24 22:26:28 -07:00
gatsby74 7cde0f0b76
fix(ai-vault): surface a workspace's own sessions past the recency cap (#6273)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-06-24 22:03:35 -07:00
Brennan Benson c328ac8a9c
Fix duplicate hibernated agent resume (#6323)
Co-authored-by: Orca <help@stably.ai>
2026-06-24 20:33:27 -07:00
gatsby74 c5d67a923b
fix(ui): match left sidebar divider opacity with the rest of the UI (#6290)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 20:33:13 -07:00
Rod Boev 79d05110ed
fix(orchestration): release dispatch lock when worker_done is sent via orchestration.send (#6317)
* fix(orchestration): release dispatch lock when worker_done is sent via orchestration.send (#6090)

* fix: preserve coordinator lifecycle accounting

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-24 20:30:55 -07:00
Rod Boev 1732648928
fix(codex): prevent duplicate config.toml hook trust key on Windows (#6318)
* fix(codex): prevent duplicate config.toml hook trust key on Windows (#6163)

* fix codex hook trust key normalization

---------

Co-authored-by: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com>
2026-06-24 20:29:24 -07:00
Jinwoo Hong cd1d4dfff3
Fix terminal scroll intent across workspace switches (#6319)
Co-authored-by: Orca <help@stably.ai>
2026-06-24 20:16:14 -07:00
Martin Belcic 9f8a27de33
Only create worktree root directory on blur, not per keystroke (#6300)
* Only create worktree root directory on blur, not per keystroke

Persist worktreeBasePath on input blur instead of on every change.
The per-keystroke updateRepo calls triggered prepareLocalWorktreeRootForRepo
on each character, creating a new directory for every intermediate value
(./w, ./wo, ./wor, …) while the user was still typing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Test that worktree path only persists on blur, not per keystroke

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix blur event dispatch in worktree path test

React delegates onBlur via focusout (which bubbles), not blur (which
doesn't). Dispatch focusout so the React handler is actually reached.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Update src/renderer/src/components/settings/RepositoryWorktreeDefaultsSection.test.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Apply suggestions

* Avoid no-op worktree path root preparation

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-24 19:48:54 -07:00
Jinwoo Hong 0be512fc23
Add diff word wrap toggle (#6214)
Co-authored-by: Orca <help@stably.ai>
2026-06-24 19:26:50 -07:00
Jinwoo Hong 634a1b27e4
fix: group multi-host projects by git remote identity (#6309)
* test: reproduce multi-host legacy project split

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

* fix: group multi-host projects by git remote identity

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

* fix: tolerate lightweight runtime repo list handlers

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

* fix: make git remote identity enrichment nonblocking

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

* fix: use projected setups for sidebar grouping

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-24 19:19:31 -07:00
Saad Khan ae0bd8ef26
fix: allow selecting a project on a non-active host when creating a workspace (#5937)
The new-workspace project dropdown pinned resolution to the host of the
currently-active workspace: handleProjectChange passed that host to
resolveWorkspaceCreationRepoId as a hard `hostId` constraint. Picking a project
set up only on a different host resolved to no repo
(`project-not-set-up-on-host`), and the `if (!nextRepoId) return` guard swallowed
the click — so the dropdown option did nothing and only projects on the current
host were selectable.

Treat the current host as a preference (focusedHostScope) and fall back to any
host the project is ready on. The strict projectId+hostId path used by the
explicit "Run on" host picker is unchanged.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 19:19:04 -07:00
Trevin Chow e65306cb2f
fix(codex): sanitize hooks config writes (#6247)
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-06-24 19:12:21 -07:00
Brennan Benson d9d870d93f
Stabilize sharded e2e CI concurrency (#6312)
Co-authored-by: Neil <neil@stably.ai>
2026-06-24 18:39:02 -07:00
Jinwoo Hong bad9afe090
Fix pwsh availability cold-start cache (#6313) 2026-06-24 21:07:15 -04:00
Jinjing c3241bdb91
Wire terminal worktree navigation to back-and-forth stack (#6310)
* Wire terminal-initiated worktree navigation to back-and-forth stack

* Unify terminal-driven worktree activation and Cmd+J recency marking.
* Record worktree visits in the back/forward history stack unless navigating history.

* fix: focus terminal-initiated worktree tabs
2026-06-24 17:44:22 -07:00
Jinwoo Hong 19b0174dca
Apply agent defaults to AI Vault resume (#6299)
Co-authored-by: Orca <help@stably.ai>
2026-06-24 17:41:09 -07:00
Brennan Benson 7436a4cfc1
Show GitHub issue workspaces immediately while they initialize (#6139)
Co-authored-by: Orca <help@stably.ai>
2026-06-24 17:01:20 -07:00
Brennan Benson 379db68e43
Fix delete workspace confirmation spacing (#6304) 2026-06-24 16:51:08 -07:00
github-actions[bot] a82859020f release: v1.4.97 2026-06-24 23:32:41 +00:00
Brennan Benson 14afd1314d
Zoom the app after leaving terminal focus (#6301)
Co-authored-by: Orca <help@stably.ai>
2026-06-24 16:31:36 -07:00
Brennan Benson 23cde7bef0
Show prompt cache timers on compact agent rows (#6295)
Co-authored-by: Orca <help@stably.ai>
2026-06-24 16:27:36 -07:00