@bastani/atomic 0.9.11-alpha.9 → 0.9.12-alpha.1

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 (380) hide show
  1. package/CHANGELOG.md +147 -0
  2. package/README.md +1 -1
  3. package/dist/builtin/intercom/CHANGELOG.md +12 -0
  4. package/dist/builtin/intercom/closed-workflow-stage-message.ts +1 -1
  5. package/dist/builtin/intercom/contact-supervisor-tool.ts +1 -1
  6. package/dist/builtin/intercom/index-heavy.ts +2 -2
  7. package/dist/builtin/intercom/intercom-tool.ts +2 -2
  8. package/dist/builtin/intercom/intercom-utils.ts +1 -1
  9. package/dist/builtin/intercom/lifecycle.ts +2 -2
  10. package/dist/builtin/intercom/overlay.ts +2 -2
  11. package/dist/builtin/intercom/package.json +1 -1
  12. package/dist/builtin/intercom/reply-tracker.ts +1 -1
  13. package/dist/builtin/intercom/subagent-relay.ts +10 -7
  14. package/dist/builtin/mcp/CHANGELOG.md +16 -0
  15. package/dist/builtin/mcp/apps-cancellation.ts +1 -1
  16. package/dist/builtin/mcp/commands.ts +7 -7
  17. package/dist/builtin/mcp/direct-tool-executor.ts +1 -1
  18. package/dist/builtin/mcp/direct-tools.ts +3 -3
  19. package/dist/builtin/mcp/host-html-template.ts +1 -1
  20. package/dist/builtin/mcp/index.ts +3 -3
  21. package/dist/builtin/mcp/init.ts +6 -6
  22. package/dist/builtin/mcp/mcp-auth-flow.ts +1 -1
  23. package/dist/builtin/mcp/mcp-callback-server.ts +1 -1
  24. package/dist/builtin/mcp/mcp-panel-state.ts +1 -1
  25. package/dist/builtin/mcp/mcp-panel.ts +1 -1
  26. package/dist/builtin/mcp/metadata-cache.ts +1 -1
  27. package/dist/builtin/mcp/package.json +1 -1
  28. package/dist/builtin/mcp/proxy-call.ts +2 -2
  29. package/dist/builtin/mcp/proxy-info-modes.ts +2 -2
  30. package/dist/builtin/mcp/sampling-handler.ts +1 -1
  31. package/dist/builtin/mcp/server-manager.ts +3 -3
  32. package/dist/builtin/mcp/startup-warmup.ts +5 -5
  33. package/dist/builtin/mcp/state.ts +1 -1
  34. package/dist/builtin/mcp/tool-call-timeout.ts +1 -1
  35. package/dist/builtin/mcp/tool-metadata.ts +2 -2
  36. package/dist/builtin/mcp/types.ts +1 -1
  37. package/dist/builtin/mcp/ui-server.ts +4 -4
  38. package/dist/builtin/mcp/ui-session.ts +3 -3
  39. package/dist/builtin/subagents/CHANGELOG.md +26 -0
  40. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  41. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  42. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  43. package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
  44. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  45. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  46. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  47. package/dist/builtin/subagents/agents/worker.md +2 -2
  48. package/dist/builtin/subagents/package.json +1 -1
  49. package/dist/builtin/subagents/src/extension/notification-content.ts +14 -9
  50. package/dist/builtin/subagents/src/runs/background/notify.ts +20 -4
  51. package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +5 -5
  52. package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +1 -1
  53. package/dist/builtin/subagents/src/runs/background/result-status.ts +2 -2
  54. package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +2 -2
  55. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +1 -1
  56. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +1 -1
  57. package/dist/builtin/subagents/src/shared/artifacts.ts +1 -1
  58. package/dist/builtin/web-access/CHANGELOG.md +26 -0
  59. package/dist/builtin/web-access/content-tools.ts +1 -0
  60. package/dist/builtin/web-access/flat-string.ts +37 -0
  61. package/dist/builtin/web-access/github-api.ts +2 -1
  62. package/dist/builtin/web-access/github-extract.ts +3 -2
  63. package/dist/builtin/web-access/index-heavy.ts +1 -1
  64. package/dist/builtin/web-access/package.json +2 -2
  65. package/dist/builtin/workflows/CHANGELOG.md +68 -0
  66. package/dist/builtin/workflows/README.md +1 -1
  67. package/dist/builtin/workflows/builtin/goal-ledger.ts +6 -4
  68. package/dist/builtin/workflows/builtin/goal-prompts.ts +4 -1
  69. package/dist/builtin/workflows/builtin/goal-runner.ts +2 -1
  70. package/dist/builtin/workflows/builtin/goal.ts +1 -1
  71. package/dist/builtin/workflows/builtin/ralph-core.ts +15 -13
  72. package/dist/builtin/workflows/builtin/ralph-forked-prompts.ts +7 -6
  73. package/dist/builtin/workflows/builtin/ralph-models.ts +4 -4
  74. package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +2 -1
  75. package/dist/builtin/workflows/builtin/ralph-runner.ts +7 -9
  76. package/dist/builtin/workflows/builtin/ralph.ts +2 -1
  77. package/dist/builtin/workflows/builtin/shared-prompts.ts +34 -7
  78. package/dist/builtin/workflows/package.json +1 -1
  79. package/dist/builtin/workflows/src/authoring/keep-context.ts +46 -0
  80. package/dist/builtin/workflows/src/authoring.d.ts +11 -0
  81. package/dist/builtin/workflows/src/durable/completed-catalog.ts +14 -8
  82. package/dist/builtin/workflows/src/durable/completed-inspection.ts +10 -11
  83. package/dist/builtin/workflows/src/durable/resume-catalog.ts +1 -1
  84. package/dist/builtin/workflows/src/durable/resume-eligibility.ts +42 -0
  85. package/dist/builtin/workflows/src/durable/resume-runtime.ts +36 -37
  86. package/dist/builtin/workflows/src/durable/tool-primitive.ts +10 -2
  87. package/dist/builtin/workflows/src/engine/run.ts +1 -0
  88. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +12 -8
  89. package/dist/builtin/workflows/src/extension/hil-answer-notifications.ts +5 -2
  90. package/dist/builtin/workflows/src/extension/index.bundle.mjs +2001 -897
  91. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +6 -3
  92. package/dist/builtin/workflows/src/extension/postmortem-deps.ts +3 -2
  93. package/dist/builtin/workflows/src/extension/render-result.ts +4 -11
  94. package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +17 -20
  95. package/dist/builtin/workflows/src/extension/runtime.ts +3 -3
  96. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +1 -1
  97. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +3 -7
  98. package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +21 -24
  99. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +4 -0
  100. package/dist/builtin/workflows/src/extension/workflow-resume-picker-rows.ts +38 -26
  101. package/dist/builtin/workflows/src/extension/workflow-resume-shadow.ts +2 -1
  102. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +56 -64
  103. package/dist/builtin/workflows/src/extension/workflow-schema.ts +2 -2
  104. package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +0 -5
  105. package/dist/builtin/workflows/src/extension/workflow-targets.ts +17 -20
  106. package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +1 -1
  107. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +24 -51
  108. package/dist/builtin/workflows/src/extension/workflow-tool-inspection.ts +7 -29
  109. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +5 -13
  110. package/dist/builtin/workflows/src/extension/workflow-tool.ts +4 -13
  111. package/dist/builtin/workflows/src/runs/background/quit.ts +4 -3
  112. package/dist/builtin/workflows/src/runs/background/run-inspect.ts +8 -8
  113. package/dist/builtin/workflows/src/runs/background/status.ts +2 -1
  114. package/dist/builtin/workflows/src/runs/background/workflow-lifecycle-aggregate.ts +2 -1
  115. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +5 -5
  116. package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +4 -0
  117. package/dist/builtin/workflows/src/runs/foreground/executor-scheduler.ts +2 -0
  118. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +23 -8
  119. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +6 -2
  120. package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +5 -0
  121. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +56 -10
  122. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +6 -0
  123. package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +137 -6
  124. package/dist/builtin/workflows/src/sdk-surface.ts +1 -0
  125. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +2 -0
  126. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +2 -0
  127. package/dist/builtin/workflows/src/shared/expanded-workflow-graph.ts +159 -10
  128. package/dist/builtin/workflows/src/shared/flat-string.ts +33 -0
  129. package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +144 -0
  130. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +2 -3
  131. package/dist/builtin/workflows/src/shared/run-id.ts +36 -0
  132. package/dist/builtin/workflows/src/shared/store-internal.ts +32 -3
  133. package/dist/builtin/workflows/src/shared/store-observation.ts +10 -0
  134. package/dist/builtin/workflows/src/shared/store-public-types.ts +8 -0
  135. package/dist/builtin/workflows/src/shared/store-run-methods.ts +14 -0
  136. package/dist/builtin/workflows/src/shared/store-types.ts +4 -0
  137. package/dist/builtin/workflows/src/shared/types.ts +2 -0
  138. package/dist/builtin/workflows/src/shared/workflow-artifacts.ts +261 -0
  139. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +39 -23
  140. package/dist/builtin/workflows/src/tui/graph-canvas.ts +26 -9
  141. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +3 -0
  142. package/dist/builtin/workflows/src/tui/graph-view-graph-render.ts +95 -98
  143. package/dist/builtin/workflows/src/tui/graph-view-render.ts +7 -20
  144. package/dist/builtin/workflows/src/tui/graph-view-state.ts +160 -13
  145. package/dist/builtin/workflows/src/tui/layout.ts +8 -2
  146. package/dist/builtin/workflows/src/tui/node-card.ts +57 -45
  147. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +4 -2
  148. package/dist/builtin/workflows/src/tui/prompt-card-render.ts +291 -21
  149. package/dist/builtin/workflows/src/tui/prompt-card.ts +1 -1
  150. package/dist/builtin/workflows/src/tui/renderers.ts +0 -1
  151. package/dist/builtin/workflows/src/tui/run-detail.ts +52 -35
  152. package/dist/builtin/workflows/src/tui/run-identity-rows.ts +97 -0
  153. package/dist/builtin/workflows/src/tui/session-overlays.ts +24 -3
  154. package/dist/builtin/workflows/src/tui/session-picker.ts +94 -41
  155. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +190 -26
  156. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +52 -18
  157. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +9 -5
  158. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +44 -4
  159. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +3 -1
  160. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +3 -2
  161. package/dist/builtin/workflows/src/tui/status-list.ts +67 -45
  162. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +7 -6
  163. package/dist/builtin/workflows/src/tui/widget.ts +49 -40
  164. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +15 -10
  165. package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +21 -8
  166. package/dist/core/agent-session-accessors.d.ts.map +1 -1
  167. package/dist/core/agent-session-accessors.js +5 -0
  168. package/dist/core/agent-session-accessors.js.map +1 -1
  169. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  170. package/dist/core/agent-session-auto-compaction.js +5 -0
  171. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  172. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  173. package/dist/core/agent-session-compaction.js +3 -0
  174. package/dist/core/agent-session-compaction.js.map +1 -1
  175. package/dist/core/agent-session-events.d.ts.map +1 -1
  176. package/dist/core/agent-session-events.js +2 -1
  177. package/dist/core/agent-session-events.js.map +1 -1
  178. package/dist/core/agent-session-message-queue.d.ts +3 -7
  179. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  180. package/dist/core/agent-session-message-queue.js +27 -13
  181. package/dist/core/agent-session-message-queue.js.map +1 -1
  182. package/dist/core/agent-session-methods.d.ts +6 -4
  183. package/dist/core/agent-session-methods.d.ts.map +1 -1
  184. package/dist/core/agent-session-methods.js.map +1 -1
  185. package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -1
  186. package/dist/core/agent-session-persistent-custom-messages.js +6 -3
  187. package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
  188. package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
  189. package/dist/core/agent-session-post-tool-compaction.js +11 -2
  190. package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
  191. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  192. package/dist/core/agent-session-runtime.js +5 -3
  193. package/dist/core/agent-session-runtime.js.map +1 -1
  194. package/dist/core/agent-session-tree.d.ts.map +1 -1
  195. package/dist/core/agent-session-tree.js +4 -0
  196. package/dist/core/agent-session-tree.js.map +1 -1
  197. package/dist/core/agent-session-types.d.ts +4 -0
  198. package/dist/core/agent-session-types.d.ts.map +1 -1
  199. package/dist/core/agent-session-types.js.map +1 -1
  200. package/dist/core/agent-session.d.ts +3 -2
  201. package/dist/core/agent-session.d.ts.map +1 -1
  202. package/dist/core/agent-session.js +1 -0
  203. package/dist/core/agent-session.js.map +1 -1
  204. package/dist/core/async/session-manager.d.ts +1 -1
  205. package/dist/core/async/session-manager.js.map +1 -1
  206. package/dist/core/auth-storage-backends.d.ts.map +1 -1
  207. package/dist/core/auth-storage-backends.js +12 -1
  208. package/dist/core/auth-storage-backends.js.map +1 -1
  209. package/dist/core/bounded-model-refresh.d.ts +14 -0
  210. package/dist/core/bounded-model-refresh.d.ts.map +1 -0
  211. package/dist/core/bounded-model-refresh.js +38 -0
  212. package/dist/core/bounded-model-refresh.js.map +1 -0
  213. package/dist/core/compaction/branch-summarization.js.map +1 -1
  214. package/dist/core/compaction/compaction-boundary.d.ts +2 -2
  215. package/dist/core/compaction/compaction-boundary.js.map +1 -1
  216. package/dist/core/compaction/compaction-parameters.d.ts +5 -0
  217. package/dist/core/compaction/compaction-parameters.d.ts.map +1 -1
  218. package/dist/core/compaction/compaction-parameters.js +6 -5
  219. package/dist/core/compaction/compaction-parameters.js.map +1 -1
  220. package/dist/core/compaction/compaction-runner.d.ts +4 -0
  221. package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
  222. package/dist/core/compaction/compaction-runner.js +5 -1
  223. package/dist/core/compaction/compaction-runner.js.map +1 -1
  224. package/dist/core/compaction/compaction-types.d.ts +7 -1
  225. package/dist/core/compaction/compaction-types.d.ts.map +1 -1
  226. package/dist/core/compaction/compaction-types.js.map +1 -1
  227. package/dist/core/compaction/deleted-ranges.d.ts.map +1 -1
  228. package/dist/core/compaction/deleted-ranges.js +2 -0
  229. package/dist/core/compaction/deleted-ranges.js.map +1 -1
  230. package/dist/core/compaction/fallback-planner.d.ts +1 -1
  231. package/dist/core/compaction/fallback-planner.js.map +1 -1
  232. package/dist/core/compaction/range-planner.d.ts +3 -3
  233. package/dist/core/compaction/range-planner.d.ts.map +1 -1
  234. package/dist/core/compaction/range-planner.js +12 -14
  235. package/dist/core/compaction/range-planner.js.map +1 -1
  236. package/dist/core/compaction/transcript-serialization.d.ts +12 -0
  237. package/dist/core/compaction/transcript-serialization.d.ts.map +1 -1
  238. package/dist/core/compaction/transcript-serialization.js +99 -1
  239. package/dist/core/compaction/transcript-serialization.js.map +1 -1
  240. package/dist/core/compaction/utils.d.ts +3 -0
  241. package/dist/core/compaction/utils.d.ts.map +1 -1
  242. package/dist/core/compaction/utils.js +16 -0
  243. package/dist/core/compaction/utils.js.map +1 -1
  244. package/dist/core/context-tool-pairing.d.ts +4 -4
  245. package/dist/core/context-tool-pairing.js +4 -4
  246. package/dist/core/context-tool-pairing.js.map +1 -1
  247. package/dist/core/http-dispatcher.d.ts.map +1 -1
  248. package/dist/core/http-dispatcher.js +26 -1
  249. package/dist/core/http-dispatcher.js.map +1 -1
  250. package/dist/core/messages.d.ts +18 -6
  251. package/dist/core/messages.d.ts.map +1 -1
  252. package/dist/core/messages.js +46 -18
  253. package/dist/core/messages.js.map +1 -1
  254. package/dist/core/model-refresh-timeout.d.ts +9 -0
  255. package/dist/core/model-refresh-timeout.d.ts.map +1 -0
  256. package/dist/core/model-refresh-timeout.js +9 -0
  257. package/dist/core/model-refresh-timeout.js.map +1 -0
  258. package/dist/core/model-runtime-snapshot.d.ts +3 -0
  259. package/dist/core/model-runtime-snapshot.d.ts.map +1 -1
  260. package/dist/core/model-runtime-snapshot.js +59 -0
  261. package/dist/core/model-runtime-snapshot.js.map +1 -1
  262. package/dist/core/model-runtime.d.ts +7 -1
  263. package/dist/core/model-runtime.d.ts.map +1 -1
  264. package/dist/core/model-runtime.js +72 -17
  265. package/dist/core/model-runtime.js.map +1 -1
  266. package/dist/core/sdk.d.ts.map +1 -1
  267. package/dist/core/sdk.js +4 -3
  268. package/dist/core/sdk.js.map +1 -1
  269. package/dist/core/session-manager-core.d.ts +1 -1
  270. package/dist/core/session-manager-core.d.ts.map +1 -1
  271. package/dist/core/session-manager-core.js +2 -2
  272. package/dist/core/session-manager-core.js.map +1 -1
  273. package/dist/core/session-manager-entries.d.ts +1 -1
  274. package/dist/core/session-manager-entries.d.ts.map +1 -1
  275. package/dist/core/session-manager-entries.js +2 -1
  276. package/dist/core/session-manager-entries.js.map +1 -1
  277. package/dist/core/session-manager-history.d.ts.map +1 -1
  278. package/dist/core/session-manager-history.js +2 -2
  279. package/dist/core/session-manager-history.js.map +1 -1
  280. package/dist/core/session-manager-types.d.ts +3 -0
  281. package/dist/core/session-manager-types.d.ts.map +1 -1
  282. package/dist/core/session-manager-types.js.map +1 -1
  283. package/dist/core/tools/bash-async-execution.d.ts +1 -1
  284. package/dist/core/tools/bash-async-execution.js.map +1 -1
  285. package/dist/core/tools/bash.js.map +1 -1
  286. package/dist/core/tools/oversized-tool-result.js.map +1 -1
  287. package/dist/extensions/index.d.ts +1 -1
  288. package/dist/extensions/index.js.map +1 -1
  289. package/dist/extensions/llama/huggingface-ui.d.ts +2 -2
  290. package/dist/extensions/llama/huggingface-ui.js.map +1 -1
  291. package/dist/extensions/llama/index.d.ts +1 -1
  292. package/dist/extensions/llama/index.js.map +1 -1
  293. package/dist/extensions/llama/ui.d.ts +1 -1
  294. package/dist/extensions/llama/ui.js.map +1 -1
  295. package/dist/index.d.ts +1 -1
  296. package/dist/index.d.ts.map +1 -1
  297. package/dist/index.js.map +1 -1
  298. package/dist/main-app-mode.d.ts +1 -0
  299. package/dist/main-app-mode.d.ts.map +1 -1
  300. package/dist/main-app-mode.js +3 -0
  301. package/dist/main-app-mode.js.map +1 -1
  302. package/dist/main.d.ts.map +1 -1
  303. package/dist/main.js +8 -3
  304. package/dist/main.js.map +1 -1
  305. package/dist/modes/interactive/components/chat-session-host-actions.d.ts +7 -2
  306. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  307. package/dist/modes/interactive/components/chat-session-host-actions.js +13 -4
  308. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  309. package/dist/modes/interactive/components/chat-session-host-editor.d.ts +3 -1
  310. package/dist/modes/interactive/components/chat-session-host-editor.d.ts.map +1 -1
  311. package/dist/modes/interactive/components/chat-session-host-editor.js +2 -2
  312. package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -1
  313. package/dist/modes/interactive/components/chat-session-host-events.d.ts +3 -0
  314. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  315. package/dist/modes/interactive/components/chat-session-host-events.js +5 -4
  316. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  317. package/dist/modes/interactive/components/chat-session-host.d.ts +16 -2
  318. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  319. package/dist/modes/interactive/components/chat-session-host.js +35 -5
  320. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  321. package/dist/modes/interactive/components/index.d.ts +1 -0
  322. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  323. package/dist/modes/interactive/components/index.js.map +1 -1
  324. package/dist/modes/interactive/components/model-selector.d.ts +0 -1
  325. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  326. package/dist/modes/interactive/components/model-selector.js +25 -35
  327. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  328. package/dist/modes/interactive/interactive-editor-actions.js +2 -1
  329. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  330. package/dist/modes/interactive/interactive-input-handling.js +1 -1
  331. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  332. package/dist/modes/interactive/interactive-mode-surface.d.ts +4 -1
  333. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  334. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  335. package/dist/modes/interactive/interactive-model-routing.js +4 -1
  336. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  337. package/dist/modes/interactive/interactive-pause.d.ts +3 -1
  338. package/dist/modes/interactive/interactive-pause.d.ts.map +1 -1
  339. package/dist/modes/interactive/interactive-pause.js +5 -1
  340. package/dist/modes/interactive/interactive-pause.js.map +1 -1
  341. package/dist/modes/interactive/interactive-queueing.js +3 -3
  342. package/dist/modes/interactive/interactive-queueing.js.map +1 -1
  343. package/dist/modes/interactive-engine/engine-health.d.ts +6 -0
  344. package/dist/modes/interactive-engine/engine-health.d.ts.map +1 -1
  345. package/dist/modes/interactive-engine/engine-health.js +15 -1
  346. package/dist/modes/interactive-engine/engine-health.js.map +1 -1
  347. package/dist/modes/interactive-engine/isolated-auth.js +1 -1
  348. package/dist/modes/interactive-engine/isolated-auth.js.map +1 -1
  349. package/dist/modes/interactive-engine/isolated-runtime.d.ts +1 -0
  350. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  351. package/dist/modes/interactive-engine/isolated-runtime.js +7 -1
  352. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  353. package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
  354. package/dist/modes/interactive-engine/remote-model-catalog.js +5 -1
  355. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  356. package/dist/modes/interactive-engine/remote-queue-pause.d.ts +1 -1
  357. package/dist/modes/interactive-engine/remote-queue-pause.js.map +1 -1
  358. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  359. package/dist/modes/rpc/rpc-command-handler.js +23 -7
  360. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  361. package/dist/modes/rpc/rpc-input-scheduler.js +1 -1
  362. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
  363. package/dist/modes/rpc/rpc-types.d.ts +2 -1
  364. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  365. package/dist/modes/rpc/rpc-types.js.map +1 -1
  366. package/docs/compaction.md +24 -0
  367. package/docs/custom-provider.md +3 -3
  368. package/docs/extensions.md +3 -1
  369. package/docs/index.md +10 -0
  370. package/docs/keybindings.md +1 -1
  371. package/docs/models.md +2 -0
  372. package/docs/providers.md +7 -3
  373. package/docs/quickstart.md +7 -1
  374. package/docs/session-format.md +2 -0
  375. package/docs/termux.md +3 -1
  376. package/docs/usage.md +3 -2
  377. package/docs/workflows.md +138 -46
  378. package/npm-shrinkwrap.json +69 -37
  379. package/package.json +4 -4
  380. package/dist/builtin/workflows/src/tui/toast.ts +0 -107
