@selesai/code 0.5.28 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +1 -1
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +9 -1
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/cli/config-selector.d.ts.map +1 -1
  7. package/dist/cli/config-selector.js +1 -1
  8. package/dist/cli/config-selector.js.map +1 -1
  9. package/dist/cli/credential-print.d.ts +23 -0
  10. package/dist/cli/credential-print.d.ts.map +1 -0
  11. package/dist/cli/credential-print.js +117 -0
  12. package/dist/cli/credential-print.js.map +1 -0
  13. package/dist/cli/startup-ui.d.ts.map +1 -1
  14. package/dist/cli/startup-ui.js +1 -1
  15. package/dist/cli/startup-ui.js.map +1 -1
  16. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  17. package/dist/core/agent-session-runtime.js +3 -0
  18. package/dist/core/agent-session-runtime.js.map +1 -1
  19. package/dist/core/agent-session.d.ts +12 -1
  20. package/dist/core/agent-session.d.ts.map +1 -1
  21. package/dist/core/agent-session.js +20 -14
  22. package/dist/core/agent-session.js.map +1 -1
  23. package/dist/core/compaction/compaction.d.ts.map +1 -1
  24. package/dist/core/compaction/compaction.js +11 -3
  25. package/dist/core/compaction/compaction.js.map +1 -1
  26. package/dist/core/extensions/runner.d.ts +1 -0
  27. package/dist/core/extensions/runner.d.ts.map +1 -1
  28. package/dist/core/extensions/runner.js +11 -0
  29. package/dist/core/extensions/runner.js.map +1 -1
  30. package/dist/core/extensions/types.d.ts +14 -1
  31. package/dist/core/extensions/types.d.ts.map +1 -1
  32. package/dist/core/extensions/types.js.map +1 -1
  33. package/dist/core/footer-data-provider.d.ts +10 -0
  34. package/dist/core/footer-data-provider.d.ts.map +1 -1
  35. package/dist/core/footer-data-provider.js +1 -1
  36. package/dist/core/footer-data-provider.js.map +1 -1
  37. package/dist/core/llama/provider.d.ts.map +1 -1
  38. package/dist/core/llama/provider.js +8 -3
  39. package/dist/core/llama/provider.js.map +1 -1
  40. package/dist/core/model-config.d.ts +30 -0
  41. package/dist/core/model-config.d.ts.map +1 -1
  42. package/dist/core/model-config.js +6 -0
  43. package/dist/core/model-config.js.map +1 -1
  44. package/dist/core/model-registry.d.ts.map +1 -1
  45. package/dist/core/model-registry.js +2 -2
  46. package/dist/core/model-registry.js.map +1 -1
  47. package/dist/core/model-resolver.d.ts +1 -0
  48. package/dist/core/model-resolver.d.ts.map +1 -1
  49. package/dist/core/model-resolver.js +20 -3
  50. package/dist/core/model-resolver.js.map +1 -1
  51. package/dist/core/model-runtime.d.ts +2 -0
  52. package/dist/core/model-runtime.d.ts.map +1 -1
  53. package/dist/core/model-runtime.js +5 -4
  54. package/dist/core/model-runtime.js.map +1 -1
  55. package/dist/core/package-manager.d.ts.map +1 -1
  56. package/dist/core/package-manager.js +13 -6
  57. package/dist/core/package-manager.js.map +1 -1
  58. package/dist/core/remote-catalog-provider.d.ts +1 -1
  59. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  60. package/dist/core/remote-catalog-provider.js +24 -11
  61. package/dist/core/remote-catalog-provider.js.map +1 -1
  62. package/dist/core/resource-loader.d.ts +15 -0
  63. package/dist/core/resource-loader.d.ts.map +1 -1
  64. package/dist/core/resource-loader.js +66 -9
  65. package/dist/core/resource-loader.js.map +1 -1
  66. package/dist/core/settings-manager.d.ts +1 -1
  67. package/dist/core/settings-manager.d.ts.map +1 -1
  68. package/dist/core/settings-manager.js.map +1 -1
  69. package/dist/core/system-prompt.d.ts.map +1 -1
  70. package/dist/core/system-prompt.js +19 -1
  71. package/dist/core/system-prompt.js.map +1 -1
  72. package/dist/core/system-prompt.test.d.ts +2 -0
  73. package/dist/core/system-prompt.test.d.ts.map +1 -0
  74. package/dist/core/system-prompt.test.js +89 -0
  75. package/dist/core/system-prompt.test.js.map +1 -0
  76. package/dist/core/tools/bash.d.ts +2 -0
  77. package/dist/core/tools/bash.d.ts.map +1 -1
  78. package/dist/core/tools/bash.js +34 -5
  79. package/dist/core/tools/bash.js.map +1 -1
  80. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  81. package/dist/core/tools/tool-definition-wrapper.js +3 -1
  82. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  83. package/dist/defaults/models.json +13 -45
  84. package/dist/defaults/settings.json +1 -2
  85. package/dist/extensions/copy-turn.test.ts +131 -0
  86. package/dist/extensions/copy-turn.ts +6 -1
  87. package/dist/extensions/package.json +0 -1
  88. package/dist/extensions/pi-intercom/CHANGELOG.md +249 -0
  89. package/dist/extensions/pi-intercom/README.md +102 -39
  90. package/dist/extensions/pi-intercom/broker/broker.ts +1233 -36
  91. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -0
  92. package/dist/extensions/pi-intercom/broker/client.ts +315 -12
  93. package/dist/extensions/pi-intercom/broker/extension-state.ts +186 -0
  94. package/dist/extensions/pi-intercom/broker/extension.test.ts +387 -0
  95. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -0
  96. package/dist/extensions/pi-intercom/broker/framing.ts +82 -24
  97. package/dist/extensions/pi-intercom/broker/paths.test.ts +153 -0
  98. package/dist/extensions/pi-intercom/broker/paths.ts +117 -8
  99. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -0
  100. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -0
  101. package/dist/extensions/pi-intercom/broker/spawn.test.ts +160 -23
  102. package/dist/extensions/pi-intercom/broker/spawn.ts +113 -27
  103. package/dist/extensions/pi-intercom/config.test.ts +93 -0
  104. package/dist/extensions/pi-intercom/config.ts +55 -6
  105. package/dist/extensions/pi-intercom/cwd.test.ts +40 -0
  106. package/dist/extensions/pi-intercom/cwd.ts +31 -0
  107. package/dist/extensions/pi-intercom/extension-api.ts +44 -0
  108. package/dist/extensions/pi-intercom/format-context.test.ts +31 -0
  109. package/dist/extensions/pi-intercom/format-context.ts +32 -0
  110. package/dist/extensions/pi-intercom/index.ts +742 -145
  111. package/dist/extensions/pi-intercom/intercom.integration.test.ts +2646 -0
  112. package/dist/extensions/pi-intercom/package.json +15 -5
  113. package/dist/extensions/pi-intercom/reply-tracker.test.ts +134 -0
  114. package/dist/extensions/pi-intercom/reply-tracker.ts +31 -13
  115. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +13 -11
  116. package/dist/extensions/pi-intercom/test/inline-message.test.ts +184 -0
  117. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -0
  118. package/dist/extensions/pi-intercom/types.ts +94 -4
  119. package/dist/extensions/pi-intercom/ui/compose.ts +8 -4
  120. package/dist/extensions/pi-intercom/ui/inline-message.ts +61 -25
  121. package/dist/extensions/pi-intercom/ui/session-list.ts +7 -3
  122. package/dist/extensions/pi-subagents/CHANGELOG.md +88 -0
  123. package/dist/extensions/pi-subagents/LICENSE +21 -0
  124. package/dist/extensions/pi-subagents/README.md +158 -69
  125. package/dist/extensions/pi-subagents/agents/architect.md +5 -4
  126. package/dist/extensions/pi-subagents/agents/builder.md +6 -4
  127. package/dist/extensions/pi-subagents/agents/commentator.md +3 -2
  128. package/dist/extensions/pi-subagents/agents/explorer.md +3 -2
  129. package/dist/extensions/pi-subagents/agents/recapper.md +3 -2
  130. package/dist/extensions/pi-subagents/agents/researcher.md +4 -3
  131. package/dist/extensions/pi-subagents/package-lock.json +2 -2
  132. package/dist/extensions/pi-subagents/package.json +3 -3
  133. package/dist/extensions/pi-subagents/prompts/review-loop.md +1 -1
  134. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +22 -988
  135. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +257 -0
  136. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +431 -0
  137. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +144 -0
  138. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +281 -0
  139. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +125 -37
  140. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +4 -0
  141. package/dist/extensions/pi-subagents/src/agents/agents.ts +118 -9
  142. package/dist/extensions/pi-subagents/src/agents/skills.ts +14 -12
  143. package/dist/extensions/pi-subagents/src/agents/task-aware-routing.ts +125 -0
  144. package/dist/extensions/pi-subagents/src/api/delegation.ts +3 -0
  145. package/dist/extensions/pi-subagents/src/api/preflight.ts +17 -13
  146. package/dist/extensions/pi-subagents/src/extension/chain-validation.ts +17 -1
  147. package/dist/extensions/pi-subagents/src/extension/index.ts +22 -8
  148. package/dist/extensions/pi-subagents/src/extension/rpc.ts +248 -6
  149. package/dist/extensions/pi-subagents/src/extension/schemas.ts +33 -8
  150. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +32 -14
  151. package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +9 -4
  152. package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +33 -4
  153. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +86 -21
  154. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +24 -13
  155. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +7 -5
  156. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -2
  157. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +48 -5
  158. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +68 -1
  159. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +56 -5
  160. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +92 -11
  161. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +29 -3
  162. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +388 -29
  163. package/dist/extensions/pi-subagents/src/runs/foreground/async-stop-action.ts +65 -0
  164. package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +3 -3
  165. package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +214 -60
  166. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +546 -252
  167. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +42 -0
  168. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +553 -154
  169. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +19 -13
  170. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +51 -19
  171. package/dist/extensions/pi-subagents/src/runs/shared/chain-outputs.ts +3 -1
  172. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
  173. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +44 -11
  174. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +8 -0
  175. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +97 -20
  176. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +43 -12
  177. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +52 -4
  178. package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +19 -0
  179. package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +45 -9
  180. package/dist/extensions/pi-subagents/src/runs/shared/runtime-acknowledged-extensions.ts +71 -0
  181. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +63 -9
  182. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +31 -1
  183. package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +101 -0
  184. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +22 -1
  185. package/dist/extensions/pi-subagents/src/runs/shared/usage-budget.ts +65 -0
  186. package/dist/extensions/pi-subagents/src/runs/shared/workflow-graph.ts +26 -1
  187. package/dist/extensions/pi-subagents/src/shared/settings.ts +17 -1
  188. package/dist/extensions/pi-subagents/src/shared/types.ts +196 -12
  189. package/dist/extensions/pi-subagents/src/shared/utils.ts +102 -5
  190. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +10 -1
  191. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +46 -4
  192. package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +5 -3
  193. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +87 -24
  194. package/dist/extensions/pi-subagents/src/tui/fleet.ts +182 -9
  195. package/dist/extensions/pi-subagents/src/tui/render.ts +55 -34
  196. package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +14 -7
  197. package/dist/extensions/pi-subagents/src/watchdog/review.ts +5 -4
  198. package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +170 -17
  199. package/dist/extensions/pi-subagents/src/watchdog/scope.ts +62 -0
  200. package/dist/extensions/pi-subagents/src/watchdog/settings.ts +41 -1
  201. package/dist/extensions/pi-subagents/src/watchdog/types.ts +10 -0
  202. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +113 -8
  203. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +419 -47
  204. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +84 -0
  205. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +4 -2
  206. package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +51 -2
  207. package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +62 -22
  208. package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +48 -0
  209. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +8 -6
  210. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +231 -19
  211. package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +48 -7
  212. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +44 -0
  213. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +199 -17
  214. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +898 -16
  215. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +112 -23
  216. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +17 -5
  217. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +2 -0
  218. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +18 -2
  219. package/dist/extensions/pi-subagents/test/support/register-loader.mjs +3 -3
  220. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +3 -1
  221. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +1 -1
  222. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +198 -6
  223. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +161 -1
  224. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +47 -2
  225. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +60 -0
  226. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +8 -0
  227. package/dist/extensions/pi-subagents/test/unit/builtin-agent-documentation.test.ts +63 -0
  228. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +136 -0
  229. package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +1 -1
  230. package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +6 -0
  231. package/dist/extensions/pi-subagents/test/unit/chain-validation.test.ts +1 -1
  232. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +48 -48
  233. package/dist/extensions/pi-subagents/test/unit/config-dir-runtime.test.ts +23 -0
  234. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +27 -0
  235. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +28 -2
  236. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +1 -0
  237. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +176 -8
  238. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +164 -5
  239. package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +41 -1
  240. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +17 -12
  241. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +18 -2
  242. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +20 -1
  243. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +30 -2
  244. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +39 -2
  245. package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +22 -0
  246. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +103 -0
  247. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +18 -0
  248. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +48 -0
  249. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +13 -1
  250. package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +29 -4
  251. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +223 -4
  252. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +30 -0
  253. package/dist/extensions/pi-subagents/test/unit/runtime-acknowledged-extensions.test.ts +52 -0
  254. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +46 -2
  255. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +91 -1
  256. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +1 -1
  257. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +1 -1
  258. package/dist/extensions/pi-subagents/test/unit/streamed-progress-bounds.test.ts +78 -0
  259. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +41 -0
  260. package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +77 -0
  261. package/dist/extensions/pi-subagents/test/unit/task-aware-routing.test.ts +213 -0
  262. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +26 -1
  263. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +61 -10
  264. package/dist/extensions/pi-subagents/test/unit/total-cost.test.ts +1 -0
  265. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +210 -1
  266. package/dist/extensions/pi-subagents/test/unit/watchdog-scope.test.ts +33 -0
  267. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +32 -0
  268. package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +1 -1
  269. package/dist/main.d.ts.map +1 -1
  270. package/dist/main.js +43 -0
  271. package/dist/main.js.map +1 -1
  272. package/dist/modes/interactive/components/custom-message.d.ts +3 -1
  273. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  274. package/dist/modes/interactive/components/custom-message.js +10 -2
  275. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  276. package/dist/modes/interactive/components/extension-editor.d.ts +1 -2
  277. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  278. package/dist/modes/interactive/components/extension-editor.js +16 -46
  279. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  280. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  281. package/dist/modes/interactive/components/model-selector.js +4 -1
  282. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  283. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  284. package/dist/modes/interactive/components/scoped-models-selector.js +22 -13
  285. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  286. package/dist/modes/interactive/external-editor.d.ts +12 -0
  287. package/dist/modes/interactive/external-editor.d.ts.map +1 -0
  288. package/dist/modes/interactive/external-editor.js +37 -0
  289. package/dist/modes/interactive/external-editor.js.map +1 -0
  290. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  291. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  292. package/dist/modes/interactive/interactive-mode.js +72 -64
  293. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  294. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  295. package/dist/modes/rpc/rpc-mode.js +14 -0
  296. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  297. package/dist/skills/ponytail/SKILL.md +1 -3
  298. package/dist/utils/clipboard.d.ts.map +1 -1
  299. package/dist/utils/clipboard.js +19 -8
  300. package/dist/utils/clipboard.js.map +1 -1
  301. package/dist/utils/version-check.d.ts.map +1 -1
  302. package/dist/utils/version-check.js +1 -1
  303. package/dist/utils/version-check.js.map +1 -1
  304. package/docs/compaction.md +1 -1
  305. package/docs/custom-provider.md +14 -5
  306. package/docs/environment-variables.md +86 -0
  307. package/docs/extensions.md +15 -5
  308. package/docs/index.md +1 -0
  309. package/docs/models.md +9 -2
  310. package/docs/plans/subagent-delegation/phase-0-correctness.md +265 -0
  311. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +486 -0
  312. package/docs/plans/subagent-delegation/phase-2-context-controls.md +282 -0
  313. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +362 -0
  314. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +381 -0
  315. package/docs/providers.md +21 -2
  316. package/docs/rpc.md +23 -6
  317. package/docs/session-format.md +2 -0
  318. package/docs/settings.md +1 -1
  319. package/docs/usage.md +0 -13
  320. package/examples/extensions/custom-compaction.ts +5 -2
  321. package/examples/extensions/custom-provider-anthropic/index.ts +9 -3
  322. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  323. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  324. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  325. package/examples/extensions/gondolin/package-lock.json +2 -2
  326. package/examples/extensions/gondolin/package.json +1 -1
  327. package/examples/extensions/handoff.ts +11 -3
  328. package/examples/extensions/message-renderer.ts +3 -3
  329. package/examples/extensions/sandbox/package-lock.json +2 -2
  330. package/examples/extensions/sandbox/package.json +1 -1
  331. package/examples/extensions/summarize.ts +5 -2
  332. package/examples/extensions/with-deps/package-lock.json +2 -2
  333. package/examples/extensions/with-deps/package.json +1 -1
  334. package/examples/sdk/12-full-control.ts +3 -1
  335. package/package.json +16 -7
  336. package/dist/extensions/caveman/caveman-instructions.cjs +0 -11
  337. package/dist/extensions/caveman/index.js +0 -118
  338. package/dist/extensions/caveman/package.json +0 -8
  339. package/dist/extensions/caveman/test/extension.test.js +0 -203
  340. package/dist/extensions/caveman/test/helpers.test.js +0 -58
  341. package/dist/skills/caveman/SKILL.md +0 -50
