Skip to content

sync: upstream 30733ac703 into swaplabs/main - #52

Closed
kiwidream wants to merge 236 commits into
swaplabs/mainfrom
main
Closed

kiwidream wants to merge 236 commits into
swaplabs/mainfrom
main

Conversation

@kiwidream

@kiwidream kiwidream commented Oct 24, 2026 •

Copy link
Copy Markdown

ELI5

Upstream Orca moved forward 236 commits since yesterday's sync (#50). This PR proposes merging them into swaplabs/main straight from the fork's mirror main.

What Changed

Upstream range 5d32f372e7..30733ac703, 236 commits (compare). The head is the fork's mirror main, so the PR adds no fork commit.

A read-only git merge-tree of 30733ac703 into swaplabs/main (7d33e616ae) reports 21 content conflicts, so this PR is expected to be CONFLICTING; the automation then moves the merge to a sync/upstream-20261024 branch and closes this PR as superseded:

  • .gitignore
  • src/main/agent-hooks/manual-compact-status-cleanup.test.ts
  • src/main/agent-hooks/server/server-cleanup.ts
  • src/main/agent-hooks/server/server-hydration.ts
  • src/main/agent-hooks/server/server-remote-envelope-normalization.ts
  • src/main/agent-hooks/server/server-types.ts
  • src/main/ai-vault/cached-session-list.ts
  • src/main/ai-vault/session-list-results.ts
  • src/main/ai-vault/session-scan-issues.ts
  • src/main/daemon/daemon-endpoint-ownership.ts
  • src/main/daemon/daemon-out-of-process-launcher.ts
  • src/main/daemon/daemon-pty-router.ts
  • src/main/ipc/pty-management.ts
  • src/main/updater-mac-install.ts
  • src/main/updater-prerelease-feed.ts
  • src/main/updater-release-build-cache.ts
  • src/main/updater-release-builds.test.ts
  • src/main/updater-release-builds.ts
  • src/main/updater.build-channel-selection.test.ts
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/runtime/web-session-terminal-handle-events.ts

Why

Daily upstream sync.

Linked Issue

N/A: daily upstream sync.

Visual Proof

N/A: upstream code only.

Testing

None on this head: main is the mirror and takes no commits. Validation happens on the sync branch.

AI Disclosure

Prepared by the "Orca upstream sync" automation (Claude Code, Claude Opus 5.5).

Agent skill upstream boundary

  • Not applicable: this PR merges upstream's history; it adds no agent skill.

Notes

orca-fork-ops status for swaplabs/main (7d33e616ae) against upstream 30733ac703, before this merge:

Upstream release tags v1.4.238 and v1.4.239 were copied to the fork.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

nwparker and others added 30 commits October 23, 2026 07:08
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* test: verify independent CLI quoting and screenshot bytes

* test: audit CLI registration and offline hook boundaries

* test: record CLI automation fence review

* test: audit computer CLI dispatch and exported files

* test: record CLI enrollment and emulator contract review

* test: audit file command path and navigation contracts

* test: bracket login shutdown grace and fallback deadlines

* test: keep managed server timeout expectations independent

* test: record Linear CLI input and dispatch review

* test: verify legacy completion dispatch boundary

* test: replace copied config and browser controls

* test: isolate gate refusal from inherited caller identity

* test: exercise real mobile host admission and teardown boundaries

* docs: reconcile audit entrypoints and refresh completed reviews

* test: fix mobile audit React Doctor findings

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…ai#32265)

* chore: shorten process-host comments

* chore: audit CLI parsing and host-routing comments

* chore: remove stale host-selector restriction comment

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* chore: shorten process-host comments

* chore: audit CLI parsing and host-routing comments

* chore: remove stale host-selector restriction comment

* chore: shorten remaining CLI root comments

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* chore: shorten process-host comments

* chore: audit CLI parsing and host-routing comments

* chore: remove stale host-selector restriction comment

* chore: shorten remaining CLI root comments

* Shorten CLI handler comments

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…ai#32283)

* chore: shorten process-host comments

* chore: audit CLI parsing and host-routing comments

