@bastani/atomic 0.9.57 → 0.9.58

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 (128) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/package.json +1 -1
  4. package/dist/builtin/subagents/CHANGELOG.md +18 -0
  5. package/dist/builtin/subagents/README.md +3 -1
  6. package/dist/builtin/subagents/package.json +1 -1
  7. package/dist/builtin/subagents/src/extension/index.bundle.mjs +202 -38
  8. package/dist/builtin/web-access/CHANGELOG.md +12 -0
  9. package/dist/builtin/web-access/index.bundle.mjs +2 -2
  10. package/dist/builtin/web-access/package.json +1 -1
  11. package/dist/builtin/workflows/CHANGELOG.md +42 -0
  12. package/dist/builtin/workflows/package.json +1 -1
  13. package/dist/builtin/workflows/src/extension/index.bundle.mjs +885 -228
  14. package/dist/builtin/workflows/src/extension/local-worker-entry.mjs +933 -175
  15. package/dist/builtin/workflows/src/index.js +630 -162
  16. package/dist/builtin/workflows/src/local-worker-entry.mjs +933 -175
  17. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +1 -1
  18. package/dist/builtin/workflows/src/shared/workflow-infrastructure-error.d.ts +13 -0
  19. package/dist/builtin/workflows/src/workers/public-options.d.ts +10 -0
  20. package/dist/core/agent-session-persistent-custom-messages.d.ts +5 -0
  21. package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -1
  22. package/dist/core/agent-session-persistent-custom-messages.js +16 -0
  23. package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
  24. package/dist/core/agent-session-tasks.d.ts.map +1 -1
  25. package/dist/core/agent-session-tasks.js +20 -0
  26. package/dist/core/agent-session-tasks.js.map +1 -1
  27. package/dist/core/child-session-options.d.ts.map +1 -1
  28. package/dist/core/child-session-options.js +3 -1
  29. package/dist/core/child-session-options.js.map +1 -1
  30. package/dist/core/sdk-types.d.ts +6 -1
  31. package/dist/core/sdk-types.d.ts.map +1 -1
  32. package/dist/core/sdk-types.js.map +1 -1
  33. package/dist/core/sdk.js +4 -2
  34. package/dist/core/sdk.js.map +1 -1
  35. package/dist/core/settings-defaults.d.ts +4 -0
  36. package/dist/core/settings-defaults.d.ts.map +1 -1
  37. package/dist/core/settings-defaults.js +4 -0
  38. package/dist/core/settings-defaults.js.map +1 -1
  39. package/dist/core/settings-manager-resource-accessors.d.ts +2 -0
  40. package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
  41. package/dist/core/settings-manager-resource-accessors.js +6 -0
  42. package/dist/core/settings-manager-resource-accessors.js.map +1 -1
  43. package/dist/core/settings-schema.d.ts +9 -0
  44. package/dist/core/settings-schema.d.ts.map +1 -1
  45. package/dist/core/settings-schema.js +11 -0
  46. package/dist/core/settings-schema.js.map +1 -1
  47. package/dist/core/settings-types.d.ts +1 -1
  48. package/dist/core/settings-types.d.ts.map +1 -1
  49. package/dist/core/settings-types.js.map +1 -1
  50. package/dist/core/tasks/agent-adapter.d.ts +10 -1
  51. package/dist/core/tasks/agent-adapter.d.ts.map +1 -1
  52. package/dist/core/tasks/agent-adapter.js +20 -0
  53. package/dist/core/tasks/agent-adapter.js.map +1 -1
  54. package/dist/core/tasks/contracts.d.ts +6 -0
  55. package/dist/core/tasks/contracts.d.ts.map +1 -1
  56. package/dist/core/tasks/contracts.js.map +1 -1
  57. package/dist/core/tasks/heartbeat-notice.d.ts +64 -0
  58. package/dist/core/tasks/heartbeat-notice.d.ts.map +1 -0
  59. package/dist/core/tasks/heartbeat-notice.js +98 -0
  60. package/dist/core/tasks/heartbeat-notice.js.map +1 -0
  61. package/dist/core/tasks/heartbeat.d.ts +75 -0
  62. package/dist/core/tasks/heartbeat.d.ts.map +1 -0
  63. package/dist/core/tasks/heartbeat.js +440 -0
  64. package/dist/core/tasks/heartbeat.js.map +1 -0
  65. package/dist/core/tasks/supervisor.d.ts +2 -0
  66. package/dist/core/tasks/supervisor.d.ts.map +1 -1
  67. package/dist/core/tasks/supervisor.js +32 -4
  68. package/dist/core/tasks/supervisor.js.map +1 -1
  69. package/dist/core/tasks/task-view-source.d.ts +72 -0
  70. package/dist/core/tasks/task-view-source.d.ts.map +1 -0
  71. package/dist/core/tasks/task-view-source.js +155 -0
  72. package/dist/core/tasks/task-view-source.js.map +1 -0
  73. package/dist/core/tools/bash-pty-native.d.ts +2 -0
  74. package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
  75. package/dist/core/tools/bash-pty-native.js +1 -0
  76. package/dist/core/tools/bash-pty-native.js.map +1 -1
  77. package/dist/core/tools/bash.d.ts +3 -0
  78. package/dist/core/tools/bash.d.ts.map +1 -1
  79. package/dist/core/tools/bash.js +20 -2
  80. package/dist/core/tools/bash.js.map +1 -1
  81. package/dist/core/tools/powershell.d.ts +16 -8
  82. package/dist/core/tools/powershell.d.ts.map +1 -1
  83. package/dist/index.d.ts +5 -3
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +4 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  88. package/dist/modes/interactive/components/chat-session-host-events.js +7 -0
  89. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  90. package/dist/modes/interactive/components/chat-session-host-state.d.ts +3 -0
  91. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  92. package/dist/modes/interactive/components/chat-session-host-state.js +4 -0
  93. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  94. package/dist/modes/interactive/components/chat-session-host-types.d.ts +11 -0
  95. package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -1
  96. package/dist/modes/interactive/components/chat-session-host-types.js.map +1 -1
  97. package/dist/modes/interactive/components/chat-session-host.d.ts +2 -0
  98. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  99. package/dist/modes/interactive/components/chat-session-host.js +15 -8
  100. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  101. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  102. package/dist/modes/interactive/components/custom-message.js +12 -0
  103. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  104. package/dist/modes/interactive/components/task-detail.d.ts.map +1 -1
  105. package/dist/modes/interactive/components/task-detail.js +5 -0
  106. package/dist/modes/interactive/components/task-detail.js.map +1 -1
  107. package/dist/modes/interactive/components/task-heartbeat-message.d.ts +14 -0
  108. package/dist/modes/interactive/components/task-heartbeat-message.d.ts.map +1 -0
  109. package/dist/modes/interactive/components/task-heartbeat-message.js +76 -0
  110. package/dist/modes/interactive/components/task-heartbeat-message.js.map +1 -0
  111. package/dist/modes/interactive/components/task-inspector.d.ts +6 -3
  112. package/dist/modes/interactive/components/task-inspector.d.ts.map +1 -1
  113. package/dist/modes/interactive/components/task-inspector.js +53 -100
  114. package/dist/modes/interactive/components/task-inspector.js.map +1 -1
  115. package/dist/modes/interactive/skill-command-autocomplete.d.ts +22 -2
  116. package/dist/modes/interactive/skill-command-autocomplete.d.ts.map +1 -1
  117. package/dist/modes/interactive/skill-command-autocomplete.js +28 -9
  118. package/dist/modes/interactive/skill-command-autocomplete.js.map +1 -1
  119. package/docs/background-tasks.md +65 -1
  120. package/docs/sdk.md +3 -1
  121. package/docs/settings.md +12 -0
  122. package/docs/subagents/reference.md +2 -0
  123. package/docs/subagents.md +2 -0
  124. package/docs/tools.md +2 -1
  125. package/docs/workflows/operations.md +5 -3
  126. package/npm-shrinkwrap.json +32 -32
  127. package/package.json +3 -3
  128. package/schemas/settings.schema.json +24 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,63 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.58] - 2026-11-01