@@ -5,7 +5,7 @@
5
5
  import * as os from "node:os";
6
6
  import * as path from "node:path";
7
7
  import type { Message } from "@earendil-works/pi-ai";
8
- import type { AgentConfig } from "../agents/agents.ts";
8
+ import type { AgentConfig, AgentSource } from "../agents/agents.ts";
9
9
  import type { FSWatcher } from "node:fs";
10
10
  import type { ExtensionContext } from "@selesai/code";
11
11
  import type { ModelScopeConfig } from "../runs/shared/model-scope.ts";
@@ -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;
@@ -831,12 +912,51 @@ export interface SpawnBudgetSnapshot {
831
912
  grantHistory: SpawnBudgetGrant[];
832
913
  }
833
914
 
915
+ // ============================================================================
916
+ // Runtime catalog (action:list machine metadata)
917
+ // ============================================================================
918
+
919
+ /** Machine-readable catalog entry for one visible runtime agent. */
920
+ export interface CatalogAgentMetadata {
921
+ name: string;
922
+ source: AgentSource;
923
+ description: string;
924
+ /** false for capability-ceiling-restricted agents (still visible, not launchable). */
925
+ executable: boolean;
926
+ /** Present only when the agent is capability-ceiling-restricted. */
927
+ restrictionSources?: string[];
928
+ aliases?: string[];
929
+ /** Normalized to explicit "fresh" when the agent has no defaultContext. */
930
+ defaultContext: "fresh" | "fork";
931
+ acceptanceRole?: AcceptanceRole;
932
+ /** Effective declared tools: normal tools plus mcp:-prefixed direct MCP tools. */
933
+ tools?: string[];
934
+ }
935
+
936
+ /** Machine-readable catalog entry for one visible chain. */
937
+ export interface CatalogChainMetadata {
938
+ name: string;
939
+ source: AgentSource;
940
+ description: string;
941
+ }
942
+
943
+ /** Versioned action:list catalog mirroring the human list output. */
944
+ export interface CatalogMetadataV1 {
945
+ version: 1;
946
+ agents: CatalogAgentMetadata[];
947
+ chains: CatalogChainMetadata[];
948
+ /** Present only when a capability ceiling restricted visible agents. */
949
+ capabilityCeilingSources?: string[];
950
+ }
951
+
834
952
  export interface Details {
835
953
  mode: SubagentRunMode | "management";
836
954
  runId?: string;
837
955
  /** Run-level context summary. "mixed" when children resolved to different modes. */
838
956
  context?: "fresh" | "fork" | "mixed";
839
957
  results: SingleResult[];
958
+ /** Runtime-resolved human+machine catalog for { action: "list" } results. */
959
+ catalog?: CatalogMetadataV1;
840
960
  controlEvents?: ControlEvent[];
841
961
  steering?: SteerActionResult;
842
962
  asyncId?: string;
@@ -847,6 +967,7 @@ export interface Details {
847
967
  stopped?: boolean;
848
968
  turnBudget?: ResolvedTurnBudget;
849
969
  toolBudget?: ResolvedToolBudget;
970
+ usageBudget?: UsageBudgetState;
850
971
  progress?: AgentProgress[];
851
972
  progressSummary?: ProgressSummary;
852
973
  artifacts?: {
@@ -860,10 +981,11 @@ export interface Details {
860
981
  artifactPath?: string;
861
982
  };
862
983
  // Chain metadata for observability
863
- chainAgents?: string[]; // Agent names in order, e.g., ["scout", "planner"]
984
+ chainAgents?: string[]; // Agent names in order, e.g., ["explorer", "architect"]
864
985
  totalSteps?: number; // Total steps in chain
865
986
  currentStepIndex?: number; // 0-indexed current step (for running chains)
866
987
  workflowGraph?: WorkflowGraphSnapshot;
988
+ checkpoint?: ChainCheckpointState;
867
989
  outputs?: ChainOutputMap;
868
990
  // Aggregated child usage across all agents in the run
869
991
  totalChildUsage?: Usage;
@@ -877,6 +999,10 @@ export interface Details {
877
999
  processTerminal?: ProcessTerminalV1;
878
1000
  };
879
1001
  launchContractDigest?: string;
1002
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1003
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
1004
+ /** Original launch contract whose persisted session is being revived. */
1005
+ sourceLaunchContractDigest?: string;
880
1006
  }
881
1007
 
882
1008
  // ============================================================================
@@ -914,7 +1040,7 @@ export interface AsyncParallelGroupStatus {
914
1040
  stepIndex: number;
915
1041
  }
916
1042
 
917
- export type NestedRunState = "queued" | "running" | "complete" | "failed" | "paused" | "stopped";
1043
+ export type NestedRunState = "queued" | "running" | "complete" | "failed" | "paused" | "stopped" | "rejected";
918
1044
  export type NestedOwnerState = "live" | "gone" | "unknown";
919
1045
 
920
1046
  export interface NestedRunAddress {
@@ -928,7 +1054,7 @@ export interface NestedRunAddress {
928
1054
 
929
1055
  export interface NestedStepSummary {
930
1056
  agent: string;
931
- status: "pending" | "running" | "complete" | "completed" | "failed" | "paused" | "stopped";
1057
+ status: "pending" | "running" | "complete" | "completed" | "failed" | "paused" | "stopped" | "rejected";
932
1058
  sessionFile?: string;
933
1059
  transcriptPath?: string;
934
1060
  transcriptError?: string;
@@ -951,6 +1077,8 @@ export interface NestedStepSummary {
951
1077
  toolBudget?: ToolBudgetState;
952
1078
  toolBudgetBlocked?: boolean;
953
1079
  processTerminal?: ProcessTerminalV1;
1080
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1081
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
954
1082
  capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
955
1083
  capabilityAudit?: SubagentCapabilityAudit;
956
1084
  children?: NestedRunSummary[];
@@ -969,6 +1097,8 @@ export interface NestedRunSummary extends NestedRunAddress {
969
1097
  capabilityToken?: string;
970
1098
  mode?: SubagentRunMode;
971
1099
  processTerminal?: ProcessTerminalV1;
1100
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1101
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
972
1102
  capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
973
1103
  capabilityAudit?: SubagentCapabilityAudit;
974
1104
  state: NestedRunState;
@@ -1029,7 +1159,11 @@ export interface AsyncStartedEvent {
1029
1159
  chainStepCount?: number;
1030
1160
  parallelGroups?: AsyncParallelGroupStatus[];
1031
1161
  workflowGraph?: WorkflowGraphSnapshot;
1162
+ checkpoint?: ChainCheckpointState;
1032
1163
  launchContractDigest?: string;
1164
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1165
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
1166
+ usageBudget?: UsageBudgetState;
1033
1167
  timeoutMs?: number;
1034
1168
  deadlineAt?: number;
1035
1169
  turnBudget?: TurnBudgetState;
@@ -1043,7 +1177,7 @@ export interface AsyncStatus {
1043
1177
  sessionId?: string;
1044
1178
  mode: SubagentRunMode;
1045
1179
  isNested?: boolean;
1046
- state: "queued" | "running" | "complete" | "failed" | "paused" | "stopped";
1180
+ state: "queued" | "running" | "complete" | "failed" | "paused" | "stopped" | "rejected";
1047
1181
  error?: string;
1048
1182
  activityState?: ActivityState;
1049
1183
  lastActivityAt?: number;
@@ -1065,6 +1199,7 @@ export interface AsyncStatus {
1065
1199
  wrapUpRequested?: boolean;
1066
1200
  toolBudget?: ToolBudgetState;
1067
1201
  toolBudgetBlocked?: boolean;
1202
+ usageBudget?: UsageBudgetState;
1068
1203
  pid?: number;
1069
1204
  cwd?: string;
1070
1205
  currentStep?: number;
@@ -1072,19 +1207,25 @@ export interface AsyncStatus {
1072
1207
  pendingAppends?: number;
1073
1208
  parallelGroups?: AsyncParallelGroupStatus[];
1074
1209
  workflowGraph?: WorkflowGraphSnapshot;
1210
+ checkpoint?: ChainCheckpointState;
1075
1211
  processTerminal?: ProcessTerminalV1;
1076
1212
  launchContractDigest?: string;
1213
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1214
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
1077
1215
  capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
1078
1216
  capabilityAudit?: SubagentCapabilityAudit;
1079
1217
  steps?: Array<{
1080
1218
  agent: string;
1081
1219
  /** Resolved launch context for this child step. */
1082
1220
  context?: "fresh" | "fork";
1221
+ /** Short caller-facing task/goal shown in fleet surfaces when available. */
1222
+ description?: string;
1083
1223
  phase?: string;
1084
1224
  label?: string;
1085
1225
  outputName?: string;
1086
1226
  structured?: boolean;
1087
- status: "pending" | "running" | "complete" | "completed" | "failed" | "paused" | "stopped";
1227
+ checkpoint?: ChainCheckpointState;
1228
+ status: "pending" | "running" | "complete" | "completed" | "failed" | "paused" | "stopped" | "rejected";
1088
1229
  children?: NestedRunSummary[];
1089
1230
  sessionFile?: string;
1090
1231
  transcriptPath?: string;
@@ -1125,6 +1266,8 @@ export interface AsyncStatus {
1125
1266
  acceptance?: AcceptanceLedger;
1126
1267
  agentContract?: AgentContract;
1127
1268
  launchContractDigest?: string;
1269
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1270
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
1128
1271
  execution?: ExecutionProjection;
1129
1272
  review?: ReviewProjection;
1130
1273
  effects?: EffectsProjection;
@@ -1136,6 +1279,7 @@ export interface AsyncStatus {
1136
1279
  sessionDir?: string;
1137
1280
  outputFile?: string;
1138
1281
  totalTokens?: TokenUsage;
1282
+ usageBudget?: UsageBudgetState;
1139
1283
  totalCost?: CostSummary;
1140
1284
  sessionFile?: string;
1141
1285
  outputs?: ChainOutputMap;
@@ -1144,6 +1288,7 @@ export interface AsyncStatus {
1144
1288
 
1145
1289
  export type AsyncJobStep = NonNullable<AsyncStatus["steps"]>[number] & {
1146
1290
  index?: number;
1291
+ description?: string;
1147
1292
  };
1148
1293
 
1149
1294
  export interface AsyncJobState {
@@ -1151,7 +1296,7 @@ export interface AsyncJobState {
1151
1296
  asyncDir: string;
1152
1297
  /** Parent-resolved launch directory retained for trusted live artifact lookup. */
1153
1298
  cwd?: string;
1154
- status: "queued" | "running" | "complete" | "failed" | "paused" | "stopped";
1299
+ status: "queued" | "running" | "complete" | "failed" | "paused" | "stopped" | "rejected";
1155
1300
  /** Short caller-facing task/goal shown in fleet surfaces when available. */
1156
1301
  description?: string;
1157
1302
  pid?: number;
@@ -1172,6 +1317,7 @@ export interface AsyncJobState {
1172
1317
  chainStepCount?: number;
1173
1318
  parallelGroups?: AsyncParallelGroupStatus[];
1174
1319
  steps?: AsyncJobStep[];
1320
+ checkpoint?: ChainCheckpointState;
1175
1321
  stepsTotal?: number;
1176
1322
  runningSteps?: number;
1177
1323
  completedSteps?: number;
@@ -1191,6 +1337,8 @@ export interface AsyncJobState {
1191
1337
  sessionDir?: string;
1192
1338
  outputFile?: string;
1193
1339
  totalTokens?: TokenUsage;
1340
+ totalCost?: CostSummary;
1341
+ usageBudget?: UsageBudgetState;
1194
1342
  sessionFile?: string;
1195
1343
  controlEventCursor?: number;
1196
1344
  nestedRoute?: NestedRouteInfo;
@@ -1202,6 +1350,8 @@ export interface ForegroundResumeChild {
1202
1350
  index: number;
1203
1351
  context?: "fresh" | "fork";
1204
1352
  sessionFile?: string;
1353
+ model?: string;
1354
+ thinking?: string;
1205
1355
  status: SubagentResultStatus;
1206
1356
  activityState?: ActivityState;
1207
1357
  lastActivityAt?: number;
@@ -1214,6 +1364,7 @@ export interface ForegroundResumeChild {
1214
1364
  exitCode?: number;
1215
1365
  error?: string;
1216
1366
  finalOutput?: string;
1367
+ outputState?: SubagentOutputState;
1217
1368
  outputMode?: OutputMode;
1218
1369
  savedOutputPath?: string;
1219
1370
  outputSaveError?: string;
@@ -1223,6 +1374,9 @@ export interface ForegroundResumeChild {
1223
1374
  detachedReason?: string;
1224
1375
  acceptance?: AcceptanceLedger;
1225
1376
  agentContract?: AgentContract;
1377
+ launchContractDigest?: string;
1378
+ launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
1379
+ runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
1226
1380
  execution?: ExecutionProjection;
1227
1381
  review?: ReviewProjection;
1228
1382
  effects?: EffectsProjection;
@@ -1238,6 +1392,7 @@ export interface ForegroundResumeRun {
1238
1392
  /** Originating parent session. Detached exits can outlive the active session. */
1239
1393
  sessionId?: string;
1240
1394
  updatedAt: number;
1395
+ checkpoint?: ChainCheckpointState;
1241
1396
  children: ForegroundResumeChild[];
1242
1397
  }
1243
1398
 
@@ -1254,12 +1409,19 @@ export interface ForegroundChildControl {
1254
1409
  currentPath?: string;
1255
1410
  turnCount?: number;
1256
1411
  tokens?: number;
1412
+ inputTokens?: number;
1413
+ outputTokens?: number;
1414
+ model?: string;
1415
+ thinking?: string;
1257
1416
  toolCount?: number;
1258
1417
  interrupt?: () => boolean;
1418
+ detach?: () => boolean;
1259
1419
  }
1260
1420
 
1261
1421
  export interface ForegroundRunControl {
1262
1422
  runId: string;
1423
+ /** Originating parent session; required for public fleet projection. */
1424
+ sessionId?: string;
1263
1425
  mode: SubagentRunMode;
1264
1426
  startedAt: number;
1265
1427
  updatedAt: number;
@@ -1276,12 +1438,19 @@ export interface ForegroundRunControl {
1276
1438
  currentPath?: string;
1277
1439
  turnCount?: number;
1278
1440
  tokens?: number;
1441
+ inputTokens?: number;
1442
+ outputTokens?: number;
1443
+ model?: string;
1444
+ thinking?: string;
1279
1445
  toolCount?: number;
1280
1446
  /** Independently tracked children for foreground parallel work and fleet inspection. */
1281
1447
  activeChildren?: Map<number, ForegroundChildControl>;
1448
+ /** Scheduling owners that may still launch another child. Removal is safe only at zero. */
1449
+ schedulingOwners?: number;
1282
1450
  nestedRoute?: NestedRouteInfo;
1283
1451
  nestedChildren?: NestedRunSummary[];
1284
1452
  interrupt?: () => boolean;
1453
+ detach?: () => boolean;
1285
1454
  }
1286
1455
 
1287
1456
  export interface SubagentState {
@@ -1290,6 +1459,8 @@ export interface SubagentState {
1290
1459
  /** Runtime-owned artifact resolution inputs used by Fleet transcript targeting. */
1291
1460
  artifactDirPreference?: ArtifactDirPreference;
1292
1461
  parentSessionFile?: string | null;
1462
+ /** Last valid parent session model observed for this session; used when continuation contexts omit ctx.model. */
1463
+ lastParentModel?: { provider: string; id: string };
1293
1464
  subagentInProgress?: boolean;
1294
1465
  subagentSpawns?: {
1295
1466
  sessionId: string | null;
@@ -1370,6 +1541,7 @@ export interface RunSyncOptions {
1370
1541
  timeoutMs?: number;
1371
1542
  deadlineAt?: number;
1372
1543
  turnBudget?: ResolvedTurnBudget;
1544
+ usageBudget?: UsageBudgetConfig;
1373
1545
  /** Enforce maxTurns + graceTurns as a hard model-turn boundary. */
1374
1546
  enforceHardTurnLimit?: boolean;
1375
1547
  toolBudget?: ResolvedToolBudget;
@@ -1378,6 +1550,11 @@ export interface RunSyncOptions {
1378
1550
  intercomEvents?: IntercomEventBus;
1379
1551
  onUpdate?: (r: import("@earendil-works/pi-agent-core").AgentToolResult<Details>) => void;
1380
1552
  onControlEvent?: (event: ControlEvent) => void;
1553
+ /** Exposes a non-terminating detach callback while the child is active. */
1554
+ onDetachReady?: (detach: (reason?: string) => boolean) => void;
1555
+ /** Internal foreground receipt proposal; returns true only when the outer waiter accepted it. */
1556
+ onDetachReceipt?: (result: SingleResult) => boolean;
1557
+ /** Authoritative terminal result, emitted only after the full detached run finalizes. */
1381
1558
  onDetachedExit?: (result: SingleResult) => void;
1382
1559
  controlConfig?: ResolvedControlConfig;
1383
1560
  intercomSessionName?: string;
@@ -1429,6 +1606,8 @@ export type IntercomBridgeMode = "off" | "fork-only" | "always";
1429
1606
  export interface IntercomBridgeConfig {
1430
1607
  mode?: IntercomBridgeMode;
1431
1608
  instructionFile?: string;
1609
+ /** Deliver grouped completion messages through an external acknowledged intercom listener. */
1610
+ resultDelivery?: boolean;
1432
1611
  }
1433
1612
 
1434
1613
  interface TopLevelParallelConfig {
@@ -1457,10 +1636,14 @@ export interface ScheduledRunsConfig {
1457
1636
  maxPending?: number;
1458
1637
  }
1459
1638
 
1639
+ export type FleetViewPlacement = "aboveEditor" | "belowEditor";
1640
+
1460
1641
  export interface ExtensionConfig {
1461
1642
  asyncByDefault?: boolean;
1462
- /** Show the Claude Code-style navigable fleet below the editor. Defaults to true. */
1643
+ /** Show the Claude Code-style navigable fleet. Defaults to true. */
1463
1644
  fleetView?: boolean;
1645
+ /** Place the persistent FleetView above or below the editor. Defaults to belowEditor. */
1646
+ fleetViewPlacement?: FleetViewPlacement;
1464
1647
  /** Show the legacy above-editor async runs widget. Defaults to true only when fleetView is disabled. */
1465
1648
  asyncWidget?: boolean;
1466
1649
  /** Tool description variant registered for the parent-facing subagent tool. Defaults to full. */
@@ -1478,6 +1661,7 @@ export interface ExtensionConfig {
1478
1661
  completionBatch?: CompletionBatchConfig;
1479
1662
  turnBudget?: TurnBudgetConfig;
1480
1663
  toolBudget?: ToolBudgetConfig;
1664
+ usageBudget?: UsageBudgetConfig;
1481
1665
  parallel?: TopLevelParallelConfig;
1482
1666
  chain?: ExtensionChainConfig;
1483
1667
  worktreeSetupHook?: string;
@@ -1500,7 +1684,7 @@ export const DEFAULT_MAX_OUTPUT: Required<MaxOutputConfig> = {
1500
1684
  };
1501
1685
 
1502
1686
  export const DEFAULT_ARTIFACT_CONFIG: ArtifactConfig = {
1503
- enabled: true,
1687
+ enabled: false,
1504
1688
  dir: "project",
1505
1689
  includeInput: true,
1506
1690
  includeOutput: true,
@@ -1581,7 +1765,7 @@ export const SLASH_SUBAGENT_CANCEL_EVENT = "subagent:slash:cancel";
1581
1765
  export const POLL_INTERVAL_MS = 250;
1582
1766
  export const MAX_WIDGET_JOBS = 4;
1583
1767
  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;
1768
+ 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
1769
 
1586
1770
  export const DEFAULT_FORK_PREAMBLE =
1587
1771
  "You are a delegated subagent running from a fork of the parent session. " +
@@ -7,7 +7,7 @@ import * as os from "node:os";
7
7
  import * as path from "node:path";
8
8
  import type { Message } from "@earendil-works/pi-ai";
9
9
  import { formatToolCall } from "./formatters.ts";
10
- import type { AgentProgress, AsyncStatus, Details, DisplayItem, ErrorInfo, NestedRunSummary, SingleResult, ToolCallSummary, Usage } from "./types.ts";
10
+ import type { AgentProgress, AsyncStatus, ChainOutputMap, Details, DisplayItem, ErrorInfo, NestedRunSummary, SingleResult, ToolCallSummary, Usage } from "./types.ts";
11
11
 
12
12
  // ============================================================================
13
13
  // File System Utilities
@@ -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 {
@@ -403,12 +414,40 @@ export function compactForegroundResult(result: SingleResult): SingleResult {
403
414
  messages: undefined,
404
415
  progress: undefined,
405
416
  toolCalls: toolCalls.length ? toolCalls : undefined,
417
+ // Reference-first terminal details: once an authoritative saved output path
418
+ // exists, drop the raw final output and truncation marker from the model-
419
+ // visible projection; consumers recover the file from `savedOutputPath`.
420
+ // Explicit `outputMode: "inline"` is the sole legacy full-text opt-out and
421
+ // keeps its final output in the terminal projection (e.g. delegation v1
422
+ // `response.output` stays populated).
423
+ finalOutput: result.savedOutputPath && result.outputMode !== "inline" ? undefined : result.finalOutput,
424
+ truncation: result.savedOutputPath && result.outputMode !== "inline" ? undefined : result.truncation,
406
425
  };
407
426
  }
408
427
 
428
+ /**
429
+ * Strip chain `details.outputs` text/structured payloads from the terminal
430
+ * projection while retaining the output names and step metadata. Chain output
431
+ * bindings themselves remain reference-first in the completion content and
432
+ * `{outputs.name}` interpolation (see outputEntryFromResult).
433
+ */
434
+ function compactChainOutputs(outputs: ChainOutputMap | undefined): ChainOutputMap | undefined {
435
+ if (!outputs) return undefined;
436
+ const compact: ChainOutputMap = {};
437
+ for (const [name, entry] of Object.entries(outputs)) {
438
+ compact[name] = {
439
+ agent: entry.agent,
440
+ stepIndex: entry.stepIndex,
441
+ text: "",
442
+ };
443
+ }
444
+ return compact;
445
+ }
446
+
409
447
  export function compactForegroundDetails(details: Details): Details {
410
448
  return {
411
449
  ...details,
450
+ outputs: compactChainOutputs(details.outputs),
412
451
  results: details.results.map(compactForegroundResult),
413
452
  progress: details.progress
414
453
  ? details.progress.map(compactCompletedProgress)
@@ -416,6 +455,49 @@ export function compactForegroundDetails(details: Details): Details {
416
455
  };
417
456
  }
418
457
 
458
+ /**
459
+ * Streaming counterparts to compactForegroundResult / compactCompletedProgress.
460
+ *
461
+ * The completed-compaction helpers above bail out while a child is still
462
+ * `running`, so a long or deeply nested fan-out streams full, unbounded progress on
463
+ * every tick. Pi serializes each streamed `tool_execution_update` as a single
464
+ * child-stdout line, which the parent reads under `MAX_CHILD_PENDING_LINE_BYTES`;
465
+ * an unbounded running snapshot can cross that cap and kill the child with
466
+ * `protocol_output_limit`.
467
+ *
468
+ * These bound the STREAMED snapshot only. The final returned result keeps the full
469
+ * live progress and message transcript, and every live-display consumer already
470
+ * reads just the last few entries (`recentTools.slice(-3)`, `recentOutput.slice(-5)`).
471
+ */
472
+ export const MAX_STREAMED_RECENT_TOOLS = 32;
473
+ export const MAX_STREAMED_TOOL_CALLS = 64;
474
+ export const MAX_STREAMED_OUTPUT_LINE_CHARS = 2000;
475
+
476
+ /** Keep only the most recent tool-history entries in a streamed snapshot. */
477
+ export function boundStreamedRecentTools(recentTools: AgentProgress["recentTools"]): AgentProgress["recentTools"] {
478
+ return recentTools.slice(-MAX_STREAMED_RECENT_TOOLS).map((tool) => ({ ...tool }));
479
+ }
480
+
481
+ /** Cap per-line length of recent output so one long line can't inflate a snapshot. */
482
+ export function boundStreamedRecentOutput(recentOutput: string[]): string[] {
483
+ return recentOutput.map((line) =>
484
+ line.length > MAX_STREAMED_OUTPUT_LINE_CHARS
485
+ ? `${line.slice(0, MAX_STREAMED_OUTPUT_LINE_CHARS)}… [truncated]`
486
+ : line,
487
+ );
488
+ }
489
+
490
+ /**
491
+ * Compact tool-call summaries for a streamed snapshot, standing in for the
492
+ * unbounded `messages` transcript. Prefers an existing `toolCalls` summary, else
493
+ * derives one from `messages`; bounded to the most recent calls.
494
+ */
495
+ export function boundStreamedToolCalls(result: Pick<SingleResult, "toolCalls" | "messages">): ToolCallSummary[] | undefined {
496
+ const summaries = result.toolCalls?.length ? result.toolCalls : extractToolCallSummaries(result.messages);
497
+ if (!summaries.length) return undefined;
498
+ return summaries.slice(-MAX_STREAMED_TOOL_CALLS).map((summary) => ({ ...summary }));
499
+ }
500
+
419
501
  export function hasEmptyTerminalAssistantResponse(messages: Message[]): boolean {
420
502
  const lastAssistant = messages.findLast((message) => message.role === "assistant");
421
503
  return lastAssistant?.role === "assistant"
@@ -428,7 +510,7 @@ export function hasEmptyTerminalAssistantResponse(messages: Message[]): boolean
428
510
  * Detect errors in subagent execution from messages (only errors with no subsequent success)
429
511
  */
430
512
  export function detectSubagentError(messages: Message[]): ErrorInfo {
431
- let lastAssistantTextIndex = -1;
513
+ let recoveryIndex = -1;
432
514
  for (let i = messages.length - 1; i >= 0; i--) {
433
515
  const msg = messages[i];
434
516
  if (msg.role === "assistant") {
@@ -436,13 +518,28 @@ export function detectSubagentError(messages: Message[]): ErrorInfo {
436
518
  (c) => c.type === "text" && "text" in c && typeof c.text === "string" && c.text.trim().length > 0,
437
519
  );
438
520
  if (hasText) {
439
- lastAssistantTextIndex = i;
521
+ recoveryIndex = i;
440
522
  break;
441
523
  }
442
524
  }
443
525
  }
444
526
 
445
- const scanStart = lastAssistantTextIndex >= 0 ? lastAssistantTextIndex + 1 : 0;
527
+ const terminalAssistantIndex = messages.findLastIndex((message) => message.role === "assistant");
528
+ const terminalAssistant = messages[terminalAssistantIndex];
529
+ const cleanTerminalStop = terminalAssistant?.role === "assistant"
530
+ && terminalAssistant.stopReason === "stop"
531
+ && !terminalAssistant.errorMessage
532
+ && !terminalAssistant.content.some((part) => part.type === "toolCall");
533
+ if (cleanTerminalStop) {
534
+ for (let i = terminalAssistantIndex - 1; i >= 0; i--) {
535
+ const msg = messages[i];
536
+ if (msg.role !== "toolResult") continue;
537
+ if (msg.isError !== true) recoveryIndex = Math.max(recoveryIndex, i);
538
+ break;
539
+ }
540
+ }
541
+
542
+ const scanStart = recoveryIndex >= 0 ? recoveryIndex + 1 : 0;
446
543
 
447
544
  for (let i = messages.length - 1; i >= scanStart; i--) {
448
545
  const msg = messages[i];