Commit Graph
3741 Commits
Author SHA1 Message Date
Jinwoo HongandOrca 9981c3b827 Check for Updates: cmd/ctrl-click fetches latest perf-tagged prerelease (#7278)
Co-authored-by: Orca <help@stably.ai>
2026-07-05 02:53:17 -07:00
Jinwoo Hong 812f24bd19 fix(terminal): clear PTY-side buffers on Ctrl+K so the prompt stops repainting at a stale row (#7413) 2026-07-05 04:36:24 -04:00
JinjingandOrca a5cdb7711d Add MiniMax rate-limit tracking and secure cookie storage (#7411)
* Add MiniMax rate-limit tracking and secure cookie storage

* Securely store MiniMax session cookies using an encrypted envelope format and local file hardening.
* Fetch rate limits in an isolated session partition and clear the cookie jar before and after requests to prevent leakage.
* Add a default-on "minimax" status bar item to display subscription usage.
* Expose minimax configuration settings (group ID and models) in settings panes and sync them via the runtime client.
* Isolate MiniMax config resolver and decryption failures from affecting other rate-limit providers.

* Redact MiniMax secrets with whitespace around colons

Update redactMiniMaxSecret to allow and match optional whitespace
surrounding the colon when redacting quoted cookie values. This matches
the spacing tolerance used during parsing.

* Address PR review: harden cookie read, validate IPC, add tests

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-07-05 01:15:16 -07:00
Jinjing 8dbe6bf372 Improve agent history indentation and layout (#7412)
* Hide redundant current worktree info in workspace vault scope

When the AI Vault is scoped to the current workspace, showing the
"Current worktree" status line or badge is redundant since the sessions
are already filtered to this workspace.

- Add helper to hide the worktree line and status badge when the vault
  is in 'workspace' scope and status is 'current'.
- Improve alignment and metadata layout in session rows using CSS grid.
- Update tests to verify worktree line and badge visibility rules.

* Indent AI vault session worktree line

Add left padding to the session worktree line to improve its visual
indentation inside the AI vault session row.
2026-07-05 00:25:10 -07:00
JinjingandOrca 9886eb507a Improve Chinese and Spanish translations (#7408)
* Refine Spanish and Chinese locale translations

- Update Spanish strings for developer tools, notifications, and session history scopes.
- Standardize Chinese terminology by converting "令牌" to "token" and correcting color translations (e.g., "橙子" to "橙色").
- Adjust Chinese UI phrasing, such as mapping issue states from "进行中" to "开放" and "资源管���器" to "文件管理器".

* test: update MR Open state filter expectation to 开放

The zh locale intentionally remapped the GitLab MR 'Open' filter from
进行中 to 开放; align the test expectation with the translation.

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

* Improve Chinese and Spanish translations

- Translate "Current workspace" to Spanish.
- Correct the translation of "Atlassian" and expand "PR" to "拉取请求"
  in Chinese locale.
- Fix spacing around English terms like "token" in Chinese text in Chinese.

---------

Co-authored-by: Orca <help@stably.ai>
2026-07-05 00:15:30 -07:00
85d555f334 fix(terminal): launch prior/default agent when a woken terminal can't resume (#6277)
* fix(terminal): launch prior/default agent when a woken terminal can't resume

Waking a sleeping worktree (or restoring terminals after an app restart)
left an agent terminal as a BLANK shell while still showing the agent's
icon: `buildColdRestoreAgentResumeStartup` returned null whenever the
provider session couldn't be resumed, and the caller then spawned a bare
shell.

Now, when resume isn't possible, an agent terminal comes back as a FRESH
session of the agent it previously ran (live status -> sleeping record ->
persisted tab `launchAgent`); if that agent is unknown but the terminal was
an agent terminal, the configured default agent is used. A genuine plain
shell stays blank, and the existing resume path, SSH/remote, and WSL
behavior are unchanged.

Fixes #4557

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

* test(terminal): assert default-agent cold restore is a fresh (non-resume) launch

Addresses CodeRabbit review on #6277.

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

* Fix cold restore agent fallback

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-07-05 00:04:24 -07:00
ec9efe4638 fix: distinguish duplicate project names in picker (#6272)
* fix: distinguish duplicate project names in picker

* review: disambiguate duplicate project picker details

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-05 00:01:30 -07:00
Jinjing d6c96e77d2 Surface detailed commit failure summaries in Create PR flow (#7401)
Instead of showing a generic commit failure message during the Create PR
intent flow, leverage `summarizeCommitFailure` to extract the underlying
reason (such as pre-commit hook or lint failures) and present it clearly.

Also introduce `commitErrorsRef` to reliably track and retrieve the most
up-to-date commit errors across renders without stale closure issues.
2026-07-05 00:00:25 -07:00
WolfieandWolfgang Schoenberger a169b7d03d fix: focus new floating-workspace agent tab on launch (#6250)
* fix: focus new floating-workspace agent tab on launch

The default-agent button in the floating workspace titlebar created its
tab with { activate: false } and only called setActiveTabForWorktree,
which writes activeTabIdByWorktree. The floating panel selects its
visible tab from the unified group's activeTabId, so the new agent tab
was appended but never selected or focused. Add activateTab(tab.id),
matching the empty-state tab creators, so launching a new agent switches
to and focuses its tab.

* test: use top-level react type import in floating controls test

* test: lock queue-before-activate order and state updates for agent launch

Strengthen the FloatingTerminalWindowControls regression test per review:
- make the createTab mock append the new tab to the worktree (realistic store)
- seed an existing tab so append/order behavior is observable
- assert startup command is queued before activateTab (invocationCallOrder)
- assert setActiveTabForWorktree and tab bar order placement

---------

Co-authored-by: Wolfgang Schoenberger <221313372+wolfiesch@users.noreply.github.com>
2026-07-04 23:52:24 -07:00
guihirsch f11a2109c8 feat(rate-limits): add MiniMax token control (#7387) 2026-07-04 23:33:25 -07:00
Jinjing 136cb50bcb Reflow and edit hard-wrapped prose within single paragraph blocks (#7407)
* Reflow and edit hard-wrapped prose within single paragraph blocks

Instead of splitting consecutive markdown source lines into multiple visual paragraph nodes during document initialization, preserve them as a single paragraph containing literal newlines.

- Use `white-space: normal` CSS to reflow soft breaks naturally.
- Introduce `deleteAdjacentEmptyParagraph` to handle Backspace/Delete without converting soft newlines to hard break elements.
- Update the cut handler to delete only a visual line on Cmd+X within hard-wrapped paragraphs.
- Avoid split-pane/sync phantom dirty states caused by structural block splitting.

* Document why normalizeEmptyListItems is used for paragraph reflow

Add comments to clarify that normalizeEmptyListItems preserves
hard-wrapped paragraphs as single paragraphs, allowing them to
reflow via CSS instead of being split on load or external sync.
2026-07-04 23:29:05 -07:00
Avichal DwivediandJinjing e94c83d164 fix(ai-vault): make SSH session history host-aware (#7367)
* fix(ai-vault): scan sessions by execution host

* fix(ai-vault): route history resume by host

* test(e2e): cover SSH AI Vault history

* Generalize remote session scanning for all AI Vault agents

Replace the Codex-only remote SSH session history scanner with a
unified scanner supporting all registered agents. This ensures remote
transcripts for Claude, Gemini, Devin, Droid, and others are scanned
and listed alongside local history.

- Propagate host metadata (host ID and platform) to scanned sessions
- Scope remote actions by host, disabling local OS path actions on
  remote session logs
- Resolve ambiguous project/worktree matching for overlapping paths
  by verifying matching host setup IDs
- Update tests and E2E specs to validate multi-agent remote scanning

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-07-04 22:56:55 -07:00
Jinjing 863d94167c Use activeWorkspaceKey to reveal active workspace in sidebar (#7406)
Older folder-based workspaces are tracked by `activeWorkspaceKey`
rather than the legacy `activeWorktreeId`. Deriving the active sidebar
workspace ID from the workspace key enables the "Reveal active
workspace" action to work correctly for both types of workspaces.
2026-07-04 22:19:28 -07:00
Rod BoevandJinjing 7e1f9e55f2 fix(worktrees): fall back from stale default base refs (#7398)
* fix(worktrees): fall back from stale default base refs (#7312)

* docs(worktrees): explain base fallback policy

* fix(worktrees): harden stale base fallback edge cases

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-07-04 21:31:51 -07:00
Jinjing 16d08b4fac Warn about and manage repository overrides for AI action recipes (#7386)
* Warn about and manage repository overrides for AI action recipes

This improves the user experience around overriding global AI action recipe
defaults with repository-specific settings:
- In global settings, display a note if repositories override a recipe,
  with a shortcut to review those repository settings.
- In the agent launch dialog, show a warning if the repo overrides the
  global default and default the save target to the repo.
- In repository settings, support saving and discarding recipe overrides
  on a per-action basis.

* Memoize repo filtering and override summaries in recipe defaults

Avoid re-filtering all repositories and re-computing override summaries
on every keystroke in sibling textareas.

Also use an exhaustive switch check for override field labels, and add
a test verifying the overflow note indicator when overrides exceed the
visible limit.
2026-07-04 18:31:44 -07:00
NeilandOrca eb2b894fc0 fix(store): purge pane-scoped agent/unread state on external worktree removal (#7383)
buildWorktreePurgeState is the bulk worktree-removal reducer reached by the
authoritative-scan reconcile (CLI `git worktree remove`, another Orca window,
SSH), remove-project, and the hydration stale-purge. Unlike the single in-app
removeWorktree path — which runs shutdownWorktreeTerminals /
dropAgentStatusByWorktree / clearPaneForegroundAgentByWorktree — it never ran
terminal teardown, so it left every pane-scoped map untouched:

  agentStatusByPaneKey, agentLaunchConfigByPaneKey, acknowledgedAgentsByPaneKey,
  paneForegroundAgentByPaneKey, sleepingAgentSessionsByPaneKey,
  unreadTerminalPanes, unreadAgentCompletionPanes, lastTerminalInputAtByPaneKey
  (all keyed by `${tabId}:${leafId}`) and unreadTerminalTabs (keyed by tabId).

Result: one orphaned entry per agent pane of every externally-removed worktree,
retained for the whole renderer session (monotonic growth), plus a phantom +1
on the unread dock badge. This is a direct parallel to leaks the maintainers
already fixed in this same function (browserAnnotationsByPageId, editorCursorLine
— each carrying a 'the bulk reconcile path missed them' comment).

Fix: evict these maps by tab-id / `${tabId}:` prefix in the reducer, matching
the in-app teardown. retainedAgentsByPaneKey and runtimeAgentOrchestrationByPaneKey
are intentionally left out — both self-heal (pruneRetainedAgents on a
worktreesByRepo change; the runtime map is replaced wholesale each sync).

Leak-regression test drives purgeWorktreeTerminalState and asserts every map is
emptied for the removed worktree while a sibling worktree's state is preserved.
Reverting the fix fails both cases.

Co-authored-by: Orca <help@stably.ai>
2026-07-04 18:15:19 -07:00
NeilandOrca 62f5ad60b2 perf(emulator): stop decoding frames for hidden emulator panes (#7382)
Co-authored-by: Orca <help@stably.ai>
2026-07-04 18:01:00 -07:00
Jinjing afd9cd5e02 Improve translations for Spanish, Japanese, Korean, and Chinese (#7381)
Translate various remaining English strings in Spanish, Japanese, Korean,
and Chinese locale files to provide better localized terminology for
common UI actions, settings descriptions, and toast messages.
2026-07-04 17:11:21 -07:00
Jinjing 568722a320 Update mobile Android APK links to 0.0.22 2026-07-04 17:06:09 -07:00
Jinjing 4fa21f727a Use official OpenCode SVG icon instead of remote favicon (#7373)
* Use official OpenCode SVG icon instead of remote favicon

Replaces the remote favicon loading for OpenCode with a local SVG icon.
This avoids flaky external network requests and ensures the icon renders
properly across light and dark themes using theme-aware currentColor.

* Update OpenCodeIcon SVG geometry to use official 512 canvas

Update the OpenCode icon geometry and viewBox to use the official
512x512 canvas sourced from the opencode.ai favicon. Using a square
viewBox matches sibling glyphs.
2026-07-04 16:54:23 -07:00
Neil dbd5064235 fix: refit desktop watcher xterm when mobile-fit override arrives (#6410) (#6596) 2026-07-04 16:42:50 -07:00
Jinjing 50339fbe82 Revert "Add default browser action for terminal links (#6129)" (#7378)
This reverts commit 3614cbc40c.
2026-07-04 16:36:29 -07:00
Jinjing c641e55486 Normalize GitHub work item type from URL to prevent issue/PR mismatch (#7371)
- Resolve true work item identity (issue vs. PR) using the URL path to
  override stale or incorrect cached payload types.
- Prevent invalid PR start point resolution when launching an issue
  misclassified as a PR.
- Validate and reject mismatched URL types in the worktree metadata
  dialog fields to avoid incorrect associations.
2026-07-04 15:16:50 -07:00
Jinjing 5ba4e2454d Remove "Open" status badge from PR comment actions (#7338)
Remove the unused "Open" action state condition and its associated
`statusBadgeOpen` class from presentation definitions.
2026-07-04 14:47:36 -07:00
8b69e41391 Fix missing space in import-cookies "From <browser>" menu labels (#6468)
* Fix missing space in import-cookies "From <browser>" menu labels

The Import Cookies dropdown rendered browser entries as "FromGoogle Chrome"
and "FromSafari" — JSX collapses whitespace between the adjacent
{translate(…, 'From')}{browser.label} expressions.

Switch both settings menus to the 'From {{value0}}' interpolation pattern
already used by the other import-cookies menus, so the label is a single
translatable unit and renders with the correct space. Interpolation also lets
each locale position the browser name correctly: ja/ko use postpositions
("から"/"에서") that belong after the name, which the old concatenation placed
before it. Localized the new key in es/ja/ko/zh to match the existing catalog
style. Adds a regression test.

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

* Fix browser use import source label

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-07-04 14:46:09 -07:00
Bevis a3e34b66b8 fix(pet): stop i18n from corrupting CSS keyframes
Keep PetOverlay runtime keyframes out of localization so translated locales cannot invalidate sprite or bob animations.\n\nAlso adds regression coverage for translated-locale keyframe CSS and removes the stale generated locale entries.
2026-07-04 14:43:57 -07:00
2607ff110b feat(ghostty): import adjust-cell-height and dual-value window paddings (#7125)
* feat(ghostty): import adjust-cell-height and dual-value window paddings

Two Ghostty config forms previously landed in unsupportedKeys:

- adjust-cell-height percentages (e.g. "35%") now map to
  terminalLineHeight (1.35), the direct xterm equivalent. Pixel values
  are still rejected because they depend on the rendered cell height.
- window-padding-x/y "top,bottom" / "left,right" pairs now import as
  the rounded average, preserving the total padding along the axis.

parseStrictInt moves to numeric-config-values.ts alongside the new
pair parser to keep mapper.ts under the max-lines budget.

* fix(ghostty): tighten import edge cases

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

* fix(settings): sentence-case account runtime copy

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-04 14:19:00 -07:00
a81b82f640 feat(ghostty): resolve theme references during config import (#7126)
* feat(ghostty): resolve theme references during config import

`theme = <name>` is how most Ghostty configs pick their colors, but the
importer treated the key as unsupported and silently dropped the entire
palette. Resolve the referenced theme file and merge its colors as
defaults, mirroring Ghostty's own precedence:

- Search user themes first (XDG, then the native macOS dir), then the
  bundled themes inside the Ghostty install, and parse the file with the
  existing parseGhosttyConfig (theme files are plain config subsets).
- Explicit config keys win over theme values; config palette entries are
  appended after the theme's so per-index overrides apply naturally.
- Only color-bearing keys may flow from a theme into the import, a theme
  file cannot smuggle font/window settings past the user's config.
- Theme names containing path separators are rejected (no traversal),
  files over 256 KB are ignored, and light:/dark: pairs plus unresolvable
  names surface as annotated unsupportedKeys instead of vanishing.

* fix(ghostty): align theme resolution with Ghostty lookup

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

* test: stabilize ghostty import CI coverage

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

---------

Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-04 14:15:35 -07:00
d7d7067ae1 chore(i18n): refine Spanish locale copy (#7359)
* chore(i18n): refine Spanish locale copy

Why:
Improve the Spanish UI copy so developer-facing terms stay natural and technically accurate.

Changes:
- Keep core dev terms such as PR, worktree, branch, and runtime consistent.
- Preserve locale key parity and placeholder compatibility with English.

* chore(i18n): localize new Spanish strings

* chore(i18n): use rama for branch in Spanish

* chore(i18n): clarify Spanish repository copy

* fix(i18n): correct Spanish locale defects found in review

Post-review polish on the Spanish copy pass:
- Restore dropped/altered meaning: 'repo color' (was 'en el repositorio'),
  'uploaded' (was 'sincronizado'), 'is behind {ref}' (was '{ref} atrás',
  which rendered the ref name as a quantity).
- Translate leftover English over prior correct strings: 'Review from'->
  'Revisión de', 'Agents'->'Agentes', 'workspace'->'espacio de trabajo',
  'clone'->'clon', 'Skill de Agent'->'Skill de agente'.
- Grammar/register: 'para commit'->'para hacer commit' (x3), 'desde issue'->
  'desde el issue' (x4), 'Cuando tanto...y'->'Cuando ambos...', unify tú in
  the sidebar-tint description, 'obligatorio'->'obligatorias' (agrees with
  approvals), 'desbloquear'->'descongelar' for 'unfreeze', de-Spanglish the
  local-folder-drop message.

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

---------

Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-04 11:37:26 -07:00
c6bfd86d4e fix(terminal): pass Ctrl+Arrow to PSReadLine on local Windows ConPTY (#6763)
* fix(terminal): pass Ctrl+Arrow to PSReadLine on local Windows ConPTY

On local Windows shells (PowerShell/cmd via PSReadLine) Ctrl+Left/Right
printed a stray "b"/"f" instead of moving by word. The terminal shortcut
policy translated Ctrl+Arrow to \eb/\ef (readline's Alt+b/Alt+f word-nav
bytes), but PSReadLine binds Escape to RevertLine and has no Alt+b/Alt+f
binding, so it consumed the ESC and self-inserted the bare letter.
PSReadLine already binds Ctrl+Left/Right to word-nav natively, so the
translation was breaking a working default.

Gate the translation so genuine local native Windows ConPTY panes fall
through to xterm's native \e[1;5D/\e[1;5C, while Linux and remote/WSL/SSH
readline shells keep the \eb/\ef translation. Reuses isLocalNativeWindowsConpty
(the same execution-host heuristic as the Kitty-keyboard fix) so SSH/WSL
panes on a Windows client are correctly excluded. Adds policy coverage for
the ConPTY-passthrough and SSH/WSL-still-translates paths.

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

* fix(terminal): use live session for Windows Ctrl+Arrow

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-07-04 07:46:50 -07:00
Neil 7c10abc582 fix(ssh): make reconnection prompts non-blocking unless the project is focused (#7344)
The SSH reconnect dialog was auto-opened at render time for any active/restored
worktree whose SSH target was disconnected, blocking the entire UI even when the
user was working elsewhere. On app restart the previously-active worktree is
restored without a click, so the modal stole focus app-wide over unrelated work.

The disconnected state is now surfaced only through the non-blocking affordances
that already existed — the worktree card chip, the status-bar Connect action, and
the pane-scoped terminal reconnect overlay. The blocking dialog opens only on
deliberate focus (clicking the worktree card), and even then it is suppressed when
the active view is a terminal, since that pane already shows the in-context
reconnect overlay and a second prompt would just duplicate it.

Fixes #7314
2026-07-04 02:35:00 -07:00
Loongandlinyunlong dd1133c873 chore: optimize and refine Chinese (zh-CN) translation (#7178)
Refines 291 Simplified Chinese (zh-CN) strings for terminology consistency and clarity. Rebased onto main with full en/es/ja/ko key + interpolation parity; fixed placeholder parity on 4 keys and 9 reviewed translation-quality issues.

Co-authored-by: linyunlong <yunlonglin1995@gmail.com>
2026-07-04 01:52:41 -07:00
9964d1ccbf perf: overlap sidebar-scope loads with worktree scan at startup (#7225) (#7306)
* perf: overlap sidebar-scope loads with worktree scan at startup (#7225)

Continues the renderer-chain parallelization proposed in #7225 (proposal 2),
on top of the merged #7266:

- Run project-groups → folder-workspaces concurrently with the per-repo
  `git worktree list` fan-out. Neither reads the repos store nor worktrees,
  so a slow remote host's 15s scope RPCs no longer queue ahead of the scan.
- Raise worktree refresh concurrency 5 → 8 so multi-core machines run fewer
  sequential scan batches, still bounded so one moment can't launch every
  git probe at once.

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

* Test overlapping sidebar scope loads and worktree hydration at startup

Verify that sidebar scope loads and worktree hydration operations run
concurrently before session hydration. This protects against regressions
in startup performance under the perf/startup-lag optimization.

Additionally, document the rationale for the worktree refresh
concurrency limit in the worktrees slice.

* Clarify worktree refresh concurrency comment

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-07-04 01:34:40 -07:00
f215a48064 fix: pr-bug-scan validated finding from #6952 (#7180)
* fix: address pr-bug-scan validated finding from #6952

throwNodeNotFound() now re-raises AbortError when the shared signal is aborted, so a signal-cancelled node probe no longer launders into 'Node.js not found'; sequential fallback runs.

* fix(ssh): make session-limited (MaxSessions=1) relay deploys actually succeed

Review of #7180 verified the parent fallback end-to-end against a real
MaxSessions=1 sshd and found the connect still failed. Four gaps, in order
of discovery:

- isSshSessionLimitError missed stock OpenSSH, which refuses session
  channels over MaxSessions with SSH2_OPEN_CONNECT_FAILED (2) and 'open
  failed' — reason 4 never matched, so the fallback never triggered.
- execCommand settled aborted commands before the channel finished
  closing, so the sequential fallback reissued execs while sshd still
  counted the old session.
- SshConnection.waitForSshCallback rejected aborts mid-channel-open
  immediately, leaking a confirmed-late channel that held the only
  session slot; it now settles after the late channel closes (bounded)
  and drains its streams so ssh2 emits 'close'.
- Session channel opens now retry transient session-limit refusals
  (sshd frees the slot only after processing our close-ack, which the
  next open can beat by microseconds), and the remote orca CLI shim
  install is non-fatal like the managed-hook install — after the relay
  bridge occupies the sole session slot, raw-connection extras must
  degrade instead of failing the connection.

Verified live against Docker sshd (OpenSSH 9.2, MaxSessions=1): fresh
deploy (upload + native deps + launch), reconnect cycles, and a PTY
round-trip all succeed; unrestricted-sshd regression run also passes.

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

* Handle ssh execution aborts immediately during retry backoff or hangs

- Cancel the session-limit retry delay immediately if the operation is
  aborted during backoff.
- Limit the wait time to a 5-second grace period when aborted during a
  channel open that is hung and never invokes its callback, rather than
  waiting for the full connection timeout.

---------

Co-authored-by: orca-bug-scan-bot <orca-bug-scan-bot@stably.ai>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
Co-authored-by: Orca <help@stably.ai>
2026-07-04 01:26:55 -07:00
Jinjing 0982882436 Exclude submodule worktree-only changes from Stage All action (#7298)
- Prevent the "Stage All" button from being enabled when only nested
  submodule worktree changes are present.
- Remove the disabled stage button on submodule worktree-only rows,
  replacing it with an explanatory tooltip.
- Fix WSL terminal environment assertion in daemon PTY tests to allow
  inherited agent-hook environment variables.
2026-07-04 00:21:55 -07:00
Jinjing 7c77ccab7d Fix notes send targets for manual agents (#7300)
* Fix notes send targets for manual agents

* Split agent title merging into manual and launch-agent paths

Separate the merging logic for terminal titles depending on whether the
tab has a launch agent or is a manually started CLI.

- Launch-agent tabs carry an owner bit, allowing their live titles to
  promote a stale status row on the same pane.
- Manually started agents have no owner bit, so they only ever add a
  row and must not override existing status evidence.
- Remove the temporary TitleHintAgentTarget type and the need to strip
  metadata when pushing targets.
2026-07-04 00:10:53 -07:00
Jinwoo Hong a074ed6182 Fix Windows ConPTY overlay after cold restore (#7310) 2026-07-03 23:24:24 -07:00
slashdevcorpseandJinwoo Hong 9fa1313179 Fix Windows native chat title fallback (#7313)
* fix: resolve title-only native chat agents

* test: cover native chat unsupported identity fallback

* fix: harden native chat agent fallback precedence

---------

Co-authored-by: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com>
2026-07-03 23:02:12 -07:00
Neil 3fdeec7c2f cleanup(renderer): drop dead code, dedupe helpers, skip wasted work, fix garbled comments (#7322)
Quality pass on renderer/shared PRs merged 2026-07-03:

- WorktreeTitleInlineRename: skip the truncation measure + ResizeObserver in `wrapTitle`
  mode, where wrapped titles never truncate — it could only churn unused state (#7307).
- editor slice: reuse the `removeEditorStateForReplacedPreview` helper this PR added
  instead of a hand-rolled copy of the same six-field eviction (drops ~50 lines) (#6476).
- useFileExplorerTree: extract `readWorktreeDirectory` so the connectionId/settings
  assembly for `readRuntimeDirectory` lives in one place, not three (#6321).
- comment-markdown-github-attachment-media: extract a shared `AttachmentFallbackLink`
  for the image/video error-fallback link (#6759).
- repository-icon-github: fold the two near-identical live resolvers into one
  parameterized `resolveRepositoryIdentityLive`; trim a 3-line comment to 2 (#6507).
- resource-usage-open-slices: delete the `shouldReadPopoverSlices` identity wrapper and
  inline `open` at the four call sites (#7275).
- BrowserPane: drop the pointerEvents assignment already applied inside
  `ensureBrowserPageWebview` for the reused-webview path (#6958).
- github slice: fix two garbled "…a commit main confirmed…" comments (#7277).
- runtime-file-client: trim the binary-file fallback comment to its whys (#6606).
- composer-branch-selection: drop the inline comment that restated the JSDoc (#6748).
- TabBarQuickCommandsButton: correct the stale "+ Command" comment (button shows no +).

No behavior change (the editor-helper reuse is behavior-equivalent, only more
conservative on an edge case); typecheck, oxlint, react-doctor, oxfmt, and touched
unit suites all pass.
2026-07-03 22:31:56 -07:00
Neil 529c06ff62 cleanup(terminal): dedupe pane teardown, reuse platform check, harden shadow-cursor tracking (#7320)
Quality pass on terminal PRs merged 2026-07-03:

- pane-split-close: extract a shared `teardownManagedPane` so `closeManagedPane` and
  `detachManagedPaneForExternalMove` can't drift apart on future edits (#7215).
- terminal-link-activation: reuse the existing `isMacPlatform()` instead of a second
  inline `navigator.userAgent` copy, keeping one source of truth for Mac detection.
- pty-connection: gate the shadow-cursor moves on empty CSI params so parameterized/
  modified cursor keys (e.g. Ctrl+Left word-jump, `ESC[1;5D`) reset command tracking
  instead of silently desyncing the buffer used to infer a typed agent name; relocate
  the `getAuthoritativePaneAgent` JSDoc to the function it documents (#6954).

No behavior change except the cursor-tracking hardening; all touched unit suites pass.
2026-07-03 22:31:54 -07:00
Jinwoo HongandOrca 52e2eb01b1 Tab strip: judge click-vs-drag at pointerup and flush gesture state on window focus (#7316)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 22:22:35 -07:00
Neil 22d5989ed9 Fix manual sorting for project headers and groups
Fixes #6609.
2026-07-03 21:38:34 -07:00
Neil c29ee51a0a Make sidebar worktree hover title editable (#7307) 2026-07-03 20:21:09 -07:00
NeilandOrca e4ac582e16 Revert "Update quick command button to use plus icon and clearer label (#6517)" (#7304)
This reverts commit a94d692cd5, restoring the
shorter "Command" label and the Play icon on the quick command entry
(PRs #5528 and #5674).

Co-authored-by: Orca <help@stably.ai>
2026-07-03 20:20:23 -07:00
Brennan BensonandOrca bdd8bb0a3b fix(agent-status): keep harness-injected turns out of sidebar prompt labels (#7274)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 19:49:17 -07:00
Neil 29c7fa7a03 Include Claude Fable reset countdown
Fixes the PTY fallback path so Claude Fable usage carries a concrete reset timestamp and the existing status tooltip renders the Fable reset countdown.
2026-07-03 19:36:10 -07:00
Brennan BensonandOrca b099e27703 fix(checks): keep a merged PR visible when the worktree sits behind its own PR head (#7277)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 19:30:10 -07:00
d5c4372b3a fix(file-explorer): batch dirCache writes on tree refresh to remove O(N²) freeze (#6321)
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
2026-07-03 19:06:13 -07:00
Brennan BensonandOrca acfec3fd85 Record hibernation activity from real user input and protect typed drafts (#7283)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 19:04:12 -07:00
andrewroxby f8591d6991 Remember Markdown TOC state while tabs are open (#6476)
* Keep markdown TOC open per document

* Clean up Markdown visibility state for replaced previews
2026-07-03 18:23:28 -07:00