@bastani/atomic 0.9.35-alpha.1 → 0.9.35-alpha.3

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.
Files changed (175) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/package.json +1 -1
  4. package/dist/builtin/subagents/package.json +1 -1
  5. package/dist/builtin/web-access/package.json +1 -1
  6. package/dist/builtin/workflows/CHANGELOG.md +13 -0
  7. package/dist/builtin/workflows/builtin/{chunk-s7y3hw0n.js → chunk-3xffzzbg.js} +1 -1
  8. package/dist/builtin/workflows/builtin/{chunk-0d0pd4fz.js → chunk-7fvrnzhb.js} +1 -1
  9. package/dist/builtin/workflows/builtin/{chunk-119gt64q.js → chunk-8c3ae7tt.js} +8 -1
  10. package/dist/builtin/workflows/builtin/{chunk-y68758re.js → chunk-rhkg3d8e.js} +1 -1
  11. package/dist/builtin/workflows/builtin/goal.js +2 -2
  12. package/dist/builtin/workflows/builtin/index.js +3 -3
  13. package/dist/builtin/workflows/builtin/ralph.js +2 -2
  14. package/dist/builtin/workflows/package.json +1 -1
  15. package/dist/builtin/workflows/src/extension/index.bundle.mjs +510 -35
  16. package/dist/builtin/workflows/src/index.js +87 -29
  17. package/dist/core/agent-session-accessors.d.ts.map +1 -1
  18. package/dist/core/agent-session-accessors.js +7 -1
  19. package/dist/core/agent-session-accessors.js.map +1 -1
  20. package/dist/core/agent-session-custom-message-commit.js +15 -15
  21. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  22. package/dist/core/agent-session-events.d.ts.map +1 -1
  23. package/dist/core/agent-session-events.js +4 -0
  24. package/dist/core/agent-session-events.js.map +1 -1
  25. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  26. package/dist/core/agent-session-extension-bindings.js +61 -1
  27. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  28. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  29. package/dist/core/agent-session-message-queue.js +3 -1
  30. package/dist/core/agent-session-message-queue.js.map +1 -1
  31. package/dist/core/agent-session-methods.d.ts +5 -3
  32. package/dist/core/agent-session-methods.d.ts.map +1 -1
  33. package/dist/core/agent-session-methods.js.map +1 -1
  34. package/dist/core/agent-session-persistent-custom-messages.js +1 -1
  35. package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
  36. package/dist/core/agent-session-prompt.d.ts +3 -1
  37. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  38. package/dist/core/agent-session-prompt.js +79 -9
  39. package/dist/core/agent-session-prompt.js.map +1 -1
  40. package/dist/core/agent-session-summary.d.ts.map +1 -1
  41. package/dist/core/agent-session-summary.js +17 -2
  42. package/dist/core/agent-session-summary.js.map +1 -1
  43. package/dist/core/agent-session-tree.js +1 -1
  44. package/dist/core/agent-session-tree.js.map +1 -1
  45. package/dist/core/agent-session.d.ts +1 -0
  46. package/dist/core/agent-session.d.ts.map +1 -1
  47. package/dist/core/agent-session.js +1 -0
  48. package/dist/core/agent-session.js.map +1 -1
  49. package/dist/core/auth-storage-backends.d.ts +1 -0
  50. package/dist/core/auth-storage-backends.d.ts.map +1 -1
  51. package/dist/core/auth-storage-backends.js +37 -23
  52. package/dist/core/auth-storage-backends.js.map +1 -1
  53. package/dist/core/compaction/session-summarization.d.ts +1 -0
  54. package/dist/core/compaction/session-summarization.d.ts.map +1 -1
  55. package/dist/core/compaction/session-summarization.js +7 -1
  56. package/dist/core/compaction/session-summarization.js.map +1 -1
  57. package/dist/core/extensions/agent-events.d.ts +15 -7
  58. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  59. package/dist/core/extensions/agent-events.js.map +1 -1
  60. package/dist/core/extensions/context-types.d.ts +6 -0
  61. package/dist/core/extensions/context-types.d.ts.map +1 -1
  62. package/dist/core/extensions/context-types.js.map +1 -1
  63. package/dist/core/extensions/index.d.ts +1 -1
  64. package/dist/core/extensions/index.d.ts.map +1 -1
  65. package/dist/core/extensions/index.js.map +1 -1
  66. package/dist/core/extensions/runner-context.d.ts +4 -0
  67. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  68. package/dist/core/extensions/runner-context.js +8 -0
  69. package/dist/core/extensions/runner-context.js.map +1 -1
  70. package/dist/core/extensions/runner-events.d.ts +1 -1
  71. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  72. package/dist/core/extensions/runner-events.js +4 -3
  73. package/dist/core/extensions/runner-events.js.map +1 -1
  74. package/dist/core/extensions/runner.d.ts +3 -1
  75. package/dist/core/extensions/runner.d.ts.map +1 -1
  76. package/dist/core/extensions/runner.js +8 -2
  77. package/dist/core/extensions/runner.js.map +1 -1
  78. package/dist/core/extensions/runtime-types.d.ts +4 -0
  79. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  80. package/dist/core/extensions/runtime-types.js.map +1 -1
  81. package/dist/core/extensions/workflow-run-control.d.ts +12 -2
  82. package/dist/core/extensions/workflow-run-control.d.ts.map +1 -1
  83. package/dist/core/extensions/workflow-run-control.js.map +1 -1
  84. package/dist/core/package-manager-resource-patterns.d.ts.map +1 -1
  85. package/dist/core/package-manager-resource-patterns.js +4 -2
  86. package/dist/core/package-manager-resource-patterns.js.map +1 -1
  87. package/dist/core/session-manager-archive.d.ts +2 -0
  88. package/dist/core/session-manager-archive.d.ts.map +1 -1
  89. package/dist/core/session-manager-archive.js +41 -19
  90. package/dist/core/session-manager-archive.js.map +1 -1
  91. package/dist/core/session-manager-core.d.ts +1 -0
  92. package/dist/core/session-manager-core.d.ts.map +1 -1
  93. package/dist/core/session-manager-core.js +8 -4
  94. package/dist/core/session-manager-core.js.map +1 -1
  95. package/dist/core/session-manager-list.d.ts.map +1 -1
  96. package/dist/core/session-manager-list.js +4 -10
  97. package/dist/core/session-manager-list.js.map +1 -1
  98. package/dist/core/session-manager-types.d.ts +2 -1
  99. package/dist/core/session-manager-types.d.ts.map +1 -1
  100. package/dist/core/session-manager-types.js.map +1 -1
  101. package/dist/core/session-manager.d.ts +1 -1
  102. package/dist/core/session-manager.d.ts.map +1 -1
  103. package/dist/core/session-manager.js.map +1 -1
  104. package/dist/core/tools/read.d.ts.map +1 -1
  105. package/dist/core/tools/read.js +3 -1
  106. package/dist/core/tools/read.js.map +1 -1
  107. package/dist/core/workflow-summary-lifecycle.d.ts +4 -0
  108. package/dist/core/workflow-summary-lifecycle.d.ts.map +1 -0
  109. package/dist/core/workflow-summary-lifecycle.js +40 -0
  110. package/dist/core/workflow-summary-lifecycle.js.map +1 -0
  111. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  112. package/dist/extensions/codemode/execute.js +20 -6
  113. package/dist/extensions/codemode/execute.js.map +1 -1
  114. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  115. package/dist/extensions/mcp/cli.js +4 -7
  116. package/dist/extensions/mcp/cli.js.map +1 -1
  117. package/dist/extensions/mcp/client/client.d.ts.map +1 -1
  118. package/dist/extensions/mcp/client/client.js +5 -4
  119. package/dist/extensions/mcp/client/client.js.map +1 -1
  120. package/dist/extensions/mcp/client/index.d.ts +2 -2
  121. package/dist/extensions/mcp/client/index.d.ts.map +1 -1
  122. package/dist/extensions/mcp/client/index.js.map +1 -1
  123. package/dist/extensions/mcp/client/protocol/content.d.ts +4 -1
  124. package/dist/extensions/mcp/client/protocol/content.d.ts.map +1 -1
  125. package/dist/extensions/mcp/client/protocol/content.js.map +1 -1
  126. package/dist/extensions/mcp/client/transports/streamable-http.d.ts +2 -2
  127. package/dist/extensions/mcp/client/transports/streamable-http.d.ts.map +1 -1
  128. package/dist/extensions/mcp/client/transports/streamable-http.js +7 -5
  129. package/dist/extensions/mcp/client/transports/streamable-http.js.map +1 -1
  130. package/dist/extensions/mcp/client/transports/transport.d.ts +4 -1
  131. package/dist/extensions/mcp/client/transports/transport.d.ts.map +1 -1
  132. package/dist/extensions/mcp/client/transports/transport.js.map +1 -1
  133. package/dist/extensions/mcp/index.d.ts.map +1 -1
  134. package/dist/extensions/mcp/index.js +2 -4
  135. package/dist/extensions/mcp/index.js.map +1 -1
  136. package/dist/extensions/mcp/runtime.d.ts +1 -8
  137. package/dist/extensions/mcp/runtime.d.ts.map +1 -1
  138. package/dist/extensions/mcp/runtime.js +2 -41
  139. package/dist/extensions/mcp/runtime.js.map +1 -1
  140. package/dist/extensions/mcp/tools.js +1 -1
  141. package/dist/extensions/mcp/tools.js.map +1 -1
  142. package/dist/index-extensions.d.ts +1 -1
  143. package/dist/index-extensions.d.ts.map +1 -1
  144. package/dist/index-extensions.js.map +1 -1
  145. package/dist/index.d.ts +1 -1
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js.map +1 -1
  148. package/dist/modes/interactive/components/session-selector-list.d.ts.map +1 -1
  149. package/dist/modes/interactive/components/session-selector-list.js +2 -1
  150. package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
  151. package/dist/modes/print-mode.d.ts.map +1 -1
  152. package/dist/modes/print-mode.js +5 -0
  153. package/dist/modes/print-mode.js.map +1 -1
  154. package/dist/modes/rpc/rpc-client-api.d.ts +7 -2
  155. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  156. package/dist/modes/rpc/rpc-client-api.js +13 -0
  157. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  158. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  159. package/dist/modes/rpc/rpc-command-handler.js +19 -0
  160. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  161. package/dist/modes/rpc/rpc-types.d.ts +50 -1
  162. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  163. package/dist/modes/rpc/rpc-types.js.map +1 -1
  164. package/docs/extensions/authoring.md +2 -0
  165. package/docs/extensions/events.md +9 -3
  166. package/docs/guides/non-interactive.md +2 -0
  167. package/docs/mcp-servers.md +2 -0
  168. package/docs/packages/reference.md +2 -0
  169. package/docs/rpc/protocol.md +15 -0
  170. package/docs/rpc.md +1 -0
  171. package/docs/sdk.md +9 -1
  172. package/docs/sessions.md +2 -2
  173. package/docs/workflows/operations.md +11 -3
  174. package/npm-shrinkwrap.json +32 -32
  175. package/package.json +3 -3
