@bastani/atomic 0.9.5-alpha.8 → 0.9.5

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 (530) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/README.md +2 -2
  3. package/dist/builtin/cursor/CHANGELOG.md +12 -0
  4. package/dist/builtin/cursor/package.json +3 -3
  5. package/dist/builtin/cursor/src/model-mapper.ts +6 -3
  6. package/dist/builtin/intercom/CHANGELOG.md +37 -0
  7. package/dist/builtin/intercom/README.md +4 -2
  8. package/dist/builtin/intercom/broker/broker.ts +6 -114
  9. package/dist/builtin/intercom/broker/client.ts +29 -54
  10. package/dist/builtin/intercom/broker/delivered-message-cache.ts +44 -0
  11. package/dist/builtin/intercom/broker/pending-send-registry.ts +142 -0
  12. package/dist/builtin/intercom/broker/send-handler.ts +106 -0
  13. package/dist/builtin/intercom/broker/send-signature.ts +37 -0
  14. package/dist/builtin/intercom/foreground-detach-handoff.ts +136 -0
  15. package/dist/builtin/intercom/index-heavy.ts +49 -53
  16. package/dist/builtin/intercom/index.ts +278 -262
  17. package/dist/builtin/intercom/lazy-heavy-proxy.ts +114 -0
  18. package/dist/builtin/intercom/lazy-subagent-ack.ts +20 -0
  19. package/dist/builtin/intercom/lazy-tool-execution.ts +39 -0
  20. package/dist/builtin/intercom/lifecycle-lease.ts +51 -0
  21. package/dist/builtin/intercom/lifecycle.ts +37 -20
  22. package/dist/builtin/intercom/package.json +3 -6
  23. package/dist/builtin/intercom/reply-routing.ts +17 -0
  24. package/dist/builtin/intercom/subagent-relay.ts +58 -12
  25. package/dist/builtin/intercom/types.ts +3 -3
  26. package/dist/builtin/mcp/CHANGELOG.md +38 -0
  27. package/dist/builtin/mcp/OAUTH.md +1 -0
  28. package/dist/builtin/mcp/README.md +10 -6
  29. package/dist/builtin/mcp/apps-cancellation.ts +32 -0
  30. package/dist/builtin/mcp/call-tool-result.ts +9 -0
  31. package/dist/builtin/mcp/caller-wait.ts +50 -0
  32. package/dist/builtin/mcp/command-registration.ts +82 -0
  33. package/dist/builtin/mcp/direct-tool-executor.ts +279 -0
  34. package/dist/builtin/mcp/direct-tools.ts +40 -255
  35. package/dist/builtin/mcp/host-html-template.ts +4 -2
  36. package/dist/builtin/mcp/index.ts +274 -239
  37. package/dist/builtin/mcp/init.ts +96 -126
  38. package/dist/builtin/mcp/mcp-auth-flow.ts +247 -237
  39. package/dist/builtin/mcp/mcp-callback-server.ts +89 -68
  40. package/dist/builtin/mcp/mcp-oauth-provider.ts +23 -1
  41. package/dist/builtin/mcp/metadata-hydration.ts +52 -0
  42. package/dist/builtin/mcp/package.json +3 -3
  43. package/dist/builtin/mcp/proxy-auth.ts +4 -4
  44. package/dist/builtin/mcp/proxy-call.ts +111 -40
  45. package/dist/builtin/mcp/proxy-connect.ts +35 -15
  46. package/dist/builtin/mcp/proxy-info-modes.ts +106 -23
  47. package/dist/builtin/mcp/proxy-modes.ts +3 -3
  48. package/dist/builtin/mcp/session-cleanup-barrier.ts +43 -0
  49. package/dist/builtin/mcp/startup-warmup.ts +98 -0
  50. package/dist/builtin/mcp/state-lease.ts +12 -0
  51. package/dist/builtin/mcp/tool-result-renderer.ts +3 -3
  52. package/dist/builtin/mcp/ui-server.ts +8 -8
  53. package/dist/builtin/mcp/ui-session.ts +9 -18
  54. package/dist/builtin/subagents/CHANGELOG.md +78 -0
  55. package/dist/builtin/subagents/README.md +30 -29
  56. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  57. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  58. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  59. package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
  60. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  61. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  62. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  63. package/dist/builtin/subagents/agents/debugger.md +2 -2
  64. package/dist/builtin/subagents/agents/worker.md +2 -2
  65. package/dist/builtin/subagents/package.json +5 -5
  66. package/dist/builtin/subagents/prompts/review-loop.md +1 -1
  67. package/dist/builtin/subagents/skills/subagent/SKILL.md +37 -36
  68. package/dist/builtin/subagents/src/extension/api-lifecycle.ts +64 -0
  69. package/dist/builtin/subagents/src/extension/fanout-child.ts +44 -51
  70. package/dist/builtin/subagents/src/extension/index.ts +289 -320
  71. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +7 -10
  72. package/dist/builtin/subagents/src/extension/schemas.ts +22 -5
  73. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +89 -0
  74. package/dist/builtin/subagents/src/extension/tool-description.ts +29 -0
  75. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +13 -2
  76. package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -4
  77. package/dist/builtin/subagents/src/runs/background/async-event-journal.ts +106 -0
  78. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +26 -20
  79. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +13 -2
  80. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +3 -0
  81. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +1 -1
  82. package/dist/builtin/subagents/src/runs/background/completion-claims.ts +189 -0
  83. package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +44 -7
  84. package/dist/builtin/subagents/src/runs/background/completion-notification.ts +34 -0
  85. package/dist/builtin/subagents/src/runs/background/notify.ts +72 -22
  86. package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +232 -0
  87. package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +151 -0
  88. package/dist/builtin/subagents/src/runs/background/result-quarantine.ts +72 -0
  89. package/dist/builtin/subagents/src/runs/background/result-retry-scheduler.ts +48 -0
  90. package/dist/builtin/subagents/src/runs/background/result-status.ts +81 -0
  91. package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +59 -0
  92. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +177 -233
  93. package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +3 -2
  94. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +73 -14
  95. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +29 -15
  96. package/dist/builtin/subagents/src/runs/background/top-level-async.ts +1 -2
  97. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +1 -0
  98. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +1 -0
  99. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +1 -0
  100. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +7 -9
  101. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +3 -13
  102. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +2 -15
  103. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +2 -2
  104. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +63 -46
  105. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +48 -0
  106. package/dist/builtin/subagents/src/runs/foreground/execution-detach-route.ts +17 -0
  107. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +39 -26
  108. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +3 -1
  109. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +3 -51
  110. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +6 -11
  111. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +11 -2
  112. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +2 -0
  113. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +5 -112
  114. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +2 -0
  115. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +68 -118
  116. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +79 -7
  117. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -2
  118. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +3 -0
  119. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -2
  120. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +55 -12
  121. package/dist/builtin/subagents/src/shared/artifacts.ts +22 -11
  122. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +294 -0
  123. package/dist/builtin/subagents/src/shared/exclusive-file-publication.ts +44 -0
  124. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -0
  125. package/dist/builtin/subagents/src/shared/model-info.ts +2 -2
  126. package/dist/builtin/subagents/src/shared/settings.ts +20 -10
  127. package/dist/builtin/subagents/src/shared/types-async.ts +3 -1
  128. package/dist/builtin/subagents/src/shared/types-config.ts +2 -0
  129. package/dist/builtin/subagents/src/shared/types-runtime.ts +3 -2
  130. package/dist/builtin/subagents/src/slash/slash-commands.ts +9 -12
  131. package/dist/builtin/subagents/src/slash/slash-live-state.ts +63 -32
  132. package/dist/builtin/subagents/src/tui/render-result.ts +7 -0
  133. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -0
  134. package/dist/builtin/subagents/src/tui/render-widget.ts +157 -89
  135. package/dist/builtin/web-access/CHANGELOG.md +28 -0
  136. package/dist/builtin/web-access/README.md +4 -0
  137. package/dist/builtin/web-access/content-tools.ts +8 -3
  138. package/dist/builtin/web-access/index-heavy.ts +1 -1
  139. package/dist/builtin/web-access/index.ts +190 -46
  140. package/dist/builtin/web-access/lifecycle-lease.ts +38 -0
  141. package/dist/builtin/web-access/package.json +2 -2
  142. package/dist/builtin/web-access/result-renderers.ts +1 -1
  143. package/dist/builtin/web-access/summary-review.ts +1 -1
  144. package/dist/builtin/web-access/web-search-activity.ts +1 -1
  145. package/dist/builtin/web-access/web-search-return.ts +7 -0
  146. package/dist/builtin/web-access/web-search-summary.ts +1 -1
  147. package/dist/builtin/web-access/web-search-tool.ts +4 -2
  148. package/dist/builtin/workflows/CHANGELOG.md +86 -0
  149. package/dist/builtin/workflows/README.md +5 -5
  150. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +27 -4
  151. package/dist/builtin/workflows/builtin/goal-runner.ts +86 -27
  152. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +10 -0
  153. package/dist/builtin/workflows/builtin/ralph-core.ts +9 -9
  154. package/dist/builtin/workflows/builtin/ralph-models.ts +71 -36
  155. package/dist/builtin/workflows/builtin/ralph-runner.ts +20 -31
  156. package/dist/builtin/workflows/package.json +2 -2
  157. package/dist/builtin/workflows/skills/impeccable/SKILL.md +16 -13
  158. package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +1 -0
  159. package/dist/builtin/workflows/skills/impeccable/reference/adapt.native.md +58 -0
  160. package/dist/builtin/workflows/skills/impeccable/reference/android.md +40 -0
  161. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +2 -0
  162. package/dist/builtin/workflows/skills/impeccable/reference/audit.md +2 -0
  163. package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +139 -0
  164. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +69 -62
  165. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +21 -7
  166. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  167. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +92 -0
  168. package/dist/builtin/workflows/skills/impeccable/reference/init.md +29 -7
  169. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +45 -0
  170. package/dist/builtin/workflows/skills/impeccable/reference/layout.md +25 -1
  171. package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +23 -1
  172. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +2 -1
  173. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +75 -14
  174. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +1 -1
  175. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +31 -0
  176. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +64 -0
  177. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +118 -11
  178. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +16 -11
  179. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +66 -0
  180. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +42 -10
  181. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
  182. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +4 -6
  183. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +660 -0
  184. package/dist/builtin/workflows/skills/impeccable/scripts/hook-before-edit.mjs +516 -0
  185. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +1764 -0
  186. package/dist/builtin/workflows/skills/impeccable/scripts/hook.mjs +61 -0
  187. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +4 -2
  188. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +2 -2
  189. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +13 -16
  190. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +17 -11
  191. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +104 -37
  192. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +9 -0
  193. package/dist/builtin/workflows/src/durable/backend.ts +12 -0
  194. package/dist/builtin/workflows/src/durable/dbos-backend.ts +17 -1
  195. package/dist/builtin/workflows/src/durable/resume-catalog.ts +12 -0
  196. package/dist/builtin/workflows/src/durable/resume-runtime.ts +5 -2
  197. package/dist/builtin/workflows/src/durable/stage-primitive.ts +2 -1
  198. package/dist/builtin/workflows/src/durable/types.ts +16 -0
  199. package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -1
  200. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +1 -2
  201. package/dist/builtin/workflows/src/engine/run-returned-status.ts +50 -16
  202. package/dist/builtin/workflows/src/engine/run.ts +20 -19
  203. package/dist/builtin/workflows/src/engine/runtime.ts +5 -0
  204. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  205. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +9 -2
  206. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +137 -27
  207. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +22 -6
  208. package/dist/builtin/workflows/src/extension/public-types.ts +1 -1
  209. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +13 -1
  210. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +19 -4
  211. package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +9 -0
  212. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +17 -22
  213. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +48 -23
  214. package/dist/builtin/workflows/src/extension/workflow-schema.ts +15 -2
  215. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +20 -8
  216. package/dist/builtin/workflows/src/extension/workflow-tool.ts +24 -8
  217. package/dist/builtin/workflows/src/runs/background/status.ts +4 -3
  218. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +29 -8
  219. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +1 -1
  220. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +3 -2
  221. package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +1 -1
  222. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +155 -20
  223. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +6 -0
  224. package/dist/builtin/workflows/src/runs/shared/worktree.ts +2 -1
  225. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +2 -2
  226. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +2 -2
  227. package/dist/builtin/workflows/src/shared/resume-continuation.ts +2 -0
  228. package/dist/builtin/workflows/src/shared/returned-run-status.ts +116 -0
  229. package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +2 -0
  230. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +21 -3
  231. package/dist/builtin/workflows/src/tui/graph-view-state.ts +3 -0
  232. package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -0
  233. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +1 -23
  234. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +54 -9
  235. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +5 -2
  236. package/dist/builtin/workflows/src/tui/status-list.ts +22 -15
  237. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +4 -4
  238. package/dist/cli/args.d.ts.map +1 -1
  239. package/dist/cli/args.js +2 -2
  240. package/dist/cli/args.js.map +1 -1
  241. package/dist/core/agent-session-auto-compaction.d.ts +23 -3
  242. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  243. package/dist/core/agent-session-auto-compaction.js +129 -17
  244. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  245. package/dist/core/agent-session-events.d.ts.map +1 -1
  246. package/dist/core/agent-session-events.js +9 -1
  247. package/dist/core/agent-session-events.js.map +1 -1
  248. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  249. package/dist/core/agent-session-message-queue.js +1 -1
  250. package/dist/core/agent-session-message-queue.js.map +1 -1
  251. package/dist/core/agent-session-methods.d.ts +6 -3
  252. package/dist/core/agent-session-methods.d.ts.map +1 -1
  253. package/dist/core/agent-session-methods.js.map +1 -1
  254. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  255. package/dist/core/agent-session-prompt.js +2 -2
  256. package/dist/core/agent-session-prompt.js.map +1 -1
  257. package/dist/core/agent-session-retry.d.ts.map +1 -1
  258. package/dist/core/agent-session-retry.js +1 -1
  259. package/dist/core/agent-session-retry.js.map +1 -1
  260. package/dist/core/agent-session-services.d.ts.map +1 -1
  261. package/dist/core/agent-session-services.js +3 -2
  262. package/dist/core/agent-session-services.js.map +1 -1
  263. package/dist/core/agent-session-types.d.ts.map +1 -1
  264. package/dist/core/agent-session-types.js +1 -1
  265. package/dist/core/agent-session-types.js.map +1 -1
  266. package/dist/core/agent-session.d.ts +4 -2
  267. package/dist/core/agent-session.d.ts.map +1 -1
  268. package/dist/core/agent-session.js +4 -2
  269. package/dist/core/agent-session.js.map +1 -1
  270. package/dist/core/anthropic-thinking-guard.d.ts +5 -5
  271. package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
  272. package/dist/core/anthropic-thinking-guard.js +42 -32
  273. package/dist/core/anthropic-thinking-guard.js.map +1 -1
  274. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  275. package/dist/core/atomic-guide-command.js +15 -15
  276. package/dist/core/atomic-guide-command.js.map +1 -1
  277. package/dist/core/auth-storage.d.ts.map +1 -1
  278. package/dist/core/auth-storage.js +14 -9
  279. package/dist/core/auth-storage.js.map +1 -1
  280. package/dist/core/compaction/compaction.d.ts +2 -0
  281. package/dist/core/compaction/compaction.d.ts.map +1 -1
  282. package/dist/core/compaction/compaction.js +79 -46
  283. package/dist/core/compaction/compaction.js.map +1 -1
  284. package/dist/core/compaction/context-assistant-turns.d.ts +42 -0
  285. package/dist/core/compaction/context-assistant-turns.d.ts.map +1 -0
  286. package/dist/core/compaction/context-assistant-turns.js +87 -0
  287. package/dist/core/compaction/context-assistant-turns.js.map +1 -0
  288. package/dist/core/compaction/context-compaction-critical.d.ts +1 -1
  289. package/dist/core/compaction/context-compaction-critical.d.ts.map +1 -1
  290. package/dist/core/compaction/context-compaction-critical.js +2 -2
  291. package/dist/core/compaction/context-compaction-critical.js.map +1 -1
  292. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts +18 -0
  293. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts.map +1 -0
  294. package/dist/core/compaction/context-compaction-eviction-alternates.js +186 -0
  295. package/dist/core/compaction/context-compaction-eviction-alternates.js.map +1 -0
  296. package/dist/core/compaction/context-compaction-eviction.d.ts +10 -2
  297. package/dist/core/compaction/context-compaction-eviction.d.ts.map +1 -1
  298. package/dist/core/compaction/context-compaction-eviction.js +196 -146
  299. package/dist/core/compaction/context-compaction-eviction.js.map +1 -1
  300. package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
  301. package/dist/core/compaction/context-compaction-prompt.js +1 -1
  302. package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
  303. package/dist/core/compaction/context-compaction-types.d.ts +2 -0
  304. package/dist/core/compaction/context-compaction-types.d.ts.map +1 -1
  305. package/dist/core/compaction/context-compaction-types.js.map +1 -1
  306. package/dist/core/compaction/context-deletion-application.d.ts +5 -4
  307. package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
  308. package/dist/core/compaction/context-deletion-application.js +17 -15
  309. package/dist/core/compaction/context-deletion-application.js.map +1 -1
  310. package/dist/core/compaction/context-deletion-store.d.ts.map +1 -1
  311. package/dist/core/compaction/context-deletion-store.js +1 -1
  312. package/dist/core/compaction/context-deletion-store.js.map +1 -1
  313. package/dist/core/compaction/context-deletion-targets.d.ts +2 -1
  314. package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
  315. package/dist/core/compaction/context-deletion-targets.js +36 -31
  316. package/dist/core/compaction/context-deletion-targets.js.map +1 -1
  317. package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -1
  318. package/dist/core/compaction/context-deletion-tool-helpers.js +116 -43
  319. package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -1
  320. package/dist/core/compaction/context-transcript-analysis.d.ts +1 -2
  321. package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
  322. package/dist/core/compaction/context-transcript-analysis.js +33 -37
  323. package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
  324. package/dist/core/copilot-model-synthesis.d.ts.map +1 -1
  325. package/dist/core/copilot-model-synthesis.js +3 -1
  326. package/dist/core/copilot-model-synthesis.js.map +1 -1
  327. package/dist/core/extensions/loader-virtual-modules.d.ts +8 -1
  328. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  329. package/dist/core/extensions/loader-virtual-modules.js +2 -1
  330. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  331. package/dist/core/extensions/provider-types.d.ts +2 -7
  332. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  333. package/dist/core/extensions/provider-types.js.map +1 -1
  334. package/dist/core/footer-data-provider.d.ts +6 -0
  335. package/dist/core/footer-data-provider.d.ts.map +1 -1
  336. package/dist/core/footer-data-provider.js +72 -29
  337. package/dist/core/footer-data-provider.js.map +1 -1
  338. package/dist/core/messages.d.ts +9 -0
  339. package/dist/core/messages.d.ts.map +1 -1
  340. package/dist/core/messages.js +100 -18
  341. package/dist/core/messages.js.map +1 -1
  342. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  343. package/dist/core/model-registry-builtins.js +5 -0
  344. package/dist/core/model-registry-builtins.js.map +1 -1
  345. package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
  346. package/dist/core/model-registry-custom-loader.js +49 -8
  347. package/dist/core/model-registry-custom-loader.js.map +1 -1
  348. package/dist/core/model-registry-dynamic.d.ts.map +1 -1
  349. package/dist/core/model-registry-dynamic.js +11 -5
  350. package/dist/core/model-registry-dynamic.js.map +1 -1
  351. package/dist/core/model-registry-loader.d.ts.map +1 -1
  352. package/dist/core/model-registry-loader.js +8 -0
  353. package/dist/core/model-registry-loader.js.map +1 -1
  354. package/dist/core/model-registry-schemas.d.ts +93 -8
  355. package/dist/core/model-registry-schemas.d.ts.map +1 -1
  356. package/dist/core/model-registry-schemas.js +24 -12
  357. package/dist/core/model-registry-schemas.js.map +1 -1
  358. package/dist/core/model-registry-types.d.ts +7 -6
  359. package/dist/core/model-registry-types.d.ts.map +1 -1
  360. package/dist/core/model-registry-types.js.map +1 -1
  361. package/dist/core/model-registry.d.ts +5 -0
  362. package/dist/core/model-registry.d.ts.map +1 -1
  363. package/dist/core/model-registry.js +23 -0
  364. package/dist/core/model-registry.js.map +1 -1
  365. package/dist/core/model-resolver-cli.d.ts.map +1 -1
  366. package/dist/core/model-resolver-cli.js +33 -5
  367. package/dist/core/model-resolver-cli.js.map +1 -1
  368. package/dist/core/model-resolver-initial.d.ts +6 -1
  369. package/dist/core/model-resolver-initial.d.ts.map +1 -1
  370. package/dist/core/model-resolver-initial.js +12 -7
  371. package/dist/core/model-resolver-initial.js.map +1 -1
  372. package/dist/core/model-resolver.d.ts +1 -1
  373. package/dist/core/model-resolver.d.ts.map +1 -1
  374. package/dist/core/model-resolver.js +1 -1
  375. package/dist/core/model-resolver.js.map +1 -1
  376. package/dist/core/openai-responses-payload-sanitizer.d.ts +1 -0
  377. package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -1
  378. package/dist/core/openai-responses-payload-sanitizer.js +24 -9
  379. package/dist/core/openai-responses-payload-sanitizer.js.map +1 -1
  380. package/dist/core/resource-loader-context-files.d.ts +1 -0
  381. package/dist/core/resource-loader-context-files.d.ts.map +1 -1
  382. package/dist/core/resource-loader-context-files.js +13 -10
  383. package/dist/core/resource-loader-context-files.js.map +1 -1
  384. package/dist/core/sdk.d.ts.map +1 -1
  385. package/dist/core/sdk.js +2 -2
  386. package/dist/core/sdk.js.map +1 -1
  387. package/dist/core/session-entry-normalization.d.ts +7 -0
  388. package/dist/core/session-entry-normalization.d.ts.map +1 -0
  389. package/dist/core/session-entry-normalization.js +14 -0
  390. package/dist/core/session-entry-normalization.js.map +1 -0
  391. package/dist/core/session-manager-core.d.ts.map +1 -1
  392. package/dist/core/session-manager-core.js +1 -0
  393. package/dist/core/session-manager-core.js.map +1 -1
  394. package/dist/core/session-manager-history.d.ts +2 -2
  395. package/dist/core/session-manager-history.d.ts.map +1 -1
  396. package/dist/core/session-manager-history.js +127 -108
  397. package/dist/core/session-manager-history.js.map +1 -1
  398. package/dist/core/settings-manager-basic-accessors.d.ts +2 -2
  399. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  400. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  401. package/dist/core/settings-types.d.ts +1 -1
  402. package/dist/core/settings-types.d.ts.map +1 -1
  403. package/dist/core/settings-types.js.map +1 -1
  404. package/dist/core/slash-commands.d.ts +2 -0
  405. package/dist/core/slash-commands.d.ts.map +1 -1
  406. package/dist/core/slash-commands.js +141 -0
  407. package/dist/core/slash-commands.js.map +1 -1
  408. package/dist/core/tools/bash.d.ts.map +1 -1
  409. package/dist/core/tools/bash.js +11 -8
  410. package/dist/core/tools/bash.js.map +1 -1
  411. package/dist/index.d.ts +1 -0
  412. package/dist/index.d.ts.map +1 -1
  413. package/dist/index.js +1 -0
  414. package/dist/index.js.map +1 -1
  415. package/dist/main-deferred-startup.d.ts.map +1 -1
  416. package/dist/main-deferred-startup.js +2 -2
  417. package/dist/main-deferred-startup.js.map +1 -1
  418. package/dist/main-early-input.d.ts.map +1 -1
  419. package/dist/main-early-input.js +7 -0
  420. package/dist/main-early-input.js.map +1 -1
  421. package/dist/main-session.d.ts.map +1 -1
  422. package/dist/main-session.js +1 -0
  423. package/dist/main-session.js.map +1 -1
  424. package/dist/main.d.ts.map +1 -1
  425. package/dist/main.js +1 -1
  426. package/dist/main.js.map +1 -1
  427. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  428. package/dist/modes/interactive/components/chat-session-host-actions.js +0 -1
  429. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  430. package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -1
  431. package/dist/modes/interactive/components/settings-selector-options.js +3 -1
  432. package/dist/modes/interactive/components/settings-selector-options.js.map +1 -1
  433. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  434. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  435. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  436. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
  437. package/dist/modes/interactive/interactive-agent-events.js +3 -1
  438. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  439. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  440. package/dist/modes/interactive/interactive-autocomplete.js +21 -9
  441. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  442. package/dist/modes/interactive/interactive-child-ordering.d.ts +7 -0
  443. package/dist/modes/interactive/interactive-child-ordering.d.ts.map +1 -0
  444. package/dist/modes/interactive/interactive-child-ordering.js +26 -0
  445. package/dist/modes/interactive/interactive-child-ordering.js.map +1 -0
  446. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  447. package/dist/modes/interactive/interactive-deferred-startup.js +43 -30
  448. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  449. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
  450. package/dist/modes/interactive/interactive-hotkeys-debug.js +1 -0
  451. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  452. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  453. package/dist/modes/interactive/interactive-input-handling.js +41 -6
  454. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  455. package/dist/modes/interactive/interactive-mode-base.d.ts +3 -0
  456. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  457. package/dist/modes/interactive/interactive-mode-base.js +3 -0
  458. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  459. package/dist/modes/interactive/interactive-mode-deps.d.ts +2 -2
  460. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  461. package/dist/modes/interactive/interactive-mode-deps.js +2 -2
  462. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  463. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -2
  464. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  465. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  466. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  467. package/dist/modes/interactive/interactive-model-routing.js +11 -4
  468. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  469. package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
  470. package/dist/modes/interactive/interactive-process-lifecycle.js +0 -3
  471. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  472. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
  473. package/dist/modes/interactive/interactive-render-chat.js +15 -1
  474. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  475. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
  476. package/dist/modes/interactive/interactive-session-routing.js +5 -1
  477. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  478. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  479. package/dist/modes/interactive/interactive-startup.js +20 -21
  480. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  481. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
  482. package/dist/modes/interactive/theme/global-theme.js +26 -2
  483. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  484. package/dist/modes/interactive/theme/theme-class.d.ts +1 -1
  485. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  486. package/dist/modes/interactive/theme/theme-class.js +2 -0
  487. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  488. package/dist/utils/clipboard-image.d.ts.map +1 -1
  489. package/dist/utils/clipboard-image.js +3 -0
  490. package/dist/utils/clipboard-image.js.map +1 -1
  491. package/dist/utils/fs-watch.d.ts +24 -1
  492. package/dist/utils/fs-watch.d.ts.map +1 -1
  493. package/dist/utils/fs-watch.js +60 -5
  494. package/dist/utils/fs-watch.js.map +1 -1
  495. package/docs/changelog.mdx +19 -0
  496. package/docs/compaction.md +60 -49
  497. package/docs/custom-provider.md +18 -5
  498. package/docs/development.md +4 -0
  499. package/docs/extensions.md +11 -2
  500. package/docs/json.md +1 -1
  501. package/docs/models.md +69 -10
  502. package/docs/providers.md +1 -1
  503. package/docs/quickstart.md +12 -8
  504. package/docs/rpc.md +2 -2
  505. package/docs/sdk.md +1 -1
  506. package/docs/settings.md +4 -4
  507. package/docs/subagents.md +40 -5
  508. package/docs/tools.md +1 -1
  509. package/docs/usage.md +4 -2
  510. package/docs/windows.md +4 -0
  511. package/docs/workflows.md +33 -48
  512. package/examples/extensions/preset.ts +2 -2
  513. package/examples/extensions/subagent/README.md +2 -2
  514. package/examples/extensions/subagent/index.ts +1 -2
  515. package/examples/extensions/subagent/schemas.ts +4 -1
  516. package/examples/sdk/12-full-control.ts +1 -1
  517. package/npm-shrinkwrap.json +48 -51
  518. package/package.json +7 -7
  519. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +0 -75
  520. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +0 -202
  521. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +0 -97
  522. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +0 -160
  523. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +0 -72
  524. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +0 -161
  525. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +0 -203
  526. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +0 -234
  527. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +0 -103
  528. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +0 -29
  529. package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +0 -9
  530. package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +0 -117