package/CHANGELOG.md CHANGED
@@ -2,6 +2,153 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.12-alpha.1] - 2026-08-04
6
+
7
+ ### Added
8
+
9
+ - Compaction honors `<keepContext>` / `</keepContext>` tags. Wrap any part of a prompt you never want compressed, and every line of the span — tag lines included — is protected verbatim regardless of the compression ratio. The guarantee is mechanical rather than advisory: deletion ranges are split around protected lines after the planner responds. Because the tag lines are protected too, a span is re-detected on each subsequent boundary and stays protected for the life of the session. Detection is bounded on three sides, because the transcript it scans is untrusted: a tag must be the whole line after any role header, a span is scoped to one message so an unclosed tag stops at the end of its own message rather than running to the end of the region, and tags inside tool results are inert — user and assistant messages may both protect, so prompts, steering, and an agent's own pinned information all work, but file, page, or command output an agent reads cannot mark itself unreclaimable or persist through compaction ahead of real content. Protected lines count against the keep target rather than raising it, so the compression ratio stays a real bound on output size and the unprotected remainder compresses harder. Results report force-preserved ranges as `keptRanges` ([#2172](https://github.com/bastani-inc/atomic/issues/2172)).
10
+
11
+ ### Fixed
12
+
13
+ - The compaction relevance query is no longer truncated to 1,000 characters. Truncation made prompt section order the retention policy: for a long structured prompt only the leading section reached the planner, so a constraint stated later could not influence what was kept, while the objective it qualified survived and was acted on. Long queries are safe — an oversized planner request surfaces as an explicit provider-overflow failure rather than silent truncation ([#2172](https://github.com/bastani-inc/atomic/issues/2172)).
14
+ - Cleared three advisories in the shipped dependency tree. `undici` moves 8.5.0 → 8.9.0, which covers five advisories against 8.0.0–8.8.0 — response desynchronization via the retry interceptor, two cross-user cache-directive disclosures, CRLF injection through a blob body `type`, and cookie-attribute injection — and it is the dispatcher behind `fetch_url` and every agent HTTP request. Transitively under `@modelcontextprotocol/sdk`, `ip-address` is pinned to 10.3.1 for three SSRF and trust-boundary bypasses (octal-decoded leading-zero octets, CIDR suffixes suppressing special-use classification, and misclassified IPv4-mapped/NAT64 addresses), and `hono` to 4.12.34 for a CORS-middleware ReDoS. `npm audit` is clean.
15
+
16
+ - Fixed bundled builtin extensions failing to load on Windows when shared modules were evaluated twice, so bundled workflows and tools initialize correctly.
17
+
18
+ ## [0.9.11] - 2026-08-03
19
+
20
+ Cumulative release of the `0.9.11-alpha.1` – `0.9.11-alpha.12` prereleases. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease sections below.
21
+
22
+ ### Breaking Changes
23
+
24
+ - Adopted pi 0.83.0 (`@earendil-works/pi-agent-core`, `pi-ai`, `pi-tui` at `^0.83.0`), which moves the bundled TypeBox to 1.3.7 and **removes seven deprecated APIs**. Atomic inherits the removal exactly as upstream shipped it with no compatibility shim, so an extension, skill, workflow, or MCP schema still calling one of these fails to compile and to run. Atomic's own sources use none of them.
25
+
26
+ | Removed API | Replacement |
27
+ | --- | --- |
28
+ | `Type.Options(type, options)` | `Type.With(type, options)` — straight rename |
29
+ | `Type.Base` | `Type.Refine()` + `Type.Unsafe()` |
30
+ | `Type.Promise(item)` | none — model the resolved value and validate after `await` |
31
+ | `Type.Awaited(type)` | none — use the resolved type itself |
32
+ | `Type.Iterator(items)` / `Type.AsyncIterator(items)` | none — drain first, then `Type.Array(items)` |
33
+ | `Value.Mutate(current, next)` | `Value.Patch(current, Value.Diff(current, next))` — returns a **new** value rather than assigning in place |
34
+
35
+ - Replaced Atomic's legacy extension OAuth registration bridge with provider-owned authentication from `@earendil-works/pi-ai`, and adopted pi's provider-owned `ModelRuntime` architecture for model composition, credentials, streaming, and catalog refresh. The bridge functions (`registerOAuthProvider`, `getOAuthApiKey`, and the rest) and their credential/status types are gone from the package root; `AuthStorage` now implements pi's asynchronous `CredentialStore` contract, so its synchronous compatibility methods and provider-auth helpers were removed in favour of `read`, `list`, `modify`, `delete`, and `ModelRuntime`; `ModelRegistry` is now the thin synchronous extension-compatibility facade constructed as `new ModelRegistry(runtime)`; and `CreateAgentSessionOptions` takes `modelRuntime` instead of `authStorage`/`modelRegistry`. Extensions must declare OAuth or API-key authentication on their provider registration, and `streamSimple` implementations are now scoped to their registered provider.
36
+ - Model configuration follows pi's single-file `ModelConfig` contract: Atomic reads one `models.json` from the active agent directory and no longer reads project-scoped `.atomic/models.json`, falls back to `~/.pi/agent/models.json`, or merges layered files. Move project-scoped custom providers and models into the agent-directory file. Catalog refreshes also use pi's exact timeout semantics — `modelRefreshTimeoutMs` applies only to the initial runtime creation refresh, and `/model` owns its own 15-second timeout.
37
+ - Removed all Atomic-specific GitHub Copilot handling; `github-copilot` is now an ordinary upstream provider sourced entirely from `pi-ai`. The live CAPI catalog fetch and disk cache, enterprise/GHE base-URL routing, the Gemini tool-schema sanitizer, the Anthropic `message_stop` SSE repair, and Copilot prompt-limit guidance are all gone. Because pi's bundled context windows can exceed what Copilot's API enforces, long sessions on affected models may overrun the server-side cap instead of compacting first ([#1608](https://github.com/bastani-inc/atomic/issues/1608)).
38
+ - Removed the short/long context-window selection feature, which upstream pi does not have: the `contextWindowOptions` / `defaultContextWindow` / `maxInputTokens` model fields, the `/model` picker, `--context-window`, the `defaultContextWindow(s)` settings, the `set_context_window` and `get_available_context_windows` RPC commands, the `context_window_changed` event, the `contextWindow` / `contextWindowStrict` SDK and workflow-stage options, the related root exports, and the `(1m)` / `(long)` token in subagent and workflow model strings. A model's `contextWindow` is now a single catalog value.
39
+ - Isolated interactive `ctx.ui.custom()` components that consume Ctrl+C must declare `{ handlesCtrlC: true }`. Without it the first Ctrl+C is the host escape and closes the focused component, resolving its promise with `undefined`. Bundled workflow and MCP surfaces were migrated; third-party extensions binding Ctrl+C need the one-line addition.
40
+ - Changed the published `runVerbatimCompaction` SDK export to a request object: `runVerbatimCompaction(preparation, model, { resolveAuth, signal, thinkingLevel, urgency, ...options })`. Pre-resolved credentials become a `resolveAuth(model)` callback because a borrowed fallback model needs its own credentials, and `urgency` is required with no default so only a `load_bearing` caller can reach the context-destroying fresh rung. The persisted `CompactionEntry` shape, resume, and the compaction hooks are preserved.
41
+ - Workflow run targets now require the full 36-character run UUID; typed prefixes are no longer resolved by any command or `runId` action, and a malformed target is rejected with a diagnostic distinct from `Run not found:` so a truncated paste is diagnosable. Stage targets are matched exactly, so `build` will not select `build-check`. Every user-facing surface already prints the full id.
42
+ - The RPC `login_provider` response no longer carries the API key it just stored. `RpcLoginProviderResult` dropped its `credential` member; `type` confirms which kind of credential was saved.
43
+
44
+ ### Added
45
+
46
+ - Added first-class Alpine/musl Linux support for x64 and arm64, including native search and PTY bindings and the `atomic-linux-x64-musl.tar.gz` and `atomic-linux-arm64-musl.tar.gz` archives. The musl archives omit the clipboard binding and glibc-linked `@embedded-postgres/*` binaries, so Atomic falls back to Linux clipboard commands/OSC52 and durable Alpine workflows require external Postgres.
47
+ - Added `atomic auth print-api-key` and `atomic auth print-bearer-token`, which print exactly one named credential to stdout while every warning and diagnostic goes to stderr, so `KEY=$(atomic auth print-api-key --model gpt-5.5)` cannot capture noise. `--model` is required, `--provider` and `--model` are the only accepted options, there is no file or clipboard sink, and `print-bearer-token` refreshes a token with less than `--min-expiry` (default `30m`) remaining. Failures are distinguishable by exit code 1–9, including a partial-write exit that tells you to discard the output. Documented in `docs/usage.md` and `docs/security.md`.
48
+ - Added a compaction rung ladder so a compaction that must succeed always does. The range planner returns typed outcomes instead of ranges-or-throw; a terminal attempt borrows the next `settings.fallbackModels` entry for one planner request resolved with that candidate's own credentials, without changing the session model or history; an overflowing planner request withholds the oldest region lines and retries; and when every model is exhausted, a load-bearing compaction starts a fresh context window — a loud (`✻ Context cleared (compaction degraded)`) and durable (`details.rung: "fresh"`) model-free rung. Manual `/compact` and threshold auto-compaction may borrow a model but can never clear context. **A configured fallback model may now receive the compaction transcript.**
49
+ - Added a built-in, hidden llama.cpp router provider with `/login llama.cpp`, `LLAMA_BASE_URL`/`LLAMA_API_KEY` configuration, loaded-model discovery, and the `/llama` manager for load, unload, reconnect, and Hugging Face GGUF download flows.
50
+ - Added provider-metadata-driven `/login` with direct `/login <provider>` routing and autocomplete, OpenRouter PKCE and Kimi Code device subscription login, API-key login for Qwen Token Plan, Radius, and GitHub Copilot, and immediate post-login model refresh without transporting credentials to the frontend.
51
+ - Added Claude Opus 5 to the Anthropic and Amazon Bedrock catalog paths with adaptive thinking/`xhigh`, Bedrock inference profiles, prompt caching, and strict-tool metadata.
52
+ - Added end-to-end constrained tool sampling to extension/SDK tool definitions and model catalogs: strict JSON Schema `prefer`/`require`, OpenAI grammar tools with Lark/regex variants, and `supportsStrictMode` / `supportsStrictTools` / `supportsOpenAIGrammarTools` flags exposed through additive optional `ModelInfo.compat` ([#1995](https://github.com/bastani-inc/atomic/issues/1995)).
53
+ - Added execution-time session metadata to every bash execution path through `ATOMIC_SESSION_ID`, `ATOMIC_SESSION_FILE`, `ATOMIC_PROVIDER`, `ATOMIC_MODEL`, and `ATOMIC_REASONING_LEVEL` with exact `PI_*` aliases, plus request-correlated `bash_execution_update` RPC events that separate stdout from stderr and support concurrent requests and per-request cancellation ([#1995](https://github.com/bastani-inc/atomic/issues/1995)).
54
+ - Added `ctx.scopedModels` to the extension context: the read-only list of models scoped to the current session, resolving at access time and handing back a fresh copy on every read so an extension cannot widen its own scope. Documented in `docs/extensions.md`.
55
+ - Added durable, searchable companion transcripts for every workflow stage that declares `output:`, run-scoped durable artifact directories under `~/.atomic/workflows/runs/<runId>/` (overridable with `ATOMIC_WORKFLOW_ARTIFACT_DIR`) with state-aware retention, explicit warnings for degenerate stage artifacts, and a real artifact-integrity probe in the shared resume predicate.
56
+ - Added extension lifecycle hooks `before_provider_headers` and `agent_settled`, durable `entry_appended` events with `registerEntryRenderer()`, named/hidden `InlineExtension` descriptors, and the public `ModelRuntime` facade, `readStoredCredential`, and session-context conversion helpers on the SDK surface.
57
+ - Added global `httpProxy`, duration-string and `"disabled"` HTTP idle timeouts, package `autoload: false` project deltas, `oauth: "radius"` custom gateways, global/project scope switching in `atomic config`, and the `get_available_thinking_levels` RPC command.
58
+ - Added Ctrl+X copy-last-message, clipboard text fallback when image paste finds no image, durable cache-miss attribution with waste totals, per-model session usage and cost breakdowns including tool and summary work, and Atomic's first-run theme preview with explicit analytics opt-in (no analytics data is transmitted by this change).
59
+
60
+ ### Changed
61
+
62
+ - Reworked interactive startup and working motion around Atomic's revision-3 identity: the ∀ banner assembles inward before its identity beat, and main and workflow-stage surfaces keep the one-cell `∀` visible on a theme-aware dark → accent → bright → accent → dark luminance ramp at 88 ms while retaining all 453 randomized working verbs. `NO_COLOR` keeps regular/bold activity without color escapes, and reduced motion keeps a static accent `∀` ([#1883](https://github.com/bastani-inc/atomic/issues/1883)).
63
+ - Made interactive startup dramatically faster on Windows: installed builds ship the builtin workflows extension as a single prebundled ESM file instead of transpiling a ~300-file module graph per launch (~7 s → ~1.1 s on a test VM), and the CLI enables Node's persistent on-disk V8 compile cache so host and engine child reuse compiled bytecode across runs ([#1962](https://github.com/bastani-inc/atomic/issues/1962)).
64
+ - Removed the fixed 1 MiB size limit from RPC and isolated interactive-engine JSONL transport; commands, responses, events, and render frames now pass through in full ([#1985](https://github.com/bastani-inc/atomic/issues/1985)).
65
+ - A stored OAuth token is now refreshed once fewer than five minutes of validity remain, rather than at expiry, so a long turn is not started on a credential that dies mid-request. The refresh runs inside the `auth.json` lock, so concurrent sessions refresh it once between them.
66
+ - The OpenRouter login now accepts a pasted final redirect URL, or the authorization code alone, for remote and headless machines where the browser cannot reach the loopback callback.
67
+ - A provider that ends a turn with an unrecognised terminal reason now surfaces a provider error naming the raw reason instead of reporting an ordinary successful stop, and assistant messages carry a new `pending` stop reason while streaming. Documented in `docs/providers.md`, `docs/custom-provider.md`, `docs/rpc.md`, and `docs/session-format.md`.
68
+ - Workflow run identifiers are shown as full UUIDs across the BACKGROUND widget, status views, run pickers, and control messages; the four-workflow BACKGROUND display cap is gone; and `workflow({ action: "status", format: "json" })` no longer includes `runIdPrefix` — read `runId`.
69
+ - Added Orwell's six writing rules from "Politics and the English Language" to the core default system prompt's `Guidelines` section, and the startup `RESOURCES` disclosure now lists `SYSTEM.md` and `APPEND_SYSTEM.md` alongside the `AGENTS.md`/`CLAUDE.md` context files.
70
+ - Synchronized the bundled `impeccable` skill tree with upstream 4.0.3 (four surface modes, new routing and craft-floor guidance, a `doctor` drift check, documenter and finish-reviewer agents), and verified the `playwright-cli` and `liteparse` trees against their upstream baselines.
71
+ - Updated the bundled user documentation for the current subagent, workflow-stage, reviewer, and `prompt-engineer` prompt contracts, removing response prefilling and private-reasoning requests for GPT-5.6, Claude Opus 5, and Claude Fable 5 compatibility.
72
+
73
+ ### Fixed
74
+
75
+ - Fixed the isolated interactive engine losing or duplicating your typed input. A submission the engine never accepted now returns to the editor exactly as typed — through every submit route, including `/atomic`, deferred slash commands, streaming steer sends, `!bash`, `/compact`, and Alt+Enter — with its own draft carried end to end so two similar submissions cannot restore each other's text, and without a misleading red transport error beside it. Work the engine *had* started is no longer offered back as unsent: the child announces ownership of every correlated request before its handler can touch the shell, so a silent `!touch marker && sleep 400` is not re-invited for a second run. The interactive-engine protocol version is now `2`.
76
+ - Fixed a total interactive-TUI lockup when the engine generation behind a mounted remote custom UI died, which previously left components mounted forever with input trapped and required killing the process from another terminal. Engine death is now a host-local lifecycle event that closes every remote component from the dead generation, settles its promises, releases widget keys, resets terminal modes, and refocuses the editor without waiting for a replacement.
77
+ - Fixed interrupting a tool call terminating the interactive engine and reporting `Engine terminated; … result unknown`. Escape now simply requests cooperative cancellation and waits for it — interrupting never terminates or restarts the engine and never discards in-flight tool state — and every cooperative-cancellation command (`abort`, `abort_bash`, `abort_compaction`, `abort_retry`, `cancel_login_provider`) is exempt from the generic 30-second RPC deadline.
78
+ - Added recovery from an unexpected interactive-engine exit — one automatic replacement attempt with the calm status `Interactive engine stopped unexpectedly; restarting.` — and kept an explicit Ctrl+C escape hatch for a provably wedged engine. Reopening an inactive session after such an exit now derives explicit error results for unanswered `toolUse` calls without rewriting its append-only JSONL, so the session is usable again instead of permanently pending.
79
+ - Fixed the interactive engine exporting its private control values (`ATOMIC_INTERACTIVE_ENGINE_CHILD`, `_HOST_PID`, `_GUARD_FILE`, `_API_KEY`) to every process it spawned, which made nested `atomic` runs start in engine mode, misdirected process guardians, disabled subagent idle watchdogs, and leaked an `--api-key` credential to every child. Those values now travel in an owner-only bootstrap file read once and unlinked by the child.
80
+ - Fixed OAuth logins being destroyed by an unrelated model-catalog refresh. A timed-out or partially failed post-login refresh used to roll freshly acquired tokens back to the previous credential and — because providers rotate refresh tokens — could permanently strand the account behind repeating `invalid_grant` failures. Freshly persisted credentials now always survive the refresh.
81
+ - Fixed `/model` and `/logout` hanging. The selector's 15-second abort now crosses the engine RPC boundary and covers credential reload, model refreshes run in a concurrent correlated lane so selection stays responsive, and `/logout` publishes credential removal immediately instead of timing out after it had already deleted the credential. Newly authenticated providers also appear without a restart ([#1918](https://github.com/bastani-inc/atomic/issues/1918)).
82
+ - Fixed Anthropic subscription login on Bun-hosted Linux sessions remaining at `Exchanging authorization code for tokens...`, caused by Bun not exposing Undici's CommonJS `install()` helper through its ESM namespace, so the configured transport was silently never used.
83
+ - Fixed RPC `save_provider_credential` writes disappearing after restart (they were stored as non-persistent runtime overrides), `ANTHROPIC_AUTH_TOKEN` header-only bearer authentication being rejected across catalog and request paths, and GitHub Copilot requests failing with `421 Misdirected Request` for `COPILOT_GITHUB_TOKEN` users on business, enterprise, and GHE tenants ([#1995](https://github.com/bastani-inc/atomic/issues/1995)).
84
+ - Fixed a mid-turn compaction leaving the turn unsendable, which the provider rejected with an unrecoverable `400 ... each tool_use must have a single result`. The post-tool preflight returned the agent's live internal message array, so every later turn duplicated assistant messages and tool results; it now returns its own copy, with provider-side deduplication and a descriptive pre-conversion guard as defence in depth ([#2051](https://github.com/bastani-inc/atomic/issues/2051)).
85
+ - Fixed reasoning tokens being able to fail a compaction outright. The planner capped its own request at `0.8 × reserveTokens` — an input-side reserve reused as an output cap — so a high-reasoning session could spend the whole budget thinking and return no deletion records, killing the active turn during a mid-turn preflight. The planner now sends no `max_tokens` at all; branch summarization received the same fix.
86
+ - Fixed compaction rebuilding the retained recent messages as structured blocks after the boundary, which could produce out-of-order provider blocks and a rejected request. The `preserve_recent` tail is now serialized with the same transcript grammar and concatenated onto the boundary, losslessly: retained tool results keep their full text and retained images stay as image blocks.
87
+ - Fixed repeated `/compact` presses starting several overlapping compactions. `AgentSession.compact()` is now single-flight — a second manual request joins the run in flight rather than emitting a duplicate boundary — and messages queued before an automatic compaction no longer stay stuck until Escape ([#1984](https://github.com/bastani-inc/atomic/issues/1984)).
88
+ - Fixed `/reload` re-transpiling and re-evaluating the entire transitive TypeScript graph of every extension on Windows and in compiled builds even when nothing changed. A per-extension SHA256 graph manifest now lets an unchanged graph reuse its evaluated factory; reloading the five builtin packages drops from ~25 s cold / ~16 s warm to ~90 ms ([#2069](https://github.com/bastani-inc/atomic/issues/2069)).
89
+ - Fixed interactive startup crashing with `Interactive engine did not become ready within 5000 ms` on machines with slow cold starts; the fixed deadline is removed while a dead process or broken transport still fails fast ([#1962](https://github.com/bastani-inc/atomic/issues/1962)).
90
+ - Fixed the external editor failing on Windows whenever the editor path, its arguments, or the temporary prompt path contained a space, and fixed the compiled package CLI crashing before TUI startup when invoked from another working directory ([#1995](https://github.com/bastani-inc/atomic/issues/1995)).
91
+ - Fixed physical Escape and Ctrl+C depending on the configurable `app.clear` action, which could send Escape to the engine stop branch and strip Ctrl+C of its host route. Both are now matched by physical key identity, and a single Ctrl+C again dismisses the `/login` popups instead of clearing the hidden editor and risking a double-press exit.
92
+ - Fixed session-tree navigation being accepted while a response was still streaming, which stranded the in-flight turn's tool results on the abandoned branch, and fixed a startup session switch rendering every agent event twice.
93
+ - Fixed inherited `.pi` extensions conflicting with Atomic-bundled resources, extension-contributed skills, prompts, and themes losing their package source metadata after a resource reload, and a nested linked git worktree loading the repository's `AGENTS.md`/`CLAUDE.md` twice ([#1955](https://github.com/bastani-inc/atomic/issues/1955)).
94
+ - Fixed workflow reliability from the parent-session side: stage `output:` no longer lost to an admitted external turn, `reads:` references fail loudly when an artifact is missing instead of handing the model an empty file, the resume picker stops offering stale or non-resumable runs, fast named workflows no longer leave a stale "still running" claim, queued work no longer escapes a controlled pause ([#1983](https://github.com/bastani-inc/atomic/issues/1983)), and tool-only workflows are no longer reported failed after their durable side effects completed ([#1991](https://github.com/bastani-inc/atomic/issues/1991)).
95
+ - Fixed the RPC `bash` command bypassing extension `user_bash` handlers, so sandbox and remote-shell extensions see an RPC request exactly as they see `user_bash`.
96
+ - Fixed a failed `git` package install leaving a half-written checkout that silently suppressed the next repair, and hardened the archive and SQLite path-selector parsers against polynomial-time regex backtracking (CodeQL `js/polynomial-redos`) with no change to accepted selector syntax.
97
+ - Fixed PDF extraction dropping text and streaming `TypeError: Math.sumPrecise is not a function` on Node runtimes without `Math.sumPrecise` by exact-pinning `unpdf` to `1.7.0` instead of letting it float to 1.8.0 ([#2141](https://github.com/bastani-inc/atomic/issues/2141)).
98
+
99
+ ## [0.9.11-alpha.12] - 2026-08-03
100
+
101
+ ### Fixed
102
+
103
+ - Fixed PDF extraction dropping text and streaming `TypeError: Math.sumPrecise is not a function` warnings on Node runtimes that do not implement `Math.sumPrecise`. The `unpdf` dependency was declared as the floating range `^1.6.2`, which resolves to 1.8.0 in a published or global install; that release's bundled PDF.js v6.1 dropped the guarded fallback and calls the builtin unconditionally, so extraction threw per glyph, emitted font-substitution warnings, and silently returned fewer text items. `unpdf` is now exact-pinned to `1.7.0`, the newest release that still ships the fallback, so no install can float to 1.8.0 ([#2141](https://github.com/bastani-inc/atomic/issues/2141)).
104
+ - Upgraded the pinned `unpdf` from 1.6.2 to 1.7.0, which adds `cMapUrl` CJK font support under Node, destroys internally created document proxies and canvas resources, and preserves line breaks in `extractText` with `mergePages`.
105
+
106
+ ## [0.9.11-alpha.11] - 2026-08-03
107
+
108
+ ### Breaking Changes
109
+
110
+ - Workflow run targets now require the full 36-character run UUID. Typed prefixes are no longer resolved by any command or workflow-tool action that accepts `runId`, including `status`, `stages`, `stage`, `transcript`, `send`, `pause`, `resume`, `interrupt`, and `quit`, and by `/workflow connect`, `/workflow attach`, and `/workflow resume`. A target that is not a well-formed 8-4-4-4-12 hex UUID — a prefix, a 32-character dashless id, or a same-length non-hex string — is rejected with `Run id must be a full 36-character UUID; got "339e05a4" (8 chars).`, which is deliberately distinct from `Run not found:` so a truncated paste is diagnosable as truncated rather than looking like a stale run. Since every user-facing surface already prints the full id, copy it back verbatim. Because ids are unique and now matched exactly, run-target ambiguity is unreachable and the "Ambiguous run prefix" diagnostic is gone.
111
+ - Stage targets are now matched exactly. A `stageId` resolves by exact stage id — a bare UUID at the root, the full `runId:stageId` composite for a stage inside a nested `ctx.workflow(...)` import, or `tool:<argsHash>` for a `ctx.tool` node — or by exact stage or tool name. Prefixes and partial names no longer resolve, so `build` will not select `build-check`. Stage ids are deliberately **not** held to the 36-character rule, because nested and tool identifiers are legitimately longer or differently shaped; nested-stage and tool-node targeting are unchanged. Two stages sharing an exact name still return the existing ambiguity diagnostic.
112
+
113
+ ### Changed
114
+
115
+ - Removed the four-workflow display cap from the BACKGROUND widget so every qualifying top-level run is rendered.
116
+ - Moved durable workflow run artifacts—including goal ledgers, Ralph implementation notes, QA evidence video paths, and worktree task outputs—from per-invocation OS temp directories to the run-scoped durable root under the Atomic config directory (`~/.atomic/workflows/runs/<runId>/`, overridable with `ATOMIC_WORKFLOW_ARTIFACT_DIR`), so they survive OS temp purges and follow state-aware retention.
117
+ - Toggling tool-output expansion (`ctrl+o`) no longer prints a `Tool output: expanded` / `Tool output: collapsed` status line. The chat re-renders in the new state, which is the same information without the extra line.
118
+
119
+ - Workflow run identifiers are now shown as full UUIDs across the BACKGROUND widget, status and detail views, run pickers, control messages, and awaiting-input attribution banners. BACKGROUND cards use a two-line identity layout at 80 columns and wider, while narrow chat surfaces wrap full ids without cutting them or breaking their borders. The public `workflow({ action: "status", format: "json" })` payload no longer includes `runIdPrefix`; read `runId` instead, which now carries the full id. The `/workflow connect` run picker now shows five runs at a time and scrolls to additional retained runs with the arrow keys or mouse wheel. The picker's type-to-filter box still narrows by name substring or id prefix, since that selects a row from a list rather than resolving a typed id.
120
+
121
+ ### Fixed
122
+
123
+ - Fixed Escape aborts restoring queued steering and follow-up messages to the editor in the main interactive chat and attached workflow-stage chats instead of leaving them stuck in the pending-message queue.
124
+ - Fixed `/model <model_name>` waiting indefinitely when a model-catalog refresh never settles; it now stops after the interactive 15-second deadline and searches cached models.
125
+ - Quit workflow cards now expire from the BACKGROUND widget after the same recent-run window as finished cards while remaining resumable and discoverable through workflow status; the header count now matches the rendered cards after expiry.
126
+ - Fixed detached foreground subagent completion notifications rendering as an unstyled dump of the full child output. They now use the same structured, collapsed notification UI as background completions while preserving the distinct detached-task wording, and persisted notifications with custom labels remain parseable.
127
+ - Fixed workflow-stage re-attach status falling back to `Working...` while context compaction is still active; the active compaction reason now survives host remounts so manual compaction, threshold auto-compaction, and overflow recovery retain their factual status labels.
128
+ - Fixed workflow stage file output being lost when an admitted external turn (for example an async subagent completion) arrived while the stage was still running: the deterministic `output:` write re-derived its content from session state at close time, so a trailing acknowledgement could overwrite the stage's real deliverable. Every stage that declares `output:` now also gets a durable, searchable companion transcript outside the repository tree, and the receipt names both paths with the intended access pattern, so the work remains recoverable regardless of which turn was persisted. The runner does not attempt to infer which turn was the intended deliverable; it writes the stage's final assistant message, and the receipt reports one fact only — an empty artifact.
129
+ - Fixed the workflow resume picker offering stale or non-resumable runs. Picker and command paths now share one resumability predicate and revalidate durable state before displaying a target, while explicit ids retain their explanatory rejection.
130
+ - Fixed workflow `reads:` references to fail loudly when an artifact path no longer exists instead of handing the model an empty, silently missing context file.
131
+ - Fixed relayed terminal subagent results retaining their stable stage-admission identity when delivered through the intercom ordering barrier, so an acknowledgement turn cannot arrive without the admission marker that identifies it in a running stage's companion transcript.
132
+ - Fixed a failed companion-transcript write reporting a bogus `Output file error` for an output artifact that was written correctly, and returning the full stage text under `outputMode: "file-only"` instead of the compact reference. A transcript failure now degrades to a warning naming the transcript path while the saved-output reference is unchanged, and artifact-retention pruning failures no longer propagate into the stage receipt.
133
+ - Fixed `createWorkflowArtifactDirectory()` attributing artifacts to the ambient most-recently-started run rather than the workflow that created them, and returning one shared directory whose fixed artifact filenames could overwrite each other. Every builtin call site now passes its owning run id, and each call receives a unique directory beneath that run.
134
+ - Fixed the workflow resume picker re-offering a live run as a durable row after the shared resumability predicate rejected it for missing artifacts or checkpoints. Rejected non-running snapshots are now suppressed from live and durable resumable rows, while completed inspection rows remain available; active-running snapshots retain their existing durable fallback.
135
+
136
+ ### Added
137
+ - Added first-class Alpine/musl Linux support for x64 and arm64, including native search and PTY bindings and the `atomic-linux-x64-musl.tar.gz` and `atomic-linux-arm64-musl.tar.gz` release archives. The musl archives omit the clipboard native binding and glibc-linked `@embedded-postgres/*` binaries: Atomic falls back to Linux clipboard commands/OSC52, while durable Alpine workflows require external Postgres via `DBOS_SYSTEM_DATABASE_URL` or Docker; otherwise the existing loud non-durable in-memory fallback applies.
138
+ - Added state-aware retention for durable workflow artifact directories: only terminal or unowned runs older than `WORKFLOW_ARTIFACT_RETENTION_MS` are pruned, while running, paused, quit, blocked, and awaiting-input runs keep live resume dependencies. Aging out a terminal run now deletes its durable entry first and removes the artifact directory only when that deletion succeeds, so a surviving durable record can never reference deleted files.
139
+ - Added durable, searchable companion transcripts for every workflow stage that declares `output:`. The caller's receipt names both the artifact and transcript paths and says to search with `rg`, read narrow line ranges, and never read the transcript whole; under `outputMode: "file-only"`, that receipt is the entire handoff.
140
+ - Added explicit warnings for degenerate stage artifacts instead of silently persisting them: an empty write or a write that only points to its own output path directs the reader to the companion transcript.
141
+ - Added a real artifact-integrity probe to the shared resume predicate. A run whose snapshot references a run-scoped artifact path is offered for resume only while that run directory still exists, and durable-checkpoint eligibility is supplied from the authoritative loadable check, so `/workflow resume` matches the documented behaviour instead of relying on flags no caller set.
142
+
143
+ ## [0.9.11-alpha.10] - 2026-08-01
144
+
145
+ ### Fixed
146
+
147
+ - Fixed an isolated interactive-engine exit after an admitted tool call leaving that session permanently pending and unusable on resume. Reopening an inactive session now derives explicit error results for unanswered `toolUse` calls without rewriting its append-only JSONL, so the transcript can render, compact, and accept another prompt while preserving that the interrupted command's side effects are unknown. Unexpected-restart notices now also retain the bounded exit kind, code, or signal that triggered recovery while excluding child stderr.
148
+ - Fixed Anthropic subscription login on Bun-hosted Linux sessions remaining at `Exchanging authorization code for tokens...`. Atomic's HTTP setup relied on Undici's CommonJS `install()` helper, but Bun does not expose that helper through its ESM namespace, so source-mode and compiled interactive-engine processes silently kept Bun's native `fetch` instead of the configured Undici transport. Atomic now installs the exported Undici web globals explicitly under Bun. Login completion also ends when the provider credential is persisted and publishes that provider against the already-loaded model snapshot immediately; cache restoration, ambient availability checks, and catalog discovery no longer run inside the successful credential transaction, so none can keep the login dialog open after the provider appears in `auth.json`.
149
+ - Fixed existing authenticated users being unable to select a model, or seeing `Refreshing model catalogs…` indefinitely, after an isolated or direct `/model` refresh stalled. The frontend's 15-second abort previously never crossed the engine RPC boundary, the engine started its deadline only after an unbounded credential/availability reload, and the selector assumed refresh work would honor cancellation. The shared deadline now covers credential reload and catalog work inside the engine, the selector races that deadline itself and replaces the progress state on both timeout and rejection, and model refreshes use a concurrent correlated lane so selection remains responsive while catalogs update. Existing `auth.json` credentials remain compatible and no `~/.atomic` reset is required.
150
+ - Fixed `/logout` timing out after it had already deleted the credential, leaving the provider in `/model` until restart and preventing the selector from reopening. Logout now publishes credential removal immediately, skips post-logout catalog refreshes, bounds the local probe for authentication that remains in the environment, and prevents a model refresh started before the mutation from overwriting the newer login or logout snapshot when it eventually settles.
151
+
5
152
  ## [0.9.11-alpha.9] - 2026-08-01
6
153
 
7
154
  ### Breaking Changes
package/README.md CHANGED
@@ -79,7 +79,7 @@ atomic
79
79
 
80
80
  Then just talk to Atomic. By default, Atomic gives the model six coding tools: `read`, `write`, `edit`, `bash`, `find`, and `search`. The model uses these to fulfill your requests. `read`, `search`, `write`, and successful `edit` calls emit session-scoped hashline anchors (`[path#TAG]` plus `LINE:text`) so the model can make stale-safe line edits; see [docs/tools.md](docs/tools.md). Add capabilities via [skills](#skills), [prompt templates](#prompt-templates), [extensions](#extensions), or [Atomic packages](#atomic-packages).
81
81
 
82
- **Platform notes:** [Windows](docs/windows.md) | [Termux (Android)](docs/termux.md) | [tmux](docs/tmux.md) | [Terminal setup](docs/terminal-setup.md) | [Shell aliases](docs/shell-aliases.md)
82
+ **Platform notes:** [Windows](docs/windows.md) | [Alpine/musl Linux](docs/index.md#alpine-and-musl-linux-archives) | [Termux (Android)](docs/termux.md) | [tmux](docs/tmux.md) | [Terminal setup](docs/terminal-setup.md) | [Shell aliases](docs/shell-aliases.md)
83
83
 
84
84
  ---
85
85
 
@@ -4,6 +4,18 @@ All notable changes to the `pi-intercom` extension will be documented in this fi
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.12-alpha.1] - 2026-08-04
8
+
9
+ ### Fixed
10
+
11
+ - Fixed bundled Intercom resources failing to load on Windows when shared modules used mixed `.ts` and `.js` import spellings.
12
+
13
+ ## [0.9.11] - 2026-08-03
14
+
15
+ ### Changed
16
+
17
+ - Released with Atomic 0.9.11. No functional intercom changes since 0.9.10; the extension now runs under the reworked isolated-engine and workflow-group behaviour shipped by the host.
18
+
7
19
  ## [0.9.11-alpha.1] - 2026-07-20
8
20
 
9
21
  ### Changed
@@ -3,7 +3,7 @@ import type { InboundMessageAdmission } from "./inbound-message-admission.js";
3
3
  import type { InboundMessageEntry } from "./intercom-utils.js";
4
4
  import { routeIncomingReply } from "./reply-routing.js";
5
5
  import type { ReplyTracker } from "./reply-tracker.js";
6
- import type { ReplyWaiterRecord } from "./reply-waiter.js";
6
+ import type { ReplyWaiterRecord } from "./reply-waiter.ts";
7
7
  import { retryStableDelivery } from "./stable-delivery-retry.js";
8
8
  import { sendWorkflowStageDeliveryFailure } from "./workflow-stage-delivery-failure.js";
9
9
 
@@ -2,7 +2,7 @@ import type { ExtensionAPI } from "@bastani/atomic";
2
2
  import { randomUUID } from "crypto";
3
3
  import { Type } from "typebox";
4
4
  import { Text } from "@earendil-works/pi-tui";
5
- import type { IntercomClient } from "./broker/client.ts";
5
+ import type { IntercomClient } from "./broker/client.js";
6
6
  import type { ReplyWait, ReplyWaitAdmission } from "./reply-waiter.ts";
7
7
  import { renderContactSupervisorResult } from "./result-renderers.js";
8
8
  import {
@@ -3,10 +3,10 @@ import { appendFileSync } from "node:fs";
3
3
  import { IntercomClient } from "./broker/client.js";
4
4
  import { spawnBrokerIfNeeded } from "./broker/spawn.js";
5
5
  import { InlineMessageComponent } from "./ui/inline-message.js";
6
- import { loadConfig, type IntercomConfig } from "./config.js";
6
+ import { loadConfig, type IntercomConfig } from "./config.ts";
7
7
  import type { SessionInfo, Message } from "./types.js";
8
8
  import { ReplyTracker } from "./reply-tracker.js";
9
- import { ReplyWaiterSlot } from "./reply-waiter.js";
9
+ import { ReplyWaiterSlot } from "./reply-waiter.ts";
10
10
  import { registerContactSupervisorTool } from "./contact-supervisor-tool.js";
11
11
  import { registerIntercomTool } from "./intercom-tool.js";
12
12
  import { registerIntercomOverlay } from "./overlay.js";
@@ -2,7 +2,7 @@ import type { ExtensionAPI } from "@bastani/atomic";
2
2
  import { randomUUID } from "crypto";
3
3
  import { Type } from "typebox";
4
4
  import { Text } from "@earendil-works/pi-tui";
5
- import type { IntercomClient } from "./broker/client.ts";
5
+ import type { IntercomClient } from "./broker/client.js";
6
6
  import type { ReplyWait, ReplyWaitAdmission } from "./reply-waiter.ts";
7
7
  import { renderIntercomResult } from "./result-renderers.js";
8
8
  import {
@@ -12,7 +12,7 @@ import {
12
12
  previewText,
13
13
  toError,
14
14
  } from "./intercom-utils.js";
15
- import type { ReplyTracker } from "./reply-tracker.ts";
15
+ import type { ReplyTracker } from "./reply-tracker.js";
16
16
  import { resolveSessionTargetId } from "./session-target.js";
17
17
  import { normalizeGroup } from "./group.js";
18
18
 
@@ -1,6 +1,6 @@
1
1
  import type { ExtensionAPI } from "@bastani/atomic";
2
2
  import { APP_NAME, getEnvValue } from "@bastani/atomic";
3
- import type { Attachment, Message, SessionInfo, SupervisorRegistration } from "./types.ts";
3
+ import type { Attachment, Message, SessionInfo, SupervisorRegistration } from "./types.js";
4
4
  import { DEFAULT_GROUP, normalizeGroup } from "./group.js";
5
5
 
6
6
 
@@ -1,9 +1,9 @@
1
1
  import type { ExtensionAPI, ExtensionContext } from "@bastani/atomic";
2
- import type { IntercomClient } from "./broker/client.ts";
2
+ import type { IntercomClient } from "./broker/client.js";
3
3
  import type { IntercomConfig } from "./config.ts";
4
4
  import { buildPresenceIdentity } from "./intercom-utils.js";
5
5
  import type { InboundIdleQueue } from "./inbound-idle-queue.js";
6
- import type { ReplyTracker } from "./reply-tracker.ts";
6
+ import type { ReplyTracker } from "./reply-tracker.js";
7
7
 
8
8
  interface LifecycleDeps {
9
9
  config: IntercomConfig;
@@ -1,9 +1,9 @@
1
1
  import type { ExtensionAPI, ExtensionContext } from "@bastani/atomic";
2
- import type { IntercomClient } from "./broker/client.ts";
2
+ import type { IntercomClient } from "./broker/client.js";
3
3
  import type { ComposeResult } from "./ui/compose.ts";
4
4
  import { ComposeOverlay } from "./ui/compose.ts";
5
5
  import { SessionListOverlay } from "./ui/session-list.ts";
6
- import type { SessionInfo } from "./types.ts";
6
+ import type { SessionInfo } from "./types.js";
7
7
  import { duplicateSessionNames, formatSessionLabel, getErrorMessage } from "./intercom-utils.js";
8
8
 
9
9
  interface OverlayDeps {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/intercom",
3
- "version": "0.9.11-alpha.9",
3
+ "version": "0.9.12-alpha.1",
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,4 +1,4 @@
1
- import type { Message, SessionInfo } from "./types.ts";
1
+ import type { Message, SessionInfo } from "./types.js";
2
2
  import { resolveSessionTarget, sessionTargetFailureReason } from "./session-target.js";
3
3
 
4
4
  export interface IntercomContext {
@@ -1,7 +1,7 @@
1
1
  import type { ExtensionAPI, ExtensionContext } from "@bastani/atomic";
2
2
  import { randomUUID } from "crypto";
3
- import type { IntercomClient } from "./broker/client.ts";
4
- import type { SessionInfo, Message } from "./types.ts";
3
+ import type { IntercomClient } from "./broker/client.js";
4
+ import type { SessionInfo, Message } from "./types.js";
5
5
  import {
6
6
  SUBAGENT_CONTROL_INTERCOM_EVENT,
7
7
  SUBAGENT_RESULT_INTERCOM_DELIVERY_EVENT,
@@ -33,6 +33,7 @@ async function dispatchRelayFallback(
33
33
  pi: ExtensionAPI,
34
34
  prefix: Array<{ customType: string; content: string; display: boolean; details?: unknown }>,
35
35
  terminalMessage: { customType: string; content: string; display: boolean; details?: unknown },
36
+ stageAdmissionKey: string,
36
37
  ): Promise<void> {
37
38
  let delivered = 0;
38
39
  try {
@@ -40,7 +41,7 @@ async function dispatchRelayFallback(
40
41
  await pi.sendMessage(message, { deliverAs: "steer" });
41
42
  delivered += 1;
42
43
  }
43
- await pi.sendMessage(terminalMessage, { triggerTurn: true });
44
+ await pi.sendMessage(terminalMessage, { triggerTurn: true, stageAdmissionKey });
44
45
  } catch (error) {
45
46
  const failure = new Error(error instanceof Error ? error.message : String(error), { cause: error });
46
47
  Object.assign(failure, { terminalPreludeDelivered: delivered });
@@ -57,6 +58,7 @@ export function registerSubagentRelay(pi: ExtensionAPI, deps: SubagentRelayDeps)
57
58
  status: string,
58
59
  messageText: string,
59
60
  terminalBarrier?: { runId: string; terminalId?: string; sourceSessionTargets: string[] },
61
+ requestId?: string,
60
62
  ): Promise<void> {
61
63
  const now = Date.now();
62
64
  const entry = {
@@ -82,10 +84,11 @@ export function registerSubagentRelay(pi: ExtensionAPI, deps: SubagentRelayDeps)
82
84
  display: true,
83
85
  details: entry,
84
86
  };
87
+ const stageAdmissionKey = `intercom:${requestId ?? entry.message.id}`;
85
88
  if (typeof pi.sendMessages === "function") {
86
- return pi.sendMessages([...prefix, terminalMessage], { triggerTurn: true });
89
+ return pi.sendMessages([...prefix, terminalMessage], { triggerTurn: true, stageAdmissionKey });
87
90
  }
88
- return dispatchRelayFallback(pi, prefix, terminalMessage);
91
+ return dispatchRelayFallback(pi, prefix, terminalMessage, stageAdmissionKey);
89
92
  },
90
93
  };
91
94
  Object.defineProperty(payload, "terminalOwner", { value: pi });
@@ -139,13 +142,13 @@ export function registerSubagentRelay(pi: ExtensionAPI, deps: SubagentRelayDeps)
139
142
  void delivery.catch(() => {});
140
143
  localDeliveriesInFlight.set(parsed.requestId, { signature, completion: delivery });
141
144
  try {
142
- void deliverLocalSubagentRelayMessage(options.sender, options.status, parsed.message, options.terminalBarrier).then(deferred.resolve, deferred.reject);
145
+ void deliverLocalSubagentRelayMessage(options.sender, options.status, parsed.message, options.terminalBarrier, parsed.requestId).then(deferred.resolve, deferred.reject);
143
146
  } catch (error) {
144
147
  deferred.reject(error);
145
148
  }
146
149
  void delivery.finally(() => { localDeliveriesInFlight.delete(parsed.requestId!); }).catch(() => {});
147
150
  } else if (!delivery) {
148
- delivery = deliverLocalSubagentRelayMessage(options.sender, options.status, parsed.message, options.terminalBarrier);
151
+ delivery = deliverLocalSubagentRelayMessage(options.sender, options.status, parsed.message, options.terminalBarrier, parsed.requestId);
149
152
  }
150
153
  await delivery;
151
154
  if (parsed.requestId) localDeliveries.record(parsed.requestId, signature);
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.9.12-alpha.1] - 2026-08-04
11
+
12
+ ### Fixed
13
+
14
+ - Fixed bundled MCP resources failing to load on Windows when shared modules used mixed `.ts` and `.js` import spellings.
15
+
16
+ ## [0.9.11] - 2026-08-03
17
+
18
+ ### Removed
19
+
20
+ - Removed Cursor MCP configuration discovery and the `cursor` compatibility import kind ([#1994](https://github.com/bastani-inc/atomic/issues/1994)).
21
+
22
+ ### Fixed
23
+
24
+ - Declared `handlesCtrlC` on the `/mcp` panel, the `/mcp setup` panel, and the MCP OAuth panel, so Ctrl+C still reaches each panel's own handler — and its cancel and cleanup work — in isolated interactive sessions.
25
+
10
26
  ## [0.9.11-alpha.9] - 2026-08-01
11
27
 
12
28
  ### Fixed
@@ -1,5 +1,5 @@
1
1
  import type { UiSessionRuntime } from "./ui-session.js";
2
- import { logger } from "./logger.js";
2
+ import { logger } from "./logger.ts";
3
3
 
4
4
  function formatCancellationReason(signal: AbortSignal): string {
5
5
  const reason = signal.reason;
@@ -1,5 +1,5 @@
1
1
  import type { ExtensionAPI, ExtensionContext } from "@bastani/atomic";
2
- import type { McpExtensionState } from "./state.ts";
2
+ import type { McpExtensionState } from "./state.js";
3
3
  import type { McpAuthResult, McpConfig, ServerEntry, McpPanelCallbacks, McpPanelResult, ImportKind } from "./types.ts";
4
4
  import {
5
5
  ensureCompatibilityImports,
@@ -12,13 +12,13 @@ import {
12
12
  writeSharedServerEntry,
13
13
  writeStarterProjectConfig,
14
14
  } from "./config.ts";
15
- import { lazyConnect, updateMetadataCache, updateStatusBar, getFailureAgeSeconds } from "./init.ts";
16
- import { loadMetadataCache } from "./metadata-cache.ts";
17
- import { buildToolMetadata } from "./tool-metadata.ts";
18
- import { supportsOAuth, authenticate, removeAuth } from "./mcp-auth-flow.ts";
19
- import { getAuthForUrl } from "./mcp-auth.ts";
15
+ import { lazyConnect, updateMetadataCache, updateStatusBar, getFailureAgeSeconds } from "./init.js";
16
+ import { loadMetadataCache } from "./metadata-cache.js";
17
+ import { buildToolMetadata } from "./tool-metadata.js";
18
+ import { supportsOAuth, authenticate, removeAuth } from "./mcp-auth-flow.js";
19
+ import { getAuthForUrl } from "./mcp-auth.js";
20
20
  import { loadOnboardingState, markSetupCompleted as persistSetupCompleted, markSharedConfigHintShown } from "./onboarding-state.ts";
21
- import { openPath } from "./utils.ts";
21
+ import { openPath } from "./utils.js";
22
22
 
23
23
  export async function showStatus(state: McpExtensionState, ctx: ExtensionContext): Promise<void> {
24
24
  if (!ctx.hasUI) return;
@@ -1,6 +1,6 @@
1
1
  import type { AgentToolResult, AgentToolUpdateCallback, ExtensionContext } from "@bastani/atomic";
2
2
  import type { McpExtensionState } from "./state.js";
3
- import type { DirectToolSpec, McpContent } from "./types.js";
3
+ import type { DirectToolSpec, McpContent } from "./types.ts";
4
4
  import { getFailureAgeSeconds, lazyConnect } from "./init.js";
5
5
  import { formatSchema } from "./tool-metadata.js";
6
6
  import { transformMcpContent } from "./tool-registrar.js";
@@ -1,8 +1,8 @@
1
- import type { DirectToolSpec, McpConfig } from "./types.js";
1
+ import type { DirectToolSpec, McpConfig } from "./types.ts";
2
2
  import type { MetadataCache } from "./metadata-cache.js";
3
3
  import { isServerCacheValid } from "./metadata-cache.js";
4
- import { formatToolName, isToolExcluded } from "./types.js";
5
- import { resourceNameToToolName } from "./resource-tools.js";
4
+ import { formatToolName, isToolExcluded } from "./types.ts";
5
+ import { resourceNameToToolName } from "./resource-tools.ts";
6
6
 
7
7
  const BUILTIN_NAMES = new Set(["read", "bash", "edit", "write", "grep", "find", "search", "ls", "mcp"]);
8
8
 
@@ -1,4 +1,4 @@
1
- import type { UiHostContext, UiResourceContent, UiResourceCsp } from "./types.js";
1
+ import type { UiHostContext, UiResourceContent, UiResourceCsp } from "./types.ts";
2
2
 
3
3
  // Use locally bundled AppBridge to avoid CDN Zod bundling issues
4
4
  const DEFAULT_APP_BRIDGE_MODULE_URL = "/app-bridge.bundle.js";
@@ -1,6 +1,6 @@
1
1
  import type { AgentToolUpdateCallback, ExtensionAPI, ExtensionContext, ToolInfo } from "@bastani/atomic";
2
2
  import type { McpExtensionState } from "./state.js";
3
- import type { McpConfig } from "./types.js";
3
+ import type { McpConfig } from "./types.ts";
4
4
  import type { MetadataCache } from "./metadata-cache.js";
5
5
  import type { ProxyToolResult } from "./proxy-types.js";
6
6
  import { waitForCaller } from "./caller-wait.js";
@@ -8,7 +8,7 @@ import { McpSessionCleanupBarrier } from "./session-cleanup-barrier.js";
8
8
  import { McpStateChangedError } from "./state-lease.js";
9
9
  import { registerMcpCommands } from "./command-registration.js";
10
10
  import { Type } from "typebox";
11
- import { loadMcpConfig } from "./config.js";
11
+ import { loadMcpConfig } from "./config.ts";
12
12
  import { getConfigPathFromArgv } from "./utils.js";
13
13
  import { renderMcpToolResult } from "./tool-result-renderer.js";
14
14
 
@@ -57,7 +57,7 @@ export default function mcpAdapter(pi: ExtensionAPI) {
57
57
  cache: MetadataCache | null,
58
58
  ): Promise<{ directToolCount: number; missingConfiguredDirectToolServers: string[] }> {
59
59
  const [{ resolveDirectTools, createDirectToolExecutor, getMissingConfiguredDirectToolServers }, { truncateAtWord }] = await Promise.all([
60
- import("./direct-tools.js"),
60
+ import("./direct-tools.ts"),
61
61
  import("./utils.js"),
62
62
  ]);
63
63
  const prefix = config.settings?.toolPrefix ?? "server";
@@ -1,10 +1,10 @@
1
1
  import type { ExtensionAPI, ExtensionContext } from "@bastani/atomic";
2
2
  import type { McpExtensionState } from "./state.js";
3
- import type { ToolMetadata } from "./types.js";
3
+ import type { ToolMetadata } from "./types.ts";
4
4
  import { existsSync } from "node:fs";
5
- import { loadMcpConfig } from "./config.js";
5
+ import { loadMcpConfig } from "./config.ts";
6
6
  import { ConsentManager } from "./consent-manager.js";
7
- import { McpLifecycleManager } from "./lifecycle.js";
7
+ import { McpLifecycleManager } from "./lifecycle.ts";
8
8
  import {
9
9
  computeServerHash,
10
10
  getMetadataCachePath,
@@ -16,11 +16,11 @@ import {
16
16
  serializeTools,
17
17
  type ServerCacheEntry,
18
18
  } from "./metadata-cache.js";
19
- import { McpServerManager } from "./server-manager.js";
19
+ import { McpServerManager } from "./server-manager.ts";
20
20
  import { buildToolMetadata, totalToolCount } from "./tool-metadata.js";
21
- import { UiResourceHandler } from "./ui-resource-handler.js";
21
+ import { UiResourceHandler } from "./ui-resource-handler.ts";
22
22
  import { openUrl, parallelLimit } from "./utils.js";
23
- import { logger } from "./logger.js";
23
+ import { logger } from "./logger.ts";
24
24
 
25
25
  const FAILURE_BACKOFF_MS = 60 * 1000;
26
26
 
@@ -23,7 +23,7 @@ import {
23
23
  type StoredTokens,
24
24
  } from "./mcp-auth.js"
25
25
  import { McpSessionCleanupBarrier } from "./session-cleanup-barrier.js"
26
- import type { ServerEntry } from "./types.js"
26
+ import type { ServerEntry } from "./types.ts"
27
27
 
28
28
  export type AuthStatus = "authenticated" | "expired" | "not_authenticated"
29
29
 
@@ -12,7 +12,7 @@ import {
12
12
  getOAuthCallbackPort,
13
13
  setOAuthCallbackPort,
14
14
  } from "./mcp-oauth-provider.js"
15
- import { logger } from "./logger.js"
15
+ import { logger } from "./logger.ts"
16
16
 
17
17
  // HTML templates for callback responses
18
18
  const HTML_SUCCESS = `<!DOCTYPE html>
@@ -1,5 +1,5 @@
1
1
  import { isToolExcluded } from "./types.ts";
2
- import type { MetadataCache, ServerCacheEntry, CachedTool } from "./metadata-cache.ts";
2
+ import type { MetadataCache, ServerCacheEntry, CachedTool } from "./metadata-cache.js";
3
3
  import { resourceNameToToolName } from "./resource-tools.ts";
4
4
  import type { McpConfig, McpPanelCallbacks, McpPanelResult, ServerProvenance } from "./types.ts";
5
5
  import type { ServerState, ToolState, VisibleItem } from "./mcp-panel-types.ts";
@@ -1,5 +1,5 @@
1
1
  import { matchesKey } from "@earendil-works/pi-tui";
2
- import type { MetadataCache } from "./metadata-cache.ts";
2
+ import type { MetadataCache } from "./metadata-cache.js";
3
3
  import type { McpConfig, McpPanelCallbacks, McpPanelResult, ServerProvenance } from "./types.ts";
4
4
  import {
5
5
  buildMcpPanelResult,
@@ -7,7 +7,7 @@ import { getToolUiResourceUri } from "@modelcontextprotocol/ext-apps/app-bridge"
7
7
  import type { McpTool, McpResource, ServerEntry, ToolMetadata } from "./types.ts";
8
8
  import { formatToolName, isToolExcluded } from "./types.ts";
9
9
  import { resourceNameToToolName } from "./resource-tools.ts";
10
- import { extractToolUiStreamMode, interpolateEnvRecord, resolveBearerToken, resolveConfigPath } from "./utils.ts";
10
+ import { extractToolUiStreamMode, interpolateEnvRecord, resolveBearerToken, resolveConfigPath } from "./utils.js";
11
11
 
12
12
  const CACHE_VERSION = 1;
13
13
  const CACHE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/mcp",
3
- "version": "0.9.11-alpha.9",
3
+ "version": "0.9.12-alpha.1",
4
4
  "private": true,
5
5
  "description": "Atomic extension that adapts MCP (Model Context Protocol) servers into the coding agent. Fork of: https://github.com/nicobailon/pi-mcp-adapter",
6
6
  "contributors": [