@@ -110,6 +110,8 @@ atomic mcp logout <server>
110
110
 
111
111
  `list` connects to enabled servers and reports state, tools, and errors; it exits with status 1 for invalid configuration or an enabled server that is not connected. `--json` produces a machine-readable report. Login gives up after 300 seconds by default; `--timeout` limits the whole sign-in, including requests to the authorization server, but not the MCP server request timeout. A running session uses new credentials on its next turn.
112
112
 
113
+ Resource-capable servers show "offers resources" rather than resource counts. In `--json` output, `resources: true` indicates resource support; resource and template counts are not included. Use the resource tools below to list them on demand.
114
+
113
115
  ## Find and call tools
114
116
 
115
117
  Tools are named `mcp__<server>__<tool>`, with punctuation replaced by `_`. Names that collide after normalization receive deterministic hash suffixes. Use names returned by discovery rather than constructing them yourself.
@@ -35,6 +35,8 @@ Filter what a package loads using the object form in settings:
35
35
  - `-path` force-excludes an exact path.
36
36
  - Filters layer on top of the manifest. They narrow down what is already allowed.
37
37
 
38
+ In the top-level `extensions`, `skills`, `prompts`, and `themes` arrays, path patterns expand `~` to your home directory. For example, `!~/skills/legacy-*` excludes matching skills and `-~/skills/legacy` disables that exact skill directory.
39
+
38
40
  ## Scope and Deduplication