@@ -1,13 +1,10 @@
1
1
  export const DEFAULT_PROMPT_GUIDANCE: string[] = [
2
- `**Subagent Orchestration**:
3
- - To avoid draining your context window, prefer to use subagents for complex tasks all non-trivial operations should be delegated to subagents.
4
- - You should delegate running bash commands (particularly ones that are likely to produce lots of output) such as investigating with the \`aws\` CLI, using the \`gh\` CLI, digging through logs to \`bash\` subagents.
5
- - You should use separate subagents for separate tasks, and you may launch them in parallel, but do not delegate multiple tasks that are likely to have significant overlap to separate subagents.
6
- - Sometimes subagents will take a long time. DO NOT attempt to do the job yourself while waiting for the subagent to respond Instead, use the time to plan out your next steps.
7
- - **Debugging**: When a user asks about debugging, spawn a debugger subagent first.
8
- - Do not attempt to debug or analyze code yourself without first consulting the debugger subagent.
9
- - Explain the debugger's insights to the user clearly and concisely.
10
- - Once the user confirms, implement the necessary code changes based on those insights.
11
- - If the user has follow-up questions, spawn additional debugger and research subagents as needed.`,
2
+ `**Subagent orchestration**: Use subagents selectively for bounded specialist delegation while the parent remains in control.
3
+ - Keep interactive, exploratory, conceptual, and conversation-led work inline when direct discussion and user steering are more useful than delegation.
4
+ - Use a single subagent for a focused specialty, a chain for a bounded sequential handoff, or parallel tasks for independent work. Multiple steps, files, tests, validation, or parallelism alone do not require a workflow.
5
+ - Delegate noisy or context-heavy command investigation when isolation helps, but run concise commands inline when that is simpler. Do not split work with substantial overlap across independent subagents.
6
+ - Use async/background execution selectively for genuinely long-running or independently useful delegated work. Foreground execution is appropriate when the parent needs the result before proceeding; do not duplicate a delegated job while waiting.
7
+ - For clearly delegated, well-defined autonomous jobs that are likely long-running/background-oriented or materially need durable stages, checkpoints, resumability, human input, gates, retries, or bounded loops, prefer an appropriate workflow rather than stretching subagent orchestration into an ad hoc workflow.
8
+ - Debug conceptual questions or exploratory analysis inline when appropriate. Use the debugger subagent for actual failures that need reproduction, root-cause diagnosis, and a validated fix; additional debugger or research delegates are optional when they add a distinct useful angle.`,
12
9
  ];
