@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
@@ -71,6 +71,51 @@ describe("result watcher", () => {
71
71
  }
72
72
  });
73
73
 
74
+ it("uses native completion delivery without attempting external grouped intercom when disabled", async () => {
75
+ const resultsDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-result-watcher-native-delivery-"));
76
+ try {
77
+ const emitted: Array<{ event: string; data: unknown }> = [];
78
+ const delivered: unknown[] = [];
79
+ const pi = {
80
+ events: {
81
+ on: () => () => {},
82
+ emit(event: string, data: unknown) { emitted.push({ event, data }); },
83
+ },
84
+ };
85
+ const state = createState();
86
+ state.currentSessionId = "session-native";
87
+ const resultPath = path.join(resultsDir, "native-run.json");
88
+ fs.writeFileSync(resultPath, JSON.stringify({
89
+ id: "native-run",
90
+ runId: "native-run",
91
+ sessionId: "session-native",
92
+ mode: "single",
93
+ success: false,
94
+ state: "failed",
95
+ summary: "Subagent process terminated by signal SIGTERM.",
96
+ results: [{ agent: "worker", output: "", success: false, exitCode: 1, processSignal: "SIGTERM" }],
97
+ intercomTarget: "native-parent",
98
+ }), "utf-8");
99
+ const watcher = createResultWatcher(pi, state, resultsDir, 60_000, {
100
+ deliverIntercomResults: false,
101
+ notifier: { deliver: async (result) => { delivered.push(result); return true; } },
102
+ });
103
+ try {
104
+ watcher.primeExistingResults();
105
+ await new Promise((resolve) => setTimeout(resolve, 100));
106
+ } finally {
107
+ watcher.stopResultWatcher();
108
+ }
109
+ assert.equal(emitted.some((entry) => entry.event === "subagent:result-intercom"), false);
110
+ assert.equal(emitted.filter((entry) => entry.event === "subagent:async-complete").length, 1);
111
+ const notification = delivered[0] as { results?: Array<{ status?: string }> } | undefined;
112
+ assert.equal(notification?.results?.[0]?.status, "stopped");
113
+ assert.equal(fs.existsSync(resultPath), false);
114
+ } finally {
115
+ fs.rmSync(resultsDir, { recursive: true, force: true });
116
+ }
117
+ });
118
+
74
119
  it("delivers result files only to the exact owning session when another watcher shares the same repo", async () => {
75
120
  const resultsDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-result-watcher-scope-"));
76
121
  const createPi = () => {
@@ -296,7 +341,11 @@ describe("result watcher", () => {
296
341
  assert.notEqual(state.watcherRestartTimer, null);
297
342
 
298
343
  fs.writeFileSync(childSessionPath, "", "utf-8");
299
- fs.writeFileSync(path.join(resultsDir, "async-fallback.json"), JSON.stringify({
344
+ const childOutputA = path.join(resultsDir, "child-a.md");
345
+ const childOutputB = path.join(resultsDir, "child-b.md");
346
+ fs.writeFileSync(childOutputA, "Result from a", "utf-8");
347
+ fs.writeFileSync(childOutputB, "Result from b", "utf-8");
348
+ fs.writeFileSync(path.join(resultsDir, "async-fallback.json"), JSON.stringify({
300
349
  id: "async-fallback",
301
350
  runId: "run-fallback",
302
351
  agent: "parallel:a+b",
@@ -305,8 +354,8 @@ describe("result watcher", () => {
305
354
  state: "complete",
306
355
  summary: "Combined summary",
307
356
  results: [
308
- { agent: "a", output: "Result from a", success: true, sessionFile: childSessionPath, intercomTarget: "subagent-a-run-fallback-1" },
309
- { agent: "b", output: "Result from b", success: false, error: "B failed", intercomTarget: "subagent-b-run-fallback-2" },
357
+ { agent: "a", output: "Result from a", outputPath: childOutputA, success: true, sessionFile: childSessionPath, intercomTarget: "subagent-a-run-fallback-1" },
358
+ { agent: "b", output: "Result from b", outputPath: childOutputB, success: false, error: "B failed", intercomTarget: "subagent-b-run-fallback-2" },
310
359
  ],
311
360
  sessionId: "session-1",
312
361
  intercomTarget: "subagent-chat-main",
@@ -332,8 +381,12 @@ describe("result watcher", () => {
332
381
  assert.equal(completion?.results?.[0]?.sessionPath, childSessionPath);
333
382
  assert.equal(payload.children?.[1]?.status, "failed");
334
383
  assert.equal(completion?.results?.[1]?.status, "failed");
335
- assert.equal(payload.children?.[1]?.summary, "B failed\n\nOutput:\nResult from b");
336
- assert.equal(completion?.results?.[1]?.summary, "B failed\n\nOutput:\nResult from b");
384
+ // Reference-only async delivery: child summaries are built from the
385
+ // authoritative output path (error/status first for failed children).
386
+ assert.match(payload.children?.[1]?.summary ?? "", /^B failed\n\nOutput saved to: .*child-b\.md/);
387
+ assert.match(completion?.results?.[1]?.summary ?? "", /^B failed\n\nOutput saved to: /);
388
+ assert.match(payload.children?.[0]?.summary ?? "", /^Output saved to: .*child-a\.md/);
389
+ assert.doesNotMatch(payload.children?.[1]?.summary ?? "", /Result from b/);
337
390
  } finally {
338
391
  fs.rmSync(resultsDir, { recursive: true, force: true });
339
392
  }
@@ -447,8 +500,8 @@ describe("result watcher", () => {
447
500
  state: "complete",
448
501
  summary: "Combined summary",
449
502
  results: [
450
- { agent: "a", output: "Result from a", success: true, sessionFile: firstSession, artifactPaths: { outputPath: "/tmp/a-output.md" }, intercomTarget: "subagent-a-run-123-1" },
451
- { agent: "b", output: "Result from b", success: false, sessionFile: missingSession, artifactPaths: { outputPath: "/tmp/b-output.md" }, intercomTarget: "subagent-b-run-123-2" },
503
+ { agent: "a", output: "Result from a", outputState: "present", success: true, sessionFile: firstSession, artifactPaths: { outputPath: "/tmp/a-output.md" }, intercomTarget: "subagent-a-run-123-1" },
504
+ { agent: "b", output: "Result from b", outputState: "present", success: false, sessionFile: missingSession, artifactPaths: { outputPath: "/tmp/b-output.md" }, intercomTarget: "subagent-b-run-123-2" },
452
505
  ],
453
506
  sessionId: "session-1",
454
507
  sessionFile: "/tmp/session.jsonl",
@@ -472,6 +525,8 @@ describe("result watcher", () => {
472
525
  assert.match(message, /Revive child: subagent\(\{ action: "resume", id: "async-1", index: 0, message: "\.\.\." \}\)/);
473
526
  assert.ok(message.includes(`Session: ${firstSession}`));
474
527
  assert.match(message, /Parallel handoff: \/tmp\/async-1\/handoff\.json/);
528
+ assert.match(message, /Outputs: 2 present \(semantic adequacy unassessed\)/);
529
+ assert.match(message, /Inspect that output before retrying/);
475
530
  assert.equal(message.includes(missingSession), false);
476
531
  const completion = emitted.find((entry) => entry.event === "subagent:async-complete")?.data as { parallelHandoff?: { path?: string } } | undefined;
477
532
  assert.equal(completion?.parallelHandoff?.path, "/tmp/async-1/handoff.json");
@@ -517,8 +572,8 @@ describe("result watcher", () => {
517
572
  stopped: true,
518
573
  summary: "Stopped by user",
519
574
  results: [
520
- { agent: "a", output: "Result from a", success: true },
521
- { agent: "b", output: "Subagent stopped by user.", success: false, stopped: true, state: "stopped" },
575
+ { agent: "a", output: "Result from a", outputState: "present", success: true },
576
+ { agent: "b", output: "Subagent stopped by user.", outputState: "absent", success: false, stopped: true, state: "stopped" },
522
577
  ],
523
578
  sessionId: "session-1",
524
579
  intercomTarget: "subagent-chat-main",
@@ -535,8 +590,8 @@ describe("result watcher", () => {
535
590
  assert.equal(eventData.status, "stopped");
536
591
  const message = String(eventData.message ?? "");
537
592
  assert.match(message, /Children: 1 completed, 1 stopped/);
538
- assert.match(message, /1\. a — completed/);
539
- assert.match(message, /2\. b — stopped/);
593
+ assert.match(message, /1\. a — process completed · output present/);
594
+ assert.match(message, /2\. b — process stopped · output absent/);
540
595
  } finally {
541
596
  fs.rmSync(resultsDir, { recursive: true, force: true });
542
597
  }
@@ -877,8 +932,8 @@ describe("result watcher", () => {
877
932
  state: "paused",
878
933
  summary: "Paused after interrupt. Waiting for explicit next action.",
879
934
  results: [
880
- { agent: "a", output: "Result from a", success: true, intercomTarget: "subagent-a-run-paused-1" },
881
- { agent: "b", output: "Paused after interrupt", success: false, intercomTarget: "subagent-b-run-paused-2" },
935
+ { agent: "a", output: "Result from a", outputState: "present", success: true, intercomTarget: "subagent-a-run-paused-1" },
936
+ { agent: "b", output: "Paused after interrupt", outputState: "absent", success: false, intercomTarget: "subagent-b-run-paused-2" },
882
937
  ],
883
938
  sessionId: "session-1",
884
939
  intercomTarget: "subagent-chat-main",
@@ -895,9 +950,9 @@ describe("result watcher", () => {
895
950
  assert.equal(payload.mode, "chain");
896
951
  assert.equal(payload.status, "paused");
897
952
  assert.equal(payload.children?.every((child) => child.status === "paused"), true);
898
- assert.match(String(payload.message ?? ""), /Status: paused/);
899
- assert.match(String(payload.message ?? ""), /1\. a — paused/);
900
- assert.match(String(payload.message ?? ""), /2\. b — paused/);
953
+ assert.match(String(payload.message ?? ""), /Process status: paused/);
954
+ assert.match(String(payload.message ?? ""), /1\. a — process paused · output present/);
955
+ assert.match(String(payload.message ?? ""), /2\. b — process paused · output absent/);
901
956
  } finally {
902
957
  fs.rmSync(resultsDir, { recursive: true, force: true });
903
958
  }
@@ -949,7 +1004,10 @@ describe("result watcher", () => {
949
1004
  watcher.stopResultWatcher();
950
1005
  }
951
1006
 
952
- assert.equal(emitted.filter((entry) => entry.event === "subagent:result-intercom").length, 1);
1007
+ const grouped = emitted.filter((entry) => entry.event === "subagent:result-intercom");
1008
+ assert.equal(grouped.length, 1);
1009
+ assert.match(String((grouped[0]?.data as { message?: string } | undefined)?.message ?? ""), /output unknown/);
1010
+ assert.doesNotMatch(String((grouped[0]?.data as { message?: string } | undefined)?.message ?? ""), /Inspect that output before retrying/);
953
1011
  assert.equal(emitted.some((entry) => entry.event === "subagent:async-complete"), true);
954
1012
  assert.equal(logged.some((entry) => /Subagent async grouped result intercom delivery was not acknowledged/.test(String(entry[0] ?? ""))), true);
955
1013
  } finally {
@@ -957,6 +1015,130 @@ describe("result watcher", () => {
957
1015
  }
958
1016
  });
959
1017
 
1018
+ it("marks acknowledged grouped intercom results so local notification is suppressed", async () => {
1019
+ const resultsDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-result-watcher-intercom-ack-"));
1020
+ try {
1021
+ const emitted: Array<{ event: string; data: unknown }> = [];
1022
+ const listeners = new Map<string, Set<(payload: unknown) => void>>();
1023
+ const pi = {
1024
+ events: {
1025
+ on(event: string, handler: (payload: unknown) => void) {
1026
+ const eventListeners = listeners.get(event) ?? new Set();
1027
+ eventListeners.add(handler);
1028
+ listeners.set(event, eventListeners);
1029
+ return () => eventListeners.delete(handler);
1030
+ },
1031
+ emit(event: string, data: unknown) {
1032
+ emitted.push({ event, data });
1033
+ for (const handler of listeners.get(event) ?? []) handler(data);
1034
+ if (event === "subagent:result-intercom") {
1035
+ const requestId = data && typeof data === "object" ? (data as { requestId?: unknown }).requestId : undefined;
1036
+ if (typeof requestId === "string") {
1037
+ setImmediate(() => pi.events.emit("subagent:result-intercom-delivery", { requestId, delivered: true }));
1038
+ }
1039
+ }
1040
+ },
1041
+ },
1042
+ };
1043
+ const state = createState();
1044
+ state.currentSessionId = "session-1";
1045
+ const delivered: Array<{ intercomDelivered?: boolean }> = [];
1046
+ const watcher = createResultWatcher(pi, state, resultsDir, 60_000, {
1047
+ notifier: { async deliver(result) { delivered.push({ intercomDelivered: result.intercomDelivered }); return true; } },
1048
+ });
1049
+ try {
1050
+ fs.writeFileSync(path.join(resultsDir, "acknowledged.json"), JSON.stringify({
1051
+ id: "acknowledged",
1052
+ runId: "run-acknowledged",
1053
+ agent: "worker",
1054
+ success: true,
1055
+ state: "complete",
1056
+ summary: "Worker summary",
1057
+ sessionId: "session-1",
1058
+ intercomTarget: "orchestrator",
1059
+ }), "utf-8");
1060
+ watcher.primeExistingResults();
1061
+ await new Promise((resolve) => setTimeout(resolve, 100));
1062
+ } finally {
1063
+ watcher.stopResultWatcher();
1064
+ }
1065
+
1066
+ assert.deepEqual(delivered, [{ intercomDelivered: true }]);
1067
+ const completion = emitted.find((entry) => entry.event === "subagent:async-complete")?.data as { intercomDelivered?: boolean } | undefined;
1068
+ assert.equal(completion?.intercomDelivered, true);
1069
+ } finally {
1070
+ fs.rmSync(resultsDir, { recursive: true, force: true });
1071
+ }
1072
+ });
1073
+
1074
+ it("uses a bounded fallback when a child output path is absent or unreadable", async () => {
1075
+ const resultsDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-result-watcher-fallback-"));
1076
+ try {
1077
+ const emitted: Array<{ event: string; data: unknown }> = [];
1078
+ const listeners = new Map<string, Set<(payload: unknown) => void>>();
1079
+ const pi = {
1080
+ events: {
1081
+ on(event: string, handler: (payload: unknown) => void) {
1082
+ const set = listeners.get(event) ?? new Set();
1083
+ set.add(handler);
1084
+ listeners.set(event, set);
1085
+ return () => set.delete(handler);
1086
+ },
1087
+ emit(event: string, data: unknown) {
1088
+ emitted.push({ event, data });
1089
+ for (const handler of listeners.get(event) ?? []) handler(data);
1090
+ },
1091
+ },
1092
+ };
1093
+ const state = createState();
1094
+ state.currentSessionId = "session-1";
1095
+ const watcher = createResultWatcher(pi, state, resultsDir, 60_000);
1096
+ const missingOutputPath = path.join(resultsDir, "missing-child.md");
1097
+ const unreadablePath = path.join(resultsDir, "unreadable-child.md");
1098
+ fs.writeFileSync(unreadablePath, "unreadable child output", "utf-8");
1099
+ fs.chmodSync(unreadablePath, 0o000);
1100
+ try {
1101
+ fs.writeFileSync(path.join(resultsDir, "fallback.json"), JSON.stringify({
1102
+ id: "fallback",
1103
+ runId: "run-fallback",
1104
+ agent: "parallel:a+b",
1105
+ mode: "parallel",
1106
+ success: false,
1107
+ state: "failed",
1108
+ summary: "run summary that must never leak",
1109
+ results: [
1110
+ { agent: "a", outputPath: missingOutputPath, output: "internal a", success: false, error: "A exploded" },
1111
+ { agent: "b", outputPath: unreadablePath, output: "internal b", success: false, error: "B exploded" },
1112
+ ],
1113
+ sessionId: "session-1",
1114
+ }), "utf-8");
1115
+ watcher.primeExistingResults();
1116
+ await new Promise((resolve) => setTimeout(resolve, 100));
1117
+ } finally {
1118
+ fs.chmodSync(unreadablePath, 0o644);
1119
+ watcher.stopResultWatcher();
1120
+ }
1121
+ const completion = emitted.find((entry) => entry.event === "subagent:async-complete")?.data as { results?: Array<{ summary?: string }> } | undefined;
1122
+ assert.ok(completion, "expected an async completion");
1123
+ const summaryA = completion.results?.[0]?.summary ?? "";
1124
+ const summaryB = completion.results?.[1]?.summary ?? "";
1125
+ assert.match(summaryA, /\[Full output unavailable\]/);
1126
+ assert.match(summaryA, /Failed to read saved output: ENOENT/);
1127
+ assert.match(summaryA, /missing-child\.md/);
1128
+ assert.match(summaryB, /\[Full output unavailable\]/);
1129
+ assert.match(summaryB, /Failed to read saved output: EACCES: permission denied/);
1130
+ assert.match(summaryB, /unreadable-child\.md/);
1131
+ // Only a bounded excerpt of the internal text is exposed, never the raw
1132
+ // full output shape or the run summary.
1133
+ assert.match(summaryA, /internal a/);
1134
+ assert.match(summaryB, /internal b/);
1135
+ assert.doesNotMatch(summaryA, /Output:\ninternal a/);
1136
+ assert.doesNotMatch(summaryA + summaryB, /run summary that must never leak/);
1137
+ } finally {
1138
+ fs.rmSync(resultsDir, { recursive: true, force: true });
1139
+ }
1140
+ });
1141
+
960
1142
  it("delivers a result when a previous duplicate key has expired", async () => {
961
1143
  const resultsDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-result-watcher-expired-"));
962
1144
  try {