Commit Graph
15710 Commits
Author SHA1 Message Date
Neil 2078db93ec ci: check dependency vulnerabilities on PRs and stable releases (#31858)
* ci: audit dependency security without gating releases

* ci: audit stable release tags instead of running daily

* ci: isolate release audit data and fix integration checks

* ci: require exact audit inputs and ignore candidate archive attributes
2026-10-22 00:43:07 -07:00
Neil 213bc4684d ci: distinguish indirect unit inputs from comments and data (#31876) 2026-10-22 00:42:21 -07:00
Neil 66e50e22cc fix(images): avoid backtracking in data URI parameter parsing (#31882) 2026-10-22 00:24:41 -07:00
Neil 0964562786 refactor(orcad): drop the toolchain probe's unread toolchainMissing verdict (#31875) 2026-10-22 00:23:32 -07:00
Neil 7e967c8968 refactor(ssh): split host key verification, the ssh2 handshake, the system ssh probe and the credential fallback out of SshConnection (#31878) 2026-10-22 00:23:12 -07:00
Neil 005060ac7a refactor(relay): group assignment cleanup and diagnostics (#31871) 2026-10-22 00:21:02 -07:00
Neil 3d1b8e396e fix(ci): restrict manual candidate test workflows to read-only caches (#31887) 2026-10-22 00:19:38 -07:00
Neil 7ff3a071c6 fix(docs): avoid backtracking in excerpt link destinations (#31884) 2026-10-22 00:19:14 -07:00
Neil 9e1ffb2333 fix(plugins): validate example panel reply dispatch (#31877)
* fix(plugins): validate example panel reply dispatch

* style(plugins): brace panel reply admission guard
2026-10-22 00:19:10 -07:00
Neil 95f8f73b9a ci: include retry attempts in runner demand reports (#31865) 2026-10-22 00:05:32 -07:00
Neil 73841a0720 fix(worktrees): pick a repo's catalog watcher transport from its resolved SSH target (#31872) 2026-10-22 00:02:14 -07:00
Neil 57f1fce9bb refactor(runtime): type worktree query stores with checked guards instead of casts (#31864) 2026-10-21 23:53:30 -07:00
Neil 70e997f4e5 refactor(runtime): resolve a watched repo's host through the canonical routing API (#31866)
* refactor(runtime): resolve a watched repo's host through the canonical routing API

* test(runtime): drop an unused mock reset
2026-10-21 23:44:49 -07:00
Jinwoo Hong 01db1b89af Main titles agent tabs and applies phone tab moves itself, and tab moves name the tab they follow (dark, layout-owner build only) (#31812)
* Layout groundwork (switched off): main derives agent tab titles from its own hook status

With the layout-owner switch on, main gives agent tabs their generated titles from
the hook-server status it owns, on the desktop, headless serve and orcad: one
renameTabs per status batch, so one write and one frame. It keeps the window's
rules (setting, custom and quick-command titles, first title wins, dispatch labels).
The window stops sending generated titles for tabs main holds; a paired server's
tab, or one main has no tab-bar entry for, is still titled by the window as today.

The title rules move to src/shared (agent-row-primary-text, and the new
agent-generated-tab-title-rules) so both sides share them; switch-off behaviour
is unchanged.

* feat(layout): main applies a phone's or paired client's tab move itself, and a tab move names the tab it follows so a stale index can't misplace it (layout-owner build, L193)

* fix(layout): a move in a group showing a tab main lacks goes the window's way, a twin's agent tab keeps its window title, and orcad subscribes titles through the store attach (layout-owner build)

* chore(layout): main's tab move reaches the old-client translation through its compat entry

* chore(layout): mark the window-only-row move fallback as bridge code (ledger L280)

* test(layout): attaching the hook store follows its rows for main's tab titles once

* chore(layout): the old-client move translation is a compat entry of its own, with no cyclic re-export

* test(config): the boundary message test names the old-client folder's configured entries
2026-10-22 02:24:37 -04:00
Neil 1769476014 fix(wsl-host): pair again from the distro when a WSL host refuses the enrolled token (#31745)
* fix(wsl-host): pair again from the distro when a WSL host refuses the enrolled token

A WSL host that lost its device registry, or revoked this desktop, refused the
enrolled token forever, and an update over it read as deferred. The connect now
re-pairs through the managed repair gate SSH uses (one repair at a time, a
capped number per window, only an offer under the pinned host key), reading the
host's published offer from the distro. The incumbent's terminal count uses the
same enrolled-or-live pairing the connect does.

* fix(wsl-host): retire a bridge whose pairing was refused, and let a user's Connect retry a repair

A refused or repaired-then-refused pairing on a reused bridge left its stale
token cached, and the failure status then saved it over the repair. That bridge
now closes first. A user-initiated Connect clears a standing repair failure or a
spent cap, as an explicit SSH connect does.

* fix(wsl-host): retire a refused bridge without cancelling a queued Update or Force

* fix(wsl-host): repair only a stored pairing, dispose the repair's transport directly, and log refusals neutrally

A host still being added has no stored record for the gate to re-pair, so its
live bridge is reused as before. The WSL repair deps are typed with the WSL
transport, and the shared refusal log no longer says SSH for WSL.
2026-10-21 23:15:59 -07:00
Neil 8e1ee111e4 ci: avoid global fan-out for routing test changes (#31856)
* ci: avoid global fan-out for routing test changes

* test(ci): isolate routing-test classification cases
2026-10-21 23:15:55 -07:00
Neil 42da9f430f refactor(mobile): group platform-seam analysis tools (#31845) 2026-10-21 23:15:21 -07:00
NeilandClaude 57ecdc2ca2 fix(ssh): say what plain SSH is for beside its button, and polish the plain SSH window (#31732)
* fix(ssh): point unclearable move conflicts at plain SSH, and polish the plain SSH window

Conflicts retrying can't clear now say how to keep working on the host. The
plain SSH terminal paints its theme background past the grid, and a failed
open shows only its error, not an empty terminal.

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

* fix(ssh): say what plain SSH is for beside its button, not in main's refusal text

Main's refusal text also reaches clients without a plain SSH terminal, so the
next step is shown next to the button wherever it renders. Also: a translucent
theme isn't painted twice, and a failed open shrinks to its error.

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

* fix(ssh): treat only opacity below 1 as a translucent plain SSH background

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-21 23:06:39 -07:00
NeilandWooseong Kim 051221c3bf fix(mobile): preserve prompt taps after terminal scrolling (#31471)
Preserve deliberate terminal taps after scrolling and keep them ordered with Live input. Retain fresh keyless edits, cap coalesced sends at the existing UTF-8 request limit, and settle cancelled flush barriers without waiting for retired acknowledgements.

Adapted from @innocarpe's community PR #30514, with additional ordering, lifecycle and bounded-send regressions.

Fixes #30510

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-21 23:01:13 -07:00
Neil 9b060ebec0 fix(i18n): preserve runtime entries after removing untracked settings (#31852) 2026-10-21 23:01:10 -07:00
Neil ad4952e1da ci: retire completed relocation and pnpm cache experiments (#31843) 2026-10-21 22:37:06 -07:00
Neil 8b5c732e6e ci: skip relay integration for renderer-only PRs (#31842) 2026-10-21 22:31:54 -07:00
Neil 6698df3277 Polish explorer search layout and collapsible filters (#31825)
* Polish explorer search layout and filter disclosure

* Use compact search details disclosure and lowercase filter labels

* fix: preserve query focus when switching explorer modes

* fix: announce active explorer search filter counts
2026-10-21 22:26:05 -07:00
Jinjing 8b6f31c68b Stabilize pending admission refusal option retry test (#31840) 2026-10-21 22:24:05 -07:00
Jinjing 8aa7f9c047 Combine untracked files into Changes (#31831)
* Combine untracked files into the Changes section

* Localize discard warnings
2026-10-21 22:23:59 -07:00
Neil 6c6ad7520f ci: vet adhoc source before build preparation (#31839) 2026-10-21 22:22:45 -07:00
Neil 019ff406f0 ci: deny cache writes from benchmark candidate code (#31838) 2026-10-21 22:20:30 -07:00
Neil b342d29cc1 test: drop obsolete streamparser dependency (#31835) 2026-10-21 22:19:46 -07:00
Neil f9c9cedad3 ci: declare read-only workflow token permissions (#31836) 2026-10-21 22:17:05 -07:00
Jinjing aa5594d536 fix(native-chat): handle inline image preview edge cases (#31742)
* fix(native-chat): handle inline image preview edge cases

* Improve native chat image preview resilience
2026-10-21 22:15:33 -07:00
Neil 70ab09ca2f refactor(settings): group repository identity modules (#31830) 2026-10-21 21:54:24 -07:00
eba0124de9 [mem] Backpressure worker subprocess output without dropping bytes (#30698)
* fix(memory): backpressure worker subprocess output without dropping bytes

* style(wsl): clear formatting gates without increasing line limits

* test: cover Codex deadlines and shutdown under worker backpressure

* test: synchronize backpressured Codex deadline fixture

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
Co-authored-by: Neil <neil@stably.ai>
2026-10-21 21:52:41 -07:00
Neil 35596d16a5 chore: replace electron-toolkit utilities with Electron APIs (#31824)
* chore: replace electron-toolkit utilities with Electron APIs

* refactor: reuse development flag within startup preflight
2026-10-21 21:52:08 -07:00
Jinjing b0778082cb fix(i18n): recover language selection after rejected catalog loads (#31822)
* fix(i18n): allow retrying rejected language catalog loads

* fix(test): return null for unhandled locale asset imports
2026-10-21 21:46:29 -07:00
Jinjing dfa8788533 fix(i18n): restore localized editor safety copy (#31259)
* fix(i18n): restore localized editor safety copy

* Refine French and Chinese file change translations
2026-10-21 21:46:10 -07:00
Neil 0a7d6bb2d5 refactor(main): group ephemeral VM lifecycle modules (#31771) 2026-10-21 21:31:21 -07:00
Jinjing 60f5cd7118 fix(mobile): announce locked picker notice on iOS (#31674)
* fix(mobile): announce locked picker notice on iOS

* Prevent stale queued iOS picker announcements

* update test
2026-10-21 21:21:59 -07:00
Neil 3cca64bef6 fix(mobile): keep a closed branch preview from reopening when loading finishes (#31707)
* fix(mobile): retire dismissed branch diff requests

A pending branch diff reopens a dismissed drawer and blocks replacement previews. Retire requests on dismissal and host/workspace changes, and keep spinner ownership with the current request.

* fix(mobile): retain branch preview through suspended transitions

* test(mobile): retain confirmed branch previews across connection cutover
2026-10-21 21:20:56 -07:00
Neil d8e997c529 fix(mobile): keep newer quick-command edits when an earlier save finishes (#31704)
* fix(mobile): retain quick command editor ownership during saves

A deferred Save discards newer edits or closes a replacement editor, including after host/repository changes. Bind each save to its editor and scope; preserve newer text and the persisted command id.

* fix(mobile): preserve quick command saves through suspended renders

* test(mobile): preserve quick-command edits during connection migration
2026-10-21 21:20:51 -07:00
Neil aec02a76ee fix(mobile): refresh nested file caches and keep deep names reachable (#31697)
Reconnect refreshes only the root and retains deleted nested entries; interrupted children can remain loading. Invalidate child reads and refresh expanded folders. Bound deep indentation to keep filenames reachable.
2026-10-21 21:20:45 -07:00
Neil f49cddc3be fix(mobile): retain setup choices across repository refreshes (#31694)
Fresh repository objects reset explicit setup choices, while host changes can retain stale scripts and trust. Use logical repository and runtime ownership.
2026-10-21 21:20:09 -07:00
Neil f719ec0845 fix(mobile): persist browser destination in user selection order (#31689)
Delayed hydration and out-of-order storage writes can reverse a browser destination selection. Order durable writes and preserve the confirmed value when saving fails.
2026-10-21 21:20:06 -07:00
Neil fc9f826cd9 chore: remove redundant Tiptap extension wrappers (#31748) 2026-10-21 21:16:13 -07:00
Jinwoo Hong d44ee0ece4 fix(session-tabs): a phone keeps a desktop's untitled markdown tab read-only in a workspace main owns (dark) (#31667)
With the layout-owner switch on, session.tabs takes main's markdown edit row and copies the
window's view facts onto it, but not the untitled flag, which the saved session never records.
The phone then offered to save an untitled document as an ordinary file. Carry the flag too.

The route tests now use a realistic store: it lists its host partitions and saves each open
editor's unified tab and group, as the window does.
2026-10-22 00:16:04 -04:00
Jinjing 301059fb77 fix(onboarding): preserve system language in both experiment cohorts (#31810) 2026-10-21 21:02:25 -07:00
Neil 307f0cdaee Move Relay deployment configuration into private cloud operations (#31792)
* refactor(cloud): move deployment configuration into private operations repo

* docs(cloud): clarify private operator ownership

* fix(ci): install pnpm through npm-compatible bootstrap

* fix(ci): avoid native downloader metadata timeout

* test(push): move deployment preflight contract into private repo

* fix(ci): bootstrap Node before installing pnpm in minimal containers

* fix(ci): pass Windows boundary test paths through the Node runner

* fix(ci): run Windows boundary Vitest with installed Node
2026-10-21 21:01:25 -07:00
Jinwoo Hong 4c949cd111 fix(session-tabs): a confirmed close of a pinned tab in a server workspace closes it instead of snapping back (#31791)
* fix(session-tabs): a confirmed close of a pinned server tab closes it instead of snapping back

A paired desktop sent its confirmed close of a pinned terminal tab in a
server workspace over session.tabs.close, which had no force, so the
server refused it (terminal_tab_pinned) and the tab came back.

- session.tabs.close takes an optional `force: true`, honoured only with
  an explicit `reason: 'user'` and passed to the server's existing forced
  close (the same path worktree stop uses), in both builds.
- The server advertises `session-tabs.close-force.v1` in both builds. The
  desktop sends force only after the pinned-tab confirmation and only to
  a server advertising it; an older server keeps today's refusal.
- A forced close the server never received keeps its force in the held
  replay record, so the replay is still the confirmed close.
- Moves the undelivered-close hold helpers into
  web-session-undelivered-close.ts unchanged, to keep the lifecycle
  module under the line limit.

* fix(session-tabs): a pinned server tab closes when the pin confirmation is turned off

A local pinned tab closes at once when confirmClosePinnedTab is off, so the
close itself is the user's consent. A server workspace's pinned tab now
sends that consent as force too (still only to a server advertising
session-tabs.close-force.v1). Lifecycle closes (pty-exit), rejectPinned
callers and bulk closes are unchanged.

* test(session-tabs): load the forced-close server test once; cover held and probe-failed forced closes

- session-tab-close-force.test.ts imports the runtime once and flips the
  layout-owner switch per case through the mock's getter, instead of
  resetting modules and re-importing the runtime for every case; drops
  the 120 s timeouts.
- A forced close held while the session is inactive, and one whose
  capability probe failed, keep their force for the replay.
- A pinned lifecycle (pty-exit) close never forces, even with the pin
  confirmation turned off.
2026-10-22 00:00:51 -04:00
Jinwoo Hong 0947c493b7 fix(wsl): forward ORCA_WORKSPACE_ID into WSL shells like the other pane identity (#31668)
wsl.exe imports only the variables WSLENV names. ORCA_WORKTREE_ID crossed but ORCA_WORKSPACE_ID
did not, so a WSL shell never saw it, whether the window or main started the terminal.
2026-10-21 23:49:51 -04:00
Neil 8ba1c9ba09 fix(ci): restore cloud and main checks during pnpm registry outages (#31793)
* fix(ci): recover verified pnpm setup from registry metadata outages

* fix(ci): prepare native pnpm shims after fallback verification

* fix(ci): provide Node for pnpm fallback in bare containers
2026-10-21 20:25:36 -07:00
Neil 5c5f9a2362 Update cloud relay runtimes, providers and security checks (#31753)
* chore(cloud): update relay runtimes and security scanning

* docs(cloud): record Go binary advisory reachability

* chore(cloud): rerun security checks after resolving main conflict
2026-10-21 19:43:26 -07:00