* chore: remove stale host-selector restriction comment

* chore: shorten remaining CLI root comments

* Shorten CLI handler comments

* Shorten CLI runtime and command specification comments

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…#32288)

* chore: shorten process-host comments

* chore: audit CLI parsing and host-routing comments

* chore: remove stale host-selector restriction comment

* chore: shorten remaining CLI root comments

* Shorten CLI handler comments

* Shorten CLI runtime and command specification comments

* Shorten top-level main process A–G comments

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…lyai#32681)

* test: exercise fresh orchestration output and identity fixtures

* test: check brief task values at the current output boundary

* test: observe worker CLI receipts through actual output

* test: reach sender lookup and print real worker wait states

* test: verify retry deadlines and headless recovery admission

* test: audit ACP lifecycle and recorded response boundaries

* test: exercise mobile and CI admission contracts

* test: check cache producers and exact capped output

* test: reconcile upstream audit coverage and cache admission

* docs: align integrated audit record hashes

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…#32290)

* chore: shorten process-host comments

* chore: audit CLI parsing and host-routing comments

* chore: remove stale host-selector restriction comment

* chore: shorten remaining CLI root comments

* Shorten CLI handler comments

* Shorten CLI runtime and command specification comments

* Shorten top-level main process A–G comments

* [comment audit] Shorten main process H–K comments

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…stablyai#30159) (stablyai#30192)

Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>
…ai#31503)

Co-authored-by: Jaeyoung22 <89302528+Jaeyoung22@users.noreply.github.com>
Rolls in the 69 missing translations from stablyai#32017 by @lucasrbsouza, preserving the current catalog and his original translated values. Adapted from commits a103b8d and 81befb5.
…tablyai#32777)

* test: audit repository visibility and session-search CLI coverage

* test: verify service identities and public skill-sharing output

* test: verify terminal retry commands and unsuccessful navigation attempts

* test: exercise bulk-close refusal and printed legacy prompt receipts

* test: audit host discovery and agent launch recovery identities

* test: audit ACP replay, lifecycle, and hook delivery coverage

* test: audit automation errors and build artifact guards

* test: audit mobile bridge and bundle lifecycle coverage

* docs: reconcile audit tracker with input-ownership changes

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…#32295)

* chore: shorten process-host comments

* chore: audit CLI parsing and host-routing comments

* chore: remove stale host-selector restriction comment

* chore: shorten remaining CLI root comments

* Shorten CLI handler comments

* Shorten CLI runtime and command specification comments

* Shorten top-level main process A–G comments

* [comment audit] Shorten main process H–K comments

* [comment audit] Shorten main process L–O comments

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…blyai#32838)

* Revert "fix(workspace): show launch actions in empty tab groups (stablyai#32182)"

This reverts commit afe62ef.

* Retire empty-workspace translations removed by revert
* Revert "Show child workspace statuses in the children toggle (stablyai#32224)"

This reverts commit b4ee652.

