Commit Graph
17064 Commits
Author SHA1 Message Date
Neil acec0e7aa0 test: remove two load-dependent CI flakes (#34613)
- git-binary-compatibility: give the docker image runs of the ref-pairing case
  a 90 s budget; each Git call is a docker exec and the case normally takes
  22-25 s of the 30 s default.
- claude-transcript-catch-up: fire the 5 ms catch-up deadline with fake timers
  only after the fallback lookup has started, instead of racing a real timer.
2026-10-27 16:38:25 -07:00
Brennan Bensonandbeduldul 47018d4844 fix(source-control): decode Kimi generated text by selected format (#34237)
* fix(source-control): read the Kimi answer from stream-json

Kimi Code's text mode prefixes thinking and hook output with a bullet, so the
commit message arrived mixed with narration. The recipe now asks for
--output-format stream-json and the answer is taken from the last assistant
record, which is the commit message (#33556).

A record that requests a tool is narration rather than an answer, so it clears
the candidate: a stream that ends on a tool call yields no answer, which
finalizeFromAgentOutput already treats as a failed run. Only a body whose every
non-empty line is a record counts as stream output, so a plain answer that
happens to contain a JSON line is left alone.

* fix(source-control): decode Kimi output only for the selected protocol

* fix(source-control): satisfy generation hook checks

* Preserve Kimi generation failures and normalize options linearly

* Fix Kimi argument failure messages

* Bound Kimi option failure recognition

* Fix Kimi generation test fixture types

---------

Co-authored-by: beduldul <alkaysan07@gmail.com>
2026-10-27 16:33:33 -07:00
Neil 90c713af1f fix(wsl): refuse Windows drive folders on a WSL host, offer Add on this computer (#34530)
* fix(wsl): refuse Windows drive folders on a WSL host and offer to add them on this computer

A /mnt/<drive> project on a WSL host shows false line-ending changes, misses
edits made from Windows, and searches slowly. Add Project refuses typed,
picked and dropped Windows drive folders for a WSL host and shows the refusal
inline with Add on this computer, which switches the open dialog to this
computer. The WSL-host orcad re-checks by /proc/self/mountinfo (after
resolving symlinks) in repo.add, repo.create, repo.clone, explicit
folderWorkspace.create and the nested scan/import, answering with the
existing runtime_error code plus optional data, so older clients still show a
readable message. Everything is behind the WSL hosts gate; SSH is untouched.

* test(wsl): hold the e2e's this-computer add instead of racing its failure

On the Linux CI host the switched local add of a Windows path fails its nested
scan and hands off to the Open as Folder modal, closing Add Project before the
test looked. The refusal itself already came before any scan. The e2e now
records the local add at its scan step and asserts it went to this computer
with the Windows path; a unit test pins that a refused pick never reaches the
host path step.

* test(wsl): type the e2e's held-scan window hooks instead of Reflect
2026-10-27 16:29:54 -07:00
EvgeniiandOrcaWin 6c469aea6d fix(plugins): reject locale ids Intl cannot parse (#12533)
* fix(plugins): reject locale ids Intl cannot parse

`pluginLocaleIdSchema` checks the shape of a locale id but not its grammar,
and the shape check is looser than BCP 47 in one direction: `en-US-US`
(duplicate region) and `en-aaa` (a subtag that is neither region nor script)
both match it. A pack declaring one installs, loads, and translates every
string — and then `Intl.DateTimeFormat` throws inside `getIntlLocale()`, which
swallows the error and falls back to English. Nothing is logged, so the pack
author sees a working pack with English dates and no way to tell why.

Delegate the grammar to `Intl.getCanonicalLocales` in a `.refine`, so the tag
is rejected at install where the author can still act on it. The bundled
`pt-BR` pack and every other well-formed tag are unaffected.

* Condense this branch's comments to one line

AGENTS.md asks for one-line comments that say why, and main's comment
cleanup (#33249) applied that across the repository. This brings the
comments this branch adds in line with it. No code changes.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 16:22:09 -07:00
7a834988dc ci: run mobile main tests on the hosted ARM runner PR verify uses (#34611)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-10-27 16:20:41 -07:00
Neil 5784e146de feat(wsl): internal distro allowlist that keeps WSL execs out of other distros on shared test boxes (#34539)
* feat(wsl): internal distro allowlist for WSL execs on shared test boxes

ORCA_INTERNAL_WSL_DISTRO_ALLOWLIST (comma-separated distro names) keeps every
wsl.exe call out of distros not on the list: process-host's resolveSpawn,
the main and daemon node-pty spawns, and the two codex-accounts calls that
bypass process-host. Pure list/status/version calls stay allowed; any other
form must name an allowlisted distro, and --shutdown or a default-distro exec
is refused. A malformed value refuses every distro and logs once. Unset, the
check reads the variable and returns, so behavior is identical to today.

* fix(wsl): cover every direct wsl.exe exec with the internal distro allowlist

- Restore #34525's worktree-create payload and captured-host test, reverted by
  accident in the first commit.
- Check the allowlist in execFileCapture, the choke point for WSL Git, gh and
  worker-thread captures, and before the WSL git-read probe, the Codex hook
  path canonicalization and the CLI login spawn. The WSL watcher now spawns
  through process-host.
- Stop scanning wsl.exe argv at the first positional argument, which wsl.exe
  runs in the default distro.
- check-process-host-imports fails on any direct wsl.exe exec outside
  process-host that does not call assertWslDistroAllowed.

* fix(wsl): check the distro allowlist where resolveCommand produces the wsl.exe form

Every Git, gh and glab path into a distro resolves through resolveCommand, so
gitExecFileSync, gitSpawn, git stream reads and wslAwareSpawn are covered too;
the execFileCapture check is now redundant and removed. The import check also
treats buildWslExecArgs as a wsl.exe exec and accepts resolveCommand as covered.
2026-10-27 16:19:13 -07:00
Jinjing 2f6c84c5f4 fix(i18n): localize browser history copy (#34609) 2026-10-27 16:19:03 -07:00
OrcaWinandOrcaWin 791502fae4 ci: move secondary, scheduled and contract workflows to GitHub-hosted runners (#34568)
* ci: move secondary, scheduled and contract workflows to GitHub-hosted runners

Public-repo standard hosted runners are free under Enterprise. Release, build,
benchmark, e2e and unit workflows stay on Blacksmith. ci-xterm-cache seeds both
cache stores since its PR consumer's pool is undecided.

* test(pi): resolve the smoke bundle's external packages from the repo

#34148 pulled zod into the commit-message planner graph; the bundle in the
OS temp dir could not resolve it on any runner.

* ci(unit): use four workers on the hosted four-core x64 runner

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 16:15:14 -07:00
OrcaWinandOrcaWin 70a6f7d184 test: remove 269 low-value cases and 26 suites (#34584)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 16:13:03 -07:00
NeilandWilliam Poisel 9a62614615 fix(cli): help lists only the flags each command actually takes (#34598)
* fix(cli): hide unsupported profile-state flags

* fix(cli): derive --page and remote-selector help from what each command takes

--page is now a property the browser spec modules set for commands that act on
one page, rather than offered to every command group not on a deny-list, so
serve, environment, agent, connector, host, vm and profile commands stop
advertising and accepting it. Local-only commands offer only --help and --json
plus a selector they take as their own argument, and a test ties their help to
the same local-only list dispatch uses.

Co-authored-by: William Poisel <53629276+epoisel@users.noreply.github.com>

---------

Co-authored-by: William Poisel <53629276+epoisel@users.noreply.github.com>
2026-10-27 16:06:49 -07:00
f4d98b74e3 ci: run hourly and daily dev builds on free hosted runners (#34585)
Hourly and daily builds publish unvetted dev channels on a schedule, so their
latency is not user-facing. Move the macOS build to hosted macos-15, the
Windows build to hosted windows-2022 (the release path), template
qualification to hosted lanes, and the small routing/publish jobs to
ubuntu-latest. Adhoc and release builds stay on Blacksmith.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-10-27 16:02:46 -07:00
Neil eb7f4d9c31 test(wsl-host): native chat on a WSL host through the fake transport, including a stopped distro (#34573)
* test(wsl-host): native chat on a WSL host through the fake transport, including a stopped distro

* test(wsl-host): type the chat spec's focus host id

* test(wsl-host): harden the WSL host chat spec and re-run fake-connector specs on change

* test(wsl-host): scope the chat reply check to the transcript and test the fake's route

Find the prompt only in the transcript so the composer can't stand in for it,
re-check the boot-free stop window after unfocusing, right before the focus,
give the fake's distros.json temp file its own name so it can't collide with the
spec's, and test that the fake connector routes to both WSL host specs.
2026-10-27 16:02:12 -07:00
Neil 5e49b6dd11 refactor: group native chat context usage (#34595) 2026-10-27 15:47:15 -07:00
Neil 5a29a68ffa test(wsl): find the chat lane's claude on the guest PATH, with a Windows-side decoy (#34551)
* test(wsl): find the chat lane's claude on the guest PATH, with a Windows-side decoy

* test(wsl): prove the Windows decoy is reachable before asserting it never ran; record probe errors
2026-10-27 15:40:15 -07:00
OrcaWinandOrcaWin 1864543ade ci: warm GitHub-hosted runner caches and drop the serve-switch installer cache (#34576)
* ci: warm hosted runner caches and drop the serve-switch installer cache

* ci: seed only restored caches from hosted warm legs

* docs(ci): hosted dev builds and no larger runners

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 15:33:07 -07:00
OrcaWinandOrcaWin 03d359749e ci: stop publishing the pnpm store from GitHub-hosted runners (#34588)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 15:32:51 -07:00
NeilandEotel c63b949604 fix(updater): accept the supervised serve's other spelling of its profile path (#34570)
* fix(updater): accept aliased supervised serve profile paths

* test(updater): cover the service's other casing of the serve profile path

Co-authored-by: Eotel <49769982+Eotel@users.noreply.github.com>

---------

Co-authored-by: eotel <49769982+Eotel@users.noreply.github.com>
2026-10-27 15:27:24 -07:00
Neil 1cabd0f952 Make context and tab menus compact and native-style (#34543)
* Make context and tab menus compact and native-style

Shared menu primitives get 13px/24px rows, inset separators, full-size
shortcuts, frosted translucency with solid fallbacks, and submenus that
level with their trigger. Tab menus keep only meaningful icons and align
the rest on one text column via inset.

* Keep launch menus and shortcut chips consistent with row text size

* Use the primitive label style in worktree menus
2026-10-27 15:23:25 -07:00
Jinwoo Hong 4e326e2371 Show Orca publishing guidance only when the host has it on (STA-12225) (#34547) 2026-10-27 18:20:40 -04:00
OrcaWinandOrcaWin 9cc555e2de ci: run off-critical-path PR jobs on free GitHub-hosted runners (#34566)
Keep preflight and the unit-test matrix (the PR critical path) on Blacksmith; move routing, aggregation, contract, packaging and mobile checks to hosted standard runners, which are free for public repos under Enterprise concurrency.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 15:19:23 -07:00
Neil f3adb8f85a refactor: group native chat work-run boundaries (#34528) 2026-10-27 15:18:29 -07:00
Kelvin Amoaba 941f4ece37 feat(mobile): support the iPhone Duo folded and unfolded, with controls in its side status bar (#34484) 2026-10-27 22:16:33 +00:00
ef21574a41 fix(sidebar): remove Claude subagent-view eye indicator (#34558)
* fix(sidebar): drop Claude subagent-view eye icon; badge viewed subagent only

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

* fix(sidebar): hide subagent-view indicator on collapsed rows too

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

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-10-27 15:16:02 -07:00
OrcaWinandOrcaWin 3058cdd1a8 ci(node-server): run PR and scheduled qualification on free hosted runners (#34560)
Only explicit fast_runners callers (manual, hourly/daily/adhoc builds) keep
Blacksmith; qualified-orcad-template's cache/save jobs always use ubuntu-latest.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 15:14:01 -07:00
Kelvin Amoaba 917ef9c737 feat(browser): install Chrome extensions from the Web Store into Orca's browser (#30940) 2026-10-27 22:04:12 +00:00
OrcaWinandOrcaWin c791ee2d98 test(wsl): stop the bash bridge flood test re-concatenating every chunk (#34524)
decode() collected payload chunks even when no payload was expected, and with
expected = 0 every data event ran Buffer.concat over all chunks so far. The
128 MB desktop-reads-slowly flood therefore copied quadratically: ~9 s idle under
bun, over 30 s under node or a loaded CI runner, timing the test out.
Collection now lives in received(), used only by the tests that check a payload.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 14:58:58 -07:00
Brennan Benson e225433c77 Lint: flag store selectors that subscribe to the whole host-status map (#34517)
* lint: flag whole host-status map selectors

* lint: keep whole host-status map findings advisory
2026-10-27 14:56:45 -07:00
Neil 84decfd2a2 feat(editor): VS Code markdown highlighting and sticky headings in source mode (#34537)
* feat(editor): VS Code markdown highlighting and sticky headings in source mode

* fix(editor): address review on markdown TextMate highlighting

- resolve fence grammars from the first word of the info string
- give fence grammars the cold-compile retry budget
- fall back to Monarch markdown when TextMate fails to load
- bound heading-scan line length
2026-10-27 14:46:30 -07:00
OrcaWinandOrcaWin 649dc1a6fb test: remove 113 low-value tests (#34541)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 14:45:01 -07:00
Neil 8fe31c930e feat(wsl): note why an idle distro stays held, and fail the holder's scan closed (#34534)
* feat(wsl): note why an idle distro stays held, and fail the holder's scan closed

When user work keeps the holder from releasing, it writes the first few process names (at
most 5) to ~/.orca/wsl-holder-blocked, replaced whole and cleared on release, for the desktop
to read later. A /proc without the holder's own entry, or a status file it cannot parse, now
keeps the hold instead of reading as idle.

* fix(wsl): count an unreadable /proc entry only when it is the user's own

Review of #34534: under hidepid=noaccess root's status files are unreadable, so each read as
this user's work and the distro never released. An unreadable entry now counts only when its
directory belongs to this user. The holder also clears a half-written note on start and
rewrites the note only when it changed.
2026-10-27 14:42:00 -07:00
OrcaWinandOrcaWin 7b8ca17c64 build(runtime): target Node 24 while retaining host compatibility (#34177)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 14:40:37 -07:00
Jinjing 54411a9a96 fix(chat): open chat name settings from naming failures (#34533)
* fix(chat): link naming failures to chat name settings

* fix(chat): hide naming settings link when controls are unavailable
2026-10-27 14:27:53 -07:00
OrcaWinandOrcaWin 9fd9cd7362 test: remove 260 low-value tests (#34535)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 14:24:21 -07:00
Brennan Benson 9510726341 Stop host status changes from rebuilding the sidebar workspace list (#34500)
* Stop unrelated host status publications rebuilding sidebar workspace state

* Follow sidebar selector lint conventions

* Scope sidebar status reads to mounted consumers

* Cover each unrelated sidebar status publication

* Fix sidebar isolation lint and formatting

* Type the composed sidebar header fixture without assertions

* Remove unused React imports from sidebar contract tests

* Reuse folder record selector and prune stale focus allowance
2026-10-27 14:15:30 -07:00
Jinjing a2b378018a Withhold virtual review tabs from mobile sessions (#34254) 2026-10-27 14:09:22 -07:00
Brennan Benson e71d4358c1 Native chat tabs can hand off work from their right-click menu (#34504)
* Add native chat hand-off menu on main

* Fix saved chat hand-off observations and RPC exports

* Reuse indexed chat tabs for hand-off subscriptions

* Match saved-chat clear fixture to current journal API
2026-10-27 14:06:57 -07:00
Neil 2bf43b7140 fix(automations): keep a desktop automation's dispatch token off a runtime host's create (#34525)
A desktop-scheduled automation whose project lives on a managed Orca server
sent its dispatch token to the server, which never minted it and rejected every
run with "Invalid automation provenance request". The token now goes only to
this desktop's own create.

Fixes #34433
2026-10-27 13:58:49 -07:00
OrcaWinandOrcaWin 1d2778fa99 test: remove 150 low-value tests (#34520)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-27 13:57:27 -07:00
Brennan Bensonand0668000615 203f4e777c fix(tasks): keep preset highlights in sync with filters (#34216)
* fix(tasks): derive preset highlights from the applied query

Reuse the parsed query and already loaded viewer login for personal preset matching. Keep the stored preset field for resume and task-kind behavior.

Co-authored-by: 0668000615 <wen.xiaosong@xydigit.com>

* fix(tasks): limit preset identity matching to known sources

* fix(tasks): wait for source identity before matching viewer aliases

* fix(tasks): match preset highlights to query tokens

Require the effective open state and recognize personal presets by their @me query tokens. Remove viewer identity matching while preserving existing preset persistence and task-kind behavior.

Co-authored-by: 0668000615 <wen.xiaosong@xydigit.com>

---------

Co-authored-by: 0668000615 <wen.xiaosong@xydigit.com>
2026-10-27 13:50:27 -07:00
Brennan BensonandWooseong Kim 287a34c0e5 fix(github-project): show linked PRs and sub-issue progress (#34185)
* fix(github-project): render linked PR and sub-issue progress values

* fix(github-project): probe schema support for project column values

* fix(github-project): preserve independently supported project fields

* Preserve nullable project values and unsupported fetch concurrency

* Exercise project relation payloads through unchanged consumers

* Combine project coordination test cache imports

* Use checked project payload types in consumer tests

* Place project provider column contract in cross-layer tests

---------

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-10-27 13:48:54 -07:00
Brennan BensonandDavid Anderson 379724a333 Keep working GitLab hosts when another login fails (#34184)
* fix(gitlab): retain successful hosts from partial auth failures

Read rejected auth-status output without treating failed host headings or
API error advice as successful logins. Publish positive results through
the existing context-owned cache; keep backoff when no login succeeds.

Co-authored-by: David Anderson <cantspamdave@gmail.com>

* fix(gitlab): preserve discovery retries with partial host evidence

* fix(gitlab): escape auth marker for ASCII server bundle

---------

Co-authored-by: David Anderson <cantspamdave@gmail.com>
2026-10-27 13:47:52 -07:00
6ecd992f44 Correct GitLab MR checks for failed and manual pipelines (#34176)
* Correct GitLab MR check status for failed and manual pipelines

Use the same single-MR read for linked and branch-discovered reviews so a
list summary cannot hide a failed pipeline. Preserve lookup failures for
strict callers and keep detail reads within the existing branch cache.

Set mergeable manual pipelines to neutral without claiming an unrun stage
passed; keep blocking manual pipelines pending.

Co-authored-by: Son of Odin <2700975-son-of-odin@users.noreply.gitlab.com>
Co-authored-by: Emily <hadikcze@gmail.com>

* test: cover GitLab MR check status consumers

* test: type GitLab MR fixtures from mapper input

* chore: document GitLab MR boundary assertion exceptions

* test: share GitLab MR producer and consumer fixtures

---------

Co-authored-by: Son of Odin <2700975-son-of-odin@users.noreply.gitlab.com>
Co-authored-by: Emily <hadikcze@gmail.com>
2026-10-27 13:47:24 -07:00
Brennan BensonandIsaac Mello 41755b5b24 fix(tasks): let Linear section headers collapse and expand (#34173)
* fix(tasks): make Linear list section headers collapsible

* test(tasks): cover Linear section collapse and keyboard activation

* test(tasks): bound Linear section toggle work at scale

* fix(tasks): compose Linear section surface with standard button

* fix(tasks): keep section keyboard focus inside the row

---------

Co-authored-by: Isaac Mello <dzordinetwork@gmail.com>
2026-10-27 13:46:23 -07:00
Brennan BensonandHotragn 8f3d8c8583 fix(gitlab): preserve MR pagination when totals are missing (#34171)
* fix(gitlab): keep paging merge requests when GitLab omits the totals

When total headers are absent, a full response advertises another page to probe and a short response ends pagination. Keep the existing header precedence and unknown total count.

Tracked in #33800

* test(gitlab): cover MR pagination exhaustion and header precedence

* test(gitlab): verify unknown-total metadata across list consumers

* test(gitlab): cover remaining screen consumers of list metadata

* test: use checked GitLab RPC runtime fixtures

---------

Co-authored-by: Hotragn <103170876+Hotragn@users.noreply.github.com>
2026-10-27 13:46:07 -07:00
NeilandClaude Opus 5.5 9a51b9845c fix(ssh): start a stopped managed server whose recycled PID hid it on hosts without ps (#34519)
* fix(ssh): prove a recycled server PID exited on hosts without ps

On slim Linux images that ship no ps, the managed server's liveness probe
could not read the recorded PID's argv, so after a reboot a PID that now
named another process read as LIVE (same user) or UNKNOWN (root). The wake
then refused to start the stopped server, the update deferred on the
terminal census, and the host stayed unreachable. Read argv and the
zombie state from /proc when ps is missing.

Fixes #34149

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(ssh): name argv-less PIDs from /proc stat; annotate e2e timeout

Kernel threads and zombies have an empty cmdline, so a recycled PID owned
by one stayed UNKNOWN on hosts without ps. Quote the stat pattern so the
probe also parses inside command substitution on older bash.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(ssh): fall back to the stat line only after cmdline was read

A failed tr must stay unproven rather than make a live server's PID look
recycled.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 13:27:49 -07:00
Neil 43c8ee5e50 fix(codex): keep the Codex app's bundled plugins in Orca-managed homes (#33621)
* fix(codex): keep the Codex app's bundled plugins in Orca-managed homes

Codex only loads the openai-bundled marketplace when its source sits under
the active CODEX_HOME. The config mirror copied ~/.codex's source verbatim,
so managed homes silently dropped bundled plugins such as visualize.
Link ~/.codex/.tmp/bundled-marketplaces into managed homes and rebase the
mirrored source onto it.

* fix(codex): rebase bundled marketplace onto the canonical managed home

Codex canonicalizes CODEX_HOME before comparing the bundled marketplace
source, so a managed home reached through a symlink (symlinked userData,
/tmp on macOS) was still rejected.
2026-10-27 13:19:22 -07:00
Neil f57d00f045 refactor: group shared native-chat upgrade-tip audience (#34509) 2026-10-27 13:17:14 -07:00
Brennan Benson 64c7d954fd test(native-chat): cover mixed drops through question submission (#33632)
* test(native-chat): preserve mixed drops through question submission

* test(native-chat): complete send harness setup

* test: remove duplicate delayed mixed-drop case
2026-10-27 13:12:48 -07:00
Brennan Benson be619433be fix: keep startup prompts usable during agent restore (#30978)
* refactor(terminal): separate startup commands from live input

* fix(terminal): run POSIX startup commands from shell prompt hooks

* fix(terminal): preserve staged commands in shell-owned startup

* fix(terminal): correct startup types and release spawn environment

* fix: keep startup prompts usable during agent restore

* test: run startup prompt regression in the native runtime

* fix(zsh): retire deferred startup callback safely

* test: make shell readiness fixtures satisfy timing checks
2026-10-27 13:11:31 -07:00
Brennan Benson 32a9b3b959 Skip command Stop history for ordinary chat replies (#34320) 2026-10-27 13:01:18 -07:00