6
+
7
+ Task heartbeats, stage chats that work on local workers, and a local worker pool that holds up under load.
8
+
9
+ - **Task heartbeats:** a background shell or subagent that keeps running now reports to its chat every 15 minutes, so the model catches stuck or runaway tasks without you stepping in. Change the cadence per call with `heartbeatMs` or for every task with the `tasks.heartbeatMs` setting, and see each task's cadence in `/tasks` ([#4141](https://github.com/bastani-inc/atomic/pull/4141))
10
+ - **Stage chats on local workers:** a stage whose session has not started reads as queued instead of running, and opens once it has. Its chat completes `/skill:` commands, runs `/compact` and `!` commands, and `/tasks` lists, opens and stops the stage's agents and shells, as in an in-process stage chat ([#4137](https://github.com/bastani-inc/atomic/pull/4137), [#4139](https://github.com/bastani-inc/atomic/pull/4139), [#4140](https://github.com/bastani-inc/atomic/pull/4140))
11
+ - **A local worker pool that holds up under load:** reloading workflows or starting other runs no longer fails a running root's children with `Stale lease for run <id>`, a busy machine no longer fails stages on delivery or lease errors, `/workflow pause` pauses a root's stages even while its own steps run, and an overloaded machine starts stages one at a time, tunable with `workflows.localWorkers.maxLoadPerCpu` ([#4138](https://github.com/bastani-inc/atomic/pull/4138), [#4145](https://github.com/bastani-inc/atomic/pull/4145), [#4146](https://github.com/bastani-inc/atomic/pull/4146))
12
+ - **Resuming pooled runs:** a root that runs children on local workers resumes from a new process, including one paused or failed by 0.9.57, and runs again the children that failed on a pool fault instead of replaying the failure ([#4146](https://github.com/bastani-inc/atomic/pull/4146))
13
+ - **Stopped tasks finish:** a shell stopped with `kill`, from `/tasks` or with Esc no longer stays "stopping" in the Tasks indicator forever; it ends as failed with the resource that could not be cleaned up ([#4142](https://github.com/bastani-inc/atomic/pull/4142))
14
+ - **Subagents that start and run as asked:** a subagent launched with an effort such as `model: "openai/gpt-5.5:xhigh"`, or from a chat turn that a workflow started, no longer stays `running` with no session, and one whose session still does not start within 5 minutes fails with the cause. An effort applies exactly where the model supports it, including on a fallback that starts in place of the requested model, and `status` lists only the children your session launched ([#4148](https://github.com/bastani-inc/atomic/pull/4148), [#4150](https://github.com/bastani-inc/atomic/pull/4150))
15
+ - **Quieter PDF fetches:** pdf.js font warnings such as `Warning: TT: undefined function: 32` no longer print over the terminal UI when a PDF is fetched ([#4136](https://github.com/bastani-inc/atomic/pull/4136))
16
+
17
+ ### Added
18
+
19
+ - `createSessionSkillAutocompleteProvider` also completes from a `SessionCommandCatalog`, the plain-data skill command list of a session that runs in another process (captured there with `getSessionCommandCatalog`), and shows a pending catalog's loading notice instead of an unavailable warning.
20
+ - `TaskInspector` and `ChatSessionHost` read tasks through a `TaskViewSource` (`ownerTaskViewSource(store)` for a session's own task store), so a host can show `/tasks` for a session that runs in another process through the new `getTaskSource` option.
21
+ - Added task heartbeats: a background shell or subagent that keeps running sends its chat a periodic `♥ Task heartbeat` notice, every 15 minutes by default like workflow heartbeats, so the model can catch runaway shells, stale subagents and hung tool calls without you stepping in. Each notice gives the task's elapsed time and when it last produced output or activity, a shell's last output lines, and a subagent's current tool call and turn, tool-call and token counts, then asks the model to let a progressing task run or to inspect, steer or stop one that is stuck, never relaunching a duplicate. Only running tasks heartbeat; tasks due together share one notice, a chat never has more than one unread heartbeat, and missed intervals are not replayed. Set `heartbeatMs` on a `bash` or `powershell` call (or `subagent`) to change one task's cadence, `0` to turn it off, or `tasks.heartbeatMs` in settings to change the default; `/tasks` shows each running task's cadence. Workflow stages on local workers heartbeat into their own stage chat the same way. See [Task heartbeats](https://github.com/bastani-inc/atomic/blob/main/packages/coding-agent/docs/background-tasks.md#task-heartbeats).
22
+
23
+ ### Fixed
24
+
25
+ - Workflow roots that run children on local workers (`workflows.localWorkers`) keep their children running when the session is busy. Reloading workflows and starting other runs in the same session could delay the root's lease renewal past the pool's 90-second window, after which every running child, and every child started later, failed with `Stale lease for run <id>` while the root kept running. The pool now waits for the late renewal, each run renews its lease independently, and a renewal that briefly fails is retried. Roots that never run a pooled `ctx.workflow` child no longer start an idle pool coordinator process. ([#4138](https://github.com/bastani-inc/atomic/pull/4138))
26
+ - A stopped shell no longer stays **stopping** in the Tasks indicator below the prompt forever (for example `Tasks 3 local agents running · 3 stopping · /tasks`). When a shell stopped with `kill`, from `/tasks`, by Esc on a foreground command, or by its timeout left a process outside its process group holding its output open (a daemon or a `setsid` or detached child), Atomic killed the command's process group but could not confirm cleanup, and the task never reached a final state. It now ends within a few seconds as failed with `CleanupUnconfirmed: Stop requested (<cause>); cleanup unconfirmed: <resource>`, and the indicator counts only tasks that are still stopping. A stopped subagent whose cleanup fails also ends instead of staying stopping. ([#4142](https://github.com/bastani-inc/atomic/pull/4142))
27
+ - Workflow stages on local workers (`workflows.localWorkers`) survive a heavily loaded machine. A slow startup delivery of queued Intercom messages no longer fails stages with `Worker exited before delivery acknowledgement`, a work lease that ran out only because renewals were processed late no longer fails or replays children (`Stale work lease`, `Stale resource admission attempt`), and a pool fault that reaches a running child replays it instead of failing its stage. Stages that do fail on a pool fault are recorded with that fault as a recoverable failure, and resume runs them again. ([#4145](https://github.com/bastani-inc/atomic/pull/4145))
28
+ - `/workflow pause` pauses a root's stages on local workers even while the root's own steps run, instead of reporting `No active stages to pause`, and pause or resume no longer fails with `Worker control acknowledgement unresolved` on a busy machine; the result says how many stages have not confirmed the pause yet. ([#4145](https://github.com/bastani-inc/atomic/pull/4145))
29
+ - Resuming a workflow root that runs children on local workers, including one paused or failed by 0.9.57, runs again the children an earlier process failed on a fault of the pool itself instead of replaying their failure, and a paused root with durable progress says it can be resumed from a new process. ([#4146](https://github.com/bastani-inc/atomic/pull/4146))
30
+ - On an overloaded machine, stages of workflow children on local workers start one at a time, at most one every 5 seconds, instead of all at once while earlier ones are still starting. Tune or turn off with `workflows.localWorkers.maxLoadPerCpu` (default `3`, `0` off). ([#4146](https://github.com/bastani-inc/atomic/pull/4146))
31
+ - A subagent launched from a chat turn that a running workflow started, for example with its completion notice, no longer stays `running` for good with no session, transcript or Intercom name. Its session waited for a permit from that workflow's resource admission (such as `admission.host.minFreeMemoryBytes` on a busy host) that it never received. A child session built from `getChildSessionOptions()` now takes its parent's admission or none, never one a `withResourceAdmission` scope the parent's turn happened to run in; SDK callers can pass `resourceAdmission: null` for a session that takes no permit inside such a scope. ([#4148](https://github.com/bastani-inc/atomic/pull/4148))
32
+ - A subagent whose session does not start within 5 minutes now fails with `Subagent session did not start within 5 min (still <step>)` instead of staying `running`, and `subagent({ action: "status" })` shows it failed with that cause, in its text and its expanded card. ([#4148](https://github.com/bastani-inc/atomic/pull/4148), [#4150](https://github.com/bastani-inc/atomic/pull/4150))
33
+ - A subagent launched with an effort, such as `model: "openai/gpt-5.5:xhigh"`, runs at exactly that effort on a model that supports it, and at that model's default level (its `modelThinkingLevels` entry, else `defaultThinkingLevel`) on one that does not, instead of the nearest level. A model its fallback chain switches to follows the same rule, so a fallback no longer drops the child to the default level silently, and a fallback the child starts on because the requested model's provider has no auth runs at its own effort. ([#4148](https://github.com/bastani-inc/atomic/pull/4148), [#4150](https://github.com/bastani-inc/atomic/pull/4150))
34
+ - `subagent({ action: "status" })` lists only the children this session launched, each with the child id `pause`, `resume` and `quit` take (`· id <run-id>:<n>`), and those actions also take the listed path. It no longer lists children of other sessions in the same process, such as a workflow stage's, that `quit` then refused with `this session launched no such child`, and `status` with a child id finds the child. ([#4148](https://github.com/bastani-inc/atomic/pull/4148))
35
+
36
+ ## [0.9.58-alpha.1] - 2026-11-01
37
+
38
+ Task heartbeats, stage chats that work on local workers, and a local worker pool that holds up under load.
39
+
40
+ - **Task heartbeats:** a background shell or subagent that keeps running now reports to its chat every 15 minutes, so the model catches stuck or runaway tasks without you stepping in. Change the cadence per call with `heartbeatMs` or for every task with the `tasks.heartbeatMs` setting, and see each task's cadence in `/tasks` ([#4141](https://github.com/bastani-inc/atomic/pull/4141))
41
+ - **Stage chats on local workers:** a stage whose session has not started reads as queued instead of running, and opens once it has. Its chat completes `/skill:` commands, runs `/compact` and `!` commands, and `/tasks` lists, opens and stops the stage's agents and shells, as in an in-process stage chat ([#4137](https://github.com/bastani-inc/atomic/pull/4137), [#4139](https://github.com/bastani-inc/atomic/pull/4139), [#4140](https://github.com/bastani-inc/atomic/pull/4140))
42
+ - **A local worker pool that holds up under load:** reloading workflows or starting other runs no longer fails a running root's children with `Stale lease for run <id>`, a busy machine no longer fails stages on delivery or lease errors, `/workflow pause` pauses a root's stages even while its own steps run, and an overloaded machine starts stages one at a time, tunable with `workflows.localWorkers.maxLoadPerCpu` ([#4138](https://github.com/bastani-inc/atomic/pull/4138), [#4145](https://github.com/bastani-inc/atomic/pull/4145), [#4146](https://github.com/bastani-inc/atomic/pull/4146))
43
+ - **Resuming pooled runs:** a root that runs children on local workers resumes from a new process, including one paused or failed by 0.9.57, and runs again the children that failed on a pool fault instead of replaying the failure ([#4146](https://github.com/bastani-inc/atomic/pull/4146))
44
+ - **Stopped tasks finish:** a shell stopped with `kill`, from `/tasks` or with Esc no longer stays "stopping" in the Tasks indicator forever; it ends as failed with the resource that could not be cleaned up ([#4142](https://github.com/bastani-inc/atomic/pull/4142))
45
+ - **Quieter PDF fetches:** pdf.js font warnings such as `Warning: TT: undefined function: 32` no longer print over the terminal UI when a PDF is fetched ([#4136](https://github.com/bastani-inc/atomic/pull/4136))
46
+
47
+ ### Added
48
+
49
+ - `createSessionSkillAutocompleteProvider` also completes from a `SessionCommandCatalog`, the plain-data skill command list of a session that runs in another process (captured there with `getSessionCommandCatalog`), and shows a pending catalog's loading notice instead of an unavailable warning.
50
+ - `TaskInspector` and `ChatSessionHost` read tasks through a `TaskViewSource` (`ownerTaskViewSource(store)` for a session's own task store), so a host can show `/tasks` for a session that runs in another process through the new `getTaskSource` option.
51
+ - Added task heartbeats: a background shell or subagent that keeps running sends its chat a periodic `♥ Task heartbeat` notice, every 15 minutes by default like workflow heartbeats, so the model can catch runaway shells, stale subagents and hung tool calls without you stepping in. Each notice gives the task's elapsed time and when it last produced output or activity, a shell's last output lines, and a subagent's current tool call and turn, tool-call and token counts, then asks the model to let a progressing task run or to inspect, steer or stop one that is stuck, never relaunching a duplicate. Only running tasks heartbeat; tasks due together share one notice, a chat never has more than one unread heartbeat, and missed intervals are not replayed. Set `heartbeatMs` on a `bash` or `powershell` call (or `subagent`) to change one task's cadence, `0` to turn it off, or `tasks.heartbeatMs` in settings to change the default; `/tasks` shows each running task's cadence. Workflow stages on local workers heartbeat into their own stage chat the same way. See [Task heartbeats](https://github.com/bastani-inc/atomic/blob/main/packages/coding-agent/docs/background-tasks.md#task-heartbeats).
52
+
53
+ ### Fixed
54
+
55
+ - Workflow roots that run children on local workers (`workflows.localWorkers`) keep their children running when the session is busy. Reloading workflows and starting other runs in the same session could delay the root's lease renewal past the pool's 90-second window, after which every running child, and every child started later, failed with `Stale lease for run <id>` while the root kept running. The pool now waits for the late renewal, each run renews its lease independently, and a renewal that briefly fails is retried. Roots that never run a pooled `ctx.workflow` child no longer start an idle pool coordinator process. ([#4138](https://github.com/bastani-inc/atomic/pull/4138))
56
+ - A stopped shell no longer stays **stopping** in the Tasks indicator below the prompt forever (for example `Tasks 3 local agents running · 3 stopping · /tasks`). When a shell stopped with `kill`, from `/tasks`, by Esc on a foreground command, or by its timeout left a process outside its process group holding its output open (a daemon or a `setsid` or detached child), Atomic killed the command's process group but could not confirm cleanup, and the task never reached a final state. It now ends within a few seconds as failed with `CleanupUnconfirmed: Stop requested (<cause>); cleanup unconfirmed: <resource>`, and the indicator counts only tasks that are still stopping. A stopped subagent whose cleanup fails also ends instead of staying stopping. ([#4142](https://github.com/bastani-inc/atomic/pull/4142))
57
+ - Workflow stages on local workers (`workflows.localWorkers`) survive a heavily loaded machine. A slow startup delivery of queued Intercom messages no longer fails stages with `Worker exited before delivery acknowledgement`, a work lease that ran out only because renewals were processed late no longer fails or replays children (`Stale work lease`, `Stale resource admission attempt`), and a pool fault that reaches a running child replays it instead of failing its stage. Stages that do fail on a pool fault are recorded with that fault as a recoverable failure, and resume runs them again. ([#4145](https://github.com/bastani-inc/atomic/pull/4145))
58
+ - `/workflow pause` pauses a root's stages on local workers even while the root's own steps run, instead of reporting `No active stages to pause`, and pause or resume no longer fails with `Worker control acknowledgement unresolved` on a busy machine; the result says how many stages have not confirmed the pause yet. ([#4145](https://github.com/bastani-inc/atomic/pull/4145))
59
+ - Resuming a workflow root that runs children on local workers, including one paused or failed by 0.9.57, runs again the children an earlier process failed on a fault of the pool itself instead of replaying their failure, and a paused root with durable progress says it can be resumed from a new process. ([#4146](https://github.com/bastani-inc/atomic/pull/4146))
60
+ - On an overloaded machine, stages of workflow children on local workers start one at a time, at most one every 5 seconds, instead of all at once while earlier ones are still starting. Tune or turn off with `workflows.localWorkers.maxLoadPerCpu` (default `3`, `0` off). ([#4146](https://github.com/bastani-inc/atomic/pull/4146))
61
+
5
62
  ## [0.9.57] - 2026-10-31
6
63
 
7
64
  ### Changed
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/intercom",
3
- "version": "0.9.57",
3
+ "version": "0.9.58",
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.57",
3
+ "version": "0.9.58",
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,24 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.58] - 2026-11-01
6
+
7
+ ### Added
8
+
9
+ - Running subagents now send the parent periodic task heartbeats (every 15 minutes by default) with their current tool call, time since their last activity, and turn, tool-call and token counts. Set `heartbeatMs` on a `subagent` call, or on a `tasks` entry, to change a child's cadence; `0` turns it off.
10
+
11
+ ### Fixed
12
+
13
+ - A subagent launched from a chat turn that a running workflow started no longer stays `running` for good with no session: its session no longer waits on that workflow's resource admission. A subagent whose session still does not start within 5 minutes fails with `Subagent session did not start within 5 min (still <step>)`, and `status` shows the cause in its text and its expanded card. ([#4148](https://github.com/bastani-inc/atomic/pull/4148), [#4150](https://github.com/bastani-inc/atomic/pull/4150))
14
+ - A subagent launched with an effort, such as `model: "openai/gpt-5.5:xhigh"`, runs at exactly that effort on a model that supports it, and at that model's default level on one that does not; each model in its fallback chain follows the same rule instead of falling back to the default level, including a fallback the child starts on in place of a requested model whose provider has no auth. ([#4148](https://github.com/bastani-inc/atomic/pull/4148), [#4150](https://github.com/bastani-inc/atomic/pull/4150))
15
+ - `status` lists only the children this session launched, with the child id `pause`, `resume` and `quit` take, and those actions also take the listed path; `status` with a child id finds the child. ([#4148](https://github.com/bastani-inc/atomic/pull/4148))
16
+
17
+ ## [0.9.58-alpha.1] - 2026-11-01
18
+
19
+ ### Added
20
+
21
+ - Running subagents now send the parent periodic task heartbeats (every 15 minutes by default) with their current tool call, time since their last activity, and turn, tool-call and token counts. Set `heartbeatMs` on a `subagent` call, or on a `tasks` entry, to change a child's cadence; `0` turns it off.
22
+
5
23
  ## [0.9.57] - 2026-10-31
6
24
 
7
25
  Desktop computer use moves from Cua Driver to agent-desktop.
@@ -570,6 +570,8 @@ subagent({ action: "quit", id: "<child-id>" })
570
570
  subagent({ action: "quit", all: true })
571
571
  ```
572
572
 
573
+ `status` lists the children this session launched that are still in this process, each as `<run-id>/<agent>_<n> — <state> (loaded|cold) · id <child-id>`, with the cause of a failed or interrupted child after it; `pause`, `resume` and `quit` take the child id or that path, and `status` takes either to show one child. Children other sessions in the same process launched, such as a workflow stage's, are not listed, since this session cannot control them. A child whose session has not started within 5 minutes fails with `Subagent session did not start within 5 min (still <step>)` instead of staying running.
574
+
573
575
  `pause` stops a child and holds its queued messages until `resume`; `quit` stops it gracefully, including a child already paused by you or with its workflow stage. Both stay resumable while the session or workflow stage that launched the child can still resume it, as do children stopped because their workflow stage was paused or quit, including by Atomic exiting or a session switch. `resume` reopens the child's own session under the same id and Intercom name. A paused, quit, or interrupted child receives `message` once as its next prompt and then continues where it left off; a completed or failed child receives `message` as one fresh prompt. Without `message`, every resumable child, including a completed or failed one, is asked to continue where it left off. Children cancelled for good (owner or batch cancellation, including a `/tasks` stop, and the removed `kill` action), children whose workflow stage ended (the stage finished, or its run ended or was cancelled; this covers all of that stage's children, including ones you paused or quit), and children reported gone after a restart cannot be resumed: `resume` returns an error that says why, and follow-up work requires a fresh launch with explicit context. A parallel child waiting for a reply is not terminal and continues in its original execution. Parent cancellation of a still-running child uses the interrupted/abort state: receipts and progress present it as cancelled rather than failed, persisted metadata keeps the abort cause, and bounded partial findings remain available. Migrate old subagent calls from `action: "kill"` or `action: "interrupt"` to `action: "quit"`; the old actions are rejected with `The subagent action "kill" was removed. Use { action: "quit", id } to stop a child gracefully; it stays resumable with { action: "resume", id, message? }.` (naming the action that was used). Host interrupt APIs are unchanged.
574
576
 
575
577
  ## Worktree isolation
@@ -814,7 +816,7 @@ The main runtime files are:
814
816
 
815
817
  ### Suffix-first reasoning levels
816
818
 
817
- Reasoning levels are configured suffix-first using the `model_name:thinking_effort` syntax on `model` and each `fallbackModels` entry: `model: claude-sonnet-4:high` and `fallbackModels: claude-sonnet-4:medium, gpt-5:low, claude-haiku-4:off`. Canonical efforts are `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, and `max`. `xhigh` and `max` are forwarded only when the selected model supports them. The older `thinking` field is deprecated; it remains supported as a legacy default only when a model candidate has no suffix, and a suffix always wins.
819
+ Reasoning levels are configured suffix-first using the `model_name:thinking_effort` syntax on `model` and each `fallbackModels` entry: `model: claude-sonnet-4:high` and `fallbackModels: claude-sonnet-4:medium, gpt-5:low, claude-haiku-4:off`. Canonical efforts are `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, and `max`. A child runs at exactly the effort it was launched with on a model that supports it; a model that does not support it, `xhigh` or `max` on many models, runs at its own default level instead (its `modelThinkingLevels` setting, else `defaultThinkingLevel`). Fallback models follow the same rule, using their own suffix or, without one, the launch's effort. The older `thinking` field is deprecated; it remains supported as a legacy default only when a model candidate has no suffix, and a suffix always wins.
818
820
 
819
821
  Migrate legacy `thinking` frontmatter by folding the effort into `model` and `fallbackModels`:
820
822
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/subagents",
3
- "version": "0.9.57",
3
+ "version": "0.9.58",
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": [