@bastani/atomic 0.9.40-alpha.2 → 0.9.40

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,36 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.40] - 2026-10-20
6
+
7
+ ### Breaking Changes
8
+
9
+ - Binding or switching a session no longer replays deliveries that a previous process left unfinished. SDK hosts call `session.startPendingRecovery()` and RPC clients send `start_pending_recovery` once they show the session. Until then, interrupted work stays pending ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
10
+ - Removed the bundled `subagent` tool's `kill` action. Replace `subagent({ action: "kill", id })` with `subagent({ action: "quit", id })`, which stops the child gracefully and keeps it resumable. Calls with `action: "kill"` or the earlier `action: "interrupt"` are rejected with an error that names `quit` as the replacement ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
11
+
12
+ ### Added
13
+
14
+ - Added `AgentSession.startPendingRecovery()`, the RPC `start_pending_recovery` command, and the `session_recovery_restore` and `session_recovery_replay` extension events. Extensions can now restore background work after a restart, decline to replay deliveries whose peer is gone, and defer deliveries they cannot decide on yet to the next resume without starting a turn ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
15
+ - Added the `typesafe/jev-1.14.0` classifier. Both direct TypeSafe classifiers, `typesafe/jev-latest` and `typesafe/jev-1.14.0`, now accept up to 262K tokens and PNG or JPEG images, for example through `models.classify()` in codemode. See [TypeSafe Jev](docs/providers.md#typesafe-jev).
16
+ - The bundled `subagent` tool now has workflow-style run control: `pause`, `resume` (with an optional `message`), and `quit`, with `all: true` for `pause` and `quit`. Pausing or quitting a parallel child still queued behind its concurrency limit keeps it from starting until you resume it. Paused, quit, interrupted, completed, and failed children resume from their own saved session under the same id and Intercom name, including children of a session you closed or switched away from (exit or crash, `/new`, `/resume` to another session, `/fork`). Subagents of a workflow stage that is paused or quit, including by Atomic exiting or a session switch, stay resumable too, and resuming the run after a restart restores them with the stage. With a `message`, a paused, quit, or interrupted child receives it once and then continues where it left off, and a completed or failed child receives it as one fresh prompt; without one, the child is asked to continue where it left off. Children cancelled for good (owner or batch cancellation, a `/tasks` stop), every subagent of a workflow stage that finished or whose run ended or was cancelled, including ones you paused or quit, and children reported gone after a restart are terminal, and `resume` on them returns an error that says why ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
17
+ - Background subagent launch cards show the child's latest state (running, paused, quit, interrupted, completed, failed, or terminal), also after you reopen the session (`/resume` or `atomic --session <id>`) or view a workflow stage's transcript. Expanding a card shows the end of the child's saved transcript. A resumed child continues in its original card, and replayed `pause`, `resume`, and `quit` calls render as their results ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
18
+ - Added per-process storage selection. `ATOMIC_STORAGE`, `ATOMIC_SESSIONS_STORAGE`, `ATOMIC_WORKFLOWS_JOURNAL`, `--storage '<json>'`, and `--storage-file <path>` take the same JSON selections as the storage settings, adapters and `secrets` included, so a host can start `atomic --mode rpc` children on their own store without editing settings. A process without them keeps using its settings, and `/resume` in each lists only its own store. Invalid or conflicting selections stop startup with a `StorageConfigError` naming the variable or flag. See [Selecting storage per process](docs/storage.md#selecting-storage-per-process) ([#3783](https://github.com/bastani-inc/atomic/issues/3783)).
19
+ - Added multi-node routing: Intercom brokers on different machines that select the same shared `storage` (in settings, `ATOMIC_STORAGE`, or `--storage`) now deliver messages to each other through that database. A message to a session on another machine arrives exactly like a local one, with the same sender identity, replies and asks, group rules, supervisor routes and save-before-delivered receipts. A send to a session that is offline, including one that quit cleanly in the last 7 days, is reported as queued for an offline session and delivered when it reconnects on any broker. Brokers coordinate only through the shared database and a polled wake-up signal; there is no broker-to-broker network connection. Without a shared `storage` selection, Intercom behaves as before.
20
+
21
+ ### Fixed
22
+
23
+ - Resuming a session with `atomic --session <id>` or `/resume` now shows the transcript before any recovery work runs, instead of leaving the screen blank while hidden agent turns replay messages from before the restart. Recovery runs afterwards and is visible in the transcript. A "Replaying N interrupted deliveries" line precedes any replayed turn, and a status line summarizes the result ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
24
+ - Resuming no longer starts agent turns on its own for stale queued messages or background task results. Results that an earlier process never delivered appear as cards without starting a turn. Messages from peers that no longer exist are not replayed; one notice tells you and the agent which peers are gone. Messages from a background subagent that was relaunched but has not reconnected yet are deferred instead, and the notice says it is not gone ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
25
+ - Intercom messages sent to a busy session are no longer lost when that session is killed or crashes before it goes idle: the recipient saves each message when it arrives, the sender sees `delivered` only after that save, and resuming the session with `atomic --session <id>` or `/resume` shows each saved message once. Like interrupted deliveries, a saved message starts a turn only when its sender is still connected; one from a gone sender is added once, in full, to the session history without starting a turn, and the recovery notice says the sender is gone; one whose sender cannot be checked is deferred to the next resume ([#3761](https://github.com/bastani-inc/atomic/issues/3761)).
26
+ - Fixed Windows rejecting Bash and PowerShell executables installed as Windows Store app aliases, such as those in `%LOCALAPPDATA%\Microsoft\WindowsApps`, as missing. Shell discovery and a configured `shellPath` now accept them ([upstream commit](https://github.com/earendil-works/pi/commit/28bea006be4adb950dcb4f86f9ee5be857bf74ff)).
27
+ - Fixed Windows PowerShell discovery when PowerShell is not on `PATH`: Atomic now also checks `%ProgramFiles%\PowerShell\7\pwsh.exe` and `%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe`. The legacy WSL `bash.exe` launcher is now recognized under the actual Windows directory, including installs on another drive or a renamed Windows directory ([#9490](https://github.com/earendil-works/pi/issues/9490)).
28
+ - JSONL sessions no longer stall when many sessions share a directory. Each append now rereads only its own session header instead of every session header in the directory ([#3780](https://github.com/bastani-inc/atomic/pull/3780) by [@darionco](https://github.com/darionco)).
29
+ - Opening or loading a session in a directory with many JSONL sessions no longer reads every session header, including the first lookup in a process and sessions created by another process.
30
+ - A resumed session no longer splits an extension tool call into an arguments-only card and a separate result card when the extension saved its own entries between them, and tool cards in an attached workflow stage chat now redraw when their renderer updates them ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
31
+ - Extension tool cards, including subagent cards, now use their extension renderers and current state when a session is opened with `atomic --session <id>`, instead of showing raw arguments. They also redraw as soon as their state changes, so an expanded subagent card shows the child's saved transcript and a resumed child updates in its original card without waiting for another screen redraw ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
32
+ - Fixed HTML export showing literal asterisks for Markdown bold and italic next to CJK punctuation ([#3353](https://github.com/earendil-works/pi/issues/3353), [#10154](https://github.com/earendil-works/pi/issues/10154))
33
+ - Fixed HTML export omitting nested tool calls (for example from codemode scripts), and not scrolling to the tool call when a tool result is selected in the tree
34
+
5
35
  ## [0.9.40-alpha.2] - 2026-10-20
6
36
 
7
37
  ### Fixed
@@ -4,6 +4,20 @@ All notable changes to the `pi-intercom` extension will be documented in this fi
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.40] - 2026-10-20
8
+
9
+ ### Added
10
+
11
+ - Added multi-node routing: Intercom brokers on different machines that select the same shared `storage` (in settings, `ATOMIC_STORAGE`, or `--storage`) now deliver messages to each other through that database. A message to a session on another machine arrives exactly like a local one, with the same sender identity, replies and asks, group rules, supervisor routes and save-before-delivered receipts. A send to a session that is offline, including one that quit cleanly in the last 7 days, is reported as queued for an offline session and delivered when it reconnects on any broker. Brokers coordinate only through the shared database and a polled wake-up signal; there is no broker-to-broker network connection. Without a shared `storage` selection, Intercom behaves as before.
12
+
13
+ ### Fixed
14
+
15
+ - On resume, Intercom messages interrupted by an exit are replayed only if their sender is connected again. Messages from a peer that is gone no longer start a hidden turn: they appear once as history in a visible notice that tells the agent the peer is gone. A resumed session that used Intercom re-registers right away. A resumed session or restored background subagent also keeps the Intercom session ID it had before the restart (unless a live session holds it), so peers can reach it by its name, by that ID, or by its Atomic session ID instead of getting `Session not found` ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
16
+ - Intercom now keeps an interrupted workflow run's targets with the restarted session that launched the run, so messages sent before `/workflow resume` are queued instead of failing with `Session not found`. If another session resumes the run, it takes over those targets, and the restarted session stops answering for the run ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
17
+ - A `send` or `ask` to a background subagent that its restarted owner has not restored yet now waits for it, whoever sends it: the session that owns it, a sibling subagent, a workflow stage, or another session in the subagent's group. This applies whether the message is addressed by the subagent's name, its Atomic session ID, or the Intercom session ID it had before the restart. The wait starts when the owning session starts, not only once its recovery has restored the subagent, and recovery takes the wait over without dropping or repeating a message. For the subagents of an interrupted workflow run's stages, the session that launched the run holds them while the run waits for `/workflow resume`, and the resumed stage takes the hold over, so a message sent in that interval is delivered once after the subagent reconnects. Waiting messages are delivered once each, in the order each sender sent them, as soon as the subagent registers again, and each sender gets its usual confirmation. A message still waiting after 20 seconds gets a "still being restored, try again" error; the owning session is told instead when the subagent was relaunched but has not reconnected. If the subagent did not survive the restart, waiting and later messages get an explicit "did not survive the restart and is gone" error instead of `Session not found`; senders other than the owner get it while the owning session stays connected to Intercom. If another Atomic session resumes the run, the messages waiting for its subagents get an error saying so. If the owning session disconnects, waiting messages get `Session not found`; a wait that nothing restores also ends after 60 seconds. Messages to a subagent while no Atomic process of its owner is running are not queued and get `Session not found` ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
18
+ - If Intercom cannot be reached when a session resumes, its interrupted Intercom messages are no longer discarded or attributed to peers that are gone. They stay pending without starting a turn, one notice says that Intercom was unreachable and the deliveries were deferred, and the next resume decides about them again. The same applies to messages from a background subagent that was relaunched but has not re-registered with Intercom yet: they are deferred, not dropped, and the subagent is not reported as gone ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
19
+ - Intercom messages that reach a busy session are no longer lost if that session is killed or crashes before it goes idle. The recipient saves each message to its session when it arrives, and the sender sees `delivered` only after that save. Resuming the session with `atomic --session <id>` or `/resume` shows every saved message it never showed or otherwise handled (a reply already returned to a waiting `ask` or a message it refused is not shown again), once each and in arrival order, after the transcript appears. Saved messages pass the same sender check as interrupted Intercom deliveries: only a message whose sender is connected again starts a turn; a message from a sender that is gone is added once, in full, to the session history without starting a turn, and the recovery notice says the sender is gone. A message whose sender cannot be checked is deferred until the session is opened again: Intercom was unreachable, or the sender is a relaunched subagent that has not reconnected yet. When the recipient does not confirm the save in time, the sender gets an explicit failure saying the outcome is uncertain instead of a false `delivered`, and a recipient that reconnects before confirming receives the message again without showing it twice, and its answer to an `ask` still reaches the waiting sender. Recipients from earlier Atomic versions keep the previous behavior, and so does an Intercom broker from an earlier version that is still running after an upgrade: upgraded sessions keep working with it and still save each message on arrival. Sessions started with `--no-session` are still not saved ([#3761](https://github.com/bastani-inc/atomic/issues/3761)).
20
+
7
21
  ## [0.9.40-alpha.1] - 2026-10-20
8
22
 
9
23
  ### Added
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/intercom",
3
- "version": "0.9.40-alpha.2",
3
+ "version": "0.9.40",
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": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/mcp",
3
- "version": "0.9.40-alpha.2",
3
+ "version": "0.9.40",
4
4
  "private": true,
5
5
  "description": "Atomic's pi-compatible MCP integration for server connections, OAuth, tools, resources, and terminal management.",
6
6
  "contributors": [
@@ -2,6 +2,37 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.40] - 2026-10-20
6
+
7
+ ### Breaking Changes
8
+
9
+ - Removed the `kill` action from the `subagent` tool. Replace `subagent({ action: "kill", id })` with `subagent({ action: "quit", id })`, which stops the child gracefully and keeps it resumable. Calls with `action: "kill"` or the earlier `action: "interrupt"` are rejected with an error that names `quit` as the replacement ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
10
+
11
+ ### Added
12
+
13
+ - Added workflow-style run control to the `subagent` tool: `pause` stops a child and holds its queued messages until resume, `quit` stops it gracefully, and `resume` continues it from its own saved session under the same child id, Intercom name, and group. `pause` and `quit` accept `all: true` and also reach parallel children still queued behind their concurrency limit, which then start only when resumed, and `resume` accepts an optional `message`: a paused, quit, or interrupted child receives it once as its next prompt and then continues where it left off, and a completed or failed child receives it as one fresh prompt. Without `message`, the child is asked to continue where it left off, including a completed or failed child. A resumed child of a parallel run waits for a slot under that run's concurrency limit, and keeps its `worktree: true` worktree until it finishes; a paused or quit child holds no slot, and its worktree is kept only while it has uncommitted or untracked changes or commits that are not in the run's base. Resume continues in a kept worktree, or recreates a removed one from the run's base; a resume that fails keeps the worktree, its changes, and its branch. Steering and follow-up messages a child had queued when it was paused or quit are delivered once, in order, when it resumes, before the resume `message`. An SDK session without a task host records its subagents the same way, so `pause`, `resume` and `quit` work there too, also after the session is reopened; a child it resumes runs in the background and reports through a completion notice. A child paused or quit before it read its task or the resume message keeps them, and resume delivers them. `id` accepts the child id, task id, Intercom name, or a single-child run id ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
14
+ - Paused, quit, interrupted, completed, and failed children can be resumed, including children of a session you closed or switched away from (Atomic exit or crash, `/new`, `/resume` to another session, `/fork`). Children cancelled for good (owner or batch cancellation, a `/tasks` stop, the removed `kill` action) or reported gone after a restart are terminal, and `resume` on them returns an error that says why ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
15
+ - Background subagent launch cards now show the child's latest state, also after you reopen the session (`/resume` or `atomic --session <id>`) or view a workflow stage's transcript: running, paused, paused with its workflow stage, quit, or interrupted (resumable), completed, failed, or terminal (killed, gone after a restart, or its workflow stage ended). Expanding a card shows the end of the child's saved transcript. A resumed child continues in its original card, marked resumed, and replayed `pause`, `resume`, and `quit` calls render as their results, or as errors when they were rejected ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
16
+
17
+ ### Changed
18
+
19
+ - Updated the bundled Cua Driver skill to upstream `cua-driver-rs-v0.36.0`. It now starts with an efficient loop: targeted `get_window_state` reads with `query`, acting by `element_token`, batching actions with `run_steps` or `run_script`, re-reading only changes with `since:"latest"`, and verifying at checkpoints instead of after every action. It also covers opening local files with `launch_app`, browser fallbacks when browser tools refuse in the background, and macOS editor recipes.
20
+ - When a workflow stage closes for good (the stage finished, or its run ended or was cancelled), every subagent it launched becomes terminal, whether running, paused, quit, completed, or failed, and `resume` on them returns an error that says their workflow stage ended. A quit child stays resumable only while the session or stage that launched it can still resume it. `quit` also accepts a child paused with its workflow stage, and `pause` reports such a child as already paused. Pausing or quitting a workflow run, Atomic exiting, switching sessions, and an interrupted stage leave the stage's children resumable: `resume` continues them, and resuming the run after Atomic restarts restores them with the stage ([#3760](https://github.com/bastani-inc/atomic/issues/3760)). A stage blocked by a recoverable failure, such as a rate limit or provider outage that leaves its run resumable, keeps its paused and quit subagents resumable until the run is killed, cancelled, or ends without staying resumable; then they end with the stage.
21
+
22
+ ### Fixed
23
+
24
+ - Background subagents that were still running when Atomic exited are now relaunched from their own sessions when you resume the session (`atomic --session <id>` or `/resume`) or resume a workflow stage that launched them. They keep their original Intercom name and group and get fresh supervisor authorization, and Intercom messages sent to it by any session in its group wait for it from the moment the resumed session starts (or, for a stage's subagent, from the moment the interrupted run becomes addressable) until it has been restored. Only the session that launched a child restores it: a fork of that session (`/fork`, `atomic --fork`, or a branched session) copies the child's record but never relaunches, waits for, or reports the child. If a child cannot be restored, the resumed agent is told explicitly that it is gone, once: the child is then recorded as gone, so later resumes neither retry it nor repeat the notice ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
25
+ - On Windows, removing a `worktree: true` worktree now removes its directory. Its `node_modules` junction is unlinked first, so Git for Windows no longer leaves the directory behind, and older Git versions no longer delete the main checkout's `node_modules` through the junction.
26
+ - A `worktree: true` child resumed after an Atomic restart saves its tracked and untracked edits as a patch in its run's `worktree-diffs` directory before its worktree is removed, as a child of a fresh run does.
27
+ - Resuming a `worktree: true` child whose worktree was already removed, such as a completed child, now restores the edits it saved as a patch before it continues, so its earlier work is not lost. Each run saves its patches in its own `worktree-diffs/<run id>` directory, and each execution of a resumed child writes its own patch (`task-<n>-<agent>.<execution>.patch`) instead of overwriting the earlier one. Patches now include binary changes.
28
+ - A subagent that an SDK session without a task host resumed now stops when that session closes, as the original launch does. Reopening the session relaunches it automatically, as it does a task-host child, and the steering and follow-up messages it had queued and not read are delivered once, in order. A task-host child whose session or workflow stage closes now keeps its unread steering and follow-up messages the same way, and restoring or resuming it delivers them once, in order, instead of losing them.
29
+ - Opening a fork no longer changes the original session's subagent launch cards back to an older state copied into the fork, such as showing a completed child as running.
30
+ - `pause` or `quit` of a subagent that completes just before the stop takes effect now reports that it completed instead of "Paused", and Intercom messages sent to it are no longer held until a resume ([#3784](https://github.com/bastani-inc/atomic/pull/3784)).
31
+ - A parallel subagent paused or quit while it still waited for a free slot can now be resumed after Atomic restarts, and one still waiting when Atomic exited starts when its session reopens, instead of being reported unrestorable or gone. It starts as a new launch under the same child id, Intercom name, and group, with its original agent definition, task, working directory or worktree, model, and skills, and a `context: "fork"` child starts on the parent conversation its launch branched; if that branch can no longer be reopened, the child is reported gone rather than started without it. This holds in task-host and SDK sessions alike ([#3784](https://github.com/bastani-inc/atomic/pull/3784)).
32
+ - Subagents of a workflow stage whose run is killed while it waits, after Atomic restarts, for `/workflow resume` now end with the run: `resume` returns "its workflow stage ended", their cards no longer show them as resumable, and reopening the stage's session no longer restores them ([#3784](https://github.com/bastani-inc/atomic/pull/3784)).
33
+ - A subagent relaunched from its own session after Atomic restarts, or resumed with `resume`, now runs on the agent definition it was launched with: a user agent is no longer replaced by a project agent of the same name. A child launched with `context: "fork"` also keeps its Intercom bridge instructions under `intercomBridge.mode: "fork-only"`. Children recorded by an earlier version keep the previous lookup ([#3784](https://github.com/bastani-inc/atomic/pull/3784)).
34
+ - A queued parallel subagent that inherited its parent's model and thinking level now keeps them when it starts after Atomic restarts, instead of taking whatever model and thinking level the parent switched to meanwhile. If that model is no longer available, resume reports the child as gone instead of starting it on the parent's current model. A child restored or resumed from its own session also falls back to the model it was launched with, not the parent's current one, and a child launched outside any Intercom group no longer joins a group the parent joined later ([#3784](https://github.com/bastani-inc/atomic/pull/3784)).
35
+
5
36
  ## [0.9.40-alpha.1] - 2026-10-20
6
37
 
7
38
  ### Breaking Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/subagents",
3
- "version": "0.9.40-alpha.2",
3
+ "version": "0.9.40",
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,12 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.40] - 2026-10-20
8
+
9
+ ### Changed
10
+
11
+ - Curator summary drafts for Codex-only users now prefer `openai-codex/gpt-6.1-sol`, the `openai-codex` default, instead of `gpt-5.3-codex-spark`, which ChatGPT accounts can no longer use. `anthropic/claude-haiku-4-5` remains the first choice.
12
+
7
13
  ## [0.9.40-alpha.2] - 2026-10-20
8
14
 
9
15
  ### Changed
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/web-access",
3
- "version": "0.9.40-alpha.2",
3
+ "version": "0.9.40",
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,25 @@ 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.40] - 2026-10-20
10
+
11
+ ### Added
12
+
13
+ - The workflow journal can be selected for one process with `ATOMIC_WORKFLOWS_JOURNAL`, `ATOMIC_STORAGE`, or Atomic's `--storage` and `--storage-file` flags, using the same JSON as the `workflows.journal` and `storage` settings. Setting `ATOMIC_WORKFLOWS_JOURNAL` together with `ATOMIC_WORKFLOW_JOURNAL_PATH` is rejected as a conflict ([#3783](https://github.com/bastani-inc/atomic/issues/3783)).
14
+
15
+ ### Changed
16
+
17
+ - Updated the bundled Impeccable skill to 4.7.0 with engine 0.1.16. Critique and audit can scan a running Electron, NW.js, CEF, or WebView2 app window through its debugging port (`impeccable detect --cdp 9222`), and critique runs its design review on iOS, Android, and adaptive projects instead of reporting an empty web scan as clean. New `straggler` and `unbalanced-heading` typography checks flag a paragraph ending on one word and a heading whose last line is a stub, and the detector raises fewer false alarms on hidden, screen-reader-only, and layered content. Decision and review pages follow the OS dark mode, `context` offers only workspaces that render a UI as targets, and the Claude Code design hook can be installed in your user settings instead of the project's. Live Mode now starts on LAN and Tailscale addresses over plain HTTP, copying works there when the clipboard API is unavailable, and an interrupted engine download cleans up after itself. Atomic's launcher still turns off the engine's choice reports and update check by default.
18
+
19
+ ### Fixed
20
+
21
+ - Resuming a workflow restores the background subagents its stages launched and delivers the stages' interrupted messages before the stage continues. Both happen visibly in the stage, and stages stay addressable at the same `workflow:<rootRunId>/...` targets ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
22
+ - An interrupted workflow run stays addressable after the session that launched it restarts, before you run `/workflow resume`. Sends to `workflow:<rootRunId>/<stage>` and `workflow:<rootRunId>/**` are queued in the run's own journal instead of failing with `Session not found`, and `intercom list` shows the run's stages as pending. Each queued message is delivered exactly once when its stage is live again, including messages sent while resume is starting. A queued message no longer makes a resume that started at the same time fail as stale. The background subagents that the run's stages launched stay addressable in the same interval: sends to them wait and are delivered once after the resumed stage restores them. If another Atomic session resumes the run instead, that session takes over the run's Intercom targets and the sends still waiting for the subagents get an error saying so ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
23
+ - A session created with its own `agentDir` now keeps its workflow runs in the same storage as its sessions. Relative paths, `{ file }` secrets, and storage adapters in a shared `storage` selection, from settings or from `ATOMIC_STORAGE`/`--storage`, previously resolved against the default Atomic home for workflow runs, and the default journal ignored the custom `agentDir` ([#3783](https://github.com/bastani-inc/atomic/issues/3783)).
24
+ - On Windows, removing a workflow's temporary worktree now deletes the worktree directory and leaves the main checkout's `node_modules` alone. Atomic unlinks the worktree's `node_modules` junction, and any other directory it linked, before asking Git to remove the worktree. Current Git for Windows left these worktrees behind, and older releases could delete the main checkout's `node_modules` through the junction. If Atomic cannot inspect or unlink one of these links, it leaves the worktree and its branch in place rather than risk Git following the link.
25
+ - Killing a workflow run while it waits, after Atomic restarts, for `/workflow resume` now ends the background subagents its stages launched. Their launch cards no longer show them as resumable, and reopening a stage's session no longer restores them ([#3784](https://github.com/bastani-inc/atomic/pull/3784)).
26
+ - Quitting Atomic after opening the workflow graph or `/workflow` run picker no longer prints an `AbortError: The operation was aborted.` trace. The graph overlay also remounts cleanly when it is opened again after a reload.
27
+
9
28
  ## [0.9.40-alpha.2] - 2026-10-20
10
29
 
11
30
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/workflows",
3
- "version": "0.9.40-alpha.2",
3
+ "version": "0.9.40",
4
4
  "private": true,
5
5
  "description": "Atomic extension for multi-stage workflow authoring and execution.",
6
6
  "contributors": [
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@bastani/atomic",
3
- "version": "0.9.40-alpha.2",
3
+ "version": "0.9.40",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bastani/atomic",
9
- "version": "0.9.40-alpha.2",
9
+ "version": "0.9.40",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@bastani/atomic-natives": "0.9.40-alpha.2",
13
- "@bastani/pi-ai": "0.9.40-alpha.2",
12
+ "@bastani/atomic-natives": "0.9.40",
13
+ "@bastani/pi-ai": "0.9.40",
14
14
  "@earendil-works/pi-agent-core": "1.3.0",
15
15
  "@earendil-works/pi-codemode": "1.3.0",
16
16
  "@earendil-works/pi-tui": "1.3.0",
@@ -427,18 +427,18 @@
427
427
  }
428
428
  },
429
429
  "node_modules/@bastani/atomic-natives": {
430
- "version": "0.9.40-alpha.2",
431
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives/-/atomic-natives-0.9.40-alpha.2.tgz",
430
+ "version": "0.9.40",
431
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives/-/atomic-natives-0.9.40.tgz",
432
432
  "license": "MIT",
433
433
  "optionalDependencies": {
434
- "@bastani/atomic-natives-darwin-arm64": "0.9.40-alpha.2",
435
- "@bastani/atomic-natives-darwin-x64": "0.9.40-alpha.2",
436
- "@bastani/atomic-natives-linux-arm64-gnu": "0.9.40-alpha.2",
437
- "@bastani/atomic-natives-linux-arm64-musl": "0.9.40-alpha.2",
438
- "@bastani/atomic-natives-linux-x64-gnu": "0.9.40-alpha.2",
439
- "@bastani/atomic-natives-linux-x64-musl": "0.9.40-alpha.2",
440
- "@bastani/atomic-natives-win32-arm64-msvc": "0.9.40-alpha.2",
441
- "@bastani/atomic-natives-win32-x64-msvc": "0.9.40-alpha.2"
434
+ "@bastani/atomic-natives-darwin-arm64": "0.9.40",
435
+ "@bastani/atomic-natives-darwin-x64": "0.9.40",
436
+ "@bastani/atomic-natives-linux-arm64-gnu": "0.9.40",
437
+ "@bastani/atomic-natives-linux-arm64-musl": "0.9.40",
438
+ "@bastani/atomic-natives-linux-x64-gnu": "0.9.40",
439
+ "@bastani/atomic-natives-linux-x64-musl": "0.9.40",
440
+ "@bastani/atomic-natives-win32-arm64-msvc": "0.9.40",
441
+ "@bastani/atomic-natives-win32-x64-msvc": "0.9.40"
442
442
  },
443
443
  "engines": {
444
444
  "bun": ">=1.4.2",
@@ -446,8 +446,8 @@
446
446
  }
447
447
  },
448
448
  "node_modules/@bastani/atomic-natives-darwin-arm64": {
449
- "version": "0.9.40-alpha.2",
450
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-arm64/-/atomic-natives-darwin-arm64-0.9.40-alpha.2.tgz",
449
+ "version": "0.9.40",
450
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-arm64/-/atomic-natives-darwin-arm64-0.9.40.tgz",
451
451
  "license": "MIT",
452
452
  "os": [
453
453
  "darwin"
@@ -458,8 +458,8 @@
458
458
  "optional": true
459
459
  },
460
460
  "node_modules/@bastani/atomic-natives-darwin-x64": {
461
- "version": "0.9.40-alpha.2",
462
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-x64/-/atomic-natives-darwin-x64-0.9.40-alpha.2.tgz",
461
+ "version": "0.9.40",
462
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-x64/-/atomic-natives-darwin-x64-0.9.40.tgz",
463
463
  "license": "MIT",
464
464
  "os": [
465
465
  "darwin"
@@ -470,8 +470,8 @@
470
470
  "optional": true
471
471
  },
472
472
  "node_modules/@bastani/atomic-natives-linux-arm64-gnu": {
473
- "version": "0.9.40-alpha.2",
474
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-gnu/-/atomic-natives-linux-arm64-gnu-0.9.40-alpha.2.tgz",
473
+ "version": "0.9.40",
474
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-gnu/-/atomic-natives-linux-arm64-gnu-0.9.40.tgz",
475
475
  "license": "MIT",
476
476
  "os": [
477
477
  "linux"
@@ -485,8 +485,8 @@
485
485
  "optional": true
486
486
  },
487
487
  "node_modules/@bastani/atomic-natives-linux-arm64-musl": {
488
- "version": "0.9.40-alpha.2",
489
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-musl/-/atomic-natives-linux-arm64-musl-0.9.40-alpha.2.tgz",
488
+ "version": "0.9.40",
489
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-musl/-/atomic-natives-linux-arm64-musl-0.9.40.tgz",
490
490
  "license": "MIT",
491
491
  "os": [
492
492
  "linux"
@@ -500,8 +500,8 @@
500
500
  "optional": true
501
501
  },
502
502
  "node_modules/@bastani/atomic-natives-linux-x64-gnu": {
503
- "version": "0.9.40-alpha.2",
504
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-gnu/-/atomic-natives-linux-x64-gnu-0.9.40-alpha.2.tgz",
503
+ "version": "0.9.40",
504
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-gnu/-/atomic-natives-linux-x64-gnu-0.9.40.tgz",
505
505
  "license": "MIT",
506
506
  "os": [
507
507
  "linux"
@@ -515,8 +515,8 @@
515
515
  "optional": true
516
516
  },
517
517
  "node_modules/@bastani/atomic-natives-linux-x64-musl": {
518
- "version": "0.9.40-alpha.2",
519
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-musl/-/atomic-natives-linux-x64-musl-0.9.40-alpha.2.tgz",
518
+ "version": "0.9.40",
519
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-musl/-/atomic-natives-linux-x64-musl-0.9.40.tgz",
520
520
  "license": "MIT",
521
521
  "os": [
522
522
  "linux"
@@ -530,8 +530,8 @@
530
530
  "optional": true
531
531
  },
532
532
  "node_modules/@bastani/atomic-natives-win32-arm64-msvc": {
533
- "version": "0.9.40-alpha.2",
534
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-arm64-msvc/-/atomic-natives-win32-arm64-msvc-0.9.40-alpha.2.tgz",
533
+ "version": "0.9.40",
534
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-arm64-msvc/-/atomic-natives-win32-arm64-msvc-0.9.40.tgz",
535
535
  "license": "MIT",
536
536
  "os": [
537
537
  "win32"
@@ -542,8 +542,8 @@
542
542
  "optional": true
543
543
  },
544
544
  "node_modules/@bastani/atomic-natives-win32-x64-msvc": {
545
- "version": "0.9.40-alpha.2",
546
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-x64-msvc/-/atomic-natives-win32-x64-msvc-0.9.40-alpha.2.tgz",
545
+ "version": "0.9.40",
546
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-x64-msvc/-/atomic-natives-win32-x64-msvc-0.9.40.tgz",
547
547
  "license": "MIT",
548
548
  "os": [
549
549
  "win32"
@@ -554,8 +554,8 @@
554
554
  "optional": true
555
555
  },
556
556
  "node_modules/@bastani/pi-ai": {
557
- "version": "0.9.40-alpha.2",
558
- "resolved": "https://registry.npmjs.org/@bastani/pi-ai/-/pi-ai-0.9.40-alpha.2.tgz",
557
+ "version": "0.9.40",
558
+ "resolved": "https://registry.npmjs.org/@bastani/pi-ai/-/pi-ai-0.9.40.tgz",
559
559
  "license": "MIT",
560
560
  "dependencies": {
561
561
  "@anthropic-ai/sdk": "0.129.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/atomic",
3
- "version": "0.9.40-alpha.2",
3
+ "version": "0.9.40",
4
4
  "description": "Atomic coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "atomicConfig": {
@@ -89,8 +89,8 @@
89
89
  "prepublishOnly": "bun run clean && bun run build && bun run shrinkwrap"
90
90
  },
91
91
  "dependencies": {
92
- "@bastani/atomic-natives": "0.9.40-alpha.2",
93
- "@bastani/pi-ai": "0.9.40-alpha.2",
92
+ "@bastani/atomic-natives": "0.9.40",
93
+ "@bastani/pi-ai": "0.9.40",
94
94
  "@earendil-works/pi-agent-core": "1.3.0",
95
95
  "@earendil-works/pi-codemode": "1.3.0",
96
96
  "@earendil-works/pi-tui": "1.3.0",