13
10
 
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { Type } from "typebox";
6
- import { MAX_SUBAGENT_NESTING_DEPTH, SUBAGENT_ACTIONS } from "../shared/types.ts";
6
+ import { MAX_PARALLEL_TASKS, MAX_SUBAGENT_NESTING_DEPTH, SUBAGENT_ACTIONS } from "../shared/types.ts";
7
7
 
8
8
  const SkillOverride = Type.Unsafe({
9
9
  anyOf: [
@@ -35,12 +35,25 @@ const ReadsOverride = Type.Unsafe({
35
35
  description: "Files to read before running (array of filenames), or false to disable",
36
36
  });
37
37
 
38
+ const RootReadsOverride = Type.Unsafe({
39
+ anyOf: [
40
+ { type: "array", items: { type: "string" } },
41
+ { type: "boolean", enum: [false] },
42
+ ],
43
+ description: "Files for a single agent to read before running, or false to disable. Relative paths resolve against the effective child cwd.",
44
+ });
45
+
38
46
  const JsonSchemaObject = Type.Unsafe({
39
47
  type: "object",
40
48
  additionalProperties: true,
41
49
  description: "Plain JSON Schema object for structured output.",
42
50
  });
43
51
 
52
+ const MaxOutputSchema = Type.Object({
53
+ bytes: Type.Optional(Type.Number()),
54
+ lines: Type.Optional(Type.Number()),
55
+ }, { additionalProperties: false });
56
+
44
57
  const TaskItem = Type.Object({
45
58
  agent: Type.String(),
46
59
  task: Type.String(),
@@ -185,7 +198,10 @@ export const SubagentParams = Type.Object({
185
198
  ],
186
199
  description: `Agent or chain config for create/update. Agent: name, package (optional namespace; runtime name becomes package.name), description, scope ('user'|'project', default 'user'), systemPrompt, systemPromptMode, inheritProjectContext, inheritSkills, defaultContext ('fresh'|'fork'), model, tools (comma-separated), extensions (comma-separated), skills (comma-separated), thinking, output, reads, progress, maxSubagentDepth (integer >= 0, clamped to ${MAX_SUBAGENT_NESTING_DEPTH}). Chain: name, package, description, scope, steps (array of {agent, task?, output?, outputMode?, reads?, model?, skill?, progress?}). Presence of 'steps' creates a chain instead of an agent. String values must be valid JSON.`
187
200
  })),
188
- tasks: Type.Optional(Type.Array(TaskItem, { description: "PARALLEL mode: [{agent, task, count?, output?, outputMode?, reads?, progress?}, ...]" })),
201
+ tasks: Type.Optional(Type.Array(TaskItem, {
202
+ maxItems: MAX_PARALLEL_TASKS,
203
+ description: `PARALLEL mode: [{agent, task, count?, output?, outputMode?, reads?, progress?}, ...]. Maximum ${MAX_PARALLEL_TASKS} tasks after count expansion.`,
204
+ })),
189
205
  concurrency: Type.Optional(Type.Integer({ minimum: 1, description: "Top-level PARALLEL mode only: max concurrent tasks. Defaults to config.parallel.concurrency or 4." })),
190
206
  worktree: Type.Optional(Type.Boolean({
191
207
  description: "Create isolated git worktrees for each parallel task. " +
@@ -201,14 +217,13 @@ export const SubagentParams = Type.Object({
201
217
  async: Type.Optional(Type.Boolean({ description: "Run in background (default: false, or per config)" })),
202
218
  agentScope: Type.Optional(Type.String({ description: "Agent discovery scope: 'user', 'project', or 'both' (default: 'both'; project wins on name collisions)" })),
203
219
  cwd: Type.Optional(Type.String()),
220
+ maxOutput: Type.Optional(MaxOutputSchema),
204
221
  artifacts: Type.Optional(Type.Boolean({ description: "Write debug artifacts (default: true)" })),
205
222
  includeProgress: Type.Optional(Type.Boolean({ description: "Include full progress in result (default: false)" })),
206
223
  share: Type.Optional(Type.Boolean({ description: "Upload session to GitHub Gist for sharing (default: false)" })),
207
224
  sessionDir: Type.Optional(
208
225
  Type.String({ description: "Directory to store session logs (default: temp; enables sessions even if share=false)" }),
209
226
  ),
210
- // Clarification TUI
211
- clarify: Type.Optional(Type.Boolean({ description: "Show TUI to preview/edit before execution. Explicit clarify: true keeps the run foreground for the clarify UI; omitted clarify can still run in the background when async: true is set." })),
212
227
  control: Type.Optional(ControlOverrides),
213
228
  // Solo agent overrides
214
229
  output: Type.Optional(Type.Unsafe({
@@ -219,6 +234,8 @@ export const SubagentParams = Type.Object({
219
234
  description: "Output file for single agent (string), or false to disable. Relative paths resolve against cwd.",
220
235
  })),
221
236
  outputMode: Type.Optional(OutputModeOverride),
237
+ reads: Type.Optional(RootReadsOverride),
238
+ progress: Type.Optional(Type.Boolean({ description: "Enable run-scoped progress.md tracking for a single agent under isolated artifact storage, without writing progress.md into the child cwd. This controls the child-maintained file; includeProgress separately controls whether detailed runtime telemetry is returned." })),
222
239
  skill: Type.Optional(SkillOverride),
223
240
  model: Type.Optional(Type.String({ description: "Override model for single agent (e.g. 'anthropic/claude-sonnet-4')" })),
224
- });
241
+ }, { additionalProperties: false });
@@ -0,0 +1,89 @@
1
+ import type { ExtensionAPI, ExtensionContext } from "@bastani/atomic";
2
+ import type { SubagentState } from "../shared/types.ts";
3
+ import { cleanupAllArtifactDirs, cleanupOldArtifacts, getArtifactsDir } from "../shared/artifacts.ts";
4
+ import { cleanupOldChainDirs } from "../shared/settings.ts";
5
+ import { cleanupOldNestedRuntimeDirs } from "../runs/shared/nested-events.ts";
6
+ import { createResultWatcher } from "../runs/background/result-watcher.ts";
7
+
8
+ export interface SubagentStartupMaintenance {
9
+ scheduleStartupCleanup(): void;
10
+ startResultWatcherDeferred(): void;
11
+ primeExistingResultsDeferred(): void;
12
+ cleanupSessionArtifactsDeferred(ctx: ExtensionContext): void;
13
+ stop(): void;
14
+ }
15
+
16
+ function scheduleMacrotask(task: () => void): () => void {
17
+ let cancelled = false;
18
+ const handle = setImmediate(() => {
19
+ if (!cancelled) task();
20
+ });
21
+ handle.unref?.();
22
+ return () => {
23
+ cancelled = true;
24
+ clearImmediate(handle);
25
+ };
26
+ }
27
+
28
+ function swallowCleanup(task: () => void): void {
29
+ try {
30
+ task();
31
+ } catch {
32
+ }
33
+ }
34
+
35
+ export function createSubagentStartupMaintenance(
36
+ pi: ExtensionAPI,
37
+ state: SubagentState,
38
+ options: {
39
+ resultsDir: string;
40
+ artifactCleanupDays: number;
41
+ resultTtlMs: number;
42
+ },
43
+ ): SubagentStartupMaintenance {
44
+ const { startResultWatcher, primeExistingResults, stopResultWatcher } = createResultWatcher(
45
+ pi,
46
+ state,
47
+ options.resultsDir,
48
+ options.resultTtlMs,
49
+ );
50
+ const cancelTasks = new Set<() => void>();
51
+ const schedule = (task: () => void): void => {
52
+ const cancel = scheduleMacrotask(() => {
53
+ cancelTasks.delete(cancel);
54
+ task();
55
+ });
56
+ cancelTasks.add(cancel);
57
+ };
58
+
59
+ return {
60
+ scheduleStartupCleanup() {
61
+ schedule(() => {
62
+ swallowCleanup(cleanupOldChainDirs);
63
+ swallowCleanup(() => cleanupAllArtifactDirs(options.artifactCleanupDays));
64
+ swallowCleanup(() => cleanupOldNestedRuntimeDirs(options.artifactCleanupDays));
65
+ });
66
+ },
67
+ startResultWatcherDeferred() {
68
+ schedule(startResultWatcher);
69
+ },
70
+ primeExistingResultsDeferred() {
71
+ schedule(primeExistingResults);
72
+ },
73
+ cleanupSessionArtifactsDeferred(ctx) {
74
+ let sessionFile: string | null | undefined;
75
+ try {
76
+ sessionFile = ctx.sessionManager.getSessionFile();
77
+ } catch {
78
+ return;
79
+ }
80
+ if (!sessionFile) return;
81
+ schedule(() => swallowCleanup(() => cleanupOldArtifacts(getArtifactsDir(sessionFile), options.artifactCleanupDays)));
82
+ },
83
+ stop() {
84
+ for (const cancel of cancelTasks) cancel();
85
+ cancelTasks.clear();
86
+ stopResultWatcher();
87
+ },
88
+ };
89
+ }
@@ -0,0 +1,29 @@
1
+ import { APP_NAME } from "@bastani/atomic";
2
+
3
+ export const SUBAGENT_TOOL_DESCRIPTION = `Delegate bounded specialist work to subagents or manage agent definitions while the parent remains in control.
4
+ EXECUTION (use exactly ONE mode):
5
+ • Execution calls always start non-interactively.
6
+ • Before executing, use { action: "list" } to inspect configured agents/chains. Only execute agents listed as executable/non-disabled.
7
+ • SINGLE: { agent, task?, progress? } - one focused task; progress:true maintains a run-scoped progress.md under isolated artifact storage without writing it into the child cwd (separate from includeProgress, which only returns runtime telemetry); omit task for self-contained agents
8
+ • CHAIN: { chain: [{agent:"agent-a"}, {parallel:[{agent:"agent-b",count:3}]}] } - bounded sequential pipeline with optional parallel fan-out
9
+ • PARALLEL: { tasks: [{agent,task,count?,output?,reads?,progress?}, ...], concurrency?: number, worktree?: true } - independent concurrent tasks (worktree: isolate each task in a git worktree)
10
+ • Optional context: { context: "fresh" | "fork" } (default: if any requested agent has defaultContext: "fork", the whole invocation uses fork; otherwise "fresh"; inspect agent defaults via { action: "list" })
11
+ • async:true is selective for genuinely long-running/background work; foreground is appropriate when the parent needs the result before proceeding
12
+ CHAIN TEMPLATE VARIABLES (use in task strings):
13
+ • {task} - The original task/request from the user
14
+ • {previous} - Text response from the previous step (empty for first step)
15
+ • {chain_dir} - Shared directory for chain files (e.g., <tmpdir>/${APP_NAME}-subagents-<scope>/chain-runs/abc123/)
16
+ Example: { chain: [{agent:"agent-a", task:"Analyze {task}"}, {agent:"agent-b", task:"Plan based on {previous}"}] }
17
+ MANAGEMENT (use action field, omit agent/task/chain/tasks):
18
+ • { action: "list" } - discover executable agents/chains
19
+ • { action: "get", agent: "name" } - full detail; packaged agents use dotted runtime names like "package.agent"
20
+ • { action: "create", config: { name: "custom-agent", package: "code-analysis", systemPrompt, systemPromptMode, inheritProjectContext, inheritSkills, defaultContext, ... } }
21
+ • { action: "update", agent: "code-analysis.custom-agent", config: { package: "analysis", ... } } - merge
22
+ • { action: "delete", agent: "code-analysis.custom-agent" }
23
+ • Use chainName for chain operations; packaged chains also use dotted runtime names
24
+ CONTROL:
25
+ • { action: "status", id: "..." } - inspect an async/background run by id or prefix
26
+ • { action: "interrupt", id?: "..." } - soft-interrupt the current child turn and leave the run paused
27
+ • { action: "resume", id: "...", message: "...", index?: 0 } - follow up with a live async child or revive a completed async/foreground child from its session
28
+ DIAGNOSTICS:
29
+ • { action: "doctor" } - read-only report for runtime paths, discovery, sessions, and intercom`;
@@ -2,7 +2,8 @@ import { execSync } from "node:child_process";
2
2
  import * as fs from "node:fs";
3
3
  import * as os from "node:os";
4
4
  import * as path from "node:path";
5
- import { getProjectConfigDirs } from "@bastani/atomic";
5
+ import { fileURLToPath } from "node:url";
6
+ import { APP_NAME, getProjectConfigDirs, getEnvValue } from "@bastani/atomic";
6
7
  import type { AgentConfig } from "../agents/agents.ts";
7
8
  import type { ExtensionConfig, IntercomBridgeConfig, IntercomBridgeMode } from "../shared/types.ts";
8
9
  import { getAgentDir } from "../shared/utils.ts";
@@ -12,11 +13,16 @@ const PI_INTERCOM_PACKAGE_NAME = "pi-intercom";
12
13
  function defaultAgentDir(): string {
13
14
  return getAgentDir();
14
15
  }
16
+ const INTERCOM_SESSION_ID_ENV = `${APP_NAME.toUpperCase()}_INTERCOM_SESSION_ID`;
15
17
 
16
18
  function defaultIntercomExtensionDir(agentDir = defaultAgentDir()): string {
17
19
  return path.join(agentDir, "extensions", PI_INTERCOM_PACKAGE_NAME);
18
20
  }
19
21
 
22
+ function bundledIntercomExtensionDir(): string {
23
+ return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "..", "intercom");
24
+ }
25
+
20
26
  function defaultIntercomConfigPath(agentDir = defaultAgentDir()): string {
21
27
  return path.join(agentDir, "intercom", "config.json");
22
28
  }
@@ -72,6 +78,8 @@ interface ResolveIntercomBridgeInput {
72
78
  }
73
79
 
74
80
  export function resolveIntercomSessionTarget(sessionName: string | undefined, sessionId: string): string {
81
+ const connectedIntercomSessionId = getEnvValue(INTERCOM_SESSION_ID_ENV)?.trim();
82
+ if (connectedIntercomSessionId) return connectedIntercomSessionId;
75
83
  const trimmedName = sessionName?.trim();
76
84
  if (trimmedName) return trimmedName;
77
85
  const normalizedSessionId = sessionId.startsWith("session-") ? sessionId.slice("session-".length) : sessionId;
@@ -231,7 +239,10 @@ function configuredPiIntercomPackageDir(input: ResolveIntercomBridgeInput, agent
231
239
  }
232
240
 
233
241
  function resolveIntercomExtensionDir(input: ResolveIntercomBridgeInput, agentDir: string): string {
234
- const legacyDir = path.resolve(input.extensionDir ?? defaultIntercomExtensionDir(agentDir));
242
+ if (input.extensionDir) return path.resolve(input.extensionDir);
243
+ const bundledDir = bundledIntercomExtensionDir();
244
+ if (packageHasPiExtension(bundledDir)) return bundledDir;
245
+ const legacyDir = path.resolve(defaultIntercomExtensionDir(agentDir));
235
246
  if (fs.existsSync(legacyDir)) return legacyDir;
236
247
  return configuredPiIntercomPackageDir(input, agentDir) ?? legacyDir;
237
248
  }
@@ -167,7 +167,7 @@ function formatNestedResultLines(children: PublicNestedRunSummary[] | undefined)
167
167
  return lines;
168
168
  }
169
169
 
170
- interface GroupedResultIntercomMessageInput {
170
+ export interface GroupedResultIntercomMessageInput {
171
171
  to: string;
172
172
  runId: string;
173
173
  mode: SubagentRunMode;
@@ -276,7 +276,7 @@ export function buildSubagentResultIntercomPayload(input: GroupedResultIntercomM
276
276
  export async function deliverSubagentResultIntercomEvent(
277
277
  events: IntercomEventBus,
278
278
  payload: SubagentResultIntercomPayload,
279
- timeoutMs = 500,
279
+ timeoutMs: number | false = 500,
280
280
  ): Promise<boolean> {
281
281
  return deliverSubagentIntercomMessageEvent(events, payload.to, payload.message, timeoutMs, payload as unknown as Record<string, unknown>);
282
282
  }
@@ -285,7 +285,7 @@ export async function deliverSubagentIntercomMessageEvent(
285
285
  events: IntercomEventBus,
286
286
  to: string,
287
287
  message: string,
288
- timeoutMs = 500,
288
+ timeoutMs: number | false = 500,
289
289
  extra: Record<string, unknown> = {},
290
290
  ): Promise<boolean> {
291
291
  if (typeof events.on !== "function" || typeof events.emit !== "function") return false;
@@ -307,7 +307,7 @@ export async function deliverSubagentIntercomMessageEvent(
307
307
  if (delivery.requestId !== requestId) return;
308
308
  finish(delivery.delivered === true);
309
309
  });
310
- timer = setTimeout(() => finish(false), timeoutMs);
310
+ if (timeoutMs !== false) timer = setTimeout(() => finish(false), timeoutMs);
311
311
  try {
312
312
  events.emit(SUBAGENT_RESULT_INTERCOM_EVENT, { ...extra, to, message, requestId });
313
313
  } catch {
@@ -0,0 +1,106 @@
1
+ import * as fs from "node:fs";
2
+ import type { DrainableSource, JsonlWriteStream } from "../../shared/jsonl-writer.ts";
3
+ import { acquireEventWriter } from "../../shared/event-jsonl-writer.ts";
4
+
5
+ const DEFAULT_TELEMETRY_BYTES = 512 * 1024;
6
+ const CAPPED_CHILD_EVENT_TYPES = new Set([
7
+ "message_update", "tool_execution_update", "subagent.child.stdout", "subagent.child.stderr",
8
+ ]);
9
+
10
+ interface ChildEventJournalContext {
11
+ runId: string;
12
+ stepIndex?: number;
13
+ agent: string;
14
+ }
15
+
16
+ interface ChildEventJournalDeps {
17
+ maxTelemetryBytes?: number;
18
+ createWriteStream?: (filePath: string) => JsonlWriteStream;
19
+ now?: () => number;
20
+ }
21
+
22
+ export interface ChildEventJournal {
23
+ append(event: Record<string, unknown>): void;
24
+ close(): Promise<void>;
25
+ }
26
+
27
+ function withoutKey(record: Record<string, unknown>, key: string): Record<string, unknown> {
28
+ const { [key]: _removed, ...rest } = record;
29
+ return rest;
30
+ }
31
+
32
+ /** Remove cumulative streaming snapshots while retaining compact delta metadata. */
33
+ export function sanitizeChildEvent(event: Record<string, unknown>): Record<string, unknown> {
34
+ let sanitized = event;
35
+ if (event.type === "message_update") {
36
+ sanitized = withoutKey(event, "message");
37
+ const assistantEvent = sanitized.assistantMessageEvent;
38
+ if (assistantEvent && typeof assistantEvent === "object" && !Array.isArray(assistantEvent)) {
39
+ let compactEvent = withoutKey(withoutKey(assistantEvent as Record<string, unknown>, "partial"), "message");
40
+ if (!("delta" in compactEvent)) {
41
+ compactEvent = withoutKey(withoutKey(compactEvent, "content"), "toolCall");
42
+ }
43
+ sanitized = { ...sanitized, assistantMessageEvent: compactEvent };
44
+ }
45
+ }
46
+ if (event.type === "message_start") sanitized = withoutKey(sanitized, "message");
47
+ if (event.type === "tool_execution_update") sanitized = withoutKey(sanitized, "partialResult");
48
+ if (event.type === "turn_end") sanitized = withoutKey(sanitized, "message");
49
+ if (event.type === "agent_end") sanitized = withoutKey(sanitized, "messages");
50
+ return sanitized;
51
+ }
52
+
53
+ export function createChildEventJournal(
54
+ filePath: string | undefined,
55
+ source: DrainableSource,
56
+ context: ChildEventJournalContext,
57
+ deps: ChildEventJournalDeps = {},
58
+ ): ChildEventJournal {
59
+ if (!filePath) return { append() {}, async close() {} };
60
+ const createStream = deps.createWriteStream ?? ((target: string) => fs.createWriteStream(target, { flags: "a" }));
61
+ const writer = acquireEventWriter(filePath, source, createStream);
62
+ if (!writer) return { append() {}, async close() {} };
63
+ const maxTelemetryBytes = deps.maxTelemetryBytes ?? DEFAULT_TELEMETRY_BYTES;
64
+ const now = deps.now ?? Date.now;
65
+ let closed = false;
66
+ let closePromise: Promise<void> | undefined;
67
+ const write = (record: Record<string, unknown>): void => writer.writeLine(JSON.stringify(record));
68
+
69
+ const enrich = (event: Record<string, unknown>): Record<string, unknown> => ({
70
+ ...event,
71
+ subagentSource: "child",
72
+ subagentRunId: context.runId,
73
+ subagentStepIndex: context.stepIndex,
74
+ subagentAgent: context.agent,
75
+ observedAt: now(),
76
+ });
77
+
78
+ return {
79
+ append(event) {
80
+ if (closed) return;
81
+ const sanitized = sanitizeChildEvent(event);
82
+ const record = enrich(sanitized);
83
+ const lineBytes = Buffer.byteLength(`${JSON.stringify(record)}\n`, "utf-8");
84
+ const assistantEvent = event.type === "message_update" && event.assistantMessageEvent
85
+ && typeof event.assistantMessageEvent === "object" && !Array.isArray(event.assistantMessageEvent)
86
+ ? event.assistantMessageEvent as Record<string, unknown>
87
+ : undefined;
88
+ const nestedTerminal = assistantEvent?.type === "done" || assistantEvent?.type === "error";
89
+ const capped = !nestedTerminal && typeof event.type === "string" && CAPPED_CHILD_EVENT_TYPES.has(event.type);
90
+ if (capped && !writer.reserveTelemetry(lineBytes, maxTelemetryBytes)) {
91
+ if (writer.claimTruncationMarker()) {
92
+ write(enrich({ type: "subagent.child.telemetry_truncated", maxTelemetryBytes }));
93
+ }
94
+ return;
95
+ }
96
+ write(record);
97
+ },
98
+ close() {
99
+ if (!closePromise) {
100
+ closed = true;
101
+ closePromise = writer.close();
102
+ }
103
+ return closePromise;
104
+ },
105
+ };
106
+ }
@@ -4,7 +4,7 @@ import * as path from "node:path";
4
4
  import { createRequire } from "node:module";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { APP_NAME } from "@bastani/atomic";
7
- import { resolvePiPackageRoot } from "../shared/pi-spawn.ts";
7
+ import { formatPiSpawnError, resolvePiPackageRoot, validatePiSpawnCwd } from "../shared/pi-spawn.ts";
8
8
  import { getAsyncConfigPath, TEMP_ROOT_DIR, type SubagentRunMode } from "../../shared/types.ts";
9
9
  import type { AsyncExecutionResult, AsyncSpawnResult } from "./async-execution-types.ts";
10
10
 
@@ -59,10 +59,11 @@ const jitiCliPath = resolveJitiCliPath();
59
59
 
60
60
  export function formatAsyncStartedMessage(headline: string): string {
61
61
  return [
62
- headline,
62
+ `Launched: ${headline}`,
63
+ "Completion pending; Pi will deliver the result when the detached run finishes.",
63
64
  "",
64
65
  "The async run is detached. Do not run sleep timers or polling loops just to wait for it.",
65
- "If you have independent work, continue that work. If you have nothing else to do until the async result arrives, end your turn now; Pi will deliver the completion when the run finishes.",
66
+ "If you have independent work, continue that work. If you have nothing else to do until the async result arrives, end your turn now.",
66
67
  "Use subagent({ action: \"status\", id: \"...\" }) when you need the current status/result, or to inspect a blocked/stale run. Do not poll just to wait.",
67
68
  ].join("\n");
68
69
  }
@@ -85,33 +86,38 @@ export function writeAsyncRunnerConfig(cfg: object, suffix: string): string {
85
86
  }
86
87
 
87
88
  export function spawnRunner(cfg: object, suffix: string, cwd: string): AsyncSpawnResult {
89
+ const cwdValidation = validatePiSpawnCwd(cwd);
90
+ if (!cwdValidation.ok) return { error: cwdValidation.error };
91
+
88
92
  if (!jitiCliPath) {
89
93
  return { error: "upstream jiti for TypeScript execution could not be found; ensure package dependencies are installed" };
90
94
  }
91
95
 
92
- try {
93
- const cwdStats = fs.statSync(cwd);
94
- if (!cwdStats.isDirectory()) {
95
- return { error: `cwd is not a directory: ${cwd}` };
96
- }
97
- } catch {
98
- return { error: `cwd does not exist: ${cwd}` };
99
- }
100
-
101
96
  const cfgPath = writeAsyncRunnerConfig(cfg, suffix);
102
97
  const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts");
103
98
 
104
- const proc = spawn(process.execPath, [jitiCliPath, runner, cfgPath], {
105
- cwd,
106
- detached: true,
107
- stdio: "ignore",
108
- windowsHide: true,
109
- });
99
+ const spawnSpec = { command: process.execPath, args: [jitiCliPath, runner, cfgPath] };
100
+ let proc: ReturnType<typeof spawn>;
101
+ try {
102
+ proc = spawn(spawnSpec.command, spawnSpec.args, {
103
+ cwd,
104
+ detached: true,
105
+ stdio: "ignore",
106
+ windowsHide: true,
107
+ });
108
+ } catch (error) {
109
+ const spawnError = error instanceof Error ? error : new Error(String(error));
110
+ return { error: formatPiSpawnError(spawnError, spawnSpec, cwd) };
111
+ }
110
112
  proc.on("error", (error) => {
111
- console.error(`[${APP_NAME}-subagents] async spawn failed: ${error.message}`);
113
+ console.error(`[${APP_NAME}-subagents] async spawn failed: ${formatPiSpawnError(error, spawnSpec, cwd)}`);
112
114
  });
113
115
  if (typeof proc.pid !== "number") {
114
- return { error: `async runner did not produce a pid for cwd: ${cwd}` };
116
+ const noPidError = Object.assign(
117
+ new Error(`spawn ${spawnSpec.command} failed before assigning a pid`),
118
+ fs.existsSync(spawnSpec.command) ? {} : { code: "ENOENT" },
119
+ );
120
+ return { error: formatPiSpawnError(noPidError, spawnSpec, cwd) };
115
121
  }
116
122
  proc.unref();
117
123
  return { pid: proc.pid };
@@ -4,6 +4,7 @@ import { getEnvValue } from "@bastani/atomic";
4
4
  import { buildSkillInjection, resolveSkillsWithFallback } from "../../agents/skills.ts";
5
5
  import { getSubagentCodexFastModeSettings, resolveSubagentCodexFastModeScope, resolveSubagentModelFastModeMetadata } from "../../shared/fast-mode.ts";
6
6
  import { resolveEffectiveThinking } from "../../shared/model-info.ts";
7
+ import { injectSingleProgressInstruction, writeInitialProgressFile } from "../../shared/settings.ts";
7
8
  import { ASYNC_DIR, RESULTS_DIR, SUBAGENT_ASYNC_STARTED_EVENT, resolveChildMaxSubagentDepth } from "../../shared/types.ts";
8
9
  import { resolveChildCwd } from "../../shared/utils.ts";
9
10
  import { applyThinkingSuffix, SUBAGENT_INTERCOM_SESSION_NAME_ENV } from "../shared/pi-args.ts";
@@ -16,7 +17,7 @@ import {
16
17
  formatAsyncStartedMessage,
17
18
  formatAsyncStartError,
18
19
  piPackageRoot,
19
- spawnRunner,
20
+ spawnRunner as defaultSpawnRunner,
20
21
  } from "./async-execution-common.ts";
21
22
  import type { AsyncExecutionResult, AsyncSingleParams, AsyncSpawnResult } from "./async-execution-types.ts";
22
23
 
@@ -46,6 +47,7 @@ export function executeAsyncSingle(
46
47
  controlIntercomTarget,
47
48
  childIntercomTarget,
48
49
  nestedRoute,
50
+ spawnRunner = defaultSpawnRunner,
49
51
  } = params;
50
52
  const task = params.task ?? "";
51
53
  const runnerCwd = resolveChildCwd(ctx.cwd, cwd);
@@ -81,7 +83,16 @@ export function executeAsyncSingle(
81
83
  const outputMode = params.outputMode ?? "inline";
82
84
  const validationError = validateFileOnlyOutputMode(outputMode, outputPath, `Async single run (${agent})`);
83
85
  if (validationError) return formatAsyncStartError("single", validationError);
84
- const taskWithOutputInstruction = injectSingleOutputInstruction(task, outputPath);
86
+ let taskWithOutputInstruction = injectSingleOutputInstruction(task, outputPath);
87
+ // Keep each child's progress contract outside its cwd and isolated by run;
88
+ // artifacts-disabled async runs use their already run-owned async directory.
89
+ if (params.progress) {
90
+ const progressDir = artifactConfig.enabled && artifactsDir
91
+ ? path.join(artifactsDir, "progress", id)
92
+ : path.join(asyncDir, "progress");
93
+ writeInitialProgressFile(progressDir);
94
+ taskWithOutputInstruction = injectSingleProgressInstruction(taskWithOutputInstruction, progressDir);
95
+ }
85
96
  const model = applyThinkingSuffix(
86
97
  resolveModelCandidate(params.modelOverride ?? agentConfig.model, availableModels, ctx.currentModelProvider),
87
98
  agentConfig.thinking,
@@ -61,6 +61,7 @@ export interface AsyncSingleParams {
61
61
  skills?: string[];
62
62
  output?: string | boolean;
63
63
  outputMode?: "inline" | "file-only";
64
+ progress?: boolean;
64
65
  modelOverride?: string;
65
66
  availableModels?: AvailableModelInfo[];
66
67
  knownModelProviders?: string[];
@@ -72,6 +73,8 @@ export interface AsyncSingleParams {
72
73
  controlIntercomTarget?: string;
73
74
  childIntercomTarget?: (agent: string, index: number) => string | undefined;
74
75
  nestedRoute?: NestedRouteInfo;
76
+ /** Internal launch seam used by focused runtime tests. */
77
+ spawnRunner?: (config: object, suffix: string, cwd: string) => AsyncSpawnResult;
75
78
  }
76
79
 
77
80
  export interface AsyncExecutionResult {
@@ -97,7 +97,7 @@ export function createAsyncJobTracker(pi: Pick<ExtensionAPI, "events">, state: S
97
97
  const pollIntervalMs = options.pollIntervalMs ?? POLL_INTERVAL_MS;
98
98
  const resultsDir = options.resultsDir ?? RESULTS_DIR;
99
99
  const rerenderWidget = (ctx: ExtensionContext, jobs = Array.from(state.asyncJobs.values())) => {
100
- renderWidget(ctx, jobs);
100
+ renderWidget(ctx, jobs, pi);
101
101
  };
102
102
  const cancelCleanup = (asyncId: string) => {
103
103
  const existingTimer = state.cleanupTimers.get(asyncId);