@selesai/code 0.5.27 → 0.5.29

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 (310) hide show
  1. package/dist/cli/args.d.ts.map +1 -1
  2. package/dist/cli/args.js +9 -1
  3. package/dist/cli/args.js.map +1 -1
  4. package/dist/cli/config-selector.d.ts.map +1 -1
  5. package/dist/cli/config-selector.js +1 -1
  6. package/dist/cli/config-selector.js.map +1 -1
  7. package/dist/cli/credential-print.d.ts +23 -0
  8. package/dist/cli/credential-print.d.ts.map +1 -0
  9. package/dist/cli/credential-print.js +117 -0
  10. package/dist/cli/credential-print.js.map +1 -0
  11. package/dist/cli/startup-ui.d.ts.map +1 -1
  12. package/dist/cli/startup-ui.js +1 -1
  13. package/dist/cli/startup-ui.js.map +1 -1
  14. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  15. package/dist/core/agent-session-runtime.js +3 -0
  16. package/dist/core/agent-session-runtime.js.map +1 -1
  17. package/dist/core/agent-session.d.ts +12 -1
  18. package/dist/core/agent-session.d.ts.map +1 -1
  19. package/dist/core/agent-session.js +20 -14
  20. package/dist/core/agent-session.js.map +1 -1
  21. package/dist/core/compaction/compaction.d.ts.map +1 -1
  22. package/dist/core/compaction/compaction.js +11 -3
  23. package/dist/core/compaction/compaction.js.map +1 -1
  24. package/dist/core/extensions/runner.d.ts +1 -0
  25. package/dist/core/extensions/runner.d.ts.map +1 -1
  26. package/dist/core/extensions/runner.js +11 -0
  27. package/dist/core/extensions/runner.js.map +1 -1
  28. package/dist/core/extensions/types.d.ts +14 -1
  29. package/dist/core/extensions/types.d.ts.map +1 -1
  30. package/dist/core/extensions/types.js.map +1 -1
  31. package/dist/core/footer-data-provider.d.ts +10 -0
  32. package/dist/core/footer-data-provider.d.ts.map +1 -1
  33. package/dist/core/footer-data-provider.js +1 -1
  34. package/dist/core/footer-data-provider.js.map +1 -1
  35. package/dist/core/llama/provider.d.ts.map +1 -1
  36. package/dist/core/llama/provider.js +8 -3
  37. package/dist/core/llama/provider.js.map +1 -1
  38. package/dist/core/model-config.d.ts +30 -0
  39. package/dist/core/model-config.d.ts.map +1 -1
  40. package/dist/core/model-config.js +6 -0
  41. package/dist/core/model-config.js.map +1 -1
  42. package/dist/core/model-registry.d.ts.map +1 -1
  43. package/dist/core/model-registry.js +2 -2
  44. package/dist/core/model-registry.js.map +1 -1
  45. package/dist/core/model-resolver.d.ts +1 -0
  46. package/dist/core/model-resolver.d.ts.map +1 -1
  47. package/dist/core/model-resolver.js +20 -3
  48. package/dist/core/model-resolver.js.map +1 -1
  49. package/dist/core/model-runtime.d.ts +2 -0
  50. package/dist/core/model-runtime.d.ts.map +1 -1
  51. package/dist/core/model-runtime.js +5 -4
  52. package/dist/core/model-runtime.js.map +1 -1
  53. package/dist/core/package-manager.d.ts.map +1 -1
  54. package/dist/core/package-manager.js +13 -6
  55. package/dist/core/package-manager.js.map +1 -1
  56. package/dist/core/remote-catalog-provider.d.ts +1 -1
  57. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  58. package/dist/core/remote-catalog-provider.js +24 -11
  59. package/dist/core/remote-catalog-provider.js.map +1 -1
  60. package/dist/core/resource-loader.d.ts +15 -0
  61. package/dist/core/resource-loader.d.ts.map +1 -1
  62. package/dist/core/resource-loader.js +66 -9
  63. package/dist/core/resource-loader.js.map +1 -1
  64. package/dist/core/settings-manager.d.ts +1 -1
  65. package/dist/core/settings-manager.d.ts.map +1 -1
  66. package/dist/core/settings-manager.js.map +1 -1
  67. package/dist/core/system-prompt.d.ts.map +1 -1
  68. package/dist/core/system-prompt.js +1 -1
  69. package/dist/core/system-prompt.js.map +1 -1
  70. package/dist/core/tools/bash.d.ts +2 -0
  71. package/dist/core/tools/bash.d.ts.map +1 -1
  72. package/dist/core/tools/bash.js +34 -5
  73. package/dist/core/tools/bash.js.map +1 -1
  74. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  75. package/dist/core/tools/tool-definition-wrapper.js +3 -1
  76. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  77. package/dist/extensions/pi-intercom/CHANGELOG.md +249 -0
  78. package/dist/extensions/pi-intercom/README.md +102 -39
  79. package/dist/extensions/pi-intercom/broker/broker.ts +1233 -36
  80. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -0
  81. package/dist/extensions/pi-intercom/broker/client.ts +315 -12
  82. package/dist/extensions/pi-intercom/broker/extension-state.ts +186 -0
  83. package/dist/extensions/pi-intercom/broker/extension.test.ts +387 -0
  84. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -0
  85. package/dist/extensions/pi-intercom/broker/framing.ts +82 -24
  86. package/dist/extensions/pi-intercom/broker/paths.test.ts +153 -0
  87. package/dist/extensions/pi-intercom/broker/paths.ts +117 -8
  88. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -0
  89. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -0
  90. package/dist/extensions/pi-intercom/broker/spawn.test.ts +160 -23
  91. package/dist/extensions/pi-intercom/broker/spawn.ts +113 -27
  92. package/dist/extensions/pi-intercom/config.test.ts +93 -0
  93. package/dist/extensions/pi-intercom/config.ts +55 -6
  94. package/dist/extensions/pi-intercom/cwd.test.ts +40 -0
  95. package/dist/extensions/pi-intercom/cwd.ts +31 -0
  96. package/dist/extensions/pi-intercom/extension-api.ts +44 -0
  97. package/dist/extensions/pi-intercom/format-context.test.ts +31 -0
  98. package/dist/extensions/pi-intercom/format-context.ts +32 -0
  99. package/dist/extensions/pi-intercom/index.ts +742 -145
  100. package/dist/extensions/pi-intercom/intercom.integration.test.ts +2646 -0
  101. package/dist/extensions/pi-intercom/package.json +15 -5
  102. package/dist/extensions/pi-intercom/reply-tracker.test.ts +134 -0
  103. package/dist/extensions/pi-intercom/reply-tracker.ts +31 -13
  104. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +13 -11
  105. package/dist/extensions/pi-intercom/test/inline-message.test.ts +184 -0
  106. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -0
  107. package/dist/extensions/pi-intercom/types.ts +94 -4
  108. package/dist/extensions/pi-intercom/ui/compose.ts +8 -4
  109. package/dist/extensions/pi-intercom/ui/inline-message.ts +61 -25
  110. package/dist/extensions/pi-intercom/ui/session-list.ts +7 -3
  111. package/dist/extensions/pi-subagents/CHANGELOG.md +85 -0
  112. package/dist/extensions/pi-subagents/LICENSE +21 -0
  113. package/dist/extensions/pi-subagents/README.md +146 -52
  114. package/dist/extensions/pi-subagents/agents/architect.md +1 -0
  115. package/dist/extensions/pi-subagents/agents/builder.md +1 -0
  116. package/dist/extensions/pi-subagents/package-lock.json +2 -2
  117. package/dist/extensions/pi-subagents/package.json +3 -3
  118. package/dist/extensions/pi-subagents/prompts/review-loop.md +1 -1
  119. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +21 -989
  120. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +256 -0
  121. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +430 -0
  122. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +144 -0
  123. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +282 -0
  124. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +71 -30
  125. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +4 -0
  126. package/dist/extensions/pi-subagents/src/agents/agents.ts +118 -9
  127. package/dist/extensions/pi-subagents/src/agents/skills.ts +14 -12
  128. package/dist/extensions/pi-subagents/src/api/delegation.ts +3 -0
  129. package/dist/extensions/pi-subagents/src/api/preflight.ts +16 -12
  130. package/dist/extensions/pi-subagents/src/extension/chain-validation.ts +17 -1
  131. package/dist/extensions/pi-subagents/src/extension/index.ts +17 -7
  132. package/dist/extensions/pi-subagents/src/extension/rpc.ts +248 -6
  133. package/dist/extensions/pi-subagents/src/extension/schemas.ts +31 -6
  134. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +8 -7
  135. package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +9 -4
  136. package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +33 -4
  137. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +63 -16
  138. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +24 -13
  139. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +7 -5
  140. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -2
  141. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +48 -5
  142. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +68 -1
  143. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +29 -4
  144. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +29 -6
  145. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +29 -3
  146. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +372 -28
  147. package/dist/extensions/pi-subagents/src/runs/foreground/async-stop-action.ts +65 -0
  148. package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +3 -3
  149. package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +143 -43
  150. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +527 -247
  151. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +42 -0
  152. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +426 -123
  153. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +15 -7
  154. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +51 -19
  155. package/dist/extensions/pi-subagents/src/runs/shared/chain-outputs.ts +3 -1
  156. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
  157. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +44 -11
  158. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +8 -0
  159. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +97 -20
  160. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +43 -12
  161. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +52 -4
  162. package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +19 -0
  163. package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +45 -9
  164. package/dist/extensions/pi-subagents/src/runs/shared/runtime-acknowledged-extensions.ts +71 -0
  165. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +31 -1
  166. package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +101 -0
  167. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +1 -1
  168. package/dist/extensions/pi-subagents/src/runs/shared/usage-budget.ts +65 -0
  169. package/dist/extensions/pi-subagents/src/runs/shared/workflow-graph.ts +26 -1
  170. package/dist/extensions/pi-subagents/src/shared/settings.ts +17 -1
  171. package/dist/extensions/pi-subagents/src/shared/types.ts +155 -10
  172. package/dist/extensions/pi-subagents/src/shared/utils.ts +73 -4
  173. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +5 -0
  174. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +46 -4
  175. package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +5 -3
  176. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +87 -24
  177. package/dist/extensions/pi-subagents/src/tui/fleet.ts +182 -9
  178. package/dist/extensions/pi-subagents/src/tui/render.ts +27 -28
  179. package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +14 -7
  180. package/dist/extensions/pi-subagents/src/watchdog/review.ts +5 -4
  181. package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +170 -17
  182. package/dist/extensions/pi-subagents/src/watchdog/scope.ts +62 -0
  183. package/dist/extensions/pi-subagents/src/watchdog/settings.ts +41 -1
  184. package/dist/extensions/pi-subagents/src/watchdog/types.ts +10 -0
  185. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +2 -2
  186. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +348 -7
  187. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +84 -0
  188. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +4 -2
  189. package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +51 -2
  190. package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +26 -1
  191. package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +48 -0
  192. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +3 -3
  193. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +213 -13
  194. package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +34 -0
  195. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +44 -0
  196. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +118 -12
  197. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +850 -7
  198. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +112 -23
  199. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +17 -5
  200. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +2 -0
  201. package/dist/extensions/pi-subagents/test/support/register-loader.mjs +3 -3
  202. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +3 -1
  203. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +128 -0
  204. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +47 -2
  205. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +60 -0
  206. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +8 -0
  207. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +102 -0
  208. package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +1 -1
  209. package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +6 -0
  210. package/dist/extensions/pi-subagents/test/unit/chain-validation.test.ts +1 -1
  211. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +48 -48
  212. package/dist/extensions/pi-subagents/test/unit/config-dir-runtime.test.ts +23 -0
  213. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +27 -0
  214. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +4 -2
  215. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +1 -0
  216. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +176 -8
  217. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +164 -5
  218. package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +41 -1
  219. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +11 -11
  220. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +18 -2
  221. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +20 -1
  222. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +30 -2
  223. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +10 -2
  224. package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +22 -0
  225. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +103 -0
  226. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +18 -0
  227. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +46 -0
  228. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +13 -1
  229. package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +29 -4
  230. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +223 -4
  231. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +30 -0
  232. package/dist/extensions/pi-subagents/test/unit/runtime-acknowledged-extensions.test.ts +52 -0
  233. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +34 -2
  234. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +1 -1
  235. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +1 -1
  236. package/dist/extensions/pi-subagents/test/unit/streamed-progress-bounds.test.ts +78 -0
  237. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +41 -0
  238. package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +77 -0
  239. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +3 -0
  240. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +1 -1
  241. package/dist/extensions/pi-subagents/test/unit/total-cost.test.ts +1 -0
  242. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +210 -1
  243. package/dist/extensions/pi-subagents/test/unit/watchdog-scope.test.ts +33 -0
  244. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +32 -0
  245. package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +1 -1
  246. package/dist/extensions/question/index.ts +14 -1
  247. package/dist/extensions/question/tests/wizard.test.ts +11 -8
  248. package/dist/main.d.ts.map +1 -1
  249. package/dist/main.js +43 -0
  250. package/dist/main.js.map +1 -1
  251. package/dist/modes/interactive/components/custom-message.d.ts +3 -1
  252. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  253. package/dist/modes/interactive/components/custom-message.js +10 -2
  254. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  255. package/dist/modes/interactive/components/extension-editor.d.ts +1 -2
  256. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  257. package/dist/modes/interactive/components/extension-editor.js +16 -46
  258. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  259. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  260. package/dist/modes/interactive/components/model-selector.js +4 -1
  261. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  262. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  263. package/dist/modes/interactive/components/scoped-models-selector.js +22 -13
  264. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  265. package/dist/modes/interactive/external-editor.d.ts +12 -0
  266. package/dist/modes/interactive/external-editor.d.ts.map +1 -0
  267. package/dist/modes/interactive/external-editor.js +37 -0
  268. package/dist/modes/interactive/external-editor.js.map +1 -0
  269. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  270. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  271. package/dist/modes/interactive/interactive-mode.js +72 -64
  272. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  273. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  274. package/dist/modes/rpc/rpc-mode.js +14 -0
  275. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  276. package/dist/skills/batch-grill-me/SKILL.md +3 -1
  277. package/dist/utils/clipboard.d.ts.map +1 -1
  278. package/dist/utils/clipboard.js +19 -8
  279. package/dist/utils/clipboard.js.map +1 -1
  280. package/dist/utils/version-check.d.ts.map +1 -1
  281. package/dist/utils/version-check.js +1 -1
  282. package/dist/utils/version-check.js.map +1 -1
  283. package/docs/compaction.md +1 -1
  284. package/docs/custom-provider.md +14 -5
  285. package/docs/environment-variables.md +86 -0
  286. package/docs/extensions.md +15 -5
  287. package/docs/index.md +1 -0
  288. package/docs/models.md +9 -2
  289. package/docs/providers.md +21 -2
  290. package/docs/rpc.md +23 -6
  291. package/docs/session-format.md +2 -0
  292. package/docs/settings.md +1 -1
  293. package/docs/usage.md +0 -13
  294. package/examples/extensions/custom-compaction.ts +5 -2
  295. package/examples/extensions/custom-provider-anthropic/index.ts +9 -3
  296. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  297. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  298. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  299. package/examples/extensions/gondolin/package-lock.json +2 -2
  300. package/examples/extensions/gondolin/package.json +1 -1
  301. package/examples/extensions/handoff.ts +11 -3
  302. package/examples/extensions/message-renderer.ts +3 -3
  303. package/examples/extensions/sandbox/package-lock.json +2 -2
  304. package/examples/extensions/sandbox/package.json +1 -1
  305. package/examples/extensions/summarize.ts +5 -2
  306. package/examples/extensions/with-deps/package-lock.json +2 -2
  307. package/examples/extensions/with-deps/package.json +1 -1
  308. package/examples/sdk/12-full-control.ts +3 -1
  309. package/package.json +15 -6
  310. package/dist/extensions/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
