Commit Graph

5452 Commits

Author SHA1 Message Date
github-actions[bot] 74a012c27d release: v1.4.100 2026-06-26 06:10:56 +00:00
github-actions[bot] dad24f67cd release: v1.4.98-rc.10 2026-06-26 05:44:30 +00:00
Brennan Benson b6ac7b9c92
Harden Windows hook command resolution (#6409)
* Keep spaced Windows Codex hook paths fast

* Harden Windows hook command resolution

---------

Co-authored-by: Neil <neil@stably.ai>
2026-06-25 22:43:25 -07:00
Jinjing dd0fa77882
Enhance PR auto-merge controls and switch to GraphQL mutation (#6405)
- Centralize and align auto-merge eligibility logic across web and
  mobile clients.
- Use the `enablePullRequestAutoMerge` GraphQL mutation instead of
  `gh pr merge --auto` to prevent immediate merges on clean branches.
- Fall back to `gh pr merge --auto` when a merge queue is required on
  the base branch.
- Hide the auto-merge control when only optional checks are pending.
2026-06-25 22:00:34 -07:00
github-actions[bot] ec8799562c release: v1.4.98-rc.9 2026-06-26 05:00:18 +00:00
Brennan Benson 6a23099594
Fix Windows agent hook regressions (#6407)
Co-authored-by: Neil <neil@stably.ai>
2026-06-25 21:59:19 -07:00
Jinjing 32c0b47afe
Restrict AI Vault resume actions to local execution hosts (#6406)
Previously, the AI Vault only blocked resume actions for workspaces with
an active SSH connection (checking `connectionId`). This allowed resume
actions to run on runtime-owned workspaces, which are non-local but do
not use SSH.

To resolve this:
- Introduce `getAiVaultResumeWorkspaceTargetStatus` to classify targets
  based on both `connectionId` and `executionHostId`.
- Restrict AI Vault panel actions, session resume checks, and drop layers
  to local workspaces.
- Preserve the `executionHostId` on project groups during normalization to
  ensure runtime-owned groups retain their execution host status across
  persistence reloads.
2026-06-25 21:58:08 -07:00
Jinjing 1f85822b34
Prevent background worktree creation from stealing focus (#6403)
Avoid forcing the active view back to the creation panel when background
worktree preflight completes after the user has already navigated away.

- Add a `revealCreationSurface` option to `continueBackgroundWorktreeCreation` to skip switching views.
- Check both `activeView` and `activePendingCreationId` to determine if the creation UI is actually visible.
- Use this option when kicking off background creation for GitHub work items.
2026-06-25 21:45:54 -07:00
github-actions[bot] 01417f689e release: v1.4.98-rc.8 2026-06-26 03:55:14 +00:00
Brennan Benson d0d257189c
Speed up Windows Codex/Claude hooks without dropping events (#6402)
Windows runs managed hooks through a shell, and #6078 wrapped the
launcher in `powershell -EncodedCommand` to survive spaces in profile
paths. Combined with the inner PowerShell Invoke-WebRequest post, every
hook spawned two PowerShell processes (~300ms startup each), so a hook
took ~650ms+ and fired up to 6x per turn. Codex 0.140 renders that as
lingering "Running <event> hook" rows. The earlier RC worked around it
by deleting SessionStart/UserPromptSubmit/Stop, which loses lifecycle
status fidelity.

Keep all six Codex events and make them fast instead:

- Codex runs hooks as `cmd.exe /C <command>` and forwards our string
  verbatim when it has no spaces/quotes, so emit the bare .cmd path for
  cmd-safe profiles (zero shell startup) and fall back to the encoded
  PowerShell launcher only for spaced/metachar paths (#6078 robustness).
- Replace the inner PowerShell post with curl.exe (Windows 10 1803+),
  posting the same form fields as the POSIX hook and reading the raw
  payload from stdin via `--data-urlencode payload@-` so UTF-8 (e.g. CJK)
  survives without code-page translation.

Result: the common Codex case is 0 PowerShell (~70-150ms vs ~650ms);
spaced-path profiles drop to 1.

Claude runs hooks through Git Bash, so its launcher must stay
PowerShell-encoded (a bare path is what breaks it), but its inner post
moves to curl.exe too, cutting Claude from two PowerShell startups to
one.

Validated against the real Codex 0.140 binary (interactive TUI + exec):
all managed hooks fire, render briefly, and clear with no lingering
rows; the listener receives every post in 1-6ms.

Co-authored-by: Neil <neil@stably.ai>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:53:58 -07:00
rubin fe53387747
Fix automation run terminal targeting (#6374)
* fix(automations): track exact run terminal targets

Record terminal pane keys and PTY ids on automation dispatches, persist them across run updates, and propagate them through runtime launch results.

Use the recorded pane and PTY for completion detection, session reuse, prompt submission, and View run navigation so split-pane tabs reopen the actual run terminal.

Keep legacy runs compatible by falling back to workspace resume when exact terminal identity is absent.

* chore: address automation targeting review cleanup

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-25 20:51:34 -07:00
Jinjing fa6173e145
Improve readability of GitHub work item status and checks (#6399)
Update the pill and badge styles for GitHub PR statuses and check runs
to use muted background washes with theme-appropriate text colors. This
replaces solid high-contrast backgrounds with soft backgrounds, and
fixes low-contrast text in light mode by using darker foreground colors.
2026-06-25 20:41:15 -07:00
Jinwoo Hong 2ec2a98604
Fix Chinese IME composition in terminal chat input (#6396) 2026-06-25 23:32:41 -04:00
github-actions[bot] 412ee329f4 release: v1.4.98-rc.7 2026-06-26 02:25:38 +00:00
Brennan Benson fa3fd3ae02
Fix slow Codex hook statuses on Windows (#6398)
Co-authored-by: Neil <neil@stably.ai>
2026-06-25 19:24:04 -07:00
Brennan Benson ef477199af
Keep worktree PR badges stable during refresh (#6397)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 19:23:40 -07:00
github-actions[bot] 5f995df942 release: v1.4.98-rc.6 2026-06-26 02:17:14 +00:00
Jinwoo Hong ff367431ff
Fix agent resume after force-exit restore (#6391) 2026-06-25 22:10:31 -04:00
Brennan Benson c0fd54c341
Show Agent activity for mobile smart sort (#6347)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 19:00:35 -07:00
Brennan Benson 829f8d9618
Reduce duplicate diff loading work (#6389)
* Deduplicate in-flight diff reads

* Clear diff dedupe for ref-moving SSH operations

* Clear diff dedupe for worktree ref mutations

* Document diff dedupe mutation invalidation

---------

Co-authored-by: Neil <neil@stably.ai>
2026-06-25 18:47:26 -07:00
Rod Boev a12566b962
fix(onboarding): stop wrong-host Open as Folder fallback (#6393)
* fix(onboarding): stop wrong-host folder fallback (#6367)

* test(repos): isolate runtime fallback proofs

* test(repos): cover runtime status RPC failures

* test(repos): drop obsolete max-lines suppression

* Prevent runtime path probes from leaking project groups

* fix(onboarding): gate runtime folder fallback status

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-25 18:42:46 -07:00
gatsby74 6881475532
fix(ports): stop cursor-move redraws corrupting advertised dev-server hosts (#6371)
* fix(ports): stop cursor-move redraws corrupting advertised dev-server hosts

The Live Ports panel showed `localhst:5199` (and opened a broken URL with the
missing `o`) for a dev server that printed `http://localhost:5199`.

AdvertisedUrlWatcher cleans raw PTY bytes with stripTerminalControls, which
*deletes* ANSI/cursor sequences instead of emulating them. CLIs that redraw a
line differentially step the cursor forward over characters already on screen
(`ESC[1C`) rather than reprinting them; a real terminal renders the underlying
glyph, but deleting the move splices the two text runs together and drops the
skipped cell — `http://localh` + `ESC[1C` + `st` collapses to `localhst`.
`new URL()` then accepts the corrupted, plausible-looking host verbatim, so it
gets cached, displayed, copied, and opened.

Neutralize horizontal cursor moves (forward/back `C`/`D`, absolute column `G`,
position `H`/`f`) to a space before the CSI delete pass, so the URL candidate
matcher breaks at the seam and can't fuse a corrupted hostname. Worst case we
skip that frame and fall back to the kernel bind, which is the safe default.

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

* docs(ports): document stripTerminalControls

Add a docstring to the exported helper to clear CodeRabbit's docstring
coverage warning and explain why horizontal cursor moves are neutralized.

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

* fix(ports): invalidate cursor-redrawn URL candidates

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-25 18:36:37 -07:00
Jinwoo Hong d32d62a395
Fix tab switching after terminal tab reorder (#6395)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 18:36:11 -07:00
github-actions[bot] ab61c1fff3 Update README downloads badge 2026-06-26 01:22:14 +00:00
github-actions[bot] a83e973e24 release: v1.4.98-rc.5 2026-06-26 00:44:38 +00:00
Jinwoo Hong 4cb25abe24
Fix WSL agent runtime selection (#6394) 2026-06-25 20:43:51 -04:00
Jinwoo Hong b651b4be6d
Fix tab switching after missed drag cleanup (#6392)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 17:43:45 -07:00
Brennan Benson e257d79294
Prevent Codex hook trust prompts on Windows upgrades (#6388)
Co-authored-by: Neil <neil@stably.ai>
2026-06-25 17:24:09 -07:00
Brennan Benson 156134e80c
Reduce duplicate worktree refresh scans (#6390)
* Reduce duplicate worktree refresh scans

* Preserve host identity during overlapping worktree refreshes

---------

Co-authored-by: Neil <neil@stably.ai>
2026-06-25 17:16:58 -07:00
Brennan Benson 0f8677d7fd
Reveal automation agent logs from the sidebar (#6387)
* Cover sidebar worker log activation

* Cover sidebar worker activation edge cases

* Reveal terminal logs from sidebar agent rows

* Restore warning spy during sidebar tests

---------

Co-authored-by: Neil <neil@stably.ai>
2026-06-25 17:01:33 -07:00
gatsby74 4e45df92ed
fix: forward Ctrl+Enter as kitty CSI-u
Fixes #5966.

Co-authored-by: gatsby74 <166927047+gatsby74@users.noreply.github.com>
2026-06-25 16:38:05 -07:00
github-actions[bot] db0865ce2c release: v1.4.98-rc.4 2026-06-25 23:19:41 +00:00
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