@bastani/atomic 0.9.13-alpha.4 → 0.9.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,87 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.13] - 2026-08-13
6
+
7
+ Cumulative release of the `0.9.13-alpha.1` – `0.9.13-alpha.4` prereleases. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease sections below.
8
+
9
+ ### Breaking Changes
10
+
11
+ - **Interactive TTY sessions always use the fullscreen renderer.** The `--tui-mode` flag, the `tuiMode` JSON setting, the `/settings` TUI-mode row, the settings-manager accessors, and the exported `TuiMode` alias are removed, with no replacement for `--tui-mode regular`. `fullscreenScrollbar` remains configurable, non-TTY output continues through print mode, and internal `TERM=dumb` and CI guards keep the main-screen renderer as a non-user-selectable fallback.
12
+ - **The `bash` tool no longer accepts its `async` parameter,** and the `__atomic_bash_job` and `__atomic_bash_job_cancel` polling and cancellation commands are gone. Drop `async` from bash calls, and run a long-lived command in a separate shell or process manager.
13
+ - **Streaming `message_update` events are delta-only across the public API.** JSON, RPC, SDK, and extension subscribers receive only `type` plus the raw `assistantMessageEvent`; the cumulative `message` and wire-only `assistantMessageEvent.partial` fields are gone. `message_start` seeds the message, ordered deltas build it without deduplication, and `message_end` supplies the authoritative final message, so a consumer that read `message` or `partial` must accumulate deltas itself. This also removes quadratic wire amplification: an 8000-character answer wrote 8,428,280 bytes across 501 frames and now writes 65,588.
14
+ - **`ctx.ui.custom()` components must report input consumption.** `handleInput` returns `true` when it consumes a key and `false` or `undefined` when it does not; a handler returning `void` must migrate. In fullscreen mode an unhandled viewport key may reach the transcript, and a remote component disposed before its reply is deliberately dropped rather than replayed.
15
+ - **Custom extension runtime and UI implementations must adopt lifecycle fields.** An exported `ExtensionRuntime` must provide `trackEventBusSubscription(unsubscribe)`, and `ExtensionUIContext.getChatRenderSettings()` must return `markdownTransformers`. `pi.events` is bound to an extension instance: subscriptions auto-unsubscribe on reload or disposal, and calling `on()` or `emit()` through a captured stale handle throws.
16
+ - **Extension provider OAuth `login` and `refreshToken` take abort signals.** The contracts are `login(callbacks, signal)` and `refreshToken(credentials, signal)` with a required concrete `AbortSignal`, so cancelling authentication or credential refresh abandons the extension's in-flight network work. Implementations must accept the parameter and forward it into their requests.
17
+ - **`ModelRegistry.refresh()` returns `ModelsRefreshResult`** — `{ aborted, errors }`, a per-provider `ReadonlyMap<string, Error>` plus a cancellation flag — instead of `Promise<void>`, so a refresh in which some providers failed, or which was aborted, is no longer indistinguishable from a clean success. A caller that awaited it only for completion needs no change.
18
+ - **`ModelRuntime.setRuntimeApiKey()` no longer refreshes the model catalog.** It takes auth-cancellation options and does only what its name says: record the runtime key and mark the provider configured, aborting early if the signal is already aborted. A caller that needs a fresh catalog must now call `refresh({ providers: [providerId], signal })`.
19
+
20
+ ### Added
21
+
22
+ - Added the fullscreen interactive TUI layout. The transcript scrolls above a sticky dock holding the editor, status line, usage meter, extension widgets, and footer, and terminal resizes preserve that layout. Wheel and trackpad gestures reach focused workflow overlays before the transcript viewport, and events those overlays do not consume fall through ([#2269](https://github.com/bastani-inc/atomic/pull/2269), [#2274](https://github.com/bastani-inc/atomic/pull/2274)).
23
+ - Added a draggable fullscreen transcript scrollbar configured as `auto`, `always`, or `hidden` through `/settings`. Themes may set `scrollbarThumb`, which falls back to `selectedBg` for existing custom themes ([#2275](https://github.com/bastani-inc/atomic/pull/2275)).
24
+ - Added fullscreen transcript navigation for page, opt-in half-page, marked-message, `home`, and `end` actions, while `ctrl+home`, `ctrl+end`, `ctrl+pageUp`, and `ctrl+pageDown` remain available to the editor. Matching viewport bindings pass through to focused overlays and inline custom components. Prompt history can be enabled with explicit `tui.editor.historyPrevious`/`historyNext` bindings such as `ctrl+p`/`ctrl+n`, which take precedence over ordinary action handlers while the editor is focused ([#2281](https://github.com/bastani-inc/atomic/pull/2281), [#2296](https://github.com/bastani-inc/atomic/pull/2296), [#2300](https://github.com/bastani-inc/atomic/pull/2300)).
25
+ - Added a clickable, centered jump-to-bottom indicator above the fullscreen input dock when the transcript is scrolled away from the live end. It displays the live `tui.altScreen.bottom` key binding and supports mouse activation ([#2361](https://github.com/bastani-inc/atomic/issues/2361)).
26
+ - Windows fullscreen sessions paste system clipboard text on a secondary-button press, with focus checks and bracketed-paste framing preserved for host and engine-owned editors.
27
+ - Added generated session summaries to the resume picker, so `/resume` and `atomic -r` show what a conversation was about in a dedicated summary column beside the session name or first message. Atomic writes a one-line summary once the agent goes idle, reusing the session's existing model, credentials, stream function, and retry policy, and persists it as a `session_summary` entry anchored to the message it describes; a later message or branch summary retires it. Generation is best-effort and invisible: it is skipped for very short sessions, workflow stage sessions, and `--print`/JSON modes, never blocks a turn, is cancelled when the next prompt starts, and a slow request that outlives the conversation discards its own result. Set `sessionSummary.enabled` to `false` to disable it ([#1033](https://github.com/bastani-inc/atomic/issues/1033)).
28
+ - Added the bundled, default-on ADHD-friendly response mode. Its hidden rules message persists across turns, resumes, branches, and compaction; `/i-have-adhd on|off`, `--no-adhd`, `.i-have-adhd-off`, and the `stop adhd mode` / `normal mode` phrases control it.
29
+ - Added `atomic auth check` to verify a provider or model's effective authentication before a session starts. It reports `ready`, `not_ready`, or `invalid`, supports JSON output and a no-refresh read-only mode, and emits no credential material unless the explicit `--credentials` opt-in is present.
30
+ - Added an **experimental** `@bastani/atomic/client` entrypoint with `RemoteSession` lifecycle management and transcript projection helpers for remote protocol sessions.
31
+ - Added the configurable and package-exported `createCodingAgentHarness()` factory, with Atomic's hashline coding tools, live prompt metadata, Atomic and `PI_*` bash session variables, and injectable pi-agent-core execution environments for read (including directory trees), bash, edit, write, and find, rejecting at runtime an environment that omits `renameFile()`. The default `search` tool remains local until its filesystem and matching pipeline gains a complete remote operations seam; read and edit retain local path-variant probes and notebook projection, read also retains local archive, SQLite, and internal-resource selectors, write retains local generated-file, shebang, conflict, and resource helpers, and bash validates its cwd locally.
32
+ - Added `pi.registerMarkdownTransformer()` for ordered, synchronous, display-only Markdown transforms in user, assistant, and assistant-thinking output. Each transformer receives the prior output plus message type, streaming state, and available width; an error leaves the current display text intact and never alters stored messages or model context ([#7231](https://github.com/earendil-works/pi/pull/7231) by [@xl0](https://github.com/xl0)).
33
+ - Added themed Unicode Mermaid diagrams in interactive transcripts, with optional rendering while responses stream ([#7624](https://github.com/earendil-works/pi/pull/7624) by [@xl0](https://github.com/xl0)), and configurable terminal-friendly Unicode LaTeX math via the `markdown.latex` setting. See [Markdown settings](docs/settings.md#markdown).
34
+ - Added per-directory `AGENTS.override.md` context files. An override replaces that directory's `AGENTS.md` or `CLAUDE.md` while global and ancestor context still layers normally; the same canonical filename works through Atomic's legacy `.pi` and `PI_*` agent-directory aliases ([#7681](https://github.com/earendil-works/pi/pull/7681) by [@m3](https://github.com/m3)).
35
+ - Added `AI_AGENT=atomic` attribution at the CLI, RPC, and compiled-binary entry points and across Atomic-owned child-process environments, including bash and tool commands, isolated RPC children, subagent and workflow runners, MCP and web-access subprocesses, and the intercom broker. Child environments follow upstream's overwrite policy while cloning rather than mutating caller-supplied environment objects.
36
+ - Added arbitrary OpenAI-compatible `samplingParams` for custom model definitions, per-model overrides, extension providers, and per-request stream options. Parameters merge by key, preserve provider-specific names, and apply to OpenAI-compatible request bodies; a malformed configuration shape now fails during `models.json` loading. Added opt-in vLLM `compat.supportsThinkingTokenBudget` handling and `compat.supportsFinishReason` stop inference for finishless OpenAI-compatible streams.
37
+ - Added built-in Baseten support with `BASETEN_API_KEY` and the `zai-org/GLM-5.2` default, and Qwen Token Plan Individual with the documented subscription catalog, the shared international `QWEN_TOKEN_PLAN_API_KEY`, and `qwen3.8-max` as its default model.
38
+ - Tool output that spills to disk is now stored per session and reaped on age, so the system temp directory can no longer fill up with orphaned files. `bash` overflow logs, streamed spill files, and the in-memory-session tool-result fallback move into one owner- and session-scoped tree, `<tmpdir>/atomic-<uid>/<session-id>/`, created `0700` with `0600` files where the platform supports it; on Windows the domain-qualified account name plus a short digest replaces the uid, so two domain principals sharing a bare account name cannot land on one tree. Every component below the system temp directory is created and checked one level at a time: a symlink is refused, a foreign-owned directory is refused, and one of this account's left too permissive is tightened and re-checked. Refusal fails closed — the tool runs with no spill file rather than writing command output through a link someone else planted. On Windows that ownership check reads the security descriptor through PowerShell `Get-Acl` and decides from SIDs alone, caching a successful verification per path per process keyed to the directory's metadata identity ([#2245](https://github.com/bastani-inc/atomic/issues/2245)).
39
+ - Persisted tool-output files are capped at 64 MB each, cut on a character boundary even when a multi-byte character spans two chunks, with bytes that are not valid UTF-8 written through unchanged. A spill file that fails to write is no longer advertised, and a storage fault never changes the outcome of the command that produced the output. A deferred, unref'd sweep started shortly after session startup removes session temp trees and `tool-results` directories whose newest file is more than 30 days old, throttled once a day per target and guarded by an exclusive lock; session transcripts and `.jsonl` session files are outside its scope, and a tree belonging to a running session is never reaped.
40
+ - Added `terminate` to blocked extension `tool_call` results. A terminating blocked call suppresses the follow-up model request only when every finalized call in its batch also terminates.
41
+ - Added `CredentialSynchronizationError` for a credential mutation that commits successfully but fails to update local model state, so credential-save failures stay distinct from post-commit synchronization failures in interactive auth surfaces.
42
+ - `CreateAgentSessionOptions` and `ExtensionContext` carry an immutable typed subagent child capability policy for in-process tool registration, and `CreateAgentSessionOptions` supports construction-time system-prompt and inherited-context transforms, so an in-process child session applies typed policy without extension injection ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
43
+ - Added immutable system-prompt contribution constants for Atomic's builtin coding tools, keeping custom harnesses and tool registries aligned with the prompt metadata the builtin factories use.
44
+
45
+ ### Changed
46
+
47
+ - Adopted the pi 0.84.1 coding-agent, agent, AI, client, protocol, telemetry, and TUI runtime surfaces, which supply the renderer behavior described above. Atomic keeps its isolated interactive engine, provider, path, and legacy `PI_*`/`.pi` compatibility surfaces, and uses the dependency's renderer and layout implementations rather than carrying forked copies.
48
+ - Bundled subagent launches use in-process `AgentSession` children with typed admission, canonical identities, and live continuation, and typed child policy now carries MCP direct-tool selection and admission-issued Intercom identity and capability, so an in-process extension consumes child policy without inheritable environment state ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
49
+ - Live tool-call argument previews no longer update while a call's arguments are still streaming. The assistant message is rebuilt from `message_update` deltas, and `toolcall_start`/`toolcall_delta` carry an unparsable fragment of JSON rather than a usable value, so the accumulator ignores them and installs the complete parsed call at `toolcall_end`. The tool card still appears as soon as the call starts, and the arguments it shows are correct and complete; the progressively filled preview is gone, which is the deliberate trade for removing the quadratic amplification above.
50
+ - Footer and workflow stage-chat extension statuses are joined with a dim `•` separator instead of a bare space, so adjacent statuses read as distinct items.
51
+
52
+ ### Fixed
53
+
54
+ - Fixed a stall where a message queued during a turn was shown in the transcript but never answered, leaving the session idle until you typed another message. Escape and Ctrl+C hold queued work by pausing the agent's own steering and follow-up queues, but a message the agent loop has already polled is in neither queue: it is written straight into the transcript, so the interrupt cancelled its reply and nothing scheduled a new one. This was most visible after answering an `ask_user_question` questionnaire. An admitted message whose reply was cancelled before it produced any output now receives that reply, and a message sent while that reply is still streaming is delivered as soon as it finishes. Messages that are still held are unchanged, and a reply that had already streamed some output is never restarted ([#2362](https://github.com/bastani-inc/atomic/issues/2362)).
55
+ - Fixed fullscreen mouse routing for focused workflow graphs and stage chats. SGR/X10 wheel and click sequences reach the focused overlay through the bounded custom-input reply path before the alternate-screen viewport, so graph scrolling and click-to-attach work without changing keyboard viewport fallback ([#2303](https://github.com/bastani-inc/atomic/issues/2303)). OSC-8 jump-to-bottom activation lets the focused overlay claim its own transcript jump before falling back to the host transcript ([#2370](https://github.com/bastani-inc/atomic/issues/2370)).
56
+ - Fixed fullscreen viewport shortcuts stealing matching keys from a focused overlay or inline custom component: a focused handler receives the key exactly once and can return `false` to let a no-op fall through to transcript navigation, input replies correlate with each forwarded key, and transcript scrolling proceeds on an explicit `false`, a failed reply, or a bounded timeout. Fullscreen shutdown avoids restarting the replacement renderer.
57
+ - Fixed isolated overlay components such as workflow stage chat failing to re-render after a terminal height change, which could clip the composer and footer after a vertical resize, and fixed isolated fullscreen tool renderers rebuilding Kitty image components on every engine render, which retransmitted visible payloads and rendered the transcript twice per frame.
58
+ - Fixed fullscreen overlay text selection when one input read contains multiple SGR mouse reports. Reports are replayed one at a time, while Shift/Option/Ctrl-modified presses and motion stay out of application selection; modifier-bearing SGR releases still close an active selection, and legacy X10 release remains excluded because pi-tui cannot identify it for selection.
59
+ - Fixed main-chat model fallback to classify provider failures consistently with workflows, advance rejected credentials and incompatible or unavailable models to the next candidate, and restore the user-selected model at the next turn without overriding an explicit `/model` choice. A failure that requesting the same model again cannot repair leaves that model out of the chain for the rest of the turn at every reasoning level, while transient rate-limit and transport failures keep those reasoning variants. A context overflow compaction cannot resolve now advances the chain instead of ending the turn, a reasoning-level change no longer strands the session on the fallback model, and gRPC `ResourceExhausted` errors are retried like other transient failures ([#2170](https://github.com/bastani-inc/atomic/issues/2170)).
60
+ - Fixed a GitHub Copilot `openai-responses` session hard-stopping with `400 invalid_request_body` once a replayed tool call entered its context. The outbound sanitizer treated an *absent* `function_call.id` the same as a malformed one and synthesized a replacement from `call_id`; across a model-identity mismatch that value was always exactly 64 characters, the server rejected it, and because the value is a pure function of the tool call every resend rebuilt the same rejected identifier. An absent id is now left absent, only a present malformed id is repaired, and the synthesized-length budget and validator agree on a maximum of 63 characters ([#2204](https://github.com/bastani-inc/atomic/issues/2204)).
61
+ - Fixed a `null` request-header suppression marker being discarded instead of suppressing the provider default header. pi documents a `null` value in `ProviderHeaders` as suppressing the provider or API default header of the same name, but Atomic narrowed the type and enforced the narrowing at runtime in two places, so the default was sent anyway and a header map of only suppression markers arrived as `{}`. Both filters are gone. This was never reachable from `models.json`, whose schema rejects `null`; the marker has to come from pi's catalog headers, credential-derived request auth, or the `before_provider_headers` hook. The agent-session filter also affected compaction, auto-compaction, post-tool compaction, and branch-summary requests.
62
+ - Fixed the model list widening to a provider's whole built-in catalog after an extension registered an additive provider override, so a GitHub Copilot account entitled to one model could be offered every catalog model. Republishing the model list now carries the previous availability projection across by model ID, including an empty one, and a registration exposes a provider's catalog provisionally only when it is what newly configures the provider.
63
+ - Fixed registration-triggered offline catalog refreshes racing newer credential-resolved refreshes, so configured `$ENV` and `!command` credentials remain authoritative ([#2318](https://github.com/bastani-inc/atomic/issues/2318)), and fixed `atomic auth check --no-refresh` resolving command-backed API keys as configured values rather than treating `!command` as a literal credential. `--json` no longer labels an unresolved model as its provider, and `print-api-key` consistently rejects `--min-expiry` before or after a `--` terminator.
64
+ - Fixed compaction across the board: manual `/compact` keeps agent events live, cancels unfinished automatic compaction safely, and then runs the requested compaction instead of rejecting it or returning an automatic boundary with different parameters; input queued during manual compaction sends after completion; a response truncated before its requested output limit gets one compact-and-retry attempt while output-cap stops retain bounded direct continuation; a stale automatic post-compaction retry no longer resumes after a manual `/compact`; a short transcript with repeated below-cap truncations no longer retries compaction more than once; and `ChatSessionHost` no longer leaves queued prompts stuck when compaction is cancelled or fails.
65
+ - Fixed a chat surface built on `ChatSessionHost` — the workflow stage chat, and any extension pane using it — showing no assistant text when opened onto a session that was already streaming. A host mounted part-way through a turn saw neither the `message_start` nor the fragments that had already gone past. A host now adopts the session's in-flight assistant message when it mounts and continues it with later deltas, and streaming consumers assemble into their own copy of the message rather than mutating the provider's live partial. `ChatSessionHost` also no longer tail-windows settled assistant rows while a later answer streams.
66
+ - Fixed in-process child sessions losing their admission-issued nesting depth and delegation limit; `SubagentChildPolicy` carries both the admitted `depth` and the effective `maxSubagentDepth` ([#2220](https://github.com/bastani-inc/atomic/pull/2220), regression from [#2205](https://github.com/bastani-inc/atomic/pull/2205)).
67
+ - Reduced redundant repaints of a Ctrl+O-expanded live subagent widget, which were scrolling the chat window to the bottom and clearing terminal scrollback during a run. Progress is now published only at milestones that change what the widget shows. A genuine above-fold milestone change can still require that redraw when the dock plus the live widget exceed the terminal height; that path is upstream (earendil-works/pi#4785, #7194) ([#2213](https://github.com/bastani-inc/atomic/pull/2213), regression from [#2205](https://github.com/bastani-inc/atomic/pull/2205)).
68
+ - Fixed the scroll anchor in `ScrollableComponentViewport` drifting when its content changes height. The offset is now re-derived from the anchored row rather than compensated only on growth, and a windowed component can report a row map (`rowSegments`) identifying each run of rows by the entry that produced it, so a compaction that deletes entries above the viewer still leaves them on the entry they were reading; if that entry was compacted away, the viewer lands on the nearest surviving entry above it ([#2214](https://github.com/bastani-inc/atomic/pull/2214), regression source [#2205](https://github.com/bastani-inc/atomic/pull/2205)).
69
+ - Fixed workflow runs awaiting human input to use the blue `?` indicator in the BACKGROUND panel, `/workflow connect` picker, and `/workflow status` listing, including prompts raised by hidden nested workflow children; the indicator returns to the run's current state when the prompt resolves.
70
+ - Release archives no longer ship packages built for a different architecture. Every archive was produced on one Linux x64 runner whose `node_modules` was copied verbatim, so 0.9.12's arm64 archives both contained `@esbuild/linux-x64`. The build now prunes the `@embedded-postgres` leaves that cannot run on the archive being staged, then fails if any staged package's own `os`/`cpu`/`libc` declaration is incompatible ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
71
+ - Fixed extension event-bus subscriptions surviving session reload or disposal ([#7193](https://github.com/earendil-works/pi/issues/7193), [#7656](https://github.com/earendil-works/pi/pull/7656) by [@tudoroancea](https://github.com/tudoroancea)), and moved the public `isStaleExtensionContextError()` predicate and its marker to the host beside the error path, so session replacement and reload guards cannot drift from host wording.
72
+ - Fixed image blocks returned by builtin and extension tools entering history at their original size; they now honor `images.autoResize` after `tool_result` handlers run, and a failed conversion leaves the original intact. Fixed same-state `ctx.ui.setToolsExpanded()` calls still traversing the transcript, extension-facing `ModelRegistry.complete()` bypassing the active model runtime, and custom editors installed through `ctx.ui.setEditorComponent()` not inheriting the default autocomplete dropdown limit.
73
+ - Fixed bare exact `--model` IDs shared by providers choosing catalog order; Atomic uses the sole authenticated matching provider or reports an ambiguity with fully qualified choices ([#7327](https://github.com/earendil-works/pi/issues/7327)). Fixed `/model <name>` and `/scoped-models` waiting for remote catalog refreshes before using cached models ([#7153](https://github.com/earendil-works/pi/issues/7153), [#7443](https://github.com/earendil-works/pi/issues/7443)), and project `retry.provider` overrides discarding unmodified global provider retry fields ([#7572](https://github.com/earendil-works/pi/issues/7572)).
74
+ - Fixed credential-resolved model endpoints — including GitHub Copilot Business and Enterprise hosts — falling back to the catalog endpoint for Verbatim Compaction, branch summaries, MCP sampling, and direct web summaries ([#6768](https://github.com/earendil-works/pi/issues/6768), [#7579](https://github.com/earendil-works/pi/issues/7579)).
75
+ - Fixed Windows fallback `find` glob patterns with paths returning no results when `fd` uses native separators ([#6817](https://github.com/earendil-works/pi/issues/6817)), `find` results at filesystem roots losing their first segment ([#6104](https://github.com/earendil-works/pi/issues/6104), [#7569](https://github.com/earendil-works/pi/pull/7569)), Git Bash, MSYS, Cygwin, and WSL drive paths resolving against the current Windows drive ([#7064](https://github.com/earendil-works/pi/issues/7064), [#7547](https://github.com/earendil-works/pi/issues/7547)), and linked project session directories being omitted from the session picker ([#7552](https://github.com/earendil-works/pi/issues/7552)).
76
+ - Fixed standalone x64 binaries failing to start on pre-Haswell CPUs that lack AVX2/BMI2 by using Bun's baseline target, including musl archives ([#7390](https://github.com/earendil-works/pi/issues/7390)), malformed package-manifest resource fields blocking valid resources or crashing startup ([#7187](https://github.com/earendil-works/pi/issues/7187)), Git package updates left incomplete after `git clean` fails ([#7570](https://github.com/earendil-works/pi/issues/7570)), and transient management requests not being retried ([#7632](https://github.com/earendil-works/pi/issues/7632)).
77
+ - Fixed native macOS `Cmd+V` so clipboard images paste into the editor without duplicate image inserts from terminal key repeats ([#2186](https://github.com/bastani-inc/atomic/issues/2186)), and reduced automatic terminal-theme detection latency by starting color-scheme and background probes together.
78
+
79
+ ### Removed
80
+
81
+ - Removed background bash jobs and the `async` parameter from the `bash` tool. Bash commands always run in the foreground; use a separate shell or process manager when a command must outlive the tool call. Polling and cancellation commands and automatic completion follow-ups are gone.
82
+ - Removed the Ctrl+X shortcut for copying the last agent message; `/copy` still copies it to the clipboard and confirms in the status line.
83
+ - Removed the `tsx` dependency from the shipped runtime. The Intercom broker's Node path runs on Atomic's bundled `jiti` loader, which is dependency-free pure JavaScript. `tsx` was the only thing pulling `esbuild`, so this removes `esbuild`, its 26 platform packages, and `fsevents` from `npm-shrinkwrap.json` and from every release archive — about 11.5 MB across 72 files. Worth noting for extension authors: TypeScript reached through the Node broker path is now transpiled by jiti (Babel-based) rather than esbuild, and jiti defaults JSX support and `tsconfig` path aliases to off while enabling legacy decorators. An extension that resolved `tsx` from the bundled `node_modules` was relying on an undocumented dependency and will no longer find it ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
84
+ - Removed the Atomic-only workflow custom-terminal mouse-scroll control from the isolated engine protocol and host terminal-mode arbiter; remote overlays retain the typed autowrap control only. Focused workflow overlays leave `ctrl+t` to the host `app.thinking.toggle` action, while the tree selector still receives the same key through `app.tree.filter.noTools`. Fullscreen pi-tui owns application selection over overlays; copy still uses OSC 52, and terminals that refuse OSC 52 writes require the modifier-drag bypass (Shift/Option, as provided by the terminal).
85
+
5
86
  ## [0.9.13-alpha.4] - 2026-08-13
6
87
 
7
88
  ### Added
@@ -4,6 +4,19 @@ All notable changes to the `@bastani/i-have-adhd` extension will be documented i
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.13] - 2026-08-13
8
+
9
+ Cumulative release of the `0.9.13-alpha.2` prerelease. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease section below.
10
+
11
+ ### Added
12
+
13
+ - Added the upstream `i-have-adhd` skill and Atomic extension as a bundled first-party package, with `/i-have-adhd [on|off]`, the `--no-adhd` startup flag, the `.i-have-adhd-off` agent-directory flag file, and the `stop adhd mode` / `normal mode` stop phrases.
14
+
15
+ ### Changed
16
+
17
+ - ADHD-friendly output is on by default for new sessions, and saved per-session state survives restarts, branches, and compaction.
18
+ - The footer status reads `ADHD Mode` and appears only while the mode is on.
19
+
7
20
  ## [0.9.13-alpha.2] - 2026-08-12
8
21
 
9
22
  ### Added
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/i-have-adhd",
3
- "version": "0.9.13-alpha.4",
3
+ "version": "0.9.13",
4
4
  "private": true,
5
5
  "description": "Atomic extension that shapes responses for readers with ADHD. Fork of: https://github.com/ayghri/i-have-adhd",
6
6
  "contributors": [
@@ -4,6 +4,32 @@ All notable changes to the `pi-intercom` extension will be documented in this fi
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.13] - 2026-08-13
8
+
9
+ Cumulative release of the `0.9.13-alpha.1` – `0.9.13-alpha.3` prereleases. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease sections below.
10
+
11
+ ### Breaking Changes
12
+
13
+ - Removed unique-ID-prefix targeting. `send`, `ask`, and `reply` now accept only an exact full session ID or an exact case-insensitive session name.
14
+
15
+ ### Added
16
+
17
+ - Added the runtime `join` and `leave` actions for named group membership. Joining updates broker presence without changing the session ID, keeps `send`/`ask` group-isolated, lets later subagents inherit the joined group, and reports success only after broker acknowledgement. `default` remains explicit, while `true` and `auto` stay reserved for generated subagent groups ([#2334](https://github.com/bastani-inc/atomic/issues/2334)).
18
+
19
+ ### Changed
20
+
21
+ - Intercom displays full session and message IDs everywhere: list rows, the session-list overlay, inbound message headers, reply-to lines, message-id result badges, and unnamed-session `subagent-chat-<id>` aliases.
22
+ - In-process child identities and supervisor capabilities arrive through typed admission policy and are captured on each `IntercomClient` at connect time instead of being read from environment for every message. A descendant cannot inherit a parent's supervisor grant through process environment; legacy Atomic/Pi bridge metadata remains available for older hosts ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
23
+ - Detached broker processes now receive `AI_AGENT=atomic` for generic child-process attribution.
24
+
25
+ ### Fixed
26
+
27
+ - Fixed the broker failing to start on standalone-binary installs, where every `intercom` call and every `subagent` delegation failed with `Intercom not connected: Intercom broker exited before startup with code 1`. The detached broker never inherits the host extension loader's `@bastani/atomic` alias and release archives ship no physical copy of that optional peer, so group resolution now reads `ATOMIC_INTERCOM_GROUP` (and the legacy `PI_INTERCOM_GROUP`) locally instead of importing the host package ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
28
+ - Broker startup is far faster on every platform, because dropping that import keeps the whole coding-agent module graph out of it: measured spawn-to-socket-connectable startup went from 1104 ms minimum / 1318 ms average to 85 ms / 96 ms on Node with tsx, and from 252 ms / 260 ms to 17 ms / 18 ms on Bun. Readiness now polls at 10 ms with bounded backoff up to the previous 100 ms interval, and the overall startup timeout is unchanged ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
29
+ - Broker stderr is no longer discarded. It is captured to `broker.log` in the agent's intercom directory, and both the "exited before startup" error and the readiness-timeout error quote the log path and a bounded tail of that output. The log is capped at 8 KiB by the broker itself, installed by the entrypoint's first import so a dependency cannot write ahead of the cap, and the cap covers `process.stderr.write`, `console.error`/`console.warn`, and default fatal printing for uncaught exceptions and unhandled rejections ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
30
+ - Fixed the session-list overlay clipping full session IDs at narrow terminal widths by wrapping IDs onto dim rows and marking unavoidable truncation with a visible ellipsis; inline sender and reply-to IDs now also signal overflow.
31
+ - Fixed relay and detach-handshake callbacks that finish after an extension reload turning a late delivery into an unhandled rejection. Stale event-bus emissions and subscription cleanup are best-effort, and stale-context detection uses the host's exported predicate instead of a duplicated error-message marker.
32
+
7
33
  ## [0.9.13-alpha.3] - 2026-08-13
8
34
 
9
35
  ### Breaking Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/intercom",
3
- "version": "0.9.13-alpha.4",
3
+ "version": "0.9.13",
4
4
  "private": true,
5
5
  "description": "Atomic extension providing a private coordination channel between parent and child agent sessions. Fork of: https://github.com/nicobailon/pi-intercom",
6
6
  "contributors": [
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.9.13] - 2026-08-13
11
+
12
+ Cumulative release of the `0.9.13-alpha.1` – `0.9.13-alpha.2` prereleases. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease sections below.
13
+
14
+ ### Changed
15
+
16
+ - In-process subagents receive MCP direct-tool selection through typed admission policy: an omitted selection preserves MCP configuration defaults, a list selects exact server/tool entries, and an empty list disables direct tools. The process-era environment bridge is gone ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
17
+ - MCP server processes and npm/Glimpse resolver probes now receive `AI_AGENT=atomic` for generic child-process attribution; the reserved marker overrides a configured `AI_AGENT` value.
18
+
19
+ ### Fixed
20
+
21
+ - Restored credential-resolved endpoints for MCP sampling requests, so GitHub Copilot Business and Enterprise accounts keep their own endpoint alongside dynamic API keys and request headers ([#7579](https://github.com/earendil-works/pi/issues/7579)).
22
+ - Fixed image blocks returned by MCP tools bypassing the host's `images.autoResize` processing before they enter session history.
23
+ - Fixed deferred MCP initialization's stale-context check by consuming the host's exported predicate instead of copying its error-message marker.
24
+
10
25
  ## [0.9.13-alpha.2] - 2026-08-12
11
26
 
12
27
  ### Changed
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/mcp",
3
- "version": "0.9.13-alpha.4",
3
+ "version": "0.9.13",
4
4
  "private": true,
5
5
  "description": "Atomic extension that adapts MCP (Model Context Protocol) servers into the coding agent. Fork of: https://github.com/nicobailon/pi-mcp-adapter",
6
6
  "contributors": [
@@ -2,6 +2,47 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.13] - 2026-08-13
6
+
7
+ Cumulative release of the `0.9.13-alpha.1` – `0.9.13-alpha.3` prereleases. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease sections below.
8
+
9
+ ### Breaking Changes
10
+
11
+ - **Subagents no longer run in OS child processes, and no longer run in the background.** Every call executes in the foreground as an in-process child of the parent session. The `subagent` tool rejects `async: true`, `/run --bg` and the related background slash flags are gone, and the `asyncByDefault` and `forceTopLevelAsync` settings have been removed — delete those keys from user configuration. `/run` and `/parallel` return their results directly; foreground Intercom coordination and resumable interrupt/resume controls remain ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
12
+ - **Removed CHAIN execution mode from the `subagent` tool.** Only SINGLE (`{agent, task?, progress?}`) and top-level PARALLEL (`{tasks: [...], concurrency?, worktree?}`) remain. The `chain` parameter is gone from the schema, so a call that still passes it is rejected by ordinary schema validation rather than by a migration shim. Also removed with no replacement: sequential chain steps, static parallel steps inside a chain, dynamic fan-out (`expand` / `collect` / `as` / `{outputs.name}`), the `{previous}` and `{chain_dir}` template variables and chain-scoped `{task}` substitution, the `chainName` and `chainDir` parameters, and saved chain definitions in `.chain.md` / `.chain.json`. Migrate a sequential chain to successive `subagent` calls that pass each step's result forward in the task text, and an in-chain parallel step to a top-level PARALLEL call.
13
+ - **Removed the `/chain` and `/run-chain` slash commands.** `/run` and `/parallel` are unchanged apart from the dropped `--bg` flag. Re-express a saved `.chain.md` workflow as `/run` and `/parallel` invocations, or as an `@bastani/workflows` workflow, which keeps first-class sequential composition through `ctx.chain(...)`.
14
+ - **Action required: delete leftover `.chain.md` files from your agents directories.** Saved-chain discovery is gone, so agent discovery no longer recognises — or skips — the `.chain.md` suffix. A leftover file carries `name` and `description` frontmatter, so it now loads as an ordinary agent and appears in `subagent list`, `/run` completions, and agent management.
15
+ - Removed the `ATOMIC_SUBAGENT_*` process-era environment bridge variables and the synthesized numeric child-result exit-code protocol (`0/1/-1/-2/143`). Child identity, policy, supervisor capability, and terminal outcomes now cross typed admission; results use a required `status` (`ok | error | skipped | interrupted | continued`) plus `cause` and `stats` ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
16
+
17
+ ### Added
18
+
19
+ - Added the in-process subagent control plane and `InProcessChildRunner` foundation, backed by the Rust N-API registry, with typed statuses, session statistics, and bounded result envelopes ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
20
+
21
+ ### Changed
22
+
23
+ - In-process admission resolves child management and fanout capabilities, MCP direct-tool selection, Intercom identity, prompt boundaries, project-context and inherited-skill filtering, and the nesting depth limit as one typed policy carried into the session and the tool executor. A restricted child cannot create, update, or delete agent definitions, fanout authorization cannot be widened by a descendant, and a supervisor grant is never inherited through environment ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
24
+ - Nested children route live `interrupt` and cold `resume` through the Rust control plane. Nested event and control records use an in-memory host route while keeping the validated file shape for cold-start compatibility, session JSONL is flushed before forced interruption, and the former 200 ms nested-control polling loop is replaced by event-driven delivery ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
25
+ - Children advance through their model-fallback ladder via the SDK session's `fallbackModels`, the exact classification, same-model retry, and candidate-advancement behavior main chat and workflow stages converged on. Pre-spawn auth filtering still builds the ladder, and results report the effective `model`, `attemptedModels`, and skipped pre-spawn attempts ([#2170](https://github.com/bastani-inc/atomic/issues/2170), [#2188](https://github.com/bastani-inc/atomic/issues/2188)).
26
+ - Unnamed subagent sessions expose runtime-only `subagent-chat-<full-id>` Intercom aliases, so supervisor targeting uses the full session ID.
27
+ - Subagent worktree Git and setup-hook commands and optional global npm probes now receive `AI_AGENT=atomic` for generic child-process attribution, without mutating caller-supplied environment objects.
28
+
29
+ ### Fixed
30
+
31
+ - Fixed a fork-context subagent ignoring its agent's configured model. The selected candidate was only ever a `provider/model[:thinking]` string, so nothing reached the child session's `model` argument and the session fell back to the model in the session file — for a fork, the parent's. A child declaring `openai-codex/gpt-5.6-luna:max` therefore ran every turn on the parent's model, and an explicit `model:` override lost its first attempt the same way. The candidate is now resolved against the model registry and applied to the child session together with its thinking level, for fresh and fork contexts across single, parallel, and resume paths.
32
+ - Fixed every `subagent` action being refused with "Subagent fanout is not authorized for this child." for a child without fanout authorization. The fanout check ran before the management branch, so the observing actions — `list`, `get`, `status`, `doctor` — were rejected with a message about delegation they do not perform, and mutating management was refused by a gate the bug made unreachable. Those four now pass, while `resume` and `interrupt` correctly receive the fanout refusal ([#2220](https://github.com/bastani-inc/atomic/pull/2220), regression from [#2205](https://github.com/bastani-inc/atomic/pull/2205)).
33
+ - Fixed the in-process depth guard and nested workflow-stage children. Admission-issued child depth travels in the typed policy into every path, an agent definition's narrower `maxSubagentDepth` is preserved across cold reload and resume, and in-process children load the bundled package resources needed to register `subagent` instead of starting with only the base built-in tools ([#2220](https://github.com/bastani-inc/atomic/pull/2220), regression from [#2205](https://github.com/bastani-inc/atomic/pull/2205)).
34
+ - Reduced redundant live subagent repaints by publishing progress only for widget-visible milestones. The runner had published `AgentProgress` from a catch-all over every child session event, including streaming deltas, so a subagent expanded with Ctrl+O repainted for the whole run, and each repaint above the terminal fold costs a pi-tui full redraw that clears scrollback. Measured against a 20-second replay in tight geometry, scrollback clears drop from 23 to 3. A genuine above-fold milestone change can still require that redraw; that path is upstream (earendil-works/pi#4785, #7194) ([#2213](https://github.com/bastani-inc/atomic/pull/2213), regression from [#2205](https://github.com/bastani-inc/atomic/pull/2205)).
35
+ - Fixed running widgets and result rows dropping the child's effective reasoning level and Codex fast-mode marker. Resolved model, thinking, and applied fast-mode metadata now travel from launch through fallback to completion, and workflow-stage children keep the real orchestration context so eligible requests get `service_tier: "priority"` ([#2335](https://github.com/bastani-inc/atomic/issues/2335), [#2336](https://github.com/bastani-inc/atomic/issues/2336)).
36
+ - Fixed progress and status lines stripping the provider prefix from the model name, so a child rendered as `claude-fable-5` where the main chat showed `anthropic/claude-fable-5`. The full model id is displayed, including every segment of a routed id; known thinking suffixes are still split into the `thinking <level>` label.
37
+ - Fixed `/run`, `/parallel`, and prompt-template requests waiting forever when an extension reload or session replacement made their response runtime stale after a long child run. Stale drops are classified through the host's exported predicate and reject the request's settlement path, bridge shutdown uses a distinct terminal error so ordinary deactivation renders a failure result, and completion, authorization, notification, and continuation paths all consume the host predicate instead of copying its marker.
38
+ - Fixed in-process parallel siblings colliding on the same canonical identity and terminal artifact path, and fixed repeated collapsed-tool-output requests from launch paths forcing an already-collapsed host transcript to update.
39
+ - Exposed `registerPromptTemplateBridgeRequestSettlement` from `@bastani/subagents` for the separately installed `pi-prompt-template-model` emitter, which owns a different extension runtime and cannot be registered by Atomic.
40
+
41
+ ### Removed
42
+
43
+ - Removed every remaining OS child-process code path from subagent execution: the detached jiti async runner and its twelve `subagent-runner*` modules, the `async-execution-*` spawn layer, the async event journal, the idle/wall attempt watchdog, the stdout drain grace, the CLI spawn resolver, the environment-bridge builder, and the post-exit stdio guard ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
44
+ - Removed every chain-only implementation surface: the chain execution engine and its step runners, chain output bindings and named-output resolution, the chain serializer and saved-chain discovery, the saved-chain slash mapping, chain TUI graph rendering, chain reporting in `subagent doctor`, and the chain types, results, settings, and formatters. Agent discovery now treats every `.md` file in an agents directory uniformly.
45
+
5
46
  ## [0.9.13-alpha.3] - 2026-08-13
6
47
 
7
48
  ### Breaking Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/subagents",
3
- "version": "0.9.13-alpha.4",
3
+ "version": "0.9.13",
4
4
  "private": true,
5
5
  "description": "Atomic extension for delegating tasks to subagents with parallel execution. Fork of: https://github.com/nicobailon/pi-subagents",
6
6
  "contributors": [
@@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.13] - 2026-08-13
8
+
9
+ Cumulative release of the `0.9.13-alpha.2` prerelease. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease section below.
10
+
11
+ ### Changed
12
+
13
+ - GitHub, credential-store, and Bun subprocesses now receive `AI_AGENT=atomic` for generic child-process attribution.
14
+ - Query rewriting and summary-review model calls now go through Atomic's model runtime, so registered custom providers and resolved request authentication apply.
15
+
16
+ ### Fixed
17
+
18
+ - Frames and thumbnails returned by `fetch_content` now honor the host's `images.autoResize` processing before they enter session history.
19
+ - Background content fetches that complete after an extension reload no longer throw through stale runtime handles. Non-stale failures still raise a visible error notification, pending state stays alive until notification admission settles, and stale-context checks use the host's exported predicate instead of a copied error-message marker.
20
+
7
21
  ## [0.9.13-alpha.2] - 2026-08-12
8
22
 
9
23
  ### Changed
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/web-access",
3
- "version": "0.9.13-alpha.4",
3
+ "version": "0.9.13",
4
4
  "private": true,
5
5
  "description": "Atomic extension for web search, URL fetching, GitHub repo cloning, PDF/video extraction. Fork of: https://github.com/nicobailon/pi-web-access",
6
6
  "contributors": [
@@ -6,6 +6,52 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.9.13] - 2026-08-13
10
+
11
+ Cumulative release of the `0.9.13-alpha.1` – `0.9.13-alpha.4` prereleases. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease sections below.
12
+
13
+ ### Breaking Changes
14
+
15
+ - Custom workflow UI components must return `true` when they consume input and `false` when they do not. In fullscreen mode an unhandled result lets the transcript process matching viewport navigation keys instead of swallowing them.
16
+ - Added `failed` to the `ctx.exit()` status union. An author-initiated failed exit persists its reason and partial declared outputs, returns the discriminated `{ exited: true, status: "failed" }` child result instead of throwing, and defaults to non-resumable unless `resumable: true` is set. Downstream exhaustive switches over `WorkflowExitStatus` must handle it ([#2242](https://github.com/bastani-inc/atomic/issues/2242)).
17
+ - Workflow `runId` and `stageId` targets never accepted prefixes. Run ids require the full 36-character UUID and stage ids and names match whole; the README claims to the contrary are corrected.
18
+
19
+ ### Added
20
+
21
+ - Added four user-initiated lifecycle notices — `started`, `paused`, `quit`, and `resumed` — so the main chat learns when a top-level background run begins, stops, or picks back up. Each travels the same steer delivery, capped-backoff retry, and notice-card path as the existing failure notice, so an agent waiting on a background run no longer mistakes a deliberate stop for work still in progress. The paused and quit cards state that the stop was user-requested and tell the model not to resume or take over unless asked ([#2177](https://github.com/bastani-inc/atomic/issues/2177)).
22
+ - Only user actions raise those notices, and one request produces exactly one notice. `/workflow <name>`, `/workflow pause`, `/workflow quit`, and `/workflow resume` notify; the matching tool calls stay silent because the tool result already reports them, and engine-internal transitions stay silent. Each notice carries an origin ("which you started" or "which the user started", recorded once at dispatch and inherited by a continuation) and an actor. The default `workflowNotifications.notifyOn` becomes `["started", "completed", "failed", "blocked", "awaiting_input", "paused", "quit", "resumed"]`; a config that pins `notifyOn` keeps exactly the kinds it lists ([#2177](https://github.com/bastani-inc/atomic/issues/2177)).
23
+ - Added the shared "Jump to bottom" follow indicator to workflow stage chat when its transcript is scrolled away from the live end, while preserving composer and footer rows in tight overlays.
24
+
25
+ ### Changed
26
+
27
+ - Rebuilt the workflow graph overlay on pi-tui 0.84.1's `VStack` and `ScrollView` layout primitives. The graph body adapts to terminal height and resize, supports vertical wheel scrolling and a draggable scrollbar, and keeps wide-graph horizontal panning and existing prompt and navigation key handling ([#2223](https://github.com/bastani-inc/atomic/issues/2223)).
28
+ - Model fallback attempt metadata now includes per-attempt input and output tokens, cache reads and writes, provider-reported total cost, and meaningful assistant-turn counts when usage is available ([#2197](https://github.com/bastani-inc/atomic/issues/2197)).
29
+ - Stage resource loading carries typed subagent policy in session options instead of mutating process-global child environment flags during reload, so concurrent stage creation preserves tool allowlists and orchestration limits ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
30
+ - Updated the Ralph research stage model configuration: the primary model moves from `openai-codex/gpt-5.6-luna:max` to `anthropic/claude-opus-5:high`, and the fallback chain is rebuilt around high and xhigh thinking levels, adding Kimi K3 and `openrouter/sakana/fugu-ultra:high`.
31
+ - Extended workflow-authoring guidance with a stacked implementation-slices starter pattern targeting roughly 100–500 changed lines between verification points, each slice routed through a child lifecycle on an explicitly created branch, stopping at the first failed gate ([#2262](https://github.com/bastani-inc/atomic/issues/2262)).
32
+ - Updated authored-workflow model guidance to treat benchmark thinking levels as measurement settings, assign effort by stage role and failure cost, require a compact `Stage | Model | Thinking | Role` declaration before launch, and reserve `max` for high-cost-of-error roles or explicit user requests ([#2203](https://github.com/bastani-inc/atomic/issues/2203)).
33
+ - Added bounded constructive-quorum deliberation to Goal and Ralph reviewer prompts: reviewers form independent preliminary verdicts, exchange evidence once over Intercom, and record evidence-backed verdict changes before the existing reducer counts final votes ([#2237](https://github.com/bastani-inc/atomic/issues/2237)).
34
+ - Workflow command, worktree Git and setup-hook, and Playwright CLI subprocesses now receive `AI_AGENT=atomic` for generic child-process attribution, without mutating caller-supplied environment objects.
35
+
36
+ ### Fixed
37
+
38
+ - Fixed long model turns losing their active stage session identity and root liveness when the process died between turn boundaries. Stage start is recorded before the first session checkpoint, that identity must persist before the first model use, and serialized unref'd 30-second checkpoints cover root and nested scoped stages. A checkpoint still in flight at shutdown is drained rather than abandoned, and a stage whose final durability checkpoint fails is recorded as failed instead of completed while its caller still receives the error and its concurrency slot is still released.
39
+ - Fixed exact workflow inspection returning `Run not found` after process loss even when DBOS retained a stale running, resumable root. Status, stages, stage, and transcript actions with a full run id, and `/workflow status <id>`, now hydrate only that DBOS root on a local miss, reconstruct its checkpoint DAG as read-only state, report stale owners as `crashed` with resume guidance, protect fresh foreign owners, and reject cyclic or nonreciprocal topology without claiming, transitioning, dispatching, or auto-resuming the run.
40
+ - Fixed stage model fallback end to end: transient failures retry the current model with bounded exponential backoff from `settings.retry` before advancing through `fallbackModels`, unrepairable failures advance immediately, a same-candidate retry no longer loses the stage prompt or stops after a completed assistant message, an eagerly created session walks the whole chain, concurrent callers join the creation already in flight instead of starting a second walk, and a controlled pause no longer aborts the stage or strands its replacement objective ([#2170](https://github.com/bastani-inc/atomic/issues/2170)).
41
+ - Fixed workflow stages being unable to use the `subagent` tool at all, and nested subagents in stage sessions losing the bundled `subagent` extension. Stages are top-level sessions rather than subagent children, so stage policy sets `fanoutAuthorized: true`, and in-process child resource loading carries the bundled package roots while disabling only the workflow extension's repeated stage lifecycle. Nesting remains bounded by the typed depth policy and Rust admission's five-level ceiling ([#2220](https://github.com/bastani-inc/atomic/pull/2220), regression from [#2205](https://github.com/bastani-inc/atomic/pull/2205)).
42
+ - Fixed the `DISPATCHED` confirmation panel being destroyed by any workflow input containing a newline. Values were truncated by visible width, which a control character does not have, so an embedded newline survived and emitted physical lines no border wrapped — and multi-line `prompt` or `acceptance_criteria` input is ordinary, so this fired for most real launches. String values and the object/array JSON projection now collapse control characters, `U+2028`, and `U+2029` to single spaces before truncation, which also stops escape sequences in an input value injecting ANSI styling into the chat surface.
43
+ - Fixed fullscreen workflow graph and stage-chat mouse routing. Focused overlays receive SGR/X10 wheel and click press/release sequences through the host's bounded custom-input reply channel before pi-tui's alternate-screen viewport, restoring graph scrolling and click-to-attach without a workflow-owned TTY-tracking seam ([#2303](https://github.com/bastani-inc/atomic/issues/2303)).
44
+ - Fixed a stage chat opened on a stage that was already mid-turn showing an empty transcript. The chat now seeds itself from the stage session's in-flight assistant message when it mounts, and later deltas continue that same message.
45
+ - Fixed the stage-chat jump-to-bottom indicator: it stayed hidden in paused and read-only archive chats, and clicking it scrolled the host transcript instead of returning that stage chat to the live end ([#2370](https://github.com/bastani-inc/atomic/issues/2370)).
46
+ - Fixed graph overlay rendering details: switcher wheel input scrolling an obscured graph, the scrollbar covering the final graph column, lost live vertical position in `ScrollView`, broken OSC-8 hyperlink terminators, corrupted geometry for unhosted overlays, node cards appending the Codex `fast` marker to dependency metadata ([#2337](https://github.com/bastani-inc/atomic/issues/2337)), and the statusline echoing the `i-have-adhd` badge ([#2341](https://github.com/bastani-inc/atomic/issues/2341), [#2223](https://github.com/bastani-inc/atomic/issues/2223)).
47
+ - Fixed completed `ctx.exit()` runs losing the reserved returned-status convention, legacy child replay records losing their exit discriminator, and failed author-exit resume surfaces falling back to snapshot inspection instead of durable retry.
48
+ - Fixed late workflow messages and MCP scope cleanup that finish after an extension reload. Stale event-bus calls stop without retrying through stale APIs, stale-context guards consume the host's exported predicate, late-message routing rejects stale drops consistently for Intercom and generic batches, and active routes keep their normal fallback behavior.
49
+ - Fixed the inline workflow form editor not inheriting the host's `autocompleteMaxVisible` setting when Atomic installs it as a custom editor.
50
+
51
+ ### Removed
52
+
53
+ - Removed workflow-owned mouse-scroll reporting and attached-stage copy mode. Fullscreen pi-tui keeps application-owned drag and multi-click selection available over workflow overlays, and `ctrl+t` is left to the host keybindings. Copy still uses OSC 52; terminals that refuse OSC 52 writes require the modifier-drag bypass (Shift/Option, as provided by the terminal).
54
+
9
55
  ## [0.9.13-alpha.4] - 2026-08-13
10
56
 
11
57
  ### Added
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/workflows",
3
- "version": "0.9.13-alpha.4",
3
+ "version": "0.9.13",
4
4
  "private": true,
5
5
  "description": "Atomic extension for multi-stage workflow authoring and execution.",
6
6
  "contributors": [
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@bastani/atomic",
3
- "version": "0.9.13-alpha.4",
3
+ "version": "0.9.13",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bastani/atomic",
9
- "version": "0.9.13-alpha.4",
9
+ "version": "0.9.13",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@bastani/atomic-natives": "0.9.13-alpha.4",
12
+ "@bastani/atomic-natives": "0.9.13",
13
13
  "@dbos-inc/dbos-sdk": "4.24.16",
14
14
  "@earendil-works/pi-agent-core": "^0.84.1",
15
15
  "@earendil-works/pi-ai": "^0.84.1",
@@ -517,18 +517,18 @@
517
517
  }
518
518
  },
519
519
  "node_modules/@bastani/atomic-natives": {
520
- "version": "0.9.13-alpha.4",
521
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives/-/atomic-natives-0.9.13-alpha.4.tgz",
520
+ "version": "0.9.13",
521
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives/-/atomic-natives-0.9.13.tgz",
522
522
  "license": "MIT",
523
523
  "optionalDependencies": {
524
- "@bastani/atomic-natives-darwin-arm64": "0.9.13-alpha.4",
525
- "@bastani/atomic-natives-darwin-x64": "0.9.13-alpha.4",
526
- "@bastani/atomic-natives-linux-arm64-gnu": "0.9.13-alpha.4",
527
- "@bastani/atomic-natives-linux-arm64-musl": "0.9.13-alpha.4",
528
- "@bastani/atomic-natives-linux-x64-gnu": "0.9.13-alpha.4",
529
- "@bastani/atomic-natives-linux-x64-musl": "0.9.13-alpha.4",
530
- "@bastani/atomic-natives-win32-arm64-msvc": "0.9.13-alpha.4",
531
- "@bastani/atomic-natives-win32-x64-msvc": "0.9.13-alpha.4"
524
+ "@bastani/atomic-natives-darwin-arm64": "0.9.13",
525
+ "@bastani/atomic-natives-darwin-x64": "0.9.13",
526
+ "@bastani/atomic-natives-linux-arm64-gnu": "0.9.13",
527
+ "@bastani/atomic-natives-linux-arm64-musl": "0.9.13",
528
+ "@bastani/atomic-natives-linux-x64-gnu": "0.9.13",
529
+ "@bastani/atomic-natives-linux-x64-musl": "0.9.13",
530
+ "@bastani/atomic-natives-win32-arm64-msvc": "0.9.13",
531
+ "@bastani/atomic-natives-win32-x64-msvc": "0.9.13"
532
532
  },
533
533
  "engines": {
534
534
  "bun": ">=1.3.14",
@@ -536,8 +536,8 @@
536
536
  }
537
537
  },
538
538
  "node_modules/@bastani/atomic-natives-darwin-arm64": {
539
- "version": "0.9.13-alpha.4",
540
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-arm64/-/atomic-natives-darwin-arm64-0.9.13-alpha.4.tgz",
539
+ "version": "0.9.13",
540
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-arm64/-/atomic-natives-darwin-arm64-0.9.13.tgz",
541
541
  "license": "MIT",
542
542
  "os": [
543
543
  "darwin"
@@ -548,8 +548,8 @@
548
548
  "optional": true
549
549
  },
550
550
  "node_modules/@bastani/atomic-natives-darwin-x64": {
551
- "version": "0.9.13-alpha.4",
552
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-x64/-/atomic-natives-darwin-x64-0.9.13-alpha.4.tgz",
551
+ "version": "0.9.13",
552
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-x64/-/atomic-natives-darwin-x64-0.9.13.tgz",
553
553
  "license": "MIT",
554
554
  "os": [
555
555
  "darwin"
@@ -560,8 +560,8 @@
560
560
  "optional": true
561
561
  },
562
562
  "node_modules/@bastani/atomic-natives-linux-arm64-gnu": {
563
- "version": "0.9.13-alpha.4",
564
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-gnu/-/atomic-natives-linux-arm64-gnu-0.9.13-alpha.4.tgz",
563
+ "version": "0.9.13",
564
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-gnu/-/atomic-natives-linux-arm64-gnu-0.9.13.tgz",
565
565
  "license": "MIT",
566
566
  "os": [
567
567
  "linux"
@@ -575,8 +575,8 @@
575
575
  "optional": true
576
576
  },
577
577
  "node_modules/@bastani/atomic-natives-linux-arm64-musl": {
578
- "version": "0.9.13-alpha.4",
579
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-musl/-/atomic-natives-linux-arm64-musl-0.9.13-alpha.4.tgz",
578
+ "version": "0.9.13",
579
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-musl/-/atomic-natives-linux-arm64-musl-0.9.13.tgz",
580
580
  "license": "MIT",
581
581
  "os": [
582
582
  "linux"
@@ -590,8 +590,8 @@
590
590
  "optional": true
591
591
  },
592
592
  "node_modules/@bastani/atomic-natives-linux-x64-gnu": {
593
- "version": "0.9.13-alpha.4",
594
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-gnu/-/atomic-natives-linux-x64-gnu-0.9.13-alpha.4.tgz",
593
+ "version": "0.9.13",
594
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-gnu/-/atomic-natives-linux-x64-gnu-0.9.13.tgz",
595
595
  "license": "MIT",
596
596
  "os": [
597
597
  "linux"
@@ -605,8 +605,8 @@
605
605
  "optional": true
606
606
  },
607
607
  "node_modules/@bastani/atomic-natives-linux-x64-musl": {
608
- "version": "0.9.13-alpha.4",
609
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-musl/-/atomic-natives-linux-x64-musl-0.9.13-alpha.4.tgz",
608
+ "version": "0.9.13",
609
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-musl/-/atomic-natives-linux-x64-musl-0.9.13.tgz",
610
610
  "license": "MIT",
611
611
  "os": [
612
612
  "linux"
@@ -620,8 +620,8 @@
620
620
  "optional": true
621
621
  },
622
622
  "node_modules/@bastani/atomic-natives-win32-arm64-msvc": {
623
- "version": "0.9.13-alpha.4",
624
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-arm64-msvc/-/atomic-natives-win32-arm64-msvc-0.9.13-alpha.4.tgz",
623
+ "version": "0.9.13",
624
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-arm64-msvc/-/atomic-natives-win32-arm64-msvc-0.9.13.tgz",
625
625
  "license": "MIT",
626
626
  "os": [
627
627
  "win32"
@@ -632,8 +632,8 @@
632
632
  "optional": true
633
633
  },
634
634
  "node_modules/@bastani/atomic-natives-win32-x64-msvc": {
635
- "version": "0.9.13-alpha.4",
636
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-x64-msvc/-/atomic-natives-win32-x64-msvc-0.9.13-alpha.4.tgz",
635
+ "version": "0.9.13",
636
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-x64-msvc/-/atomic-natives-win32-x64-msvc-0.9.13.tgz",
637
637
  "license": "MIT",
638
638
  "os": [
639
639
  "win32"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/atomic",
3
- "version": "0.9.13-alpha.4",
3
+ "version": "0.9.13",
4
4
  "description": "Atomic coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "atomicConfig": {
@@ -83,7 +83,7 @@
83
83
  "prepublishOnly": "bun run clean && bun run build && bun run shrinkwrap"
84
84
  },
85
85
  "dependencies": {
86
- "@bastani/atomic-natives": "0.9.13-alpha.4",
86
+ "@bastani/atomic-natives": "0.9.13",
87
87
  "@dbos-inc/dbos-sdk": "4.24.16",
88
88
  "@earendil-works/pi-agent-core": "^0.84.1",
89
89
  "@earendil-works/pi-ai": "^0.84.1",