@@ -114,6 +114,14 @@ export interface DynamicParallelStep {
114
114
  gateOn?: ChainGateLayer;
115
115
  }
116
116
 
117
+ /** Approval checkpoint: pause before later chain steps until parent approval. */
118
+ export interface CheckpointStep {
119
+ checkpoint: string;
120
+ message?: string;
121
+ phase?: string;
122
+ label?: string;
123
+ }
124
+
117
125
  /** Parallel step: multiple agents running concurrently */
118
126
  export interface ParallelStep {
119
127
  parallel: ParallelTaskItem[];
@@ -126,12 +134,16 @@ export interface ParallelStep {
126
134
  }
127
135
 
128
136
  /** Union type for chain steps */
129
- export type ChainStep = SequentialStep | ParallelStep | DynamicParallelStep;
137
+ export type ChainStep = SequentialStep | ParallelStep | DynamicParallelStep | CheckpointStep;
130
138
 
131
139
  // =============================================================================
132
140
  // Type Guards
133
141
  // =============================================================================
134
142
 
143
+ export function isCheckpointStep(step: ChainStep): step is CheckpointStep {
144
+ return "checkpoint" in step;
145
+ }
146
+
135
147
  export function isParallelStep(step: ChainStep): step is ParallelStep {
136
148
  return "parallel" in step && Array.isArray((step as ParallelStep).parallel);
137
149
  }
@@ -142,6 +154,9 @@ export function isDynamicParallelStep(step: ChainStep): step is DynamicParallelS
142
154
 
143
155
  /** Get all agent names in a step (single for sequential, multiple for parallel) */
144
156
  export function getStepAgents(step: ChainStep): string[] {
157
+ if (isCheckpointStep(step)) {
158
+ return [];
159
+ }
145
160
  if (isParallelStep(step)) {
146
161
  return step.parallel.map((t) => t.agent);
147
162
  }
@@ -209,6 +224,7 @@ export function resolveChainTemplates(
209
224
  steps: ChainStep[],
210
225
  ): ResolvedTemplates {
211
226
  return steps.map((step, i) => {
227
+ if (isCheckpointStep(step)) return "";
212
228
  if (isParallelStep(step)) {
213
229
  // Parallel step: resolve each task's template
214
230
  return step.parallel.map((task) => {
@@ -35,11 +35,11 @@ export interface ChainOutputMapEntry {
35
35
 
36
36
  export type ChainOutputMap = Record<string, ChainOutputMapEntry>;
37
37
 
38
- export type WorkflowNodeStatus = "pending" | "running" | "completed" | "failed" | "paused" | "stopped" | "detached";
38
+ export type WorkflowNodeStatus = "pending" | "running" | "completed" | "failed" | "paused" | "stopped" | "detached" | "rejected";
39
39
 
40
40
  export interface WorkflowGraphNode {
41
41
  id: string;
42
- kind: "step" | "parallel-group" | "dynamic-parallel-group" | "agent";
42
+ kind: "step" | "parallel-group" | "dynamic-parallel-group" | "agent" | "checkpoint";
43
43
  agent?: string;
44
44
  phase?: string;
45
45
  label: string;
@@ -59,6 +59,16 @@ export interface WorkflowGraphNode {
59
59
  structured?: boolean;
60
60
  acceptanceStatus?: AcceptanceLedgerStatus;
61
61
  error?: string;
62
+ checkpoint?: ChainCheckpointState;
63
+ }
64
+
65
+ export interface ChainCheckpointState {
66
+ name: string;
67
+ message?: string;
68
+ status: "pending" | "approved" | "rejected";
69
+ stepIndex: number;
70
+ approvedAt?: number;
71
+ rejectedAt?: number;
62
72
  }
63
73
 
64
74
  export interface WorkflowGraphSnapshot {
@@ -215,6 +225,7 @@ export interface ControlEvent {
215
225
  }
216
226
 
217
227
  export type SubagentResultStatus = "completed" | "failed" | "paused" | "stopped" | "detached";
228
+ export type SubagentOutputState = "present" | "absent" | "unknown";
218
229
  export type SubagentRunMode = "single" | "parallel" | "chain";
219
230
 
220
231
  export interface ParallelHandoffPatch {
@@ -507,7 +518,10 @@ export type PublicNestedRunSummary = Pick<
507
518
 
508
519
  export interface SubagentResultIntercomChild {
509
520
  agent: string;
521
+ /** Process/lifecycle status. It does not establish semantic task completion. */
510
522
  status: SubagentResultStatus;
523
+ /** Whether the child produced substantive output before its process ended. */
524
+ outputState?: SubagentOutputState;
511
525
  summary: string;
512
526
  index?: number;
513
527
  artifactPath?: string;
@@ -566,6 +580,11 @@ export interface AgentProgress {
566
580
  toolCount: number;
567
581
  turnCount?: number;
568
582
  tokens: number;
583
+ /** Resolved launch model/effort and split usage for public live projections. */
584
+ model?: string;
585
+ thinking?: string;
586
+ inputTokens?: number;
587
+ outputTokens?: number;
569
588
  durationMs: number;
570
589
  error?: string;
571
590
  failedTool?: string;
@@ -756,12 +775,68 @@ export interface ProtocolOutputLimit {
756
775
  diagnosticTail: string;
757
776
  }
758
777
 
778
+ export interface LaunchResolvedChildExtensionsV1 {
779
+ version: 1;
780
+ /** This is parent-resolved launch intent, not child-runtime acknowledgement that extensions loaded. */
781
+ source: "launch-resolved";
782
+ disableAmbientExtensions: boolean;
783
+ runtime: string[];
784
+ configured: string[];
785
+ effective: string[];
786
+ omitted: {
787
+ runtime: number;
788
+ configured: number;
789
+ effective: number;
790
+ };
791
+ }
792
+
793
+ export interface RuntimeAcknowledgedChildExtensionsV1 {
794
+ version: 1;
795
+ /** Best-effort child-runtime registration acknowledgement, not extension health. */
796
+ source: "child-runtime";
797
+ ids: string[];
798
+ omitted: number;
799
+ }
800
+
801
+ export interface UsageBudgetLimitConfig {
802
+ soft?: number;
803
+ hard: number;
804
+ }
805
+
806
+ export interface UsageBudgetConfig {
807
+ tokens?: UsageBudgetLimitConfig;
808
+ costUsd?: UsageBudgetLimitConfig;
809
+ }
810
+
811
+ export interface UsageBudgetMetricState extends UsageBudgetLimitConfig {
812
+ used: number;
813
+ outcome: "within-budget" | "soft-exceeded" | "hard-exceeded";
814
+ }
815
+
816
+ export interface UsageBudgetState {
817
+ version: 1;
818
+ /** Enforced from usage reported by completed or streaming child runs; no reservation estimates. */
819
+ source: "reported";
820
+ tokens?: UsageBudgetMetricState;
821
+ costUsd?: UsageBudgetMetricState;
822
+ exhausted: boolean;
823
+ reason?: "tokens" | "costUsd";
824
+ }
825
+
759
826
  export interface SingleResult {
827
+ /**
828
+ * Stable child identity within the foreground run. Pair with Details.runId for
829
+ * cross-run correlation. This is assigned in launch order, remains stable across
830
+ * partial progress snapshots and the final result, and is independent of the
831
+ * result row's array position.
832
+ */
833
+ index: number;
760
834
  agent: string;
761
835
  task: string;
762
836
  /** Resolved launch context for this child. */
763
837
  context?: "fresh" | "fork";
764
838
  exitCode: number;
839
+ processSignal?: string | null;
765
840
  detached?: boolean;
766
841
  detachedReason?: string;
767
842
  interrupted?: boolean;
@@ -791,10 +866,14 @@ export interface SingleResult {
791
866
  artifactPaths?: ArtifactPaths;
792
867
  truncation?: TruncationResult;
793
868
  finalOutput?: string;
869
+ /** Provenance-aware state for substantive child output, excluding synthetic lifecycle messages. */
870
+ outputState?: SubagentOutputState;
794
871
  outputMode?: OutputMode;
795
872
  savedOutputPath?: string;
796
873
  outputReference?: SavedOutputReference;
797
874
  outputSaveError?: string;
875
+ /** Best-effort metadata persistence failure; execution and receipt publication continue. */
876
+ metadataSaveError?: string;
798
877
  structuredOutput?: unknown;
799
878
  structuredOutputFailed?: boolean;
800
879
  structuredOutputPath?: string;
@@ -802,6 +881,8 @@ export interface SingleResult {
802
881
  acceptance?: AcceptanceLedger;
803
882
  agentContract?: AgentContract;
804
883
  launchContractDigest?: string;
884
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
885
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
805
886
  execution?: ExecutionProjection;
806
887
  review?: ReviewProjection;
807
888
  effects?: EffectsProjection;
@@ -847,6 +928,7 @@ export interface Details {
847
928
  stopped?: boolean;
848
929
  turnBudget?: ResolvedTurnBudget;
849
930
  toolBudget?: ResolvedToolBudget;
931
+ usageBudget?: UsageBudgetState;
850
932
  progress?: AgentProgress[];
851
933
  progressSummary?: ProgressSummary;
852
934
  artifacts?: {
@@ -860,10 +942,11 @@ export interface Details {
860
942
  artifactPath?: string;
861
943
  };
862
944
  // Chain metadata for observability
863
- chainAgents?: string[]; // Agent names in order, e.g., ["scout", "planner"]
945
+ chainAgents?: string[]; // Agent names in order, e.g., ["explorer", "architect"]
864
946
  totalSteps?: number; // Total steps in chain
865
947
  currentStepIndex?: number; // 0-indexed current step (for running chains)
866
948
  workflowGraph?: WorkflowGraphSnapshot;
949
+ checkpoint?: ChainCheckpointState;
867
950
  outputs?: ChainOutputMap;
868
951
  // Aggregated child usage across all agents in the run
869
952
  totalChildUsage?: Usage;
@@ -877,6 +960,10 @@ export interface Details {
877
960
  processTerminal?: ProcessTerminalV1;
878
961
  };
879
962
  launchContractDigest?: string;
963
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
964
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
965
+ /** Original launch contract whose persisted session is being revived. */
966
+ sourceLaunchContractDigest?: string;
880
967
  }
881
968
 
882
969
  // ============================================================================
@@ -914,7 +1001,7 @@ export interface AsyncParallelGroupStatus {
914
1001
  stepIndex: number;
915
1002
  }
916
1003
 
917
- export type NestedRunState = "queued" | "running" | "complete" | "failed" | "paused" | "stopped";
1004
+ export type NestedRunState = "queued" | "running" | "complete" | "failed" | "paused" | "stopped" | "rejected";
918
1005
  export type NestedOwnerState = "live" | "gone" | "unknown";
919
1006
 
920
1007
  export interface NestedRunAddress {
@@ -928,7 +1015,7 @@ export interface NestedRunAddress {
928
1015
 
929
1016
  export interface NestedStepSummary {
930
1017
  agent: string;
931
- status: "pending" | "running" | "complete" | "completed" | "failed" | "paused" | "stopped";
1018
+ status: "pending" | "running" | "complete" | "completed" | "failed" | "paused" | "stopped" | "rejected";
932
1019
  sessionFile?: string;
933
1020
  transcriptPath?: string;
934
1021
  transcriptError?: string;
@@ -951,6 +1038,8 @@ export interface NestedStepSummary {
951
1038
  toolBudget?: ToolBudgetState;
952
1039
  toolBudgetBlocked?: boolean;
953
1040
  processTerminal?: ProcessTerminalV1;
1041
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1042
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
954
1043
  capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
955
1044
  capabilityAudit?: SubagentCapabilityAudit;
956
1045
  children?: NestedRunSummary[];
@@ -969,6 +1058,8 @@ export interface NestedRunSummary extends NestedRunAddress {
969
1058
  capabilityToken?: string;
970
1059
  mode?: SubagentRunMode;
971
1060
  processTerminal?: ProcessTerminalV1;
1061
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1062
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
972
1063
  capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
973
1064
  capabilityAudit?: SubagentCapabilityAudit;
974
1065
  state: NestedRunState;
@@ -1029,7 +1120,11 @@ export interface AsyncStartedEvent {
1029
1120
  chainStepCount?: number;
1030
1121
  parallelGroups?: AsyncParallelGroupStatus[];
1031
1122
  workflowGraph?: WorkflowGraphSnapshot;
1123
+ checkpoint?: ChainCheckpointState;
1032
1124
  launchContractDigest?: string;
1125
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1126
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
1127
+ usageBudget?: UsageBudgetState;
1033
1128
  timeoutMs?: number;
1034
1129
  deadlineAt?: number;
1035
1130
  turnBudget?: TurnBudgetState;
@@ -1043,7 +1138,7 @@ export interface AsyncStatus {
1043
1138
  sessionId?: string;
1044
1139
  mode: SubagentRunMode;
1045
1140
  isNested?: boolean;
1046
- state: "queued" | "running" | "complete" | "failed" | "paused" | "stopped";
1141
+ state: "queued" | "running" | "complete" | "failed" | "paused" | "stopped" | "rejected";
1047
1142
  error?: string;
1048
1143
  activityState?: ActivityState;
1049
1144
  lastActivityAt?: number;
@@ -1065,6 +1160,7 @@ export interface AsyncStatus {
1065
1160
  wrapUpRequested?: boolean;
1066
1161
  toolBudget?: ToolBudgetState;
1067
1162
  toolBudgetBlocked?: boolean;
1163
+ usageBudget?: UsageBudgetState;
1068
1164
  pid?: number;
1069
1165
  cwd?: string;
1070
1166
  currentStep?: number;
@@ -1072,19 +1168,25 @@ export interface AsyncStatus {
1072
1168
  pendingAppends?: number;
1073
1169
  parallelGroups?: AsyncParallelGroupStatus[];
1074
1170
  workflowGraph?: WorkflowGraphSnapshot;
1171
+ checkpoint?: ChainCheckpointState;
1075
1172
  processTerminal?: ProcessTerminalV1;
1076
1173
  launchContractDigest?: string;
1174
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1175
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
1077
1176
  capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
1078
1177
  capabilityAudit?: SubagentCapabilityAudit;
1079
1178
  steps?: Array<{
1080
1179
  agent: string;
1081
1180
  /** Resolved launch context for this child step. */
1082
1181
  context?: "fresh" | "fork";
1182
+ /** Short caller-facing task/goal shown in fleet surfaces when available. */
1183
+ description?: string;
1083
1184
  phase?: string;
1084
1185
  label?: string;
1085
1186
  outputName?: string;
1086
1187
  structured?: boolean;
1087
- status: "pending" | "running" | "complete" | "completed" | "failed" | "paused" | "stopped";
1188
+ checkpoint?: ChainCheckpointState;
1189
+ status: "pending" | "running" | "complete" | "completed" | "failed" | "paused" | "stopped" | "rejected";
1088
1190
  children?: NestedRunSummary[];
1089
1191
  sessionFile?: string;
1090
1192
  transcriptPath?: string;
@@ -1125,6 +1227,8 @@ export interface AsyncStatus {
1125
1227
  acceptance?: AcceptanceLedger;
1126
1228
  agentContract?: AgentContract;
1127
1229
  launchContractDigest?: string;
1230
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1231
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
1128
1232
  execution?: ExecutionProjection;
1129
1233
  review?: ReviewProjection;
1130
1234
  effects?: EffectsProjection;
@@ -1136,6 +1240,7 @@ export interface AsyncStatus {
1136
1240
  sessionDir?: string;
1137
1241
  outputFile?: string;
1138
1242
  totalTokens?: TokenUsage;
1243
+ usageBudget?: UsageBudgetState;
1139
1244
  totalCost?: CostSummary;
1140
1245
  sessionFile?: string;
1141
1246
  outputs?: ChainOutputMap;
@@ -1144,6 +1249,7 @@ export interface AsyncStatus {
1144
1249
 
1145
1250
  export type AsyncJobStep = NonNullable<AsyncStatus["steps"]>[number] & {
1146
1251
  index?: number;
1252
+ description?: string;
1147
1253
  };
1148
1254
 
1149
1255
  export interface AsyncJobState {
@@ -1151,7 +1257,7 @@ export interface AsyncJobState {
1151
1257
  asyncDir: string;
1152
1258
  /** Parent-resolved launch directory retained for trusted live artifact lookup. */
1153
1259
  cwd?: string;
1154
- status: "queued" | "running" | "complete" | "failed" | "paused" | "stopped";
1260
+ status: "queued" | "running" | "complete" | "failed" | "paused" | "stopped" | "rejected";
1155
1261
  /** Short caller-facing task/goal shown in fleet surfaces when available. */
1156
1262
  description?: string;
1157
1263
  pid?: number;
@@ -1172,6 +1278,7 @@ export interface AsyncJobState {
1172
1278
  chainStepCount?: number;
1173
1279
  parallelGroups?: AsyncParallelGroupStatus[];
1174
1280
  steps?: AsyncJobStep[];
1281
+ checkpoint?: ChainCheckpointState;
1175
1282
  stepsTotal?: number;
1176
1283
  runningSteps?: number;
1177
1284
  completedSteps?: number;
@@ -1191,6 +1298,8 @@ export interface AsyncJobState {
1191
1298
  sessionDir?: string;
1192
1299
  outputFile?: string;
1193
1300
  totalTokens?: TokenUsage;
1301
+ totalCost?: CostSummary;
1302
+ usageBudget?: UsageBudgetState;
1194
1303
  sessionFile?: string;
1195
1304
  controlEventCursor?: number;
1196
1305
  nestedRoute?: NestedRouteInfo;
@@ -1202,6 +1311,8 @@ export interface ForegroundResumeChild {
1202
1311
  index: number;
1203
1312
  context?: "fresh" | "fork";
1204
1313
  sessionFile?: string;
1314
+ model?: string;
1315
+ thinking?: string;
1205
1316
  status: SubagentResultStatus;
1206
1317
  activityState?: ActivityState;
1207
1318
  lastActivityAt?: number;
@@ -1214,6 +1325,7 @@ export interface ForegroundResumeChild {
1214
1325
  exitCode?: number;
1215
1326
  error?: string;
1216
1327
  finalOutput?: string;
1328
+ outputState?: SubagentOutputState;
1217
1329
  outputMode?: OutputMode;
1218
1330
  savedOutputPath?: string;
1219
1331
  outputSaveError?: string;
@@ -1223,6 +1335,9 @@ export interface ForegroundResumeChild {
1223
1335
  detachedReason?: string;
1224
1336
  acceptance?: AcceptanceLedger;
1225
1337
  agentContract?: AgentContract;
1338
+ launchContractDigest?: string;
1339
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1340
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
1226
1341
  execution?: ExecutionProjection;
1227
1342
  review?: ReviewProjection;
1228
1343
  effects?: EffectsProjection;
@@ -1238,6 +1353,7 @@ export interface ForegroundResumeRun {
1238
1353
  /** Originating parent session. Detached exits can outlive the active session. */
1239
1354
  sessionId?: string;
1240
1355
  updatedAt: number;
1356
+ checkpoint?: ChainCheckpointState;
1241
1357
  children: ForegroundResumeChild[];
1242
1358
  }
1243
1359
 
@@ -1254,12 +1370,19 @@ export interface ForegroundChildControl {
1254
1370
  currentPath?: string;
1255
1371
  turnCount?: number;
1256
1372
  tokens?: number;
1373
+ inputTokens?: number;
1374
+ outputTokens?: number;
1375
+ model?: string;
1376
+ thinking?: string;
1257
1377
  toolCount?: number;
1258
1378
  interrupt?: () => boolean;
1379
+ detach?: () => boolean;
1259
1380
  }
1260
1381
 
1261
1382
  export interface ForegroundRunControl {
1262
1383
  runId: string;
1384
+ /** Originating parent session; required for public fleet projection. */
1385
+ sessionId?: string;
1263
1386
  mode: SubagentRunMode;
1264
1387
  startedAt: number;
1265
1388
  updatedAt: number;
@@ -1276,12 +1399,19 @@ export interface ForegroundRunControl {
1276
1399
  currentPath?: string;
1277
1400
  turnCount?: number;
1278
1401
  tokens?: number;
1402
+ inputTokens?: number;
1403
+ outputTokens?: number;
1404
+ model?: string;
1405
+ thinking?: string;
1279
1406
  toolCount?: number;
1280
1407
  /** Independently tracked children for foreground parallel work and fleet inspection. */
1281
1408
  activeChildren?: Map<number, ForegroundChildControl>;
1409
+ /** Scheduling owners that may still launch another child. Removal is safe only at zero. */
1410
+ schedulingOwners?: number;
1282
1411
  nestedRoute?: NestedRouteInfo;
1283
1412
  nestedChildren?: NestedRunSummary[];
1284
1413
  interrupt?: () => boolean;
1414
+ detach?: () => boolean;
1285
1415
  }
1286
1416
 
1287
1417
  export interface SubagentState {
@@ -1290,6 +1420,8 @@ export interface SubagentState {
1290
1420
  /** Runtime-owned artifact resolution inputs used by Fleet transcript targeting. */
1291
1421
  artifactDirPreference?: ArtifactDirPreference;
1292
1422
  parentSessionFile?: string | null;
1423
+ /** Last valid parent session model observed for this session; used when continuation contexts omit ctx.model. */
1424
+ lastParentModel?: { provider: string; id: string };
1293
1425
  subagentInProgress?: boolean;
1294
1426
  subagentSpawns?: {
1295
1427
  sessionId: string | null;
@@ -1370,6 +1502,7 @@ export interface RunSyncOptions {
1370
1502
  timeoutMs?: number;
1371
1503
  deadlineAt?: number;
1372
1504
  turnBudget?: ResolvedTurnBudget;
1505
+ usageBudget?: UsageBudgetConfig;
1373
1506
  /** Enforce maxTurns + graceTurns as a hard model-turn boundary. */
1374
1507
  enforceHardTurnLimit?: boolean;
1375
1508
  toolBudget?: ResolvedToolBudget;
@@ -1378,6 +1511,11 @@ export interface RunSyncOptions {
1378
1511
  intercomEvents?: IntercomEventBus;
1379
1512
  onUpdate?: (r: import("@earendil-works/pi-agent-core").AgentToolResult<Details>) => void;
1380
1513
  onControlEvent?: (event: ControlEvent) => void;
1514
+ /** Exposes a non-terminating detach callback while the child is active. */
1515
+ onDetachReady?: (detach: (reason?: string) => boolean) => void;
1516
+ /** Internal foreground receipt proposal; returns true only when the outer waiter accepted it. */
1517
+ onDetachReceipt?: (result: SingleResult) => boolean;
1518
+ /** Authoritative terminal result, emitted only after the full detached run finalizes. */
1381
1519
  onDetachedExit?: (result: SingleResult) => void;
1382
1520
  controlConfig?: ResolvedControlConfig;
1383
1521
  intercomSessionName?: string;
@@ -1429,6 +1567,8 @@ export type IntercomBridgeMode = "off" | "fork-only" | "always";
1429
1567
  export interface IntercomBridgeConfig {
1430
1568
  mode?: IntercomBridgeMode;
1431
1569
  instructionFile?: string;
1570
+ /** Deliver grouped completion messages through an external acknowledged intercom listener. */
1571
+ resultDelivery?: boolean;
1432
1572
  }
1433
1573
 
1434
1574
  interface TopLevelParallelConfig {
@@ -1457,10 +1597,14 @@ export interface ScheduledRunsConfig {
1457
1597
  maxPending?: number;
1458
1598
  }
1459
1599
 
1600
+ export type FleetViewPlacement = "aboveEditor" | "belowEditor";
1601
+
1460
1602
  export interface ExtensionConfig {
1461
1603
  asyncByDefault?: boolean;
1462
- /** Show the Claude Code-style navigable fleet below the editor. Defaults to true. */
1604
+ /** Show the Claude Code-style navigable fleet. Defaults to true. */
1463
1605
  fleetView?: boolean;
1606
+ /** Place the persistent FleetView above or below the editor. Defaults to belowEditor. */
1607
+ fleetViewPlacement?: FleetViewPlacement;
1464
1608
  /** Show the legacy above-editor async runs widget. Defaults to true only when fleetView is disabled. */
1465
1609
  asyncWidget?: boolean;
1466
1610
  /** Tool description variant registered for the parent-facing subagent tool. Defaults to full. */
@@ -1478,6 +1622,7 @@ export interface ExtensionConfig {
1478
1622
  completionBatch?: CompletionBatchConfig;
1479
1623
  turnBudget?: TurnBudgetConfig;
1480
1624
  toolBudget?: ToolBudgetConfig;
1625
+ usageBudget?: UsageBudgetConfig;
1481
1626
  parallel?: TopLevelParallelConfig;
1482
1627
  chain?: ExtensionChainConfig;
1483
1628
  worktreeSetupHook?: string;
@@ -1581,7 +1726,7 @@ export const SLASH_SUBAGENT_CANCEL_EVENT = "subagent:slash:cancel";
1581
1726
  export const POLL_INTERVAL_MS = 250;
1582
1727
  export const MAX_WIDGET_JOBS = 4;
1583
1728
  export const DEFAULT_SUBAGENT_MAX_DEPTH = 2;
1584
- export const SUBAGENT_ACTIONS = ["list", "get", "models", "create", "update", "delete", "eject", "disable", "enable", "reset", "status", "grant-spawn-budget", "interrupt", "resume", "steer", "stop", "append-step", "doctor", "watchdog.status", "watchdog.check", "watchdog.configure", "watchdog.recommend-model", "schedule", "schedule-list", "schedule-status", "schedule-cancel"] as const;
1729
+ export const SUBAGENT_ACTIONS = ["list", "get", "models", "create", "update", "delete", "eject", "disable", "enable", "reset", "status", "grant-spawn-budget", "interrupt", "resume", "steer", "stop", "append-step", "approve-checkpoint", "reject-checkpoint", "doctor", "watchdog.status", "watchdog.check", "watchdog.configure", "watchdog.recommend-model", "schedule", "schedule-list", "schedule-status", "schedule-cancel"] as const;
1585
1730
 
1586
1731
  export const DEFAULT_FORK_PREAMBLE =
1587
1732
  "You are a delegated subagent running from a fork of the parent session. " +
@@ -77,8 +77,19 @@ export function resolveConfigDirName(codingAgentModule?: unknown, entryPoint?: s
77
77
  ?? DEFAULT_CONFIG_DIR_NAME;
78
78
  }
79
79
 
80
+ let cachedConfigDirName: { entryPoint: string | undefined; packageRoot: string | undefined; value: string } | undefined;
81
+
80
82
  export function getConfigDirName(): string {
81
- return resolveConfigDirName();
83
+ const entryPoint = process.argv[1];
84
+ const packageRoot = process.env[SELESAI_CODING_AGENT_PACKAGE_ROOT_ENV];
85
+ if (cachedConfigDirName
86
+ && cachedConfigDirName.entryPoint === entryPoint
87
+ && cachedConfigDirName.packageRoot === packageRoot) {
88
+ return cachedConfigDirName.value;
89
+ }
90
+ const value = resolveConfigDirName(undefined, entryPoint, packageRoot);
91
+ cachedConfigDirName = { entryPoint, packageRoot, value };
92
+ return value;
82
93
  }
83
94
 
84
95
  export function getProjectConfigDir(projectRoot: string): string {
@@ -416,6 +427,49 @@ export function compactForegroundDetails(details: Details): Details {
416
427
  };
417
428
  }
418
429
 
430
+ /**
431
+ * Streaming counterparts to compactForegroundResult / compactCompletedProgress.
432
+ *
433
+ * The completed-compaction helpers above bail out while a child is still
434
+ * `running`, so a long or deeply nested fan-out streams full, unbounded progress on
435
+ * every tick. Pi serializes each streamed `tool_execution_update` as a single
436
+ * child-stdout line, which the parent reads under `MAX_CHILD_PENDING_LINE_BYTES`;
437
+ * an unbounded running snapshot can cross that cap and kill the child with
438
+ * `protocol_output_limit`.
439
+ *
440
+ * These bound the STREAMED snapshot only. The final returned result keeps the full
441
+ * live progress and message transcript, and every live-display consumer already
442
+ * reads just the last few entries (`recentTools.slice(-3)`, `recentOutput.slice(-5)`).
443
+ */
444
+ export const MAX_STREAMED_RECENT_TOOLS = 32;
445
+ export const MAX_STREAMED_TOOL_CALLS = 64;
446
+ export const MAX_STREAMED_OUTPUT_LINE_CHARS = 2000;
447
+
448
+ /** Keep only the most recent tool-history entries in a streamed snapshot. */
449
+ export function boundStreamedRecentTools(recentTools: AgentProgress["recentTools"]): AgentProgress["recentTools"] {
450
+ return recentTools.slice(-MAX_STREAMED_RECENT_TOOLS).map((tool) => ({ ...tool }));
451
+ }
452
+
453
+ /** Cap per-line length of recent output so one long line can't inflate a snapshot. */
454
+ export function boundStreamedRecentOutput(recentOutput: string[]): string[] {
455
+ return recentOutput.map((line) =>
456
+ line.length > MAX_STREAMED_OUTPUT_LINE_CHARS
457
+ ? `${line.slice(0, MAX_STREAMED_OUTPUT_LINE_CHARS)}… [truncated]`
458
+ : line,
459
+ );
460
+ }
461
+
462
+ /**
463
+ * Compact tool-call summaries for a streamed snapshot, standing in for the
464
+ * unbounded `messages` transcript. Prefers an existing `toolCalls` summary, else
465
+ * derives one from `messages`; bounded to the most recent calls.
466
+ */
467
+ export function boundStreamedToolCalls(result: Pick<SingleResult, "toolCalls" | "messages">): ToolCallSummary[] | undefined {
468
+ const summaries = result.toolCalls?.length ? result.toolCalls : extractToolCallSummaries(result.messages);
469
+ if (!summaries.length) return undefined;
470
+ return summaries.slice(-MAX_STREAMED_TOOL_CALLS).map((summary) => ({ ...summary }));
471
+ }
472
+
419
473
  export function hasEmptyTerminalAssistantResponse(messages: Message[]): boolean {
420
474
  const lastAssistant = messages.findLast((message) => message.role === "assistant");
421
475
  return lastAssistant?.role === "assistant"
@@ -428,7 +482,7 @@ export function hasEmptyTerminalAssistantResponse(messages: Message[]): boolean
428
482
  * Detect errors in subagent execution from messages (only errors with no subsequent success)
429
483
  */
430
484
  export function detectSubagentError(messages: Message[]): ErrorInfo {
431
- let lastAssistantTextIndex = -1;
485
+ let recoveryIndex = -1;
432
486
  for (let i = messages.length - 1; i >= 0; i--) {
433
487
  const msg = messages[i];
434
488
  if (msg.role === "assistant") {
@@ -436,13 +490,28 @@ export function detectSubagentError(messages: Message[]): ErrorInfo {
436
490
  (c) => c.type === "text" && "text" in c && typeof c.text === "string" && c.text.trim().length > 0,
437
491
  );
438
492
  if (hasText) {
439
- lastAssistantTextIndex = i;
493
+ recoveryIndex = i;
440
494
  break;
441
495
  }
442
496
  }
443
497
  }
444
498
 
445
- const scanStart = lastAssistantTextIndex >= 0 ? lastAssistantTextIndex + 1 : 0;
499
+ const terminalAssistantIndex = messages.findLastIndex((message) => message.role === "assistant");
500
+ const terminalAssistant = messages[terminalAssistantIndex];
501
+ const cleanTerminalStop = terminalAssistant?.role === "assistant"
502
+ && terminalAssistant.stopReason === "stop"
503
+ && !terminalAssistant.errorMessage
504
+ && !terminalAssistant.content.some((part) => part.type === "toolCall");
505
+ if (cleanTerminalStop) {
506
+ for (let i = terminalAssistantIndex - 1; i >= 0; i--) {
507
+ const msg = messages[i];
508
+ if (msg.role !== "toolResult") continue;
509
+ if (msg.isError !== true) recoveryIndex = Math.max(recoveryIndex, i);
510
+ break;
511
+ }
512
+ }
513
+
514
+ const scanStart = recoveryIndex >= 0 ? recoveryIndex + 1 : 0;
446
515
 
447
516
  for (let i = messages.length - 1; i >= scanStart; i--) {
448
517
  const msg = messages[i];
@@ -69,6 +69,7 @@ interface PromptTemplateDelegationTaskProgress {
69
69
 
70
70
  export interface PromptTemplateDelegationUpdate {
71
71
  requestId: string;
72
+ runId?: string;
72
73
  currentTool?: string;
73
74
  currentToolArgs?: string;
74
75
  recentOutput?: string;
@@ -323,6 +324,7 @@ export function toDelegationUpdate(requestId: string, update: PromptTemplateBrid
323
324
  : undefined;
324
325
  return {
325
326
  requestId,
327
+ ...(update.details?.runId ? { runId: update.details.runId } : {}),
326
328
  currentTool: progress?.currentTool,
327
329
  currentToolArgs: progress?.currentToolArgs,
328
330
  recentOutput: safeLastOutput,
@@ -414,6 +416,7 @@ export function toSubagentDelegationUpdate(requestId: string, result: PromptTemp
414
416
  return {
415
417
  version: SUBAGENT_DELEGATION_PROTOCOL_VERSION,
416
418
  requestId,
419
+ ...(legacy.runId ? { runId: legacy.runId } : {}),
417
420
  ...(legacy.currentTool ? { currentTool: legacy.currentTool } : {}),
418
421
  ...(legacy.currentToolArgs ? { currentToolArgs: legacy.currentToolArgs } : {}),
419
422
  ...(legacy.recentOutput ? { recentOutput: legacy.recentOutput } : {}),
@@ -437,6 +440,7 @@ export function toSubagentDelegationV2Update(
437
440
  requestId: request.requestId,
438
441
  ownerRunId: request.ownerRunId,
439
442
  nodeId: request.nodeId,
443
+ ...(legacy.runId ? { runId: legacy.runId } : {}),
440
444
  ...(legacy.currentTool ? { currentTool: legacy.currentTool } : {}),
441
445
  ...(legacy.currentToolArgs ? { currentToolArgs: legacy.currentToolArgs } : {}),
442
446
  ...(legacy.recentOutput ? { recentOutput: legacy.recentOutput } : {}),
@@ -553,6 +557,7 @@ export function toSubagentDelegationV2Response(
553
557
  ...(child?.model ? { model: child.model } : {}),
554
558
  ...(child?.thinking ? { thinking: child.thinking } : {}),
555
559
  ...(typeof child?.exitCode === "number" ? { exitCode: child.exitCode } : {}),
560
+ ...(child?.launchContractDigest ? { launchContractDigest: child.launchContractDigest } : {}),
556
561
  ...(projectedResult ? { result: projectedResult } : {}),
557
562
  ...(usage ? {
558
563
  usage: {