39
41
 
40
42
  Packages can appear in both global and project settings. The project entry normally wins.
@@ -7,6 +7,21 @@ description: Every RPC command, event, type, and error contract.
7
7
 
8
8
  ## Commands
9
9
 
10
+ ### Stored summaries and workflow history
11
+
12
+ These read-only commands do not start a model turn. Stored summaries remain available when `sessionSummary.enabled` is false.
13
+
14
+ | Command | Response `data` | TypeScript `RpcClient` method |
15
+ | --- | --- | --- |
16
+ | `{"type":"get_session_summary"}` | `{ summary: SessionSummaryEntry \| null }`, including `summary` and `summarizedThroughId` | `getSessionSummary()` |
17
+ | `{"type":"list_sessions"}` | `{ sessions: RpcSessionInfo[] }` for the current project/session directory, including `summary` and `summarizedThroughId`; `created` and `modified` are ISO strings | `listSessions()` |
18
+ | `{"type":"list_workflow_runs"}` | `{ runs: WorkflowRunSummary[] }`, including live runs and current-project resumable and completed history | `listWorkflowRuns(status?)` |
19
+ | `{"type":"get_workflow_run_summary","runId":"<uuid>"}` | `WorkflowRunDetail` for that run | `getWorkflowRunSummary(runId)` |
20
+
21
+ Workflow records include `runId`, `name`, `status`, `label`, `identity`, `summary`, and `summarizedThrough` (Unix milliseconds). Optional summary fields are absent when no summary has been saved. `list_workflow_runs` accepts an optional `status` filter. Run detail requests accept full UUIDs for earlier sessions; a missing run returns the normal error response. Summaries describe progress through their marker and may be stale.
22
+
23
+ Stored history follows the SDK's run-detail access rules: top-level runs with a recorded session owner launched from the current project directory. Runs from other project directories are not included.
24
+
10
25
  ### Prompting