* Fix revert button styling and retire stale child-toggle translations
nwparker and others added 26 commits October 24, 2026 00:49
…pload to the paired server (stablyai#33060)

* fix(web): chat attachments from the browser's file picker and drops upload to the paired server

In the web client the chat's attach button resolved no files and a dropped
file was refused as unresolvable, so neither ever attached. The browser now
opens its own file picker, and a drop on the chat hands over its File
objects, each held under a token whose last segment is the file's name. The
chat's upload reads the held file and streams it in chunks over the paired
server's existing agentSessionAttachment upload RPC, as the browser's image
paste already does.

* fix(web): release held browser files where an attach ends, never by eviction

An eviction cap could drop the files of a batch still waiting to upload when
another pick or drop came in. Every pick and drop now ends in the composer's
one delivery step, which releases whatever it left unclaimed.

* fix(web): release held browser files a disabled composer or detached drop owner never delivers

A pick that returns to a disabled or unmounted composer skipped the delivery
step, and so did a queued drop whose owner detached; both now release their
held files. The composer-workspace comparison moves beside the other
attachment ownership checks.
* A Claude chat shows the turns made outside it

When a Claude chat's agent next opens, turns written to the same
conversation elsewhere (claude --resume in a terminal) are appended once,
in order, under the existing "Continued outside this chat." divider.

Streamed reply and thinking rows are now keyed by their source block
(message id and block index), which Claude also saves on each transcript
row, so the chat can tell which saved rows it already shows. The read goes
back from the end of the transcript only to the chat's saved turn-end leaf,
replays the rows through Claude's own translator in an isolated sink, and
commits them in one settlement that writes nothing if the chat moved.
Imported prompts are display-only and never settle a send; any failure
opens the chat normally.

* test(claude): name the transcript row shapes the catch-up test builds

* fix(claude): read a catch-up row's uuid once as a string

* fix(claude): parse transcript tail rows without type assertions

* refactor(native-chat): share the catch-up open runner across agents

The Codex catch-up's agent-neutral parts move to one module: the open-time
envelope (its own deadline and cancellation, never gating the open), the
bounded staged batch, the single settlement commit that re-checks the
journal before writing, and the "Continued outside this chat." divider.
Codex keeps only how it reads its saved turns and what the chat already
holds. No behavior change; the other agents' catch-up builds on this
instead of copying it.

* refactor(claude): catch up through the shared history catch-up runner

* chore: remove unrelated pnpm executable metadata

* refactor(native-chat): the catch-up runner reads the chat's view only when the agent asks

* chore: remove regenerated pnpm executable metadata

* fix(native-chat): the catch-up deadline also bounds waiting for its commit to be written

A journal write barrier that never settled after the import was admitted held
the provider's open past the catch-up deadline. The wait now ends with the
deadline or the open's cancellation, like every other step.

* test: type the history catch-up sink fixture without assertions

* fix(native-chat): bound and revoke history preparation

* test(claude): expect source block identity in stream cadence

* fix(claude): preserve final output and history coverage

* feat(native-chat): validate expected saved items during history catch-up

* fix(claude): integrate conditional history settlement

* fix(claude): use new content and provider prompt identities for catch-up

* fix(claude): retain qualified completed leaves through session exit

* fix(claude): preserve unresolved membership for recovered follow-ups

* test(claude): use fork epoch reason for rewind preservation

* fix(claude): consolidate translator sink type imports

* fix(claude): preserve source message times during catch-up

* fix(claude): narrow staged history mutations to items

* test: bound Claude retained-leaf catch-up work

* fix(claude): settle imported work at source boundaries

* test(claude): keep shared journal harness portable

* test(mobile): await editor listener cleanup before snapshot

* test: isolate retained slice measurements and accept closed socket EPIPE
* ci: fail when a checked-in test file has no runner

Two node:test files under .github/actions lost their runner when stablyai#31792
trimmed cloud pretest, and the two monaco .bench.ts budgets were never run
by any CI job. Wire both back in and add a static check that every
test-like file is collected by a declared runner or imported by a
collected entry (the src .spec.* suite-module convention).

* ci: ignore type-only imports and quote the lease glob for cmd.exe

* ci: parse type-only imports, cover UNIT_EXCLUDE, route cloud runner edits

Type-only imports are now dropped with the TypeScript parser, so a type
alias before a runtime re-export no longer hides it. UNIT_EXCLUDE files
must be named by a pr.yml or unit-tests.yml step. A cloud-only diff that
adds a test or edits a runner config now runs the static job. The monaco
benchmarks stay manual (pnpm test:perf:benchmarks) until a CI runner
proves their wall-clock budgets.

* ci: require UNIT_INCLUDE names in dedicated jobs and erase typeof import()

* ci: resolve each runtime import to the one file Vite loads

The unit dependency graph keeps every plausible candidate so it can
invalidate conservatively, which cannot prove a suite runs: an import of
./case.spec counted both case.spec.ts and case.spec.tsx. Resolve with
Vite's extension order instead.

* ci: take runtime imports from transpiled output

Imports used only as types are erased without a type modifier, so
parsing for type-only syntax still followed them. Derive edges from
ts.transpileModule output, which erases what Vitest's transform erases,
and only transpile files that can reach an uncollected candidate.

* ci: fix the agent-status benchmark config and route all cloud code

The agent-status benchmark config inherited the unit projects, whose
includes override its own, so it ran the whole unit suite and never the
benchmark. Clear projects as the performance config does. Route every
cloud code file to the static job, since content-detected tests can have
any name.
…tablyai#33082)

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…lient writes (stablyai#33083)

Exiting a paired host tab's original pane moved the host's active leaf to the
surviving split. The client's reconciliation effect followed it with
setActivePane, and that persisted every still-mounted pane, writing the retired
leaf (whose remote PTY had not ended yet) back into the layout. The leaf was then
no longer retired, so its pane stayed forever. Any other persist in that window
(insertions, clicks, title edits, divider drags) could do the same.

persistLayoutSnapshot now drops the leaves the host retired, using the
retireLeavesFromTerminalLayout main already uses, moved to shared. The retired
set it reads is the one the reconciliation effect tracks.
…ablyai#33088)

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…es load (stablyai#33038)

* fix(native-chat): name workspaces by folder in the resume dialog while workspaces load

On restart the resume dialog opens before the full workspace list loads, so
every row it could not look up showed its raw repo-qualified id. Fall back to
the folder name the id carries, as the status bar and Automations already do.

* fix: distinguish unknown resume workspaces with matching folder names

* refactor: extract resume workspace display derivation

* fix: distinguish resume workspace control names
…osing it (stablyai#33071)

On macOS wake and network online events every remote-runtime socket was
probed with an 8 s deadline and closed on a miss. Relayed or lossy links
still rerouting after a wake lost connections that would have survived.
A miss now re-pings and leaves the socket until the normal 25 s keepalive
window ends; the probe is skipped when data arrived in the last 3 s.
…tablyai#33093)

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…ai#33094)

Client control-socket closes and server heartbeat reaps only reached the
console, which a packaged app never shows. Each control-socket close now
writes a remote-runtime.control-socket-close span (cause, close code,
error code, last keepalive RTT, socket and ready uptime). Each server reap
writes remote-runtime.server-socket-reaped. Both land in the main trace
file that Send app diagnostics collects. Keepalive pongs now measure RTT,
exposed as lastRttMs and lastCloseCause on the shared-control diagnostics.
…i#33098)

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* fix(editor): enable Lean syntax highlighting

* fix(editor): enable Lean syntax highlighting

Adapt stablyai#31930 onto current main and retain its bundled Lean grammar repair. Register the lazy TextMate provider and cover detection, proof syntax, nested comments, and bounded tokenization.

* test(editor): verify Lean highlighting in the full app

---------

Co-authored-by: Neil <neil@stably.ai>
…lyai#19600)

* fix(agent-hooks): force C numeric locale on POSIX curl timeouts

curl parses --connect-timeout/--max-time with locale-sensitive strtod, so comma-decimal locales reject 0.5 and every hook silently falls into the restart spool.

Fixes stablyai#19578

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(agent-hooks): neutralize LC_ALL before setting LC_NUMERIC=C on POSIX curl

Signed-off-by: siddiqui irshad <mohdirshad1306@gmail.com>

* style(agent-hooks): format scoped curl commands

* test(hooks): expect scoped curl locale in Muse install script

---------

Signed-off-by: siddiqui irshad <mohdirshad1306@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Neil <neil@stably.ai>
…24470)

* fix(dashboard): skip hidden pop-out view transitions

A column change in a hidden Agent Dashboard pop-out started a View
Transition whose ready promise rejects with InvalidStateError. Nothing
observed that promise, so each move became an unhandled rejection.
Skip the transition while the document is hidden, and consume ready
when a transition still starts.

Fixes stablyai#21323

* fix: preserve visible dashboard transition errors

* test(dashboard): preserve unrelated hidden transition errors

---------

Co-authored-by: Neil <neil@stably.ai>
…created (stablyai#33103)

* fix(worktrees): don't prune worktrees the other Git (Windows or WSL) created

On Windows one repo can hold linked worktrees written by both Git for Windows
(link C:/...) and WSL Git (/mnt/c/..., /home/...), e.g. after the project runtime
toggle switched it. Each Git reads the other's links as missing, and the
`git worktree prune` Orca runs after removing a worktree (and before deleting a branch
held by one) deleted those worktrees' metadata, leaving checkouts git no longer knows.
All five prune sites now go through pruneGitWorktrees, which reads the link files first
and refuses (through each site's existing failure path) when any link is foreign to the
Git that would run.

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

* fix(worktrees): lock the other Git's entries for the prune instead of skipping it

Review: refusing the whole prune broke stale-registration recovery and left branches
undeletable in mixed repos, and reading <cwd>/.git/worktrees missed bare and linked
checkouts. Now the other Git's entries get a marked lock file for the prune (git never
prunes a locked entry; a user's existing lock is kept), the rest prune as before, and
the admin dir comes from rev-parse --git-common-dir once routing is settled.
//server/share links read as Windows Git's.

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

* test(worktrees): drop a type assertion from the prune guard test

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

* fix(worktrees): serialize guarded prunes per repo and reclaim stale guard locks

Re-review: two prunes in one repo could interleave so the first's unlock let the
second prune the other Git's entry, and a crash between lock and unlock left a lock
read as the user's forever. Prunes now chain per admin dir, and a lock carrying the
guard's own reason is reclaimed.

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

* test(worktrees): assert the overlapping prune waits, not only its outcome

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
…rtions (stablyai#33106)

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…ai#32194)

* fix(windows): include registry addon in relocated daemon host

* test(windows): preserve registry path in native-read child script

* fix(ci): match registry gate command to recorded validation
…stablyai#32750)

* fix(terminal): keep xterm parse barriers and the output behind them across a resize

Orca waits for xterm to finish parsing by writing an empty string with a
callback. In xterm 6.1, resize() drains the write queue through
WriteBuffer.flushSync, whose loop stops at a falsy chunk and clears the rest of
the queue. A resize while such a barrier was queued therefore dropped its
callback and every chunk written after it: replay guards and output waits fell
back to their stall timers, and that pane output never reached the screen.

The replay guard, output scheduler and write-pipeline probe now write a
zero-length Uint8Array through writeXtermParseBarrier. It parses as nothing, but
it is a truthy chunk, so the flush keeps going. Test fakes that recognised a
barrier by '' now check for a zero-length write. Regression tests use real
@xterm/headless and fail before the fix.

Fixes stablyai#26950

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

* test(terminal): verify parse barriers across installed xterm runtimes

Exercise the existing contributor workaround against both browser and
headless packages through replay waits, scheduler waits and health probes.
Check FIFO callbacks, following bytes, parser tails and no-resize controls.
Register the bounded resize invariant as an experimental reliability gate.

Make terminal test writers accept string or Uint8Array and preserve textual
captures through the existing fixture conversion. Keep the original PR's
production implementation and contributor ancestry unchanged.

* test(terminal): complete byte barriers in unhide restore fixture

---------

Co-authored-by: outof-place <contact@outofplace.space>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
stablyai#33104)

* feat(telemetry): count Windows-drive WSL repos with WSL-made worktrees

The daily wsl_usage_snapshot gains projects_wsl_windows_drive_wsl_worktrees: of the
Windows-drive repos that run Git in WSL, how many have a linked worktree WSL Git made
(a Linux-path link). Git for Windows can't take those over, so the D1c conversion
refuses them; this sizes that class before the bridge is removed. Bucketed count only,
read from the link files with no Git spawned; optional in the schema so older payloads
still validate.

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

* fix(telemetry): don't count Windows Git's //server/share worktree links as WSL-made

Review: a UNC link starts with '/' too. Reuse the prune guard's classifier, and note
that a repo whose .git is a file reads as having no worktrees (no Git is spawned).

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review 🔄 Running since 2026-10-24T10:03:46.615044Z 30733ac PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@kiwidream

Copy link
Copy Markdown
Author

Superseded by #53 (sync/upstream-20261024): main is the mirror and takes no commits, so the 21 conflicts are resolved in a signed merge on the sync branch.

@kiwidream kiwidream closed this Oct 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.