Commit Graph
6314 Commits
Author SHA1 Message Date
Jinwoo-H 8709d97337 Merge remote-tracking branch 'origin/main' into orca-performance 2026-07-04 02:47:20 -04:00
Jinwoo Hong a074ed6182 Fix Windows ConPTY overlay after cold restore (#7310) 2026-07-03 23:24:24 -07:00
github-actions[bot] 7595baccef release: v1.4.122-rc.2 v1.4.122-rc.2 2026-07-04 06:21:22 +00: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
github-actions[bot] 19bb7df93a release: v1.4.122-rc.1 v1.4.122-rc.1 2026-07-04 05:49:42 +00:00
Neil bec4392d87 cleanup(main): defer serve-sim materialization, dedupe reload flags, guard gate validators (#7321)
Quality pass on main-process/build PRs merged 2026-07-03:

- ios-emulator-backend: resolve the serve-sim executable via a lazily-cached getter
  instead of eagerly in the constructor. The bridge is built before the main window
  is shown, so the one-time recursive copy + xattr subprocess (first launch after each
  version bump) no longer blocks macOS startup for a feature that may go unused (#7174).
- index: collapse the two near-identical `{webContentsId, until}` reload flags
  (expectedRendererReload / recoveryReloadInFlight) into one `createWebContentsTimedFlag`
  primitive; behavior preserved, including consume-on-read for the recovery reload (#7290).
- check-reliability-gates: coerce gate.commands/testFiles/platforms/providers with an
  `asArray` helper before `.includes`, so a hand-edited manifest with a missing/mistyped
  field reports a validation failure instead of throwing an uncaught TypeError; extract
  `hasCompleteRedGreenEvidence` for the duplicated status check (#7295).
- claude-pty: derive FABLE_WEEKLY_LABEL_RE from WEEKLY_RE.source so a future weekly-
  wording change stays in one place and can't reopen the parsing gap it just closed.
- macos-tcc-login-shell: trim the 30-line flag-by-flag JSDoc to the two non-obvious whys
  (TCC identity, env(1) SHELL re-assertion) per the repo comment guidance (#7003).

Typecheck, oxlint, oxfmt, `check:reliability-gates`, and touched unit suites all pass.
2026-07-03 22:32:11 -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-HandOrca dd013205e0 Fix branch CI lint: split pane-interaction functions out of artificial-opencode-terminal-load.spec (815>800 lines), modernize perf-html-report script
No max-lines disable per repo rules; extracted to
artificial-opencode-pane-interactions.ts. toReversed() and
import.meta.filename replace reverse()/fileURLToPath.

Co-authored-by: Orca <help@stably.ai>
2026-07-04 01:30:44 -04:00
Jinwoo-HandOrca 5475d869e9 Merge origin/main (#7316 tab-strip click-vs-drag fix); adapt #7290 recovery-reload tests to this branch's dual did-finish-load listeners
The three tests grabbed the FIRST did-finish-load listener; on this branch
the renderer delivery-gate reset registers before the orphan sweep, so the
sweep tests exercised the wrong handler (one failing, two vacuously green).
They now fire all listeners like a real reload.

Co-authored-by: Orca <help@stably.ai>
2026-07-04 01:27:51 -04:00
Jinwoo-H 98c6a16e16 Merge remote-tracking branch 'origin/main' into orca-performance 2026-07-04 01:23:31 -04: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
Jinwoo-HandOrca 01e8ec5fcf Branch guide: document merge-not-rebase sync strategy and conflict pattern
Co-authored-by: Orca <help@stably.ai>
2026-07-04 00:54:30 -04:00
Jinwoo-HandOrca 3e120b9246 Merge origin/main (32 commits): pane foreground-agent tracker composed with chain's shared OSC 133 scanner
Main inlined an OSC 133 parser with new 133;C onCommandStarted support;
our branch parses via the shared scanner so main-side side-effect facts
stay byte-identical. Resolution keeps the shared-scanner architecture and
adds 133;C to it; the foreground-agent tracker hooks into the branch's
single handleCommandFinished policy (bytes and sideEffect facts alike).

Co-authored-by: Orca <help@stably.ai>
2026-07-04 00:53:51 -04:00
Jinwoo-HandOrca b35b96cc35 Untrack branch-added bench result JSONs (20 files); keep numbers in the findings log
Files stay on disk; main's 7 pre-existing results are untouched.

Co-authored-by: Orca <help@stably.ai>
2026-07-04 00:50:07 -04:00
Neil 22d5989ed9 Fix manual sorting for project headers and groups
Fixes #6609.
2026-07-03 21:38:34 -07:00
Jinjing b2fcbdbc73 fix: bound release notes by published releases (#7311) 2026-07-03 20:53:16 -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 20201f3ae8 Fix #5787: recovery reload no longer sweeps local PTYs; guard close for hung-but-alive renderer (#7290)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 20:09:19 -07:00
Jinwoo-HandOrca fe2c9b42c3 Synthesize salvaged query replies directly instead of replaying into xterm
The 10MB dev bench proved the write-back salvage insufficient: a
pending-cap drop always triggers a snapshot restore, whose replay guard
swallows xterm auto-replies and whose discardTerminalOutput races away
still-queued query writes — the salvaged DSR died both ways and the
fence still timed out.

Salvage now answers directly on the input path (immune to both): CPR
(CSI 6n) from the live buffer via transport.sendInput, DA1 with the
renderer's canned response, OSC color probes via the existing direct
responder. Rare queries (DECRQM, DA2) keep the best-effort xterm
replay.

Co-authored-by: Orca <help@stably.ai>
2026-07-03 23:06:31 -04:00
5b5ce6cef8 Harden reliability gate policy and register merged terminal regression tests as gates (#7295)
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: brennanb2025 <delta-eng@stably.ai>
2026-07-03 19:58:07 -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
Jinwoo-HandOrca 8e2faedcec ACK terminal output at parse-drain, not dispatcher enqueue (C)
The renderer credited main's per-PTY in-flight window the moment a
pty:data chunk entered the dispatcher, so the 512KB window meant "bytes
received", never "bytes parsed". Under flood the renderer write queue
grew unbounded behind instant ACKs; main saw no backpressure, crossed
the pending cap, and bulk-dropped output (rc.7.perf DSR timeouts).

Crediting is now parse-deferred: each delivery carries a fire-once
credit (deliverPtyDataWithDeferredAck); the pane's first scheduler write
claims it (writeTerminalOutput.ackCredit) and the output scheduler fires
it when the bytes are consumed — after terminal.write in the
parse-clocked drain, or on ANY discard path (backlog cap replacement,
discardTerminalOutput, disposed-terminal drops, flush recovery).
Deliveries that never reach the scheduler (reconcile drops, restore
queueing, pre-mount eager buffer) settle at handler return, so the
invariant holds: every delivered chunk credits exactly once, parsed or
discarded. E2E ack-gate hold/release and delivery-resync semantics are
unchanged (all crediting still routes through ackPtyData).

Main-side equilibrium: with ACKs at parse cadence, in-flight becomes
true backpressure — pendingData stays near the 256KB producer-pause
watermark, far under the >=2MB drop cap, so bulk floods block the shell
(node-pty pause) instead of dropping.

Co-authored-by: Orca <help@stably.ai>
2026-07-03 22:46:55 -04:00
Jinwoo-HandOrca 09b68cbb12 Cut the hidden-restore flood feedback loop (A) + query carve-out on drops (B)
(A) Under a foreground flood, the hidden-output-restore loop re-fetched
snapshots endlessly: each synchronous applyMainBufferSnapshot starved ACK
processing, main pinned at the in-flight cap, dropped at the pending cap,
and every droppedOutput/modelRestoreNeeded marker re-armed another
restore until the flood ended (rc.7.perf DSR timeouts).
- Restore loop: a foreground live-chunk queue overflow now abandons the
  restore immediately (the stream is outrunning snapshot fetch+replay),
  with a 3-iteration hard cap + lifecycle warn as backstop.
- Re-arm gate: drop markers/sentinels and reconcile seq-gaps on a visible
  pane during its own in-flight/just-abandoned restore no longer re-arm;
  live bytes write through and ONE deferred repaint (2s after the last
  backpressure signal) heals the gap. Hidden-pane gate semantics are
  unchanged.
- Query salvage: discarding queued restore bytes (overflow/refetch) now
  extracts DSR/CPR/DA/OSC-color queries and replays them to xterm so
  replies still flow.

(B) Main-side: dropOversizedPendingPtyData carves reply-eliciting query
sequences out of the dropped buffer (and out of post-drop latched data,
bounded) and ships them on the droppedOutput sentinel, so DSR probes
survive bulk drops. Query scanning moved to
src/shared/terminal-reply-query-extraction.ts, shared verbatim with the
renderer's hidden-startup query extraction.

Co-authored-by: Orca <help@stably.ai>
2026-07-03 22:45:02 -04:00
Jinjing 0d2d44b989 Use ASCII-safe speech model cache paths on Windows (#7291)
sherpa-onnx cannot load model files or hotword lists from Windows
paths containing non-ASCII characters.

- Resolve speech model and hotwords paths to ASCII-safe alternatives
  like ProgramData when the default userData path contains non-ASCII
- Migrate existing downloaded models from the legacy non-ASCII cache
- Ensure deleted models are removed from the legacy source folder to
  prevent them from being re-migrated on subsequent launches
2026-07-03 19:43:38 -07:00
Jinjing bdb6d144c3 Pin the new tab button outside the tab scroll view (#7292)
Move the "New tab" button out of ScrollView so that it remains visible
and reachable regardless of how far the tabs have been scrolled.
2026-07-03 19:38:24 -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
Brennan BensonandOrca 1282f5c2da Add reliability gate manifest (#7001)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 19:26:00 -07:00
github-actions[bot] 266defab34 release: v1.4.122-rc.0 v1.4.122-rc.0 2026-07-04 02:25:39 +00: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
NeilandOrca 77a223a7e2 Fix macOS TCC attribution for terminal children via login(1) (#7003)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 19:04:16 -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
NeilandOrca fc7747021c Fix main typecheck: pin printToPDF mock Buffer generic (#7264)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 19:03:36 -07:00
Jinwoo-H 1ce7f1b8cd Merge remote-tracking branch 'origin/Jinwoo-H/perf-update-click' into orca-performance 2026-07-03 21:57:20 -04:00
Jinwoo-HandOrca 04ca7c9508 Classify suffixed rc tags (rc.N.perf) as rc telemetry identity in release builds
The build-identity guard only knew vX.Y.Z and vX.Y.Z-rc.N, so suffixed
perf RCs cut fine but every platform build refused the tag and the
releases published empty.

Co-authored-by: Orca <help@stably.ai>
2026-07-03 21:34:51 -04:00
Jinwoo-HandOrca 00ba563176 Count suffixed RC tags (rc.N.perf) in the shared rc counter — second suffixed cut collided with the first
Co-authored-by: Orca <help@stably.ai>
2026-07-03 21:25:35 -04: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
Jinwoo-HandOrca 24b135e74e Fix snapshot DECSC register loss (Bug D) and mid-escape boundary drop (Bug E)
Bug D: the serialized screen cannot carry the VT100 DECSC saved-cursor
register, so a hidden ESC 7 followed by a post-reveal ESC 8 restored to
home and clobbered live cells. The snapshot epilogue now re-saves at the
source's saved position before the final absolute CUP
(readSavedCursorRegister + serializeWithAbsoluteCursor; the active
buffer's own register, so alt screens carry theirs). Position-only by
design; never-saved terminals are left untouched.

Bug E: a PTY read ending mid-escape leaves the sequence in the emulator's
parser, so serialize dropped it and the racing tail's continuation bytes
rendered literally after reveal (~24% of the fuzz corpus). The emulator
now tracks the unparsed trailing partial at ingest
(terminal-partial-escape-tail.ts, committed post-parse like the mouse
mirror) and ships it as TerminalSnapshot.pendingEscapeTailAnsi.
applyMainBufferSnapshot writes it LAST, after POST_REPLAY reset — any
later ESC would abort the dangling sequence. Seq accounting is unchanged:
the tail is a suffix of bytes the snapshot seq already counts, so
reconcile slicing needs no adjustment.

Fuzz suites: unskip the Bug B/C repros (fixed on this branch) and the new
D/E repros; remove the B/C/E tolerance predicates so regressions fail
loudly. Only Bug A (upstream wrap null-cell) stays tolerated + counted.
Green at FUZZ_ITERATIONS=2000 (fidelity) and 1000 (reconciliation).

Co-authored-by: Orca <help@stably.ai>
2026-07-03 21:15:20 -04:00
Jinwoo-HandOrca 04e2d12899 Keep RC update checks off perf prereleases
Co-authored-by: Orca <help@stably.ai>
2026-07-03 21:11:44 -04:00
Brennan BensonandOrca 748bced2e6 Fix Resource Manager going empty when a runtime server is selected or stale (#7275)
Co-authored-by: Orca <help@stably.ai>
mobile-android-v0.0.22
2026-07-03 17:52:59 -07:00
Jinwoo-H 32f7201b42 Merge remote-tracking branch 'origin/test/garble-differential-fuzz' into orca-performance 2026-07-03 20:52:22 -04:00
Jinwoo-HandOrca 8ab4afb2ab Gates: tolerate+count Bugs B/C in deep mode; drop inverse from reconciliation tail
- Fidelity suite: add snapshotHasSelfCancellingBoldReset (Bug B) and
  isMarginWrapPendingCursorOffByOne (Bug C) predicates so the corpus tolerates +
  counts them like Bug A. FUZZ_ITERATIONS=2000 is now green (~113s) and fails
  only on genuinely new divergences; each tolerance keeps its <50% degeneracy
  guard. Default 300 unchanged (~17s).
- Reconciliation suite: drop SGR 7 (inverse) from the append-only tail. Inverse
  marks trailing blanks with an inverse-fg the serializer round-trips slightly
  differently by capture depth — a Bug-B-class serialize nuance, not seq
  reconciliation. FUZZ_ITERATIONS=1000 is now green; default 200 unchanged.
- Notes updated: every bug class is both pinned (skipped repro) and tolerated in
  its corpus; combined default runtime ~19s.

Regex uses String.fromCharCode(27) to stay oxlint no-control-regex clean.

Co-authored-by: Orca <help@stably.ai>
2026-07-03 20:50:53 -04:00
d1bd91417e fix: stop Claude account loading after denial (#6653)
* fix: stop Claude account loading after denial

* fix(claude-accounts): tear down whole login tree on OAuth denial

Use killChild() (not child.kill) on the denial path so the detached
POSIX process group and Windows child tree are killed, matching the
timeout/abort paths and honoring the detached-spawn comment. Strengthen
the regression test to assert the process-group teardown.

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

---------

Co-authored-by: Neil <charlie-eng@stably.ai>
Co-authored-by: Orca <help@stably.ai>
2026-07-03 17:49:29 -07:00
Jinwoo-HandOrca 28016b837d Fix two serialize round-trip bugs garbling hidden-terminal snapshot restore
BUG B (addon patch): @xterm/addon-serialize's SGR diff emitted bold/dim set
params before the shared intensity reset 22, so "1;22" wiped a freshly set
bold and a bare "22" dropped a still-set bold/dim. Patched via pnpm
patchedDependencies (config/patches) to diff bold+dim as one intensity
group with the clearing 22 emitted first. Other flag pairs (4/24, 3/23,
7/27, ...) have dedicated resets and were verified unaffected.

BUG C (Orca-side hardening): the addon restores the cursor with relative
moves computed from where it assumes replay leaves the cursor; a final row
filled exactly to the right margin leaves replay wrap-pending and the
restore lands one column short. New shared
serializeWithAbsoluteCursor appends an absolute CUP from the source
terminal's authoritative cursor at every restore/replay serialize site
(daemon/runtime HeadlessEmulator.getSnapshot, renderer mobile snapshot
serializer, shutdown layout capture). It skips empty snapshots and
wrap-pending sources so it never changes already-correct behavior.

Round-trip repros + non-regression coverage in
src/main/daemon/terminal-snapshot-serialize-roundtrip.test.ts (verified
failing with the fixes stashed). buildRehydrateSequences extracted to its
own module to keep headless-emulator.ts under the max-lines budget.

Co-authored-by: Orca <help@stably.ai>
2026-07-03 20:42:00 -04:00
Jinwoo-HandOrca 6a3646e8f2 Suite 3: 25-cycle park/reveal drift e2e test
Extends terminal-hidden-view-parking.spec.ts with a deterministic 25-cycle
park->reveal test on a static rich alt-screen TUI frame (box drawing, SGR
colors, wide CJK/emoji). Baselines against the frame after the first snapshot
restore (so both sides pass through identical machinery — the alt-screen restore
correctly drops normal-buffer scrollback, which is contract not garble), then
asserts every subsequent reveal reproduces it byte-for-byte with no accumulated
drift and no hidden-skip banner. Exercises the real renderer teardown +
HeadlessEmulator snapshot restore + PTY reattach path the fuzz suites model in
isolation. Passes in ~29s (electron-headless, workers=1).

Co-authored-by: Orca <help@stably.ai>
2026-07-03 20:40:34 -04:00
Brennan BensonandOrca 4951168d4a Unify tab agent identity with the agent-status pipeline (#7059)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 17:39:59 -07:00
727c7ae21b fix(runtime): render remote-server binary files (PDF/images) in the editor (#6606)
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
2026-07-03 17:37:06 -07:00
Brennan BensonandOrca 95caf2ee9d fix(mobile): match diff review line height to desktop diff density (#7276)
Co-authored-by: Orca <help@stably.ai>
2026-07-03 17:34:44 -07:00