11
26
 
12
27
  #### prompt
package/docs/rpc.md CHANGED
@@ -16,6 +16,7 @@ This page starts RPC mode and walks one client end to end. The rest is split by
16
16
  - [RPC protocol](/rpc/protocol) — every command, event, type, and error contract.
17
17
  - [RPC extension UI protocol](/rpc/extension-ui) — drive extension-rendered UI over RPC.
18
18
  - [RPC client examples](/rpc/examples) — additional client implementations.
19
+ - [Stored summaries and workflow history](/rpc/protocol#stored-summaries-and-workflow-history) — read session and workflow summaries without starting a model turn.
19
20
 
20
21
  Not sure RPC is the right integration mode? Compare it with the SDK and JSON mode on [Programmatic use](/programmatic).
21
22
 
package/docs/sdk.md CHANGED
@@ -230,13 +230,17 @@ Rebinding host callbacks preserves pending MCP OAuth ownership. Authorization st
230
230
 
231
231
  Web provider configuration caches are session-local. Configuration discovery and environment keys are unchanged; create a new session to pick up changed cached settings. GitHub extraction returns the owned clone path for use with file tools, so callers need not predict its directory.
232
232
 
233
+ ### Stored session summaries
234
+
235
+ `session.sessionSummary` returns the current branch's latest `SessionSummaryEntry`, or `undefined` when none is available. Read `summary` for the generated text and `summarizedThroughId` for the last message it describes. `SessionManager.list()` and `SessionManager.listAll()` expose those same fields on each `SessionInfo`. Stored summaries remain readable when `sessionSummary.enabled` is false; that setting controls generation only.
236
+
233
237
  ### Workflow run control
234
238
 
235
239
  `session.workflows` controls this session's workflow runs without slash commands or the model-facing `workflow` tool. A fresh session can also inspect a durable root from another session by its full UUID, within the same working directory and configured workflow database. Inspection stays read-only and does not add the run to `listRuns()`.
236
240
 
237
241
  ```typescript
238
242
  interface SessionWorkflows {
239
- listRuns(filter?: { status?: WorkflowRunFilterStatus }): Promise<readonly WorkflowRunSummary[]>;
243
+ listRuns(filter?: { status?: WorkflowRunFilterStatus; includeDurable?: boolean }): Promise<readonly WorkflowRunSummary[]>;
240
244
  getRun(runId: string): Promise<WorkflowRunDetail>;
241
245
  getStages(runId: string, filter?: { status?: WorkflowStageStatus }): Promise<readonly WorkflowRunStageSummary[]>;
242
246
  pause(runId: string, options?: { stageId?: string }): Promise<WorkflowRunControlOutcome>;
@@ -247,6 +251,8 @@ interface SessionWorkflows {
247
251
  }
248
252
  ```
249
253
 
254
+ `listRuns()` and `getRun()` expose `label`, `identity`, `summary`, and `summarizedThrough` (Unix milliseconds). The identity prefers the label, then the objective/prompt input, then the run ID. Use `listRuns({ includeDurable: true })` to include stored resumable and completed top-level runs launched from the current project directory alongside this session's live runs. Stored runs must have a recorded session owner, matching the SDK's run-detail access rules. The default remains this session's runs only. Saved summaries can lag current progress and remain readable with summary generation disabled.
255
+
250
256
  `listRuns()` returns the same per-run data as `workflow status`: id, workflow name, status, active stages, and unanswered prompts (`awaitingInput`). Run IDs accept the full UUID or a unique 8-character prefix. `getRun()`, `getStages()`, `pause()` and `quit()` resolve a prefix against the runs this session holds and reject it at once when none matches, so pass the full UUID for a run recorded by an earlier process. `pause`, `quit` and `resume` resolve with the tool's acknowledged outcome: `action`, `runId` (`--all` for a batch), a `status` of `ok`, `running`, `paused`, `partial`, `noop` or `cancelled`, and a human-readable `message`. A `noop` means the request was understood and found nothing to change, such as pausing a run that already ended. A `partial` outcome means part of the request took effect. For `pause({ all: true })` and `quit({ all: true })`, `partial` means this call stopped at least one run and others are still active: `failedRuns` lists each run that is still active with its `runId`, a `reason` (for example `pause_failed` or `no_active_stages`) and a `message`, so check `outcome.status === "partial"` before treating a batch stop as complete. If active runs could not be stopped and this call stopped none, the call rejects with `WorkflowRunControlError` (`WORKFLOW_RUN_CONTROL_FAILED`) whose `failedRuns` carries the same list, even when other runs were already paused. Runs that are already paused or already ended are not failures, and a batch with no active run left to stop resolves as a `noop`. Call `getRun()` before retrying.
251
257
 
252
258
  After an owning process crashes, create a new authorized SDK session with the original `cwd` and workflow database configuration. Keep the workflow definition available, then call `getRun(runId)` with the saved full UUID. Once its progress has been stale for about two minutes and its database ownership connection is gone, status reports `crashed`. `resume(runId)` claims the durable run only after the database excludes the previous owner and any unfinished database writes. It continues under the same UUID and replays completed checkpoints. This works with `SessionManager.inMemory()` and does not require reopening a session file. Concurrent recovery attempts admit only one executor; inspect again if another caller won the claim.
@@ -255,6 +261,8 @@ A healthy connected foreign owner remains read-only, even while a long-running t
255
261
 
256
262
  A run launched through the model-facing `workflow` tool can also move to another session without a crash. Disposing its owning session with `session.dispose()` stops that session's in-flight runs at their last checkpoint and records in the workflow database that the session released every checkpointed run it paused. Afterward, any authorized SDK session with the same `cwd` and workflow database can call `resume(runId)` with the full UUID, in the same process or after the owning process has exited. The adopting session becomes the run's owner, the run continues under the same UUID, and completed checkpoints replay without rerunning their callbacks.
257
263
 
264
+ Workflow resume is project-scoped. SDK and workflow-tool resume calls for a run from a different `cwd` return an actionable error without changing it. To continue in a different project, use `/workflow resume <id>` interactively and confirm the fork into the current directory. The fork receives a new run ID and copies saved progress; the original run is left untouched. To keep the original ID, create the successor session with the original `cwd`.
265
+
258
266
  ```ts
259
267
  await owner.dispose(); // quits in-flight runs at their last checkpoint and releases them
260
268
 
package/docs/sessions.md CHANGED
@@ -71,9 +71,9 @@ When available, Atomic uses the `trash` CLI for deletion instead of permanently
71
71
 
72
72
  Each row shows a short generated description of what the session was about in its own column, beside the session name or first message, so you can recognize a conversation without opening it. Atomic writes one after the agent goes idle, using the model the session is already configured with, and stores it in the session file as a `session_summary` entry.
73
73
 
74
- A summary describes the conversation up to a specific message. Once a newer message arrives it is considered stale and the summary column shows "No summary available." instead — the same placeholder you get when a summary has not been generated yet, could not be generated, or is still in flight. The session name and first message are never displaced by a summary, and the column only appears once at least one listed session has a summary. Summaries are also searchable along with the rest of the session text.
74
+ A summary describes the conversation up to a specific message and remains visible as newer messages arrive. A later branch summary retires it. "No summary available." means no summary has been generated for the current branch, generation failed, or it is still in flight. The session name and first message are never displaced by a summary, and the column only appears once at least one listed session has a summary. Summaries are also searchable along with the rest of the session text.
75
75
 
76
- Generation is best-effort and never blocks a turn. Atomic skips very short sessions, workflow stage sessions, and `--print` and JSON modes. It cancels generation when you send the next message or quit; failures are silent. Set `sessionSummary.enabled` to `false` to disable it.
76
+ Generation is best-effort and never blocks a turn or quitting. Opening or resuming a session in interactive or RPC mode also schedules generation if its summary is missing or stale. Atomic skips very short sessions, workflow stage sessions, and `--print` and JSON modes. It cancels generation when you send the next message, switch sessions, or quit; failures are silent. Set `sessionSummary.enabled` to `false` to disable it.
77
77
 
78
78
  You can search, navigate, or cancel while the picker loads sessions. Closing it cancels the scan.
79
79
 
@@ -685,19 +685,27 @@ Changing `iteration` makes each loop pass a distinct durable call. Reusing the s
685
685
 
686
686
  The `/workflow resume` command mirrors `/resume` ergonomics and `/workflows` is its alias. With no id, it builds one newest-first picker from live runs that satisfy the shared resumability predicate and current DBOS resumable/completed records. DBOS is the authoritative catalog; selected records are hydrated and revalidated before resume or inspection. Running workflows never appear: fresh-heartbeat rows are excluded in every session to prevent double dispatch, and stale ones surface as `crashed`. A row whose durable checkpoint or referenced artifact is missing is not resumable and is omitted rather than offered and rejected later. Naming such an id explicitly still produces the existing clear no-checkpoint/not-resumable error.
687
687
 
688
- Picker rows use the workflow ID as the primary label for search and direct resume. The adjacent details show status, completed stages or checkpoints, then the workflow name; on narrow terminals, the picker may truncate the ID or name visually, but searching the full ID still works.
688
+ Picker rows use the run label when set, otherwise a one-line objective or prompt input, falling back to the workflow ID. When a generated progress summary is available, it has its own column; status and workflow name precede the identity in the other column. Live rows also show completed/total stages. Without a generated summary, the adjacent column shows those status details instead. Search matches the identity, summary, and full run ID.
689
+
690
+ Progress summaries are generated in the background at workflow heartbeat intervals and once when a run finishes or becomes blocked. The latest saved summary remains available without the original session; it may lag behind current progress. If generation is unavailable, the picker keeps showing the status details. Set `sessionSummary.enabled` to `false` to disable summary generation and resume-context messages.
691
+
692
+ Resuming through the picker, `/workflow resume <id>`, or the workflow tool adds the saved summary to the main chat as model-visible context, including the run ID, workflow name, status, and summarized-through timestamp. This does not start an extra model turn. Repeating resume for the same live attachment does not duplicate the message; runs without a summary add no message.
689
693
 
690
694
  If resume reports a checkpoint decoding error or an unavailable serializer, retain the full run ID and original diagnostic when reporting the problem. Do not delete saved progress or launch a fresh copy just to bypass the error: that can repeat completed side effects.
691
695
 
692
696
  Only runs with usable durable checkpoints or pending prompts can resume. Deleted durable entries and missing artifacts are not offered. Status and connect/attach still expose eligible terminal runs for inspection.
693
697
 
694
- Rows carry semantic colors — completed green, paused yellow, failed/blocked/crashed red — and show checkpoint progress without the redundant pending-prompt count. The open picker live-updates on local run changes plus a bounded cross-session poll, so state transitions appear (and freshly running workflows disappear) without reopening it.
698
+ Rows carry semantic colors — completed green, paused yellow, failed/blocked/crashed red. The open picker live-updates on local run changes plus a bounded cross-session poll, so state transitions appear (and freshly running workflows disappear) without reopening it.
695
699
 
696
700
  Ctrl+D deletes a highlighted inactive durable or completed row after confirmation. Deletion rechecks same-process activity and the authoritative DBOS status, refuses a `running` workflow, and leaves host and stage chat transcripts untouched. The history surface matches `/resume` retention semantics: eligible runs remain searchable regardless of age or count. Aged-out history is driven by the state-aware `WORKFLOW_ARTIFACT_RETENTION_MS` policy: only terminal or unowned directories older than the policy are pruned, and pruning deletes the durable entry first, removing the artifact directory only when that deletion succeeds — a refused or unavailable deletion preserves both. Running, paused, quit, blocked, and awaiting-input runs retain their artifacts and durable records so they remain resumable. The picker mounts before asynchronous catalog hydration completes and merges DBOS rows when ready.
697
701
 
698
702
  Only current-format DBOS records are selectable. Atomic hides unsupported or malformed records without reinterpreting them.
699
703
 
700
- Selecting a paused, resumable failed, blocked, or crash-recovery target follows the existing resume path unchanged: Atomic re-dispatches the workflow with its cached inputs and the **original workflow id**. Every nested invocation validates and reuses its durable boundary and child identity before dispatch. Previously completed `ctx.tool`, `ctx.ui`, stage/task/chain/parallel items, and child boundaries replay from checkpoints instead of executing again; only incomplete work continues.
704
+ Selecting a paused, resumable failed, blocked, or crash-recovery target from the current project re-dispatches the workflow with its cached inputs and the **original workflow id**. Every nested invocation validates and reuses its durable boundary and child identity before dispatch. Previously completed `ctx.tool`, `ctx.ui`, stage/task/chain/parallel items, and child boundaries replay from checkpoints instead of executing again; only incomplete work continues.
705
+
706
+ Workflow resume is project-scoped. Naming a resumable run from another project in an interactive `/workflow resume <id>` command asks: `Workflow run found in different project: <cwd>. Fork it into the current directory?` Choosing Yes creates a new run ID in the current directory, copies saved checkpoints and stage conversation history, and continues incomplete work there. Completed side effects replay from their saved results; the source run remains unchanged. Choosing No cancels without creating a run. The workflow definition must remain available in the current or original project. SDK, workflow-tool, and headless calls do not prompt: use the interactive command to fork, or reopen the original project to resume the original run.
707
+
708
+ The fork inherits the source run's label and saved progress summary. When summaries are enabled and a saved summary exists, the main chat receives it before the fork resumes, identified by the new run ID and `forked from <source run id>`. Declining the fork adds no summary context.
701
709
 
702
710
  A run quit while a `ctx.tool` call was in flight resumes the same way: the unfinished call left no replayable checkpoint, so resume re-executes exactly that callback at the same ordinal and `tool:<argsHash>` node id, while every completed tool — including a sibling that finished before the quit — replays from cache. A cancelled node never replays a cancellation as a value.
703
711
 
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@bastani/atomic",
3
- "version": "0.9.35-alpha.1",
3
+ "version": "0.9.35-alpha.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bastani/atomic",
9
- "version": "0.9.35-alpha.1",
9
+ "version": "0.9.35-alpha.3",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@bastani/atomic-natives": "0.9.35-alpha.1",
13
- "@bastani/pi-ai": "0.9.35-alpha.1",
12
+ "@bastani/atomic-natives": "0.9.35-alpha.3",
13
+ "@bastani/pi-ai": "0.9.35-alpha.3",
14
14
  "@dbos-inc/dbos-sdk": "4.25.14",
15
15
  "@earendil-works/pi-agent-core": "1.1.0",
16
16
  "@earendil-works/pi-client": "1.1.0",
@@ -432,18 +432,18 @@
432
432
  }
433
433
  },
434
434
  "node_modules/@bastani/atomic-natives": {
435
- "version": "0.9.35-alpha.1",
436
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives/-/atomic-natives-0.9.35-alpha.1.tgz",
435
+ "version": "0.9.35-alpha.3",
436
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives/-/atomic-natives-0.9.35-alpha.3.tgz",
437
437
  "license": "MIT",
438
438
  "optionalDependencies": {
439
- "@bastani/atomic-natives-darwin-arm64": "0.9.35-alpha.1",
440
- "@bastani/atomic-natives-darwin-x64": "0.9.35-alpha.1",
441
- "@bastani/atomic-natives-linux-arm64-gnu": "0.9.35-alpha.1",
442
- "@bastani/atomic-natives-linux-arm64-musl": "0.9.35-alpha.1",
443
- "@bastani/atomic-natives-linux-x64-gnu": "0.9.35-alpha.1",
444
- "@bastani/atomic-natives-linux-x64-musl": "0.9.35-alpha.1",
445
- "@bastani/atomic-natives-win32-arm64-msvc": "0.9.35-alpha.1",
446
- "@bastani/atomic-natives-win32-x64-msvc": "0.9.35-alpha.1"
439
+ "@bastani/atomic-natives-darwin-arm64": "0.9.35-alpha.3",
440
+ "@bastani/atomic-natives-darwin-x64": "0.9.35-alpha.3",
441
+ "@bastani/atomic-natives-linux-arm64-gnu": "0.9.35-alpha.3",
442
+ "@bastani/atomic-natives-linux-arm64-musl": "0.9.35-alpha.3",
443
+ "@bastani/atomic-natives-linux-x64-gnu": "0.9.35-alpha.3",
444
+ "@bastani/atomic-natives-linux-x64-musl": "0.9.35-alpha.3",
445
+ "@bastani/atomic-natives-win32-arm64-msvc": "0.9.35-alpha.3",
446
+ "@bastani/atomic-natives-win32-x64-msvc": "0.9.35-alpha.3"
447
447
  },
448
448
  "engines": {
449
449
  "bun": ">=1.4.2",
@@ -451,8 +451,8 @@
451
451
  }
452
452
  },
453
453
  "node_modules/@bastani/atomic-natives-darwin-arm64": {
454
- "version": "0.9.35-alpha.1",
455
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-arm64/-/atomic-natives-darwin-arm64-0.9.35-alpha.1.tgz",
454
+ "version": "0.9.35-alpha.3",
455
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-arm64/-/atomic-natives-darwin-arm64-0.9.35-alpha.3.tgz",
456
456
  "license": "MIT",
457
457
  "os": [
458
458
  "darwin"
@@ -463,8 +463,8 @@
463
463
  "optional": true
464
464
  },
465
465
  "node_modules/@bastani/atomic-natives-darwin-x64": {
466
- "version": "0.9.35-alpha.1",
467
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-x64/-/atomic-natives-darwin-x64-0.9.35-alpha.1.tgz",
466
+ "version": "0.9.35-alpha.3",
467
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-darwin-x64/-/atomic-natives-darwin-x64-0.9.35-alpha.3.tgz",
468
468
  "license": "MIT",
469
469
  "os": [
470
470
  "darwin"
@@ -475,8 +475,8 @@
475
475
  "optional": true
476
476
  },
477
477
  "node_modules/@bastani/atomic-natives-linux-arm64-gnu": {
478
- "version": "0.9.35-alpha.1",
479
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-gnu/-/atomic-natives-linux-arm64-gnu-0.9.35-alpha.1.tgz",
478
+ "version": "0.9.35-alpha.3",
479
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-gnu/-/atomic-natives-linux-arm64-gnu-0.9.35-alpha.3.tgz",
480
480
  "license": "MIT",
481
481
  "os": [
482
482
  "linux"
@@ -490,8 +490,8 @@
490
490
  "optional": true
491
491
  },
492
492
  "node_modules/@bastani/atomic-natives-linux-arm64-musl": {
493
- "version": "0.9.35-alpha.1",
494
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-musl/-/atomic-natives-linux-arm64-musl-0.9.35-alpha.1.tgz",
493
+ "version": "0.9.35-alpha.3",
494
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-arm64-musl/-/atomic-natives-linux-arm64-musl-0.9.35-alpha.3.tgz",
495
495
  "license": "MIT",
496
496
  "os": [
497
497
  "linux"
@@ -505,8 +505,8 @@
505
505
  "optional": true
506
506
  },
507
507
  "node_modules/@bastani/atomic-natives-linux-x64-gnu": {
508
- "version": "0.9.35-alpha.1",
509
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-gnu/-/atomic-natives-linux-x64-gnu-0.9.35-alpha.1.tgz",
508
+ "version": "0.9.35-alpha.3",
509
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-gnu/-/atomic-natives-linux-x64-gnu-0.9.35-alpha.3.tgz",
510
510
  "license": "MIT",
511
511
  "os": [
512
512
  "linux"
@@ -520,8 +520,8 @@
520
520
  "optional": true
521
521
  },
522
522
  "node_modules/@bastani/atomic-natives-linux-x64-musl": {
523
- "version": "0.9.35-alpha.1",
524
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-musl/-/atomic-natives-linux-x64-musl-0.9.35-alpha.1.tgz",
523
+ "version": "0.9.35-alpha.3",
524
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-linux-x64-musl/-/atomic-natives-linux-x64-musl-0.9.35-alpha.3.tgz",
525
525
  "license": "MIT",
526
526
  "os": [
527
527
  "linux"
@@ -535,8 +535,8 @@
535
535
  "optional": true
536
536
  },
537
537
  "node_modules/@bastani/atomic-natives-win32-arm64-msvc": {
538
- "version": "0.9.35-alpha.1",
539
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-arm64-msvc/-/atomic-natives-win32-arm64-msvc-0.9.35-alpha.1.tgz",
538
+ "version": "0.9.35-alpha.3",
539
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-arm64-msvc/-/atomic-natives-win32-arm64-msvc-0.9.35-alpha.3.tgz",
540
540
  "license": "MIT",
541
541
  "os": [
542
542
  "win32"
@@ -547,8 +547,8 @@
547
547
  "optional": true
548
548
  },
549
549
  "node_modules/@bastani/atomic-natives-win32-x64-msvc": {
550
- "version": "0.9.35-alpha.1",
551
- "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-x64-msvc/-/atomic-natives-win32-x64-msvc-0.9.35-alpha.1.tgz",
550
+ "version": "0.9.35-alpha.3",
551
+ "resolved": "https://registry.npmjs.org/@bastani/atomic-natives-win32-x64-msvc/-/atomic-natives-win32-x64-msvc-0.9.35-alpha.3.tgz",
552
552
  "license": "MIT",
553
553
  "os": [
554
554
  "win32"
@@ -559,8 +559,8 @@
559
559
  "optional": true
560
560
  },
561
561
  "node_modules/@bastani/pi-ai": {
562
- "version": "0.9.35-alpha.1",
563
- "resolved": "https://registry.npmjs.org/@bastani/pi-ai/-/pi-ai-0.9.35-alpha.1.tgz",
562
+ "version": "0.9.35-alpha.3",
563
+ "resolved": "https://registry.npmjs.org/@bastani/pi-ai/-/pi-ai-0.9.35-alpha.3.tgz",
564
564
  "license": "MIT",
565
565
  "dependencies": {
566
566
  "@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.35-alpha.1",
3
+ "version": "0.9.35-alpha.3",
4
4
  "description": "Atomic coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "atomicConfig": {
@@ -82,8 +82,8 @@
82
82
  "prepublishOnly": "bun run clean && bun run build && bun run shrinkwrap"
83
83
  },
84
84
  "dependencies": {
85
- "@bastani/atomic-natives": "0.9.35-alpha.1",
86
- "@bastani/pi-ai": "0.9.35-alpha.1",
85
+ "@bastani/atomic-natives": "0.9.35-alpha.3",
86
+ "@bastani/pi-ai": "0.9.35-alpha.3",
87
87
  "@dbos-inc/dbos-sdk": "4.25.14",
88
88
  "@earendil-works/pi-agent-core": "1.1.0",
89
89
  "@earendil-works/pi-client": "1.1.0",