Commit Graph
3425 Commits
Author SHA1 Message Date
Jinjing 7a4ec5c671 Open file links from native chat messages (#6998)
* Resolve and open file links from native chat messages

- Add `onLinkClick` and `allowFileUriLinks` props to `CommentMarkdown`
  to support intercepting links and enabling file URI navigation.
- Resolve relative paths, line/column suffixes, and file URIs from
  native chat messages against the active worktree context.
- Handle clicked links in `NativeChatView` by opening the target file in
  the editor (or system default via Shift+click).
- Refactor markdown renderers and parse utilities into standalone,
  reusable modules to share between terminal and chat components.

* Fix file link resolution and click event propagation

Ensure file links open correctly by falling back to repo-scoped
worktrees if a known worktree lacks a path. Also, stop propagation
on markdown anchor clicks to prevent triggering outer card click
handlers.
2026-07-01 03:03:18 -07:00
Jinjing 252e5f6af5 Avoid clearing terminal scrollback for metadata-only eager replays (#7012)
Previously, the terminal pane would always perform a clear screen on PTY
attach before replaying the eager buffer. This cleared restored scrollback
unconditionally, even when there was no active terminal content to replay
(e.g., when the buffer was empty or only contained window titles and
agent status metadata).

Now, eager buffers are parsed to determine if they contain display-affecting
content. The attach-time clear is skipped for empty or metadata-only
replays, preserving the restored scrollback history. Trailing partial
control sequences are also trimmed to prevent swallowing live terminal output.
2026-07-01 02:57:14 -07:00
Jinjing 16a14ec0cf Add terminal SSH reconnect overlay (#7009)
* Add terminal SSH reconnect overlay

* Publish returned SSH connection state to store on reconnect

Write the returned connection state immediately into the renderer store
to ensure the deferred terminal reattach can resume without waiting for
the state-change IPC to land.

Also translate SSH reconnect overlay strings in the non-English locales
and update the overlay visibility condition to use isVisible.

* Delete SSH terminal reconnect empty pane design document

Remove the design document detailing the SSH terminal reconnect empty pane
overlay problem, design, and data flow, as it is no longer needed.
2026-07-01 02:53:49 -07:00
Brennan BensonandNeil 1cc41ba83b Fix Windows ConPTY agent keyboard reset (#6999)
Co-authored-by: Neil <neil@stably.ai>
2026-07-01 01:38:28 -07:00
Jinjing 07bbd44769 Update Spanish, Japanese, Korean, and Chinese translations (#6997)
Translate newly added features, including per-workspace environments,
native chat, agent runtime options, and emulator SDK settings, to complete
localization coverage across ES, JA, KO, and ZH.
2026-07-01 00:48:31 -07:00
Jinwoo HongandOrca 8fa2c4a203 Fix terminal resume width flicker (#6989)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 22:27:08 -07:00
cbd06a7671 feat(tab-bar): add shortcut to open commands for active tab group (#6325)
* Add keyboard shortcut to toggle the Quick Commands menu

- New `tab.openQuickCommandsMenu` keybinding action (no default binding)
- TabBarQuickCommandsMenu listens for the binding and toggles open/closed
- Scoped to the active tab group naturally since the component only mounts when its group is focused

* Show keyboard shortcut in Quick Commands menu trigger tooltip

* Add tests

* expand tests

* Expand keyboard toggle to call handleOpenChange and skip repeated keys

- Replace `setMenuOpen` toggle with `handleOpenChange(!menuOpen)` so closing
  via keyboard runs the same reset logic (query, focus frame, value override)
- Guard against key-repeat events to prevent rapid toggling on held key
- Wrap `handleOpenChange` in `useCallback` so it's stable enough to include
  in the `useEffect` dependency array without causing spurious re-registrations
- Update tests to reflect that re-running the effect between presses is
  required for the close path, and add a repeat-event test

* Add docstring to withShortcutHint func

* review: harden quick commands menu shortcut

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-30 18:21:37 -07:00
Brennan BensonandOrca 764e2fe61f Keep sidebar agent rows stable during status updates (#6961)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 17:29:03 -07:00
Jinjing 79828fb1eb Update Android APK links to 0.0.18
Point README and mobile APK links at the published mobile-android-v0.0.18 release.
2026-06-30 17:06:39 -07:00
Jinwoo HongandOrca 0ce726bb3b Fix startup draft paste race for Codex (#6936)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 16:40:58 -07:00
Jinwoo HongandOrca f9d8b532f1 Fix stale terminal grid drift (#6959)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 16:29:51 -07:00
Jinwoo HongandOrca 6b66bda634 Fix stuck remote terminal mirror polling (#6951)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 16:21:30 -07:00
Jinwoo HongandOrca 782eb12688 Make remote SSH terminals persistent by default (#6955)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 16:16:10 -07:00
Neil b9f65576d9 Fix Monaco Delayer cancellation during renderer teardown
Handle expected Monaco Delayer cancellation during renderer cleanup so ignored trigger promises do not surface as unhandled rejections. Adds regression coverage for the DisposableStore teardown path from the crash report.
2026-06-30 16:05:01 -07:00
Brennan BensonandOrca 945b270454 Recover terminal rendering after risky output (#6949)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 15:51:45 -07:00
Brennan Benson bcb381e6ec Prevent repeated automatic agent resume tabs (#6945) 2026-06-30 15:30:29 -07:00
Jinwoo HongandOrca 1a3d561dec Fix Codex skill preview terminal artifacts (#6940)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 15:29:12 -07:00
Brennan BensonandNeil 11cd231023 Fix pending worktree spinner alignment (#6948)
Co-authored-by: Neil <neil@stably.ai>
2026-06-30 15:17:23 -07:00
Jinwoo HongandOrca 547834d6d7 fix: route runtime GitHub PR actions (#6947)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 15:10:00 -07:00
Brennan BensonandOrca 34fcf3af67 Keep terminal input wrapping aligned with pane width (#6939)
* Keep terminal PTY columns synced after visible resize

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

* Address terminal resize review feedback

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-30 15:08:01 -07:00
Jinwoo HongandOrca 8a52bec8ff Fix remote runtime branch diffs (#6942)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 14:56:17 -07:00
Jinwoo HongandOrca d7010353ca Move per-workspace environments to Experimental settings (#6926)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 12:57:39 -07:00
Wolfie 62ab2d470e fix: keep floating tabs local with active runtime
Keep the synthetic floating workspace local while a remote runtime is active, including terminal/browser creation, activation, close, and remote snapshot handling.

Maintainer follow-ups:
- require worktreeId for runtime-session terminal create payloads
- add renderer-backed terminal create reply sender regression coverage
- merge current main and keep the WSL readDir breadcrumb test aligned with main's Windows-only handler coverage
2026-06-30 12:48:26 -07:00
Brennan BensonandOrca ebd81c7c88 Fix multi-second input lag after pressing Enter in Windows terminals (#6858)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 11:40:04 -07:00
Jinwoo HongandOrca 39964149c8 Per-Workspace Environments (on-demand disposable runtimes) + Add Project remote host setup (#6320)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 11:31:55 -07:00
Neil be3f30e2f8 Fix Windows CJK terminal repaint and ConPTY wrap markers
Fix native Windows CJK terminal repaint and ConPTY wrap metadata handling.\n\nNormalize filesystem realpath results before authorization so WSL UNC roots compare consistently in CI.
2026-06-30 03:50:30 -07:00
huhuhulululu 9256bd39da fix(native-chat): use basename for Windows tool-call paths
Fix native-chat tool-run summaries so Windows-style file paths display their basename instead of the full backslash path.

Also reuse the renderer basename helper so trailing Windows paths keep a useful summary hint.
2026-06-30 01:55:35 -07:00
Jinwoo HongandOrca e770350407 fix(terminal): reclaim xterm focus after window blur (#6814), pane-scoped + guarded (#6867)
* Apply #6826: reclaim xterm focus after window blur (verbatim)

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

* Improve #6826 focus reclaim: pane-scoped helper + cross-platform focus-steal guard

- Reclaim the exact split helper that owned focus at blur, not the first
  helper in the container (a single TerminalPane hosts all splits as siblings).
- Defer the reclaim refocus to the next frame on every platform and only
  take focus if nothing newer grabbed it, matching the existing macOS guard,
  so a click into the sidebar/dialog during reactivation isn't yanked back.
- Skip reclaim if the released helper was detached before refocus.

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-30 01:30:01 -07:00
Jinwoo HongandOrca 6cdd2ed946 Harden daemon degraded-spawn handling (follow-up to #6830) for #6814 (#6866)
* Harden merged #6830 daemon degraded-mode handling

- shutdownFallbackSessions is now best-effort: a single un-killable local PTY
  no longer throws and aborts the daemon restart (which would leave the user's
  recovery path unusable, recreating the original lockup). Logs and continues.
- checkPtySpawnHealth retries once (timeout raised 2s->4s) so a transient stall
  on a busy machine right after an upgrade does not mis-classify a healthy
  daemon as unable to spawn PTYs and silently drop new terminals to the local
  provider without daemon persistence.
- Surface degraded mode: DegradedDaemonPtyProvider exposes isDegraded, and
  pty:management:listSessions returns { degraded } so the session UI can warn
  instead of it being a silent console.warn. Clearer actionable warn message.

Refs #6814.

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

* Add #6814 daemon failure-mode classification test

Drives the real DaemonServer + checkDaemonHealth over a real socket to lock in
the healthy / degraded(pty-spawn-unhealthy) / wedged(unreachable) / unreachable
classification. Documents the load-bearing boundary that the degraded-daemon
fallback rescues a degraded daemon but NOT a fully wedged one.

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

* Add degraded flag to web preload listSessions stub (typecheck parity)

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-30 01:29:45 -07:00
Neil f769fc7052 Guard terminal search shortcut navigation (#6872) 2026-06-30 01:25:56 -07:00
Jinjing 39fb540844 Improve styling and scannability of PR and task pages (#6870)
- Update the PR state badge icon to dynamically match merged, closed, or draft states.
- Simplify PR merge direction layout using branch tags and a directional arrow.
- Add author avatars to the PR metadata row.
- Prevent scrolled task rows from bleeding through sticky elements by adjusting header z-indexes and applying opaque hover/surface backgrounds.
- Refine padding, text size, and spacing across the PR and task views.
2026-06-30 01:19:10 -07:00
Brennan Benson 973360cfce Reliably deliver the issue prompt into opencode's composer (#6798) 2026-06-30 01:16:55 -07:00
NeilandOrca 1a7dae7a5e fix: keep terminal search from crashing the surface on narrow viewports (#6852)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 01:14:34 -07:00
NeilandOrca d6be1d6050 fix: never leave a split-right PTY pinned at 0x0 (white screen) (#6853)
Co-authored-by: Orca <help@stably.ai>
2026-06-30 01:10:26 -07:00
Brennan BensonandNeil e08df5f98a fix(win): guard xterm link providers so a RangeError can't kill the renderer (#6855)
A synchronous throw inside any terminal link provider's provideLinks
escapes to window.onerror and gets the renderer killed (reason=killed,
exit 1). The reported crash (F0BDKBHDAUE) is xterm web-links'
LinkComputer._getWindowedLineStrings raising 'RangeError: Invalid array
length' while scanning a pathological wrapped line during agent CLI
output (opencode).

Patch terminal.registerLinkProvider at construction so every provider
registered afterward — the web-links addon's internal provider plus
Orca's file-path and terminal-handle providers — has its provideLinks
wrapped in a try/catch that records a crash breadcrumb and degrades to
'no links this hover' instead of throwing.

Covered by terminal-link-provider-guard.test.ts (reproduces the
RangeError and asserts it no longer escapes).

Co-authored-by: Neil <neil@stably.ai>
2026-06-30 00:24:30 -07:00
Jinwoo Hong b44606f023 Fix floating workspace editor ownership (#6859) 2026-06-30 02:59:19 -04:00
Neil f9e18910ae chore(lint): adopt unicorn/prefer-import-meta-properties (error) (#6847)
Migrate fileURLToPath(import.meta.url) / dirname(...) boilerplate to the
native import.meta.dirname / import.meta.filename, then enable the rule
at error so new code stays on the native form.

The oxlint autofix rewrites the expression but leaves the now-unused
node:url / node:path imports behind (which the already-enabled
no-unused-vars=error would then flag), so this commit also removes those
34 orphaned imports — trimming the named import where other names are
still used, deleting the line where it was the sole import.

Scope is build scripts + Node-env tests only (config/scripts, tools/
benchmarks, *.test.{ts,mjs}, vitest configs); zero shipped runtime code.
The native properties are exact equivalents (Node >= 20.11; repo is on
24), so behavior is unchanged.

Verified: oxlint 0 errors tree-wide (root + mobile), oxfmt clean,
typecheck (node+cli+web) + mobile tsc pass, root vitest 22825 passed /
0 failed, mobile vitest 1018 passed. Exercised the rewritten scripts
directly: build:relay (6 targets), ensure-native-runtime,
verify-macos-entitlements all run correctly with import.meta.dirname.
2026-06-29 23:37:30 -07:00
NeilandOrca 2f5f7daa03 fix: recover corrupt lazy-chunk parse errors instead of crashing the boundary (#6850)
Co-authored-by: Orca <help@stably.ai>
2026-06-29 23:34:06 -07:00
NeilandOrca f8d52f72e5 fix(browser): mount floating-workspace browser webview via a slot viewport root (#6854)
Co-authored-by: Orca <help@stably.ai>
2026-06-29 23:29:54 -07:00
Brennan BensonandOrca 8e06ee113c Prevent regressions in Windows local project adds (#6815)
Co-authored-by: Orca <help@stably.ai>
2026-06-29 22:39:32 -07:00
NeilandOrca 46646d7ff1 chore(lint): upgrade oxlint to 1.71 + enable 7 new rules (autofixed backlog) (#6841)
* chore(lint): upgrade oxlint to 1.71 and enable 7 new rules

Upgrade oxlint 1.67.0 -> 1.71.0 (1.72 was blocked by the repo's 3-day
minimum-release-age supply-chain guard; nothing here needs it). The
bump is a no-op on the existing config.

Enable 3 error rules (backlog autofixed to zero in this commit) and
4 warn rules (surface signal without gating CI):

error (autofixed, behavior-preserving):
- unicorn/prefer-node-protocol        (~1531 sites: bare builtin -> node:)
- typescript/no-import-type-side-effects (~36: all-inline-type -> import type)
- unicorn/no-array-reverse            (19: copy-then-reverse -> toReversed)

warn (real signal, current fires are test-only/correct):
- unicorn/no-array-fill-with-reference-type  (aliasing footgun guard)
- typescript/no-unsafe-function-type         (bans bare Function type)
- unicorn/prefer-array-flat-map              (map().flat() -> flatMap())
- unicorn/prefer-regexp-test                 (.match() in bool ctx -> .test())

mobile/.oxlintrc.json extends root, so it inherits all 7; the autofix
ran from root and covered mobile/ too.

Verification (all green): oxlint 0 errors (root+mobile+aux configs),
oxfmt clean, typecheck (node+cli+web), vitest 22795 passed / 0 failed,
builds (electron-vite + web + cli) succeed. node: rewrites confirmed to
skip embedded SSH/CLI string payloads (AST-only); all toReversed sites
verified to operate on fresh copies or write-once locals.

* chore(lint): bump mobile oxlint to 1.71 so inherited rules parse

mobile/ is a standalone pnpm project pinning its own oxlint@1.67, which
lacks unicorn/no-array-fill-with-reference-type (needs >=1.70). Since
mobile/.oxlintrc.json extends the root config, mobile CI's 'cd mobile &&
oxlint' failed to parse the new rule. Bump mobile to match root (1.71).

Verified in mobile/: oxlint 0 errors, oxfmt --check clean, tsc --noEmit
pass, vitest 978 passed / 0 failed.

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-29 22:38:29 -07:00
NeilandOrca 0476109e2c fix: keep a worktree's sole newborn terminal mounted when its PTY dies on startup (#6842)
A worktree created from a PR whose branch ships an .envrc with a failing
direnv command bounced the user straight back to the Landing screen. The
worktree's only terminal spawns in the worktree cwd, direnv runs on shell
startup, fails, and the login shell exits non-zero immediately. The
single-pane PTY-exit branch routed that through onPtyExitRef ->
handlePtyExit -> closeTerminalTab, which deactivated the just-created
worktree (setActiveWorktree(null)) and rendered Landing.

The existing newborn-death guard only protected freshly-split panes, never
the first/sole terminal. Track the freshly-spawned ptyId (onPtySpawn fires
only for fresh spawns, never reattach/coldRestore) and, in the sole-pane
branch, keep the dead pane mounted when a never-interacted fresh spawn
exits. A typed 'exit' or a reattached-dead session still tears down as
before. Not gated on hasReceivedPtyOutput on purpose: a failing direnv
prints its error first, so output is received.

Co-authored-by: Orca <help@stably.ai>
2026-06-29 22:36:42 -07:00
Neil 6130340229 fix: answer startup terminal color queries (#6824) 2026-06-29 21:37:49 -07:00
Neil bf274fd8a9 Fix startup routing test for diagnostic wrappers 2026-06-29 21:37:27 -07:00
Vladislav Meshkorudnyjandvladmesh e82dce4382 Fix/remote skill install floating terminal (#6816)
* fix(terminal): scope skill-install terminals to the floating runtime selector (#6789)

Inline setup/onboarding terminals (skill installers, feature tips) create a
PTY under a synthetic per-panel worktree id. On a remote runtime the remote
PTY transport sent that id as `id:<panel>` to `terminal.create`, which the
runtime cannot resolve, so installing a skill via Settings failed with
selector_not_found. Locally it worked because the IPC spawn uses cwd directly
and never resolves the selector.

These terminals are ephemeral floating terminals with no backing worktree, so
brand their id and resolve it to the floating-terminal selector
(global-floating-terminal), which every runtime already maps to the home dir.
Local tab isolation keeps the distinct per-panel id; only the runtime terminal
selector changes. The server is unchanged.

* docs(terminal): add JSDoc for functions touched by the skill-install terminal fix

Document the new ephemeral setup-terminal id helpers, the runtime terminal
selector, and the onboarding/remote-transport entry points so the changed
functions carry contract-level docstrings.

---------

Co-authored-by: vladmesh <vladmesh@gmail.com>
2026-06-29 20:38:11 -07:00
Neil 380db44d77 Measure and batch restored terminal startup (#6836) 2026-06-29 20:37:26 -07:00
NeilandOrca 16ce1aa73d perf(startup): lazy-load locale catalogs + mermaid (−5.40MB / −31% eager cold-start JS) (#6804)
Co-authored-by: Orca <help@stably.ai>
2026-06-29 20:02:28 -07:00
Neil 30fc4859e2 fix: reject mobile-scope web pairing and surface forbidden runtime errors (#6581)
Fixes #5508.

Rejects mobile-scope phone-QR pairing in the full web client, keeps runtime browser access links on the instant startup path via advisory pairing scope metadata, and surfaces forbidden runtime scope errors instead of rendering empty workspaces or retry-looping setup checks.

Security note: pairing offer scope is UI metadata only. Runtime RPC authorization remains based on the server-side device token registry and mobile allowlist.
2026-06-29 19:06:59 -07:00
Neil 499b900f1b Remove unused dead-code exports (#6821) 2026-06-29 18:32:56 -07:00
Neil 24fa9860a6 Polish terminal context menu shortcuts (#6809)
* Polish terminal context menu shortcuts

* Polish terminal split menu shortcuts
2026-06-29 18:30:57 -07:00