@selesai/code 0.6.3 → 0.8.0

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 (1056) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/README.md +5 -3
  3. package/dist/bun/cli.d.ts +0 -1
  4. package/dist/bun/cli.js +0 -1
  5. package/dist/bun/register-bedrock.d.ts +0 -1
  6. package/dist/bun/register-bedrock.js +0 -1
  7. package/dist/bun/restore-sandbox-env.d.ts +0 -1
  8. package/dist/bun/restore-sandbox-env.js +0 -1
  9. package/dist/cli/args.d.ts +0 -1
  10. package/dist/cli/args.js +0 -1
  11. package/dist/cli/config-selector.d.ts +0 -1
  12. package/dist/cli/config-selector.js +0 -1
  13. package/dist/cli/credential-print.d.ts +0 -1
  14. package/dist/cli/credential-print.js +0 -1
  15. package/dist/cli/file-processor.d.ts +0 -1
  16. package/dist/cli/file-processor.js +0 -1
  17. package/dist/cli/initial-message.d.ts +0 -1
  18. package/dist/cli/initial-message.js +0 -1
  19. package/dist/cli/list-models.d.ts +0 -1
  20. package/dist/cli/list-models.js +0 -1
  21. package/dist/cli/project-trust.d.ts +0 -1
  22. package/dist/cli/project-trust.js +0 -1
  23. package/dist/cli/session-picker.d.ts +0 -1
  24. package/dist/cli/session-picker.js +0 -1
  25. package/dist/cli/startup-ui.d.ts +0 -1
  26. package/dist/cli/startup-ui.js +0 -1
  27. package/dist/cli.d.ts +0 -1
  28. package/dist/cli.js +0 -1
  29. package/dist/config.d.ts +0 -1
  30. package/dist/config.js +0 -1
  31. package/dist/core/agent-session-auto-handoff.test.d.ts +0 -1
  32. package/dist/core/agent-session-auto-handoff.test.js +0 -1
  33. package/dist/core/agent-session-runtime.d.ts +0 -1
  34. package/dist/core/agent-session-runtime.js +0 -1
  35. package/dist/core/agent-session-services.d.ts +0 -1
  36. package/dist/core/agent-session-services.js +0 -1
  37. package/dist/core/agent-session-skill-block.test.d.ts +0 -1
  38. package/dist/core/agent-session-skill-block.test.js +0 -1
  39. package/dist/core/agent-session.d.ts +0 -1
  40. package/dist/core/agent-session.js +0 -1
  41. package/dist/core/agents.d.ts +0 -1
  42. package/dist/core/agents.js +0 -1
  43. package/dist/core/auth-guidance.d.ts +0 -1
  44. package/dist/core/auth-guidance.js +0 -1
  45. package/dist/core/auth-storage.d.ts +0 -1
  46. package/dist/core/auth-storage.js +0 -1
  47. package/dist/core/bash-executor.d.ts +0 -1
  48. package/dist/core/bash-executor.js +0 -1
  49. package/dist/core/built-in-extensions.d.ts +0 -1
  50. package/dist/core/built-in-extensions.js +0 -1
  51. package/dist/core/cache-stats.d.ts +0 -1
  52. package/dist/core/cache-stats.js +0 -1
  53. package/dist/core/compaction/branch-summarization.d.ts +0 -1
  54. package/dist/core/compaction/branch-summarization.js +0 -1
  55. package/dist/core/compaction/compaction.d.ts +0 -1
  56. package/dist/core/compaction/compaction.js +0 -1
  57. package/dist/core/compaction/index.d.ts +0 -1
  58. package/dist/core/compaction/index.js +0 -1
  59. package/dist/core/compaction/utils.d.ts +0 -1
  60. package/dist/core/compaction/utils.js +0 -1
  61. package/dist/core/defaults.d.ts +0 -1
  62. package/dist/core/defaults.js +0 -1
  63. package/dist/core/diagnostics.d.ts +0 -1
  64. package/dist/core/diagnostics.js +0 -1
  65. package/dist/core/event-bus.d.ts +0 -1
  66. package/dist/core/event-bus.js +0 -1
  67. package/dist/core/exec.d.ts +0 -1
  68. package/dist/core/exec.js +0 -1
  69. package/dist/core/experimental.d.ts +0 -1
  70. package/dist/core/experimental.js +0 -1
  71. package/dist/core/export-html/ansi-to-html.d.ts +0 -1
  72. package/dist/core/export-html/ansi-to-html.js +0 -1
  73. package/dist/core/export-html/index.d.ts +0 -1
  74. package/dist/core/export-html/index.js +0 -1
  75. package/dist/core/export-html/tool-renderer.d.ts +0 -1
  76. package/dist/core/export-html/tool-renderer.js +0 -1
  77. package/dist/core/extensions/index.d.ts +0 -1
  78. package/dist/core/extensions/index.js +0 -1
  79. package/dist/core/extensions/loader.d.ts +0 -1
  80. package/dist/core/extensions/loader.js +0 -1
  81. package/dist/core/extensions/runner.d.ts +0 -1
  82. package/dist/core/extensions/runner.js +0 -1
  83. package/dist/core/extensions/types.d.ts +0 -1
  84. package/dist/core/extensions/types.js +0 -1
  85. package/dist/core/extensions/wrapper.d.ts +0 -1
  86. package/dist/core/extensions/wrapper.js +0 -1
  87. package/dist/core/footer-data-provider.d.ts +0 -1
  88. package/dist/core/footer-data-provider.js +0 -1
  89. package/dist/core/git-command.d.ts +0 -1
  90. package/dist/core/git-command.js +0 -1
  91. package/dist/core/http-dispatcher.d.ts +0 -1
  92. package/dist/core/http-dispatcher.js +0 -1
  93. package/dist/core/index.d.ts +0 -1
  94. package/dist/core/index.js +0 -1
  95. package/dist/core/keybindings.d.ts +0 -1
  96. package/dist/core/keybindings.js +0 -1
  97. package/dist/core/llama/client.d.ts +0 -1
  98. package/dist/core/llama/client.js +0 -1
  99. package/dist/core/llama/huggingface.d.ts +0 -1
  100. package/dist/core/llama/huggingface.js +0 -1
  101. package/dist/core/llama/index.d.ts +0 -1
  102. package/dist/core/llama/index.js +0 -1
  103. package/dist/core/llama/provider.d.ts +0 -1
  104. package/dist/core/llama/provider.js +0 -1
  105. package/dist/core/llama/ui.d.ts +0 -1
  106. package/dist/core/llama/ui.js +0 -1
  107. package/dist/core/messages.d.ts +0 -1
  108. package/dist/core/messages.js +0 -1
  109. package/dist/core/model-config.d.ts +0 -1
  110. package/dist/core/model-config.js +0 -1
  111. package/dist/core/model-registry.d.ts +0 -1
  112. package/dist/core/model-registry.js +0 -1
  113. package/dist/core/model-resolver.d.ts +0 -1
  114. package/dist/core/model-resolver.js +0 -1
  115. package/dist/core/model-runtime.d.ts +0 -1
  116. package/dist/core/model-runtime.js +0 -1
  117. package/dist/core/models-store.d.ts +0 -1
  118. package/dist/core/models-store.js +0 -1
  119. package/dist/core/output-guard.d.ts +0 -1
  120. package/dist/core/output-guard.js +0 -1
  121. package/dist/core/package-manager.d.ts +0 -1
  122. package/dist/core/package-manager.js +0 -1
  123. package/dist/core/package-manager.test.d.ts +0 -1
  124. package/dist/core/package-manager.test.js +0 -1
  125. package/dist/core/project-trust.d.ts +0 -1
  126. package/dist/core/project-trust.js +0 -1
  127. package/dist/core/prompt-templates.d.ts +0 -1
  128. package/dist/core/prompt-templates.js +0 -1
  129. package/dist/core/provider-attribution.d.ts +0 -1
  130. package/dist/core/provider-attribution.js +0 -1
  131. package/dist/core/provider-composer.d.ts +0 -1
  132. package/dist/core/provider-composer.js +0 -1
  133. package/dist/core/radius.d.ts +0 -1
  134. package/dist/core/radius.js +0 -1
  135. package/dist/core/remote-catalog-provider.d.ts +0 -1
  136. package/dist/core/remote-catalog-provider.js +0 -1
  137. package/dist/core/resolve-config-value.d.ts +0 -1
  138. package/dist/core/resolve-config-value.js +0 -1
  139. package/dist/core/resource-loader.d.ts +0 -1
  140. package/dist/core/resource-loader.js +0 -1
  141. package/dist/core/runtime-credentials.d.ts +0 -1
  142. package/dist/core/runtime-credentials.js +0 -1
  143. package/dist/core/sdk.d.ts +0 -1
  144. package/dist/core/sdk.js +0 -1
  145. package/dist/core/session-cwd.d.ts +0 -1
  146. package/dist/core/session-cwd.js +0 -1
  147. package/dist/core/session-manager.d.ts +0 -1
  148. package/dist/core/session-manager.js +0 -1
  149. package/dist/core/settings-manager-auto-handoff.test.d.ts +0 -1
  150. package/dist/core/settings-manager-auto-handoff.test.js +0 -1
  151. package/dist/core/settings-manager.d.ts +0 -4
  152. package/dist/core/settings-manager.js +0 -12
  153. package/dist/core/skills.d.ts +0 -1
  154. package/dist/core/skills.js +0 -1
  155. package/dist/core/slash-commands.d.ts +0 -1
  156. package/dist/core/slash-commands.js +0 -1
  157. package/dist/core/source-info.d.ts +0 -1
  158. package/dist/core/source-info.js +0 -1
  159. package/dist/core/system-prompt.d.ts +0 -1
  160. package/dist/core/system-prompt.js +0 -1
  161. package/dist/core/system-prompt.test.d.ts +0 -1
  162. package/dist/core/system-prompt.test.js +0 -1
  163. package/dist/core/telemetry.d.ts +0 -1
  164. package/dist/core/telemetry.js +0 -1
  165. package/dist/core/timings.d.ts +0 -1
  166. package/dist/core/timings.js +0 -1
  167. package/dist/core/tools/bash.d.ts +0 -1
  168. package/dist/core/tools/bash.js +0 -1
  169. package/dist/core/tools/edit-diff.d.ts +0 -1
  170. package/dist/core/tools/edit-diff.js +0 -1
  171. package/dist/core/tools/edit.d.ts +0 -1
  172. package/dist/core/tools/edit.js +0 -1
  173. package/dist/core/tools/file-mutation-queue.d.ts +0 -1
  174. package/dist/core/tools/file-mutation-queue.js +0 -1
  175. package/dist/core/tools/find.d.ts +0 -1
  176. package/dist/core/tools/find.js +0 -1
  177. package/dist/core/tools/grep.d.ts +0 -1
  178. package/dist/core/tools/grep.js +0 -1
  179. package/dist/core/tools/index.d.ts +0 -1
  180. package/dist/core/tools/index.js +0 -1
  181. package/dist/core/tools/ls.d.ts +0 -1
  182. package/dist/core/tools/ls.js +0 -1
  183. package/dist/core/tools/output-accumulator.d.ts +0 -1
  184. package/dist/core/tools/output-accumulator.js +0 -1
  185. package/dist/core/tools/path-utils.d.ts +0 -1
  186. package/dist/core/tools/path-utils.js +0 -1
  187. package/dist/core/tools/read.d.ts +0 -1
  188. package/dist/core/tools/read.js +0 -1
  189. package/dist/core/tools/render-utils.d.ts +0 -1
  190. package/dist/core/tools/render-utils.js +0 -1
  191. package/dist/core/tools/tool-definition-wrapper.d.ts +0 -1
  192. package/dist/core/tools/tool-definition-wrapper.js +0 -1
  193. package/dist/core/tools/truncate.d.ts +0 -1
  194. package/dist/core/tools/truncate.js +0 -1
  195. package/dist/core/tools/write.d.ts +0 -1
  196. package/dist/core/tools/write.js +0 -1
  197. package/dist/core/trust-manager.d.ts +0 -1
  198. package/dist/core/trust-manager.js +0 -1
  199. package/dist/core/usage-totals.d.ts +0 -1
  200. package/dist/core/usage-totals.js +0 -1
  201. package/dist/defaults/models.json +8 -0
  202. package/dist/defaults/settings.json +6 -7
  203. package/dist/extensions/agent-browser.test.ts +195 -0
  204. package/dist/extensions/agent-browser.ts +158 -0
  205. package/dist/extensions/inline-skills.test.ts +27 -13
  206. package/dist/extensions/inline-skills.ts +18 -11
  207. package/dist/extensions/package.json +2 -1
  208. package/dist/extensions/pi-powerline-footer/.github/workflows/test.yml +27 -0
  209. package/dist/extensions/pi-powerline-footer/CHANGELOG.md +153 -0
  210. package/dist/extensions/pi-powerline-footer/CONTRIBUTING.md +16 -0
  211. package/dist/extensions/pi-powerline-footer/README.md +192 -44
  212. package/dist/extensions/pi-powerline-footer/bash-mode/completion.ts +19 -4
  213. package/dist/extensions/pi-powerline-footer/bash-mode/editor.ts +80 -25
  214. package/dist/extensions/pi-powerline-footer/bash-mode/history.ts +81 -29
  215. package/dist/extensions/pi-powerline-footer/bash-mode/types.ts +1 -1
  216. package/dist/extensions/pi-powerline-footer/cd-command.ts +190 -0
  217. package/dist/extensions/pi-powerline-footer/colors.ts +2 -1
  218. package/dist/extensions/pi-powerline-footer/context-usage.ts +121 -6
  219. package/dist/extensions/pi-powerline-footer/currency-rates.ts +142 -0
  220. package/dist/extensions/pi-powerline-footer/editor-composition.ts +32 -0
  221. package/dist/extensions/pi-powerline-footer/git-status.ts +108 -6
  222. package/dist/extensions/pi-powerline-footer/icons.ts +11 -2
  223. package/dist/extensions/pi-powerline-footer/index.ts +1056 -324
  224. package/dist/extensions/pi-powerline-footer/lifecycle.ts +10 -0
  225. package/dist/extensions/pi-powerline-footer/package.json +10 -6
  226. package/dist/extensions/pi-powerline-footer/paths.ts +22 -0
  227. package/dist/extensions/pi-powerline-footer/powerline-config.ts +297 -15
  228. package/dist/extensions/pi-powerline-footer/presets.ts +6 -25
  229. package/dist/extensions/pi-powerline-footer/queue/store.ts +361 -0
  230. package/dist/extensions/pi-powerline-footer/queue/types.ts +54 -0
  231. package/dist/extensions/pi-powerline-footer/render-scheduler.ts +12 -7
  232. package/dist/extensions/pi-powerline-footer/segments.ts +114 -107
  233. package/dist/extensions/pi-powerline-footer/session-usage.ts +1 -1
  234. package/dist/extensions/pi-powerline-footer/shortcuts.ts +17 -3
  235. package/dist/extensions/pi-powerline-footer/tests/bash-mode.test.ts +189 -17
  236. package/dist/extensions/pi-powerline-footer/tests/cd-command.test.ts +144 -0
  237. package/dist/extensions/pi-powerline-footer/tests/context-usage.test.ts +120 -2
  238. package/dist/extensions/pi-powerline-footer/tests/custom-items.test.ts +245 -22
  239. package/dist/extensions/pi-powerline-footer/tests/editor-composition.test.ts +48 -0
  240. package/dist/extensions/pi-powerline-footer/tests/editor-responsiveness.test.ts +34 -0
  241. package/dist/extensions/pi-powerline-footer/tests/fixed-editor-border.test.ts +39 -0
  242. package/dist/extensions/pi-powerline-footer/tests/git-status.test.ts +92 -0
  243. package/dist/extensions/pi-powerline-footer/tests/guide.test.ts +4 -1
  244. package/dist/extensions/pi-powerline-footer/tests/jump-shortcuts.test.ts +33 -197
  245. package/dist/extensions/pi-powerline-footer/tests/mode-aware-trigger.test.ts +79 -0
  246. package/dist/extensions/pi-powerline-footer/tests/paths.test.ts +63 -0
  247. package/dist/extensions/pi-powerline-footer/tests/queue-store.test.ts +195 -0
  248. package/dist/extensions/pi-powerline-footer/tests/quit-cursor.test.ts +14 -0
  249. package/dist/extensions/pi-powerline-footer/tests/remaining-regressions.test.ts +167 -0
  250. package/dist/extensions/pi-powerline-footer/tests/stash-shortcut.test.ts +23 -18
  251. package/dist/extensions/pi-powerline-footer/tests/thinking-segment.test.ts +16 -1
  252. package/dist/extensions/pi-powerline-footer/tests/token-stats.test.ts +249 -0
  253. package/dist/extensions/pi-powerline-footer/tests/usage-display.test.ts +237 -0
  254. package/dist/extensions/pi-powerline-footer/tests/welcome.test.ts +199 -0
  255. package/dist/extensions/pi-powerline-footer/tests/working-vibes.test.ts +191 -100
  256. package/dist/extensions/pi-powerline-footer/theme.ts +32 -18
  257. package/dist/extensions/pi-powerline-footer/token-stats.ts +304 -0
  258. package/dist/extensions/pi-powerline-footer/tsconfig.json +13 -0
  259. package/dist/extensions/pi-powerline-footer/types.ts +74 -29
  260. package/dist/extensions/pi-powerline-footer/welcome-dismiss.ts +34 -0
  261. package/dist/extensions/pi-powerline-footer/welcome.ts +65 -10
  262. package/dist/extensions/pi-powerline-footer/working-vibes.ts +44 -11
  263. package/dist/extensions/pi-subagents/CHANGELOG.md +89 -12
  264. package/dist/extensions/pi-subagents/README.md +339 -604
  265. package/dist/extensions/pi-subagents/package-lock.json +190 -2079
  266. package/dist/extensions/pi-subagents/package.json +13 -5
  267. package/dist/extensions/pi-subagents/prompts/parallel-context-build.md +1 -1
  268. package/dist/extensions/pi-subagents/prompts/parallel-handoff-plan.md +1 -1
  269. package/dist/extensions/pi-subagents/prompts/review-loop.md +1 -1
  270. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +10 -10
  271. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +32 -43
  272. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +106 -105
  273. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +3 -3
  274. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +28 -35
  275. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +167 -124
  276. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +19 -0
  277. package/dist/extensions/pi-subagents/src/agents/agents.ts +163 -75
  278. package/dist/extensions/pi-subagents/src/agents/chain-serializer.ts +10 -7
  279. package/dist/extensions/pi-subagents/src/agents/frontmatter.ts +5 -3
  280. package/dist/extensions/pi-subagents/src/agents/identity.ts +1 -1
  281. package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +14 -11
  282. package/dist/extensions/pi-subagents/src/agents/skills.ts +23 -6
  283. package/dist/extensions/pi-subagents/src/agents/task-aware-routing.ts +8 -1
  284. package/dist/extensions/pi-subagents/src/api/control-channel.ts +4 -0
  285. package/dist/extensions/pi-subagents/src/api/delegation.ts +26 -194
  286. package/dist/extensions/pi-subagents/src/api/external-runs.ts +129 -0
  287. package/dist/extensions/pi-subagents/src/api/intercom-bridge.ts +3 -0
  288. package/dist/extensions/pi-subagents/src/api/pi-args.ts +5 -0
  289. package/dist/extensions/pi-subagents/src/api/preflight.ts +4 -4
  290. package/dist/extensions/pi-subagents/src/api/shared-types.ts +19 -0
  291. package/dist/extensions/pi-subagents/src/extension/config.ts +10 -0
  292. package/dist/extensions/pi-subagents/src/extension/control-notices.ts +5 -39
  293. package/dist/extensions/pi-subagents/src/extension/doctor.ts +10 -9
  294. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +7 -4
  295. package/dist/extensions/pi-subagents/src/extension/index.ts +243 -77
  296. package/dist/extensions/pi-subagents/src/extension/rpc.ts +18 -6
  297. package/dist/extensions/pi-subagents/src/extension/schemas.ts +50 -39
  298. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +36 -103
  299. package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +229 -0
  300. package/dist/extensions/pi-subagents/src/inspectors/herdr/client.ts +130 -0
  301. package/dist/extensions/pi-subagents/src/inspectors/herdr/inspector-runner.ts +141 -0
  302. package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +154 -0
  303. package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +330 -0
  304. package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +3 -2
  305. package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +5 -1
  306. package/dist/extensions/pi-subagents/src/missions/actions.ts +372 -0
  307. package/dist/extensions/pi-subagents/src/missions/lifecycle.ts +314 -0
  308. package/dist/extensions/pi-subagents/src/missions/store.ts +442 -0
  309. package/dist/extensions/pi-subagents/src/missions/types.ts +135 -0
  310. package/dist/extensions/pi-subagents/src/policy/authority.ts +46 -0
  311. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +32 -6
  312. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +103 -72
  313. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +10 -2
  314. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +6 -6
  315. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +29 -1
  316. package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +3 -3
  317. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +3 -2
  318. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +9 -7
  319. package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +3 -4
  320. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +3 -28
  321. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +5 -5
  322. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +18 -68
  323. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +3 -3
  324. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +35 -8
  325. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +602 -375
  326. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +3 -3
  327. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +612 -464
  328. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +50 -9
  329. package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +253 -0
  330. package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +12 -4
  331. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +3 -3
  332. package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +8 -4
  333. package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +74 -102
  334. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +21 -22
  335. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1050 -396
  336. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +44 -18
  337. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +0 -1
  338. package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +302 -22
  339. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
  340. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +130 -0
  341. package/dist/extensions/pi-subagents/src/runs/shared/long-running-guard.ts +42 -1
  342. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +1 -1
  343. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +59 -5
  344. package/dist/extensions/pi-subagents/src/runs/shared/nested-render.ts +9 -4
  345. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +86 -2
  346. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +11 -2
  347. package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +95 -0
  348. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +11 -1
  349. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +15 -6
  350. package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +1 -1
  351. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +9 -63
  352. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +37 -6
  353. package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +5 -2
  354. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +2 -23
  355. package/dist/extensions/pi-subagents/src/runs/shared/turn-budget.ts +6 -6
  356. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +124 -13
  357. package/dist/extensions/pi-subagents/src/shared/accessible-dir.ts +29 -7
  358. package/dist/extensions/pi-subagents/src/shared/artifacts.ts +18 -1
  359. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +3 -2
  360. package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +1 -0
  361. package/dist/extensions/pi-subagents/src/shared/settings.ts +10 -0
  362. package/dist/extensions/pi-subagents/src/shared/types.ts +158 -55
  363. package/dist/extensions/pi-subagents/src/shared/utils.ts +16 -66
  364. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +33 -199
  365. package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +43 -126
  366. package/dist/extensions/pi-subagents/src/slash/inline-subagents.ts +136 -0
  367. package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +158 -205
  368. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +22 -58
  369. package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +14 -0
  370. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +44 -642
  371. package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +18 -14
  372. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +156 -21
  373. package/dist/extensions/pi-subagents/src/tui/fleet-transcript.ts +110 -5
  374. package/dist/extensions/pi-subagents/src/tui/fleet.ts +60 -24
  375. package/dist/extensions/pi-subagents/src/tui/render.ts +296 -140
  376. package/dist/extensions/pi-subagents/src/types/pi-runtime-compat.d.ts +14 -0
  377. package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +1 -1
  378. package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +13 -7
  379. package/dist/extensions/pi-subagents/src/watchdog/model-selection.ts +2 -2
  380. package/dist/extensions/pi-subagents/src/watchdog/permission-arbiter.ts +145 -0
  381. package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +1 -1
  382. package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +1 -1
  383. package/dist/extensions/pi-subagents/src/watchdog/review.ts +4 -1
  384. package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +3 -2
  385. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +140 -0
  386. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +415 -0
  387. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +41 -144
  388. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +16 -16
  389. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +415 -298
  390. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +149 -82
  391. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +40 -40
  392. package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +15 -15
  393. package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +193 -133
  394. package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +1 -49
  395. package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +62 -0
  396. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +56 -58
  397. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +81 -68
  398. package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +20 -25
  399. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +425 -317
  400. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +73 -73
  401. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +123 -98
  402. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +653 -240
  403. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +20 -1661
  404. package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +9 -9
  405. package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +3 -3
  406. package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +2 -2
  407. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +8 -5
  408. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +6 -6
  409. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +4 -20
  410. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +25 -4
  411. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +1 -1
  412. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +280 -295
  413. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +47 -207
  414. package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +26 -26
  415. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +89 -89
  416. package/dist/extensions/pi-subagents/test/unit/agent-selection.test.ts +9 -9
  417. package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +10 -0
  418. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +33 -9
  419. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +24 -2
  420. package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +11 -9
  421. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +2 -2
  422. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +40 -40
  423. package/dist/extensions/pi-subagents/test/unit/authority-policy.test.ts +22 -0
  424. package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +1 -1
  425. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +5 -39
  426. package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +19 -19
  427. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +9 -9
  428. package/dist/extensions/pi-subagents/test/unit/chain-serializer.test.ts +20 -20
  429. package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +99 -0
  430. package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +9 -9
  431. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +41 -0
  432. package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +2 -2
  433. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +35 -5
  434. package/dist/extensions/pi-subagents/test/unit/config-dir-runtime.test.ts +7 -0
  435. package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +16 -82
  436. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +162 -620
  437. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +1 -1
  438. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +25 -25
  439. package/dist/extensions/pi-subagents/test/unit/ensure-accessible-dir.test.ts +125 -0
  440. package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +94 -0
  441. package/dist/extensions/pi-subagents/test/unit/external-runs.test.ts +66 -0
  442. package/dist/extensions/pi-subagents/test/unit/extra-agent-dirs.test.ts +3 -3
  443. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +242 -52
  444. package/dist/extensions/pi-subagents/test/unit/fleet-transcript.test.ts +127 -0
  445. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +197 -36
  446. package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +4 -4
  447. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +245 -0
  448. package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +494 -0
  449. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +261 -31
  450. package/dist/extensions/pi-subagents/test/unit/inline-subagents.test.ts +127 -0
  451. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +6 -6
  452. package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +217 -0
  453. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +182 -0
  454. package/dist/extensions/pi-subagents/test/unit/mock-pi.test.ts +22 -0
  455. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +1 -1
  456. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +10 -10
  457. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +20 -12
  458. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +47 -5
  459. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +49 -55
  460. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +20 -3
  461. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +37 -7
  462. package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +10 -10
  463. package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +3 -3
  464. package/dist/extensions/pi-subagents/test/unit/permissions.test.ts +46 -0
  465. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +31 -10
  466. package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +40 -16
  467. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +42 -44
  468. package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +13 -13
  469. package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +4 -4
  470. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +75 -9
  471. package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +20 -84
  472. package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +15 -16
  473. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +28 -28
  474. package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +19 -12
  475. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +37 -21
  476. package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +1 -1
  477. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +50 -50
  478. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +396 -433
  479. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +76 -153
  480. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +411 -0
  481. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +1 -91
  482. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +139 -0
  483. package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +29 -0
  484. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +13 -13
  485. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -2
  486. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +2 -2
  487. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +35 -35
  488. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +53 -18
  489. package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +13 -1
  490. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +44 -11
  491. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +2 -26
  492. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +24 -148
  493. package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +11 -9
  494. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +351 -0
  495. package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +13 -13
  496. package/dist/extensions/pi-subagents/test/unit/watchdog-lsp-diagnostics.test.ts +1 -1
  497. package/dist/extensions/pi-subagents/test/unit/watchdog-permission-arbiter.test.ts +79 -0
  498. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +1 -1
  499. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +8 -8
  500. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +45 -9
  501. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +197 -0
  502. package/dist/extensions/pi-subagents/test/unit/workflow-graph.test.ts +8 -8
  503. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +142 -12
  504. package/dist/extensions/pi-subagents/tsconfig.json +15 -0
  505. package/dist/extensions/ponytail/index.js +1 -31
  506. package/dist/extensions/ponytail/test/extension.test.js +5 -22
  507. package/dist/extensions/rtk.test.ts +141 -0
  508. package/dist/extensions/rtk.ts +78 -36
  509. package/dist/index.d.ts +1 -1
  510. package/dist/index.js +1 -1
  511. package/dist/main.d.ts +0 -1
  512. package/dist/main.js +0 -1
  513. package/dist/migrations.d.ts +0 -1
  514. package/dist/migrations.js +0 -1
  515. package/dist/modes/index.d.ts +0 -1
  516. package/dist/modes/index.js +0 -1
  517. package/dist/modes/interactive/components/armin.d.ts +0 -1
  518. package/dist/modes/interactive/components/armin.js +0 -1
  519. package/dist/modes/interactive/components/assistant-message.d.ts +0 -1
  520. package/dist/modes/interactive/components/assistant-message.js +0 -1
  521. package/dist/modes/interactive/components/bash-execution.d.ts +0 -1
  522. package/dist/modes/interactive/components/bash-execution.js +0 -1
  523. package/dist/modes/interactive/components/bordered-loader.d.ts +0 -1
  524. package/dist/modes/interactive/components/bordered-loader.js +0 -1
  525. package/dist/modes/interactive/components/branch-summary-message.d.ts +0 -1
  526. package/dist/modes/interactive/components/branch-summary-message.js +0 -1
  527. package/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -1
  528. package/dist/modes/interactive/components/compaction-summary-message.js +0 -1
  529. package/dist/modes/interactive/components/config-selector.d.ts +0 -1
  530. package/dist/modes/interactive/components/config-selector.js +0 -1
  531. package/dist/modes/interactive/components/countdown-timer.d.ts +0 -1
  532. package/dist/modes/interactive/components/countdown-timer.js +0 -1
  533. package/dist/modes/interactive/components/custom-editor.d.ts +0 -1
  534. package/dist/modes/interactive/components/custom-editor.js +0 -1
  535. package/dist/modes/interactive/components/custom-entry.d.ts +0 -1
  536. package/dist/modes/interactive/components/custom-entry.js +0 -1
  537. package/dist/modes/interactive/components/custom-message.d.ts +0 -1
  538. package/dist/modes/interactive/components/custom-message.js +0 -1
  539. package/dist/modes/interactive/components/daxnuts.d.ts +0 -1
  540. package/dist/modes/interactive/components/daxnuts.js +0 -1
  541. package/dist/modes/interactive/components/diff.d.ts +0 -1
  542. package/dist/modes/interactive/components/diff.js +0 -1
  543. package/dist/modes/interactive/components/dynamic-border.d.ts +0 -1
  544. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  545. package/dist/modes/interactive/components/earendil-announcement.d.ts +0 -1
  546. package/dist/modes/interactive/components/earendil-announcement.js +0 -1
  547. package/dist/modes/interactive/components/extension-editor.d.ts +0 -1
  548. package/dist/modes/interactive/components/extension-editor.js +0 -1
  549. package/dist/modes/interactive/components/extension-input.d.ts +0 -1
  550. package/dist/modes/interactive/components/extension-input.js +0 -1
  551. package/dist/modes/interactive/components/extension-selector.d.ts +0 -1
  552. package/dist/modes/interactive/components/extension-selector.js +0 -1
  553. package/dist/modes/interactive/components/first-time-setup.d.ts +0 -1
  554. package/dist/modes/interactive/components/first-time-setup.js +0 -1
  555. package/dist/modes/interactive/components/footer.d.ts +0 -1
  556. package/dist/modes/interactive/components/footer.js +0 -1
  557. package/dist/modes/interactive/components/index.d.ts +0 -1
  558. package/dist/modes/interactive/components/index.js +0 -1
  559. package/dist/modes/interactive/components/keybinding-hints.d.ts +0 -1
  560. package/dist/modes/interactive/components/keybinding-hints.js +0 -1
  561. package/dist/modes/interactive/components/login-dialog.d.ts +0 -1
  562. package/dist/modes/interactive/components/login-dialog.js +0 -1
  563. package/dist/modes/interactive/components/model-selector.d.ts +0 -1
  564. package/dist/modes/interactive/components/model-selector.js +0 -1
  565. package/dist/modes/interactive/components/oauth-selector.d.ts +0 -1
  566. package/dist/modes/interactive/components/oauth-selector.js +0 -1
  567. package/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -1
  568. package/dist/modes/interactive/components/scoped-models-selector.js +0 -1
  569. package/dist/modes/interactive/components/session-selector-search.d.ts +0 -1
  570. package/dist/modes/interactive/components/session-selector-search.js +0 -1
  571. package/dist/modes/interactive/components/session-selector.d.ts +0 -1
  572. package/dist/modes/interactive/components/session-selector.js +0 -1
  573. package/dist/modes/interactive/components/settings-selector.d.ts +0 -3
  574. package/dist/modes/interactive/components/settings-selector.js +1 -14
  575. package/dist/modes/interactive/components/show-images-selector.d.ts +0 -1
  576. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  577. package/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -1
  578. package/dist/modes/interactive/components/skill-invocation-message.js +0 -1
  579. package/dist/modes/interactive/components/status-indicator.d.ts +0 -1
  580. package/dist/modes/interactive/components/status-indicator.js +0 -1
  581. package/dist/modes/interactive/components/theme-selector.d.ts +0 -1
  582. package/dist/modes/interactive/components/theme-selector.js +0 -1
  583. package/dist/modes/interactive/components/thinking-selector.d.ts +0 -1
  584. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  585. package/dist/modes/interactive/components/tool-execution.d.ts +0 -1
  586. package/dist/modes/interactive/components/tool-execution.js +0 -1
  587. package/dist/modes/interactive/components/tree-selector.d.ts +0 -1
  588. package/dist/modes/interactive/components/tree-selector.js +0 -1
  589. package/dist/modes/interactive/components/trust-selector.d.ts +0 -1
  590. package/dist/modes/interactive/components/trust-selector.js +0 -1
  591. package/dist/modes/interactive/components/user-message-selector.d.ts +0 -1
  592. package/dist/modes/interactive/components/user-message-selector.js +0 -1
  593. package/dist/modes/interactive/components/user-message.d.ts +0 -1
  594. package/dist/modes/interactive/components/user-message.js +0 -1
  595. package/dist/modes/interactive/components/visual-truncate.d.ts +0 -1
  596. package/dist/modes/interactive/components/visual-truncate.js +0 -1
  597. package/dist/modes/interactive/external-editor.d.ts +0 -1
  598. package/dist/modes/interactive/external-editor.js +0 -1
  599. package/dist/modes/interactive/interactive-mode.d.ts +0 -2
  600. package/dist/modes/interactive/interactive-mode.js +1 -22
  601. package/dist/modes/interactive/model-search.d.ts +0 -1
  602. package/dist/modes/interactive/model-search.js +0 -1
  603. package/dist/modes/interactive/theme/theme-controller.d.ts +0 -1
  604. package/dist/modes/interactive/theme/theme-controller.js +0 -1
  605. package/dist/modes/interactive/theme/theme.d.ts +0 -1
  606. package/dist/modes/interactive/theme/theme.js +0 -1
  607. package/dist/modes/print-mode.d.ts +0 -1
  608. package/dist/modes/print-mode.js +0 -1
  609. package/dist/modes/rpc/jsonl.d.ts +0 -1
  610. package/dist/modes/rpc/jsonl.js +0 -1
  611. package/dist/modes/rpc/rpc-client.d.ts +1 -2
  612. package/dist/modes/rpc/rpc-client.js +1 -2
  613. package/dist/modes/rpc/rpc-mode.d.ts +0 -1
  614. package/dist/modes/rpc/rpc-mode.js +0 -9
  615. package/dist/modes/rpc/rpc-types.d.ts +0 -1
  616. package/dist/modes/rpc/rpc-types.js +0 -1
  617. package/dist/package-manager-cli.d.ts +0 -1
  618. package/dist/package-manager-cli.js +0 -1
  619. package/dist/rpc-entry.d.ts +0 -1
  620. package/dist/rpc-entry.js +0 -1
  621. package/dist/utils/ansi.d.ts +0 -1
  622. package/dist/utils/ansi.js +0 -1
  623. package/dist/utils/changelog.d.ts +0 -1
  624. package/dist/utils/changelog.js +0 -1
  625. package/dist/utils/child-process.d.ts +0 -1
  626. package/dist/utils/child-process.js +0 -1
  627. package/dist/utils/clipboard-image.d.ts +0 -1
  628. package/dist/utils/clipboard-image.js +0 -1
  629. package/dist/utils/clipboard-native.d.ts +0 -1
  630. package/dist/utils/clipboard-native.js +0 -1
  631. package/dist/utils/clipboard.d.ts +0 -1
  632. package/dist/utils/clipboard.js +0 -1
  633. package/dist/utils/deprecation.d.ts +0 -1
  634. package/dist/utils/deprecation.js +0 -1
  635. package/dist/utils/exif-orientation.d.ts +0 -1
  636. package/dist/utils/exif-orientation.js +0 -1
  637. package/dist/utils/frontmatter.d.ts +0 -1
  638. package/dist/utils/frontmatter.js +0 -1
  639. package/dist/utils/fs-watch.d.ts +0 -1
  640. package/dist/utils/fs-watch.js +0 -1
  641. package/dist/utils/git.d.ts +0 -1
  642. package/dist/utils/git.js +0 -1
  643. package/dist/utils/html.d.ts +0 -1
  644. package/dist/utils/html.js +0 -1
  645. package/dist/utils/image-convert.d.ts +0 -1
  646. package/dist/utils/image-convert.js +0 -1
  647. package/dist/utils/image-process.d.ts +0 -1
  648. package/dist/utils/image-process.js +0 -1
  649. package/dist/utils/image-resize-core.d.ts +0 -1
  650. package/dist/utils/image-resize-core.js +0 -1
  651. package/dist/utils/image-resize-worker.d.ts +0 -1
  652. package/dist/utils/image-resize-worker.js +0 -1
  653. package/dist/utils/image-resize.d.ts +0 -1
  654. package/dist/utils/image-resize.js +0 -1
  655. package/dist/utils/json.d.ts +0 -1
  656. package/dist/utils/json.js +0 -1
  657. package/dist/utils/mime.d.ts +0 -1
  658. package/dist/utils/mime.js +0 -1
  659. package/dist/utils/open-browser.d.ts +0 -1
  660. package/dist/utils/open-browser.js +0 -1
  661. package/dist/utils/paths.d.ts +0 -1
  662. package/dist/utils/paths.js +0 -1
  663. package/dist/utils/photon.d.ts +0 -1
  664. package/dist/utils/photon.js +0 -1
  665. package/dist/utils/pi-user-agent.d.ts +0 -1
  666. package/dist/utils/pi-user-agent.js +0 -1
  667. package/dist/utils/shell.d.ts +0 -1
  668. package/dist/utils/shell.js +0 -1
  669. package/dist/utils/sleep.d.ts +0 -1
  670. package/dist/utils/sleep.js +0 -1
  671. package/dist/utils/syntax-highlight.d.ts +0 -1
  672. package/dist/utils/syntax-highlight.js +0 -1
  673. package/dist/utils/thinking-tags.d.ts +0 -1
  674. package/dist/utils/thinking-tags.js +0 -1
  675. package/dist/utils/tools-manager.d.ts +3 -3
  676. package/dist/utils/tools-manager.js +125 -42
  677. package/dist/utils/version-check.d.ts +0 -1
  678. package/dist/utils/version-check.js +0 -1
  679. package/dist/utils/windows-self-update.d.ts +0 -1
  680. package/dist/utils/windows-self-update.js +0 -1
  681. package/docs/rpc.md +1 -2
  682. package/docs/settings.md +0 -1
  683. package/docs/skills.md +10 -18
  684. package/package.json +3 -2
  685. package/dist/bun/cli.d.ts.map +0 -1
  686. package/dist/bun/cli.js.map +0 -1
  687. package/dist/bun/register-bedrock.d.ts.map +0 -1
  688. package/dist/bun/register-bedrock.js.map +0 -1
  689. package/dist/bun/restore-sandbox-env.d.ts.map +0 -1
  690. package/dist/bun/restore-sandbox-env.js.map +0 -1
  691. package/dist/cli/args.d.ts.map +0 -1
  692. package/dist/cli/args.js.map +0 -1
  693. package/dist/cli/config-selector.d.ts.map +0 -1
  694. package/dist/cli/config-selector.js.map +0 -1
  695. package/dist/cli/credential-print.d.ts.map +0 -1
  696. package/dist/cli/credential-print.js.map +0 -1
  697. package/dist/cli/file-processor.d.ts.map +0 -1
  698. package/dist/cli/file-processor.js.map +0 -1
  699. package/dist/cli/initial-message.d.ts.map +0 -1
  700. package/dist/cli/initial-message.js.map +0 -1
  701. package/dist/cli/list-models.d.ts.map +0 -1
  702. package/dist/cli/list-models.js.map +0 -1
  703. package/dist/cli/project-trust.d.ts.map +0 -1
  704. package/dist/cli/project-trust.js.map +0 -1
  705. package/dist/cli/session-picker.d.ts.map +0 -1
  706. package/dist/cli/session-picker.js.map +0 -1
  707. package/dist/cli/startup-ui.d.ts.map +0 -1
  708. package/dist/cli/startup-ui.js.map +0 -1
  709. package/dist/cli.d.ts.map +0 -1
  710. package/dist/cli.js.map +0 -1
  711. package/dist/config.d.ts.map +0 -1
  712. package/dist/config.js.map +0 -1
  713. package/dist/core/agent-session-auto-handoff.test.d.ts.map +0 -1
  714. package/dist/core/agent-session-auto-handoff.test.js.map +0 -1
  715. package/dist/core/agent-session-runtime.d.ts.map +0 -1
  716. package/dist/core/agent-session-runtime.js.map +0 -1
  717. package/dist/core/agent-session-services.d.ts.map +0 -1
  718. package/dist/core/agent-session-services.js.map +0 -1
  719. package/dist/core/agent-session-skill-block.test.d.ts.map +0 -1
  720. package/dist/core/agent-session-skill-block.test.js.map +0 -1
  721. package/dist/core/agent-session.d.ts.map +0 -1
  722. package/dist/core/agent-session.js.map +0 -1
  723. package/dist/core/agents.d.ts.map +0 -1
  724. package/dist/core/agents.js.map +0 -1
  725. package/dist/core/auth-guidance.d.ts.map +0 -1
  726. package/dist/core/auth-guidance.js.map +0 -1
  727. package/dist/core/auth-storage.d.ts.map +0 -1
  728. package/dist/core/auth-storage.js.map +0 -1
  729. package/dist/core/bash-executor.d.ts.map +0 -1
  730. package/dist/core/bash-executor.js.map +0 -1
  731. package/dist/core/built-in-extensions.d.ts.map +0 -1
  732. package/dist/core/built-in-extensions.js.map +0 -1
  733. package/dist/core/cache-stats.d.ts.map +0 -1
  734. package/dist/core/cache-stats.js.map +0 -1
  735. package/dist/core/compaction/branch-summarization.d.ts.map +0 -1
  736. package/dist/core/compaction/branch-summarization.js.map +0 -1
  737. package/dist/core/compaction/compaction.d.ts.map +0 -1
  738. package/dist/core/compaction/compaction.js.map +0 -1
  739. package/dist/core/compaction/index.d.ts.map +0 -1
  740. package/dist/core/compaction/index.js.map +0 -1
  741. package/dist/core/compaction/utils.d.ts.map +0 -1
  742. package/dist/core/compaction/utils.js.map +0 -1
  743. package/dist/core/defaults.d.ts.map +0 -1
  744. package/dist/core/defaults.js.map +0 -1
  745. package/dist/core/diagnostics.d.ts.map +0 -1
  746. package/dist/core/diagnostics.js.map +0 -1
  747. package/dist/core/event-bus.d.ts.map +0 -1
  748. package/dist/core/event-bus.js.map +0 -1
  749. package/dist/core/exec.d.ts.map +0 -1
  750. package/dist/core/exec.js.map +0 -1
  751. package/dist/core/experimental.d.ts.map +0 -1
  752. package/dist/core/experimental.js.map +0 -1
  753. package/dist/core/export-html/ansi-to-html.d.ts.map +0 -1
  754. package/dist/core/export-html/ansi-to-html.js.map +0 -1
  755. package/dist/core/export-html/index.d.ts.map +0 -1
  756. package/dist/core/export-html/index.js.map +0 -1
  757. package/dist/core/export-html/tool-renderer.d.ts.map +0 -1
  758. package/dist/core/export-html/tool-renderer.js.map +0 -1
  759. package/dist/core/extensions/index.d.ts.map +0 -1
  760. package/dist/core/extensions/index.js.map +0 -1
  761. package/dist/core/extensions/loader.d.ts.map +0 -1
  762. package/dist/core/extensions/loader.js.map +0 -1
  763. package/dist/core/extensions/runner.d.ts.map +0 -1
  764. package/dist/core/extensions/runner.js.map +0 -1
  765. package/dist/core/extensions/types.d.ts.map +0 -1
  766. package/dist/core/extensions/types.js.map +0 -1
  767. package/dist/core/extensions/wrapper.d.ts.map +0 -1
  768. package/dist/core/extensions/wrapper.js.map +0 -1
  769. package/dist/core/footer-data-provider.d.ts.map +0 -1
  770. package/dist/core/footer-data-provider.js.map +0 -1
  771. package/dist/core/git-command.d.ts.map +0 -1
  772. package/dist/core/git-command.js.map +0 -1
  773. package/dist/core/http-dispatcher.d.ts.map +0 -1
  774. package/dist/core/http-dispatcher.js.map +0 -1
  775. package/dist/core/index.d.ts.map +0 -1
  776. package/dist/core/index.js.map +0 -1
  777. package/dist/core/keybindings.d.ts.map +0 -1
  778. package/dist/core/keybindings.js.map +0 -1
  779. package/dist/core/llama/client.d.ts.map +0 -1
  780. package/dist/core/llama/client.js.map +0 -1
  781. package/dist/core/llama/huggingface.d.ts.map +0 -1
  782. package/dist/core/llama/huggingface.js.map +0 -1
  783. package/dist/core/llama/index.d.ts.map +0 -1
  784. package/dist/core/llama/index.js.map +0 -1
  785. package/dist/core/llama/provider.d.ts.map +0 -1
  786. package/dist/core/llama/provider.js.map +0 -1
  787. package/dist/core/llama/ui.d.ts.map +0 -1
  788. package/dist/core/llama/ui.js.map +0 -1
  789. package/dist/core/messages.d.ts.map +0 -1
  790. package/dist/core/messages.js.map +0 -1
  791. package/dist/core/model-config.d.ts.map +0 -1
  792. package/dist/core/model-config.js.map +0 -1
  793. package/dist/core/model-registry.d.ts.map +0 -1
  794. package/dist/core/model-registry.js.map +0 -1
  795. package/dist/core/model-resolver.d.ts.map +0 -1
  796. package/dist/core/model-resolver.js.map +0 -1
  797. package/dist/core/model-runtime.d.ts.map +0 -1
  798. package/dist/core/model-runtime.js.map +0 -1
  799. package/dist/core/models-store.d.ts.map +0 -1
  800. package/dist/core/models-store.js.map +0 -1
  801. package/dist/core/output-guard.d.ts.map +0 -1
  802. package/dist/core/output-guard.js.map +0 -1
  803. package/dist/core/package-manager.d.ts.map +0 -1
  804. package/dist/core/package-manager.js.map +0 -1
  805. package/dist/core/package-manager.test.d.ts.map +0 -1
  806. package/dist/core/package-manager.test.js.map +0 -1
  807. package/dist/core/project-trust.d.ts.map +0 -1
  808. package/dist/core/project-trust.js.map +0 -1
  809. package/dist/core/prompt-templates.d.ts.map +0 -1
  810. package/dist/core/prompt-templates.js.map +0 -1
  811. package/dist/core/provider-attribution.d.ts.map +0 -1
  812. package/dist/core/provider-attribution.js.map +0 -1
  813. package/dist/core/provider-composer.d.ts.map +0 -1
  814. package/dist/core/provider-composer.js.map +0 -1
  815. package/dist/core/radius.d.ts.map +0 -1
  816. package/dist/core/radius.js.map +0 -1
  817. package/dist/core/remote-catalog-provider.d.ts.map +0 -1
  818. package/dist/core/remote-catalog-provider.js.map +0 -1
  819. package/dist/core/resolve-config-value.d.ts.map +0 -1
  820. package/dist/core/resolve-config-value.js.map +0 -1
  821. package/dist/core/resource-loader.d.ts.map +0 -1
  822. package/dist/core/resource-loader.js.map +0 -1
  823. package/dist/core/runtime-credentials.d.ts.map +0 -1
  824. package/dist/core/runtime-credentials.js.map +0 -1
  825. package/dist/core/sdk.d.ts.map +0 -1
  826. package/dist/core/sdk.js.map +0 -1
  827. package/dist/core/session-cwd.d.ts.map +0 -1
  828. package/dist/core/session-cwd.js.map +0 -1
  829. package/dist/core/session-manager.d.ts.map +0 -1
  830. package/dist/core/session-manager.js.map +0 -1
  831. package/dist/core/settings-manager-auto-handoff.test.d.ts.map +0 -1
  832. package/dist/core/settings-manager-auto-handoff.test.js.map +0 -1
  833. package/dist/core/settings-manager.d.ts.map +0 -1
  834. package/dist/core/settings-manager.js.map +0 -1
  835. package/dist/core/skills.d.ts.map +0 -1
  836. package/dist/core/skills.js.map +0 -1
  837. package/dist/core/slash-commands.d.ts.map +0 -1
  838. package/dist/core/slash-commands.js.map +0 -1
  839. package/dist/core/source-info.d.ts.map +0 -1
  840. package/dist/core/source-info.js.map +0 -1
  841. package/dist/core/system-prompt.d.ts.map +0 -1
  842. package/dist/core/system-prompt.js.map +0 -1
  843. package/dist/core/system-prompt.test.d.ts.map +0 -1
  844. package/dist/core/system-prompt.test.js.map +0 -1
  845. package/dist/core/telemetry.d.ts.map +0 -1
  846. package/dist/core/telemetry.js.map +0 -1
  847. package/dist/core/timings.d.ts.map +0 -1
  848. package/dist/core/timings.js.map +0 -1
  849. package/dist/core/tools/bash.d.ts.map +0 -1
  850. package/dist/core/tools/bash.js.map +0 -1
  851. package/dist/core/tools/edit-diff.d.ts.map +0 -1
  852. package/dist/core/tools/edit-diff.js.map +0 -1
  853. package/dist/core/tools/edit.d.ts.map +0 -1
  854. package/dist/core/tools/edit.js.map +0 -1
  855. package/dist/core/tools/file-mutation-queue.d.ts.map +0 -1
  856. package/dist/core/tools/file-mutation-queue.js.map +0 -1
  857. package/dist/core/tools/find.d.ts.map +0 -1
  858. package/dist/core/tools/find.js.map +0 -1
  859. package/dist/core/tools/grep.d.ts.map +0 -1
  860. package/dist/core/tools/grep.js.map +0 -1
  861. package/dist/core/tools/index.d.ts.map +0 -1
  862. package/dist/core/tools/index.js.map +0 -1
  863. package/dist/core/tools/ls.d.ts.map +0 -1
  864. package/dist/core/tools/ls.js.map +0 -1
  865. package/dist/core/tools/output-accumulator.d.ts.map +0 -1
  866. package/dist/core/tools/output-accumulator.js.map +0 -1
  867. package/dist/core/tools/path-utils.d.ts.map +0 -1
  868. package/dist/core/tools/path-utils.js.map +0 -1
  869. package/dist/core/tools/read.d.ts.map +0 -1
  870. package/dist/core/tools/read.js.map +0 -1
  871. package/dist/core/tools/render-utils.d.ts.map +0 -1
  872. package/dist/core/tools/render-utils.js.map +0 -1
  873. package/dist/core/tools/tool-definition-wrapper.d.ts.map +0 -1
  874. package/dist/core/tools/tool-definition-wrapper.js.map +0 -1
  875. package/dist/core/tools/truncate.d.ts.map +0 -1
  876. package/dist/core/tools/truncate.js.map +0 -1
  877. package/dist/core/tools/write.d.ts.map +0 -1
  878. package/dist/core/tools/write.js.map +0 -1
  879. package/dist/core/trust-manager.d.ts.map +0 -1
  880. package/dist/core/trust-manager.js.map +0 -1
  881. package/dist/core/usage-totals.d.ts.map +0 -1
  882. package/dist/core/usage-totals.js.map +0 -1
  883. package/dist/extensions/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  884. package/dist/extensions/pi-subagents/test/unit/slash-chain-groups.test.ts +0 -464
  885. package/dist/index.d.ts.map +0 -1
  886. package/dist/index.js.map +0 -1
  887. package/dist/main.d.ts.map +0 -1
  888. package/dist/main.js.map +0 -1
  889. package/dist/migrations.d.ts.map +0 -1
  890. package/dist/migrations.js.map +0 -1
  891. package/dist/modes/index.d.ts.map +0 -1
  892. package/dist/modes/index.js.map +0 -1
  893. package/dist/modes/interactive/components/armin.d.ts.map +0 -1
  894. package/dist/modes/interactive/components/armin.js.map +0 -1
  895. package/dist/modes/interactive/components/assistant-message.d.ts.map +0 -1
  896. package/dist/modes/interactive/components/assistant-message.js.map +0 -1
  897. package/dist/modes/interactive/components/bash-execution.d.ts.map +0 -1
  898. package/dist/modes/interactive/components/bash-execution.js.map +0 -1
  899. package/dist/modes/interactive/components/bordered-loader.d.ts.map +0 -1
  900. package/dist/modes/interactive/components/bordered-loader.js.map +0 -1
  901. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +0 -1
  902. package/dist/modes/interactive/components/branch-summary-message.js.map +0 -1
  903. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +0 -1
  904. package/dist/modes/interactive/components/compaction-summary-message.js.map +0 -1
  905. package/dist/modes/interactive/components/config-selector.d.ts.map +0 -1
  906. package/dist/modes/interactive/components/config-selector.js.map +0 -1
  907. package/dist/modes/interactive/components/countdown-timer.d.ts.map +0 -1
  908. package/dist/modes/interactive/components/countdown-timer.js.map +0 -1
  909. package/dist/modes/interactive/components/custom-editor.d.ts.map +0 -1
  910. package/dist/modes/interactive/components/custom-editor.js.map +0 -1
  911. package/dist/modes/interactive/components/custom-entry.d.ts.map +0 -1
  912. package/dist/modes/interactive/components/custom-entry.js.map +0 -1
  913. package/dist/modes/interactive/components/custom-message.d.ts.map +0 -1
  914. package/dist/modes/interactive/components/custom-message.js.map +0 -1
  915. package/dist/modes/interactive/components/daxnuts.d.ts.map +0 -1
  916. package/dist/modes/interactive/components/daxnuts.js.map +0 -1
  917. package/dist/modes/interactive/components/diff.d.ts.map +0 -1
  918. package/dist/modes/interactive/components/diff.js.map +0 -1
  919. package/dist/modes/interactive/components/dynamic-border.d.ts.map +0 -1
  920. package/dist/modes/interactive/components/dynamic-border.js.map +0 -1
  921. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +0 -1
  922. package/dist/modes/interactive/components/earendil-announcement.js.map +0 -1
  923. package/dist/modes/interactive/components/extension-editor.d.ts.map +0 -1
  924. package/dist/modes/interactive/components/extension-editor.js.map +0 -1
  925. package/dist/modes/interactive/components/extension-input.d.ts.map +0 -1
  926. package/dist/modes/interactive/components/extension-input.js.map +0 -1
  927. package/dist/modes/interactive/components/extension-selector.d.ts.map +0 -1
  928. package/dist/modes/interactive/components/extension-selector.js.map +0 -1
  929. package/dist/modes/interactive/components/first-time-setup.d.ts.map +0 -1
  930. package/dist/modes/interactive/components/first-time-setup.js.map +0 -1
  931. package/dist/modes/interactive/components/footer.d.ts.map +0 -1
  932. package/dist/modes/interactive/components/footer.js.map +0 -1
  933. package/dist/modes/interactive/components/index.d.ts.map +0 -1
  934. package/dist/modes/interactive/components/index.js.map +0 -1
  935. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +0 -1
  936. package/dist/modes/interactive/components/keybinding-hints.js.map +0 -1
  937. package/dist/modes/interactive/components/login-dialog.d.ts.map +0 -1
  938. package/dist/modes/interactive/components/login-dialog.js.map +0 -1
  939. package/dist/modes/interactive/components/model-selector.d.ts.map +0 -1
  940. package/dist/modes/interactive/components/model-selector.js.map +0 -1
  941. package/dist/modes/interactive/components/oauth-selector.d.ts.map +0 -1
  942. package/dist/modes/interactive/components/oauth-selector.js.map +0 -1
  943. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +0 -1
  944. package/dist/modes/interactive/components/scoped-models-selector.js.map +0 -1
  945. package/dist/modes/interactive/components/session-selector-search.d.ts.map +0 -1
  946. package/dist/modes/interactive/components/session-selector-search.js.map +0 -1
  947. package/dist/modes/interactive/components/session-selector.d.ts.map +0 -1
  948. package/dist/modes/interactive/components/session-selector.js.map +0 -1
  949. package/dist/modes/interactive/components/settings-selector.d.ts.map +0 -1
  950. package/dist/modes/interactive/components/settings-selector.js.map +0 -1
  951. package/dist/modes/interactive/components/show-images-selector.d.ts.map +0 -1
  952. package/dist/modes/interactive/components/show-images-selector.js.map +0 -1
  953. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +0 -1
  954. package/dist/modes/interactive/components/skill-invocation-message.js.map +0 -1
  955. package/dist/modes/interactive/components/status-indicator.d.ts.map +0 -1
  956. package/dist/modes/interactive/components/status-indicator.js.map +0 -1
  957. package/dist/modes/interactive/components/theme-selector.d.ts.map +0 -1
  958. package/dist/modes/interactive/components/theme-selector.js.map +0 -1
  959. package/dist/modes/interactive/components/thinking-selector.d.ts.map +0 -1
  960. package/dist/modes/interactive/components/thinking-selector.js.map +0 -1
  961. package/dist/modes/interactive/components/tool-execution.d.ts.map +0 -1
  962. package/dist/modes/interactive/components/tool-execution.js.map +0 -1
  963. package/dist/modes/interactive/components/tree-selector.d.ts.map +0 -1
  964. package/dist/modes/interactive/components/tree-selector.js.map +0 -1
  965. package/dist/modes/interactive/components/trust-selector.d.ts.map +0 -1
  966. package/dist/modes/interactive/components/trust-selector.js.map +0 -1
  967. package/dist/modes/interactive/components/user-message-selector.d.ts.map +0 -1
  968. package/dist/modes/interactive/components/user-message-selector.js.map +0 -1
  969. package/dist/modes/interactive/components/user-message.d.ts.map +0 -1
  970. package/dist/modes/interactive/components/user-message.js.map +0 -1
  971. package/dist/modes/interactive/components/visual-truncate.d.ts.map +0 -1
  972. package/dist/modes/interactive/components/visual-truncate.js.map +0 -1
  973. package/dist/modes/interactive/external-editor.d.ts.map +0 -1
  974. package/dist/modes/interactive/external-editor.js.map +0 -1
  975. package/dist/modes/interactive/interactive-mode.d.ts.map +0 -1
  976. package/dist/modes/interactive/interactive-mode.js.map +0 -1
  977. package/dist/modes/interactive/model-search.d.ts.map +0 -1
  978. package/dist/modes/interactive/model-search.js.map +0 -1
  979. package/dist/modes/interactive/theme/theme-controller.d.ts.map +0 -1
  980. package/dist/modes/interactive/theme/theme-controller.js.map +0 -1
  981. package/dist/modes/interactive/theme/theme.d.ts.map +0 -1
  982. package/dist/modes/interactive/theme/theme.js.map +0 -1
  983. package/dist/modes/print-mode.d.ts.map +0 -1
  984. package/dist/modes/print-mode.js.map +0 -1
  985. package/dist/modes/rpc/jsonl.d.ts.map +0 -1
  986. package/dist/modes/rpc/jsonl.js.map +0 -1
  987. package/dist/modes/rpc/rpc-client.d.ts.map +0 -1
  988. package/dist/modes/rpc/rpc-client.js.map +0 -1
  989. package/dist/modes/rpc/rpc-mode.d.ts.map +0 -1
  990. package/dist/modes/rpc/rpc-mode.js.map +0 -1
  991. package/dist/modes/rpc/rpc-types.d.ts.map +0 -1
  992. package/dist/modes/rpc/rpc-types.js.map +0 -1
  993. package/dist/package-manager-cli.d.ts.map +0 -1
  994. package/dist/package-manager-cli.js.map +0 -1
  995. package/dist/rpc-entry.d.ts.map +0 -1
  996. package/dist/rpc-entry.js.map +0 -1
  997. package/dist/utils/ansi.d.ts.map +0 -1
  998. package/dist/utils/ansi.js.map +0 -1
  999. package/dist/utils/changelog.d.ts.map +0 -1
  1000. package/dist/utils/changelog.js.map +0 -1
  1001. package/dist/utils/child-process.d.ts.map +0 -1
  1002. package/dist/utils/child-process.js.map +0 -1
  1003. package/dist/utils/clipboard-image.d.ts.map +0 -1
  1004. package/dist/utils/clipboard-image.js.map +0 -1
  1005. package/dist/utils/clipboard-native.d.ts.map +0 -1
  1006. package/dist/utils/clipboard-native.js.map +0 -1
  1007. package/dist/utils/clipboard.d.ts.map +0 -1
  1008. package/dist/utils/clipboard.js.map +0 -1
  1009. package/dist/utils/deprecation.d.ts.map +0 -1
  1010. package/dist/utils/deprecation.js.map +0 -1
  1011. package/dist/utils/exif-orientation.d.ts.map +0 -1
  1012. package/dist/utils/exif-orientation.js.map +0 -1
  1013. package/dist/utils/frontmatter.d.ts.map +0 -1
  1014. package/dist/utils/frontmatter.js.map +0 -1
  1015. package/dist/utils/fs-watch.d.ts.map +0 -1
  1016. package/dist/utils/fs-watch.js.map +0 -1
  1017. package/dist/utils/git.d.ts.map +0 -1
  1018. package/dist/utils/git.js.map +0 -1
  1019. package/dist/utils/html.d.ts.map +0 -1
  1020. package/dist/utils/html.js.map +0 -1
  1021. package/dist/utils/image-convert.d.ts.map +0 -1
  1022. package/dist/utils/image-convert.js.map +0 -1
  1023. package/dist/utils/image-process.d.ts.map +0 -1
  1024. package/dist/utils/image-process.js.map +0 -1
  1025. package/dist/utils/image-resize-core.d.ts.map +0 -1
  1026. package/dist/utils/image-resize-core.js.map +0 -1
  1027. package/dist/utils/image-resize-worker.d.ts.map +0 -1
  1028. package/dist/utils/image-resize-worker.js.map +0 -1
  1029. package/dist/utils/image-resize.d.ts.map +0 -1
  1030. package/dist/utils/image-resize.js.map +0 -1
  1031. package/dist/utils/json.d.ts.map +0 -1
  1032. package/dist/utils/json.js.map +0 -1
  1033. package/dist/utils/mime.d.ts.map +0 -1
  1034. package/dist/utils/mime.js.map +0 -1
  1035. package/dist/utils/open-browser.d.ts.map +0 -1
  1036. package/dist/utils/open-browser.js.map +0 -1
  1037. package/dist/utils/paths.d.ts.map +0 -1
  1038. package/dist/utils/paths.js.map +0 -1
  1039. package/dist/utils/photon.d.ts.map +0 -1
  1040. package/dist/utils/photon.js.map +0 -1
  1041. package/dist/utils/pi-user-agent.d.ts.map +0 -1
  1042. package/dist/utils/pi-user-agent.js.map +0 -1
  1043. package/dist/utils/shell.d.ts.map +0 -1
  1044. package/dist/utils/shell.js.map +0 -1
  1045. package/dist/utils/sleep.d.ts.map +0 -1
  1046. package/dist/utils/sleep.js.map +0 -1
  1047. package/dist/utils/syntax-highlight.d.ts.map +0 -1
  1048. package/dist/utils/syntax-highlight.js.map +0 -1
  1049. package/dist/utils/thinking-tags.d.ts.map +0 -1
  1050. package/dist/utils/thinking-tags.js.map +0 -1
  1051. package/dist/utils/tools-manager.d.ts.map +0 -1
  1052. package/dist/utils/tools-manager.js.map +0 -1
  1053. package/dist/utils/version-check.d.ts.map +0 -1
  1054. package/dist/utils/version-check.js.map +0 -1
  1055. package/dist/utils/windows-self-update.d.ts.map +0 -1
  1056. package/dist/utils/windows-self-update.js.map +0 -1
@@ -3,21 +3,14 @@ import { describe, it } from "node:test";
3
3
 
4
4
  import {
5
5
  SUBAGENT_DELEGATION_CANCEL_EVENT,
6
- SUBAGENT_DELEGATION_PROTOCOL_VERSION,
7
- SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION,
8
6
  SUBAGENT_DELEGATION_REQUEST_EVENT,
9
7
  SUBAGENT_DELEGATION_RESPONSE_EVENT,
10
8
  SUBAGENT_DELEGATION_STARTED_EVENT,
11
9
  SUBAGENT_DELEGATION_UPDATE_EVENT,
12
- type SubagentDelegationAcceptance,
13
10
  type SubagentDelegationRequest,
14
11
  type SubagentDelegationResponse,
15
- type SubagentDelegationV2InvalidResponse,
16
- type SubagentDelegationV2Request,
17
- type SubagentDelegationV2Response,
18
12
  } from "../../src/api/delegation.ts";
19
13
  import { parseSubagentDelegationRequest } from "../../src/slash/delegation-request.ts";
20
- import { toSubagentDelegationExecutionParams } from "../../src/slash/delegation-adapters.ts";
21
14
  import {
22
15
  registerPromptTemplateDelegationBridge,
23
16
  type PromptTemplateBridgeEvents,
@@ -51,22 +44,11 @@ function tick(): Promise<void> {
51
44
  return new Promise((resolve) => setImmediate(resolve));
52
45
  }
53
46
 
54
- const acceptance: SubagentDelegationAcceptance = {
55
- level: "verified",
56
- criteria: [{ id: "criterion-1", must: "Verify the result", evidence: ["validation-output"], severity: "required" }],
57
- evidence: ["commands-run", "validation-output"],
58
- verify: [{ id: "test", command: "npm test", timeoutMs: 1_000, cwd: "/repo", env: { CI: "true" }, allowFailure: false }],
59
- review: { agent: "reviewer", focus: "correctness", required: false },
60
- stopRules: ["Stop on verification failure"],
61
- reason: "Explicit verification contract",
62
- };
63
-
64
- const v2Request: SubagentDelegationV2Request = {
65
- version: 2,
47
+ const request: SubagentDelegationRequest = {
66
48
  requestId: "attempt-1",
67
49
  ownerRunId: "owner-1",
68
50
  nodeId: "node-1",
69
- agent: "reviewer",
51
+ agent: "commentator",
70
52
  task: "Review evidence",
71
53
  context: "fresh",
72
54
  cwd: "/repo",
@@ -80,29 +62,8 @@ const v2Request: SubagentDelegationV2Request = {
80
62
  result: { kind: "structured", schema: { type: "object", properties: { ok: { type: "boolean" } } } },
81
63
  };
82
64
 
83
- const request: SubagentDelegationRequest = {
84
- version: 1,
85
- requestId: "delegation-1",
86
- agent: "reviewer",
87
- task: "Review evidence",
88
- context: "fresh",
89
- cwd: "/repo",
90
- model: "openai/gpt-5",
91
- timeoutMs: 1_000,
92
- turnBudget: { maxTurns: 4, graceTurns: 1 },
93
- toolBudget: { soft: 3, hard: 5, block: "*" },
94
- skill: ["review"],
95
- output: "result.md",
96
- outputMode: "file-only",
97
- outputSchema: { type: "object", properties: { ok: { type: "boolean" } } },
98
- agentContract: { version: 1 },
99
- acceptance: "checked",
100
- artifacts: true,
101
- };
102
-
103
65
  describe("public subagent delegation contract", () => {
104
66
  it("uses the existing prompt-template event family as the only transport", () => {
105
- assert.equal(SUBAGENT_DELEGATION_PROTOCOL_VERSION, 1);
106
67
  assert.equal(SUBAGENT_DELEGATION_REQUEST_EVENT, "prompt-template:subagent:request");
107
68
  assert.equal(SUBAGENT_DELEGATION_STARTED_EVENT, "prompt-template:subagent:started");
108
69
  assert.equal(SUBAGENT_DELEGATION_UPDATE_EVENT, "prompt-template:subagent:update");
@@ -110,28 +71,27 @@ describe("public subagent delegation contract", () => {
110
71
  assert.equal(SUBAGENT_DELEGATION_CANCEL_EVENT, "prompt-template:subagent:cancel");
111
72
  });
112
73
 
113
- it("strictly parses the complete v2 request and enforces its independent allowlists and bounds", () => {
114
- assert.equal(SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION, 2);
115
- assert.deepEqual(parseSubagentDelegationRequest(v2Request), { ok: true, request: v2Request });
74
+ it("strictly parses the structured owned-leaf request", () => {
75
+ assert.deepEqual(parseSubagentDelegationRequest(request), { ok: true, request });
116
76
  const malformed = [
117
- [{ ...v2Request, ownerRunId: "bad\nowner" }, /ownerRunId.*256 characters without newlines/],
118
- [{ ...v2Request, nodeId: "x".repeat(257) }, /nodeId.*256 characters without newlines/],
119
- [{ ...v2Request, thinking: "extreme" }, /thinking must be one of/],
120
- [{ ...v2Request, output: false }, /Unsupported delegation field: output/],
121
- [{ ...v2Request, outputMode: "inline" }, /Unsupported delegation field: outputMode/],
122
- [{ ...v2Request, agentContract: { version: 1 } }, /Unsupported delegation field: agentContract/],
123
- [{ ...v2Request, acceptance: false }, /Unsupported delegation field: acceptance/],
124
- [{ ...v2Request, result: { kind: "text", schema: {} } }, /result.schema is not supported/],
125
- [{ ...v2Request, result: { kind: "structured" } }, /result.schema must be a JSON Schema object/],
126
- [{ ...v2Request, task: "é".repeat(524_289) }, /task exceeds 1 MiB/],
127
- [{ ...v2Request, cwd: "é".repeat(16_385) }, /cwd exceeds 32 KiB/],
128
- [{ ...v2Request, agent: "é".repeat(513) }, /agent exceeds 1 KiB/],
129
- [{ ...v2Request, model: "é".repeat(513) }, /model exceeds 1 KiB/],
130
- [{ ...v2Request, skill: "é".repeat(513) }, /skill entry exceeds 1 KiB/],
131
- [{ ...v2Request, skill: Array.from({ length: 257 }, () => "x") }, /skill supports at most 256 entries/],
132
- [{ ...v2Request, skill: Array.from({ length: 256 }, () => "x".repeat(257)) }, /skill entries exceed 64 KiB in aggregate/],
133
- [{ ...v2Request, result: { kind: "structured", schema: { value: "x".repeat(65_536) } } }, /result.schema exceeds 64 KiB/],
134
- [{ ...v2Request, timeoutMs: 2_147_483_648 }, /timeoutMs must be <= 2147483647 for delegation v2/],
77
+ [{ ...request, version: 99 }, /Unsupported delegation field: version/],
78
+ [{ ...request, ownerRunId: "bad\nowner" }, /ownerRunId.*256 characters without newlines/],
79
+ [{ ...request, nodeId: "x".repeat(257) }, /nodeId.*256 characters without newlines/],
80
+ [{ ...request, thinking: "extreme" }, /thinking must be one of/],
81
+ [{ ...request, output: false }, /Unsupported delegation field: output/],
82
+ [{ ...request, acceptance: false }, /Unsupported delegation field: acceptance/],
83
+ [{ ...request, agentContract: { version: 1 } }, /Unsupported delegation field: agentContract/],
84
+ [{ ...request, result: { kind: "text", schema: {} } }, /result.schema is not supported/],
85
+ [{ ...request, result: { kind: "structured" } }, /result.schema must be a JSON Schema object/],
86
+ [{ ...request, task: "é".repeat(524_289) }, /task exceeds 1 MiB/],
87
+ [{ ...request, cwd: "é".repeat(16_385) }, /cwd exceeds 32 KiB/],
88
+ [{ ...request, agent: "é".repeat(513) }, /agent exceeds 1 KiB/],
89
+ [{ ...request, model: "é".repeat(513) }, /model exceeds 1 KiB/],
90
+ [{ ...request, skill: "é".repeat(513) }, /skill entry exceeds 1 KiB/],
91
+ [{ ...request, skill: Array.from({ length: 257 }, () => "x") }, /skill supports at most 256 entries/],
92
+ [{ ...request, skill: Array.from({ length: 256 }, () => "x".repeat(257)) }, /skill entries exceed 64 KiB in aggregate/],
93
+ [{ ...request, result: { kind: "structured", schema: { value: "x".repeat(65_536) } } }, /result.schema exceeds 64 KiB/],
94
+ [{ ...request, timeoutMs: 2_147_483_648 }, /timeoutMs must be <= 2147483647/],
135
95
  ] as const;
136
96
  for (const [input, expected] of malformed) {
137
97
  const parsed = parseSubagentDelegationRequest(input);
@@ -140,24 +100,20 @@ describe("public subagent delegation contract", () => {
140
100
  }
141
101
  });
142
102
 
143
- it("accepts an exact zero tool budget only for v2", () => {
103
+ it("accepts exact zero tool budgets for structured delegated leaves", () => {
144
104
  const zeroBudget = { hard: 0, block: "*" as const };
145
- const parsedV2 = parseSubagentDelegationRequest({ ...v2Request, toolBudget: zeroBudget });
146
- assert.equal(parsedV2.ok, true);
147
- if (parsedV2.ok) assert.deepEqual(parsedV2.request.toolBudget, zeroBudget);
148
-
149
- const parsedV1 = parseSubagentDelegationRequest({ ...request, toolBudget: zeroBudget });
150
- assert.equal(parsedV1.ok, false);
151
- if (!parsedV1.ok) assert.equal(parsedV1.error, "toolBudget.hard must be an integer >= 1.");
105
+ const parsed = parseSubagentDelegationRequest({ ...request, toolBudget: zeroBudget });
106
+ assert.equal(parsed.ok, true);
107
+ if (parsed.ok) assert.deepEqual(parsed.request.toolBudget, zeroBudget);
152
108
  for (const soft of [0, 1]) {
153
- assert.equal(parseSubagentDelegationRequest({ ...v2Request, toolBudget: { ...zeroBudget, soft } }).ok, false);
109
+ assert.equal(parseSubagentDelegationRequest({ ...request, toolBudget: { ...zeroBudget, soft } }).ok, false);
154
110
  }
155
111
  });
156
112
 
157
- it("rejects non-JSON v2 schemas without executing toJSON hooks", () => {
113
+ it("rejects non-JSON schemas without executing toJSON hooks", () => {
158
114
  let calls = 0;
159
115
  const parsed = parseSubagentDelegationRequest({
160
- ...v2Request,
116
+ ...request,
161
117
  result: {
162
118
  kind: "structured",
163
119
  schema: { toJSON: () => { calls++; return {}; } },
@@ -168,40 +124,7 @@ describe("public subagent delegation contract", () => {
168
124
  assert.equal(calls, 0);
169
125
  });
170
126
 
171
- it("strictly parses the complete v1 request", () => {
172
- assert.deepEqual(parseSubagentDelegationRequest(request), { ok: true, request });
173
- const requestWithAcceptance = { ...request, acceptance };
174
- assert.deepEqual(parseSubagentDelegationRequest(requestWithAcceptance), { ok: true, request: requestWithAcceptance });
175
- });
176
-
177
- it("rejects unsupported versions, unknown fields, aliases, and malformed controls", () => {
178
- const malformed = [
179
- [{ ...request, version: 2 }, /Unsupported delegation protocol version/],
180
- [{ ...request, tools: ["write"] }, /Unsupported delegation field: tools/],
181
- [{ ...request, maxRuntimeMs: 1_000 }, /Unsupported delegation field: maxRuntimeMs/],
182
- [{ ...request, timeoutMs: 0 }, /timeoutMs must be an integer >= 1/],
183
- [{ ...request, turnBudget: { maxTurns: 0 } }, /turnBudget.maxTurns/],
184
- [{ ...request, turnBudget: { maxTurns: 1, extra: true } }, /turnBudget.extra is not supported/],
185
- [{ ...request, toolBudget: { hard: 1, soft: 2 } }, /toolBudget.soft must be <=/],
186
- [{ ...request, toolBudget: { hard: 1, extra: true } }, /toolBudget.extra is not supported/],
187
- [{ ...request, skill: [] }, /skill must/],
188
- [{ ...request, output: "" }, /output must/],
189
- [{ ...request, output: false, outputMode: "file-only" }, /outputMode.*output.*path/],
190
- [{ ...request, outputSchema: [] }, /outputSchema must be a JSON Schema object/],
191
- [{ ...request, agentContract: { version: 2 } }, /agentContract must be \{ version: 1 \}/],
192
- [{ ...request, agentContract: { version: 1, extra: true } }, /agentContract must be \{ version: 1 \}/],
193
- [{ ...request, acceptance: "none" }, /level "none" requires a reason/],
194
- [{ ...request, acceptance: { level: "none" } }, /reason is required/],
195
- [{ ...request, artifacts: "yes" }, /artifacts must be a boolean/],
196
- ] as const;
197
- for (const [input, expected] of malformed) {
198
- const parsed = parseSubagentDelegationRequest(input);
199
- assert.equal(parsed.ok, false);
200
- if (!parsed.ok) assert.match(parsed.error, expected);
201
- }
202
- });
203
-
204
- it("runs v2 through the versioned executor and preserves literal text with full effective metadata", async () => {
127
+ it("runs structured delegation through the concurrent executor and preserves literal text metadata", async () => {
205
128
  const events = new FakeEvents();
206
129
  let ordinaryCalls = 0;
207
130
  let observedParams: Record<string, unknown> | undefined;
@@ -212,15 +135,15 @@ describe("public subagent delegation contract", () => {
212
135
  ordinaryCalls++;
213
136
  return { details: { mode: "single", results: [] } };
214
137
  },
215
- executeVersioned: async (_id, params, _signal, _ctx, onUpdate) => {
138
+ executeStructured: async (_id, params, _signal, _ctx, onUpdate) => {
216
139
  observedParams = params as unknown as Record<string, unknown>;
217
- onUpdate({ details: { mode: "single", runId: "run-v2", results: [{ agent: "reviewer", model: "openai/gpt-5", thinking: "high" }], progress: [{ currentTool: "read" }] } });
140
+ onUpdate({ details: { mode: "single", runId: "run-1", results: [{ agent: "commentator", model: "openai/gpt-5", thinking: "high" }], progress: [{ currentTool: "read" }] } });
218
141
  return {
219
142
  details: {
220
143
  mode: "single",
221
- runId: "run-v2",
144
+ runId: "run-1",
222
145
  results: [{
223
- agent: "reviewer",
146
+ agent: "commentator",
224
147
  exitCode: 0,
225
148
  model: "openai/gpt-5",
226
149
  thinking: "high",
@@ -233,31 +156,30 @@ describe("public subagent delegation contract", () => {
233
156
  };
234
157
  },
235
158
  });
236
- const textRequest = { ...v2Request, result: { kind: "text" as const } };
159
+ const textRequest = { ...request, result: { kind: "text" as const } };
237
160
  const startedPromise = once(events, SUBAGENT_DELEGATION_STARTED_EVENT);
238
161
  const updatePromise = once(events, SUBAGENT_DELEGATION_UPDATE_EVENT);
239
162
  const responsePromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
240
163
  events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, textRequest);
241
- assert.deepEqual(await startedPromise, { version: 2, requestId: "attempt-1", ownerRunId: "owner-1", nodeId: "node-1" });
242
- assert.deepEqual(await updatePromise, { version: 2, requestId: "attempt-1", ownerRunId: "owner-1", nodeId: "node-1", runId: "run-v2", currentTool: "read", model: "openai/gpt-5" });
164
+ assert.deepEqual(await startedPromise, { requestId: "attempt-1", ownerRunId: "owner-1", nodeId: "node-1" });
165
+ assert.deepEqual(await updatePromise, { requestId: "attempt-1", ownerRunId: "owner-1", nodeId: "node-1", runId: "run-1", currentTool: "read", model: "openai/gpt-5" });
243
166
  assert.deepEqual(await responsePromise, {
244
- version: 2,
245
167
  requestId: "attempt-1",
246
168
  ownerRunId: "owner-1",
247
169
  nodeId: "node-1",
248
170
  status: "completed",
249
- runId: "run-v2",
250
- agent: "reviewer",
171
+ runId: "run-1",
172
+ agent: "commentator",
251
173
  model: "openai/gpt-5",
252
174
  thinking: "high",
253
175
  exitCode: 0,
254
176
  launchContractDigest: "launch-contract-digest",
255
177
  result: { kind: "text", text: '{"looks":"json"}' },
256
178
  usage: { input: 2, output: 3, cacheRead: 4, cacheWrite: 5, cost: 0.01, turns: 2, toolCalls: 6, durationMs: 7 },
257
- } satisfies SubagentDelegationV2Response);
179
+ } satisfies SubagentDelegationResponse);
258
180
  assert.equal(ordinaryCalls, 0);
259
181
  assert.deepEqual(observedParams, {
260
- agent: "reviewer",
182
+ agent: "commentator",
261
183
  task: "Review evidence",
262
184
  context: "fresh",
263
185
  cwd: "/repo",
@@ -279,7 +201,7 @@ describe("public subagent delegation contract", () => {
279
201
  bridge.dispose();
280
202
  });
281
203
 
282
- it("projects structured v2 values and fails missing or oversized captures", async () => {
204
+ it("projects structured values and fails missing or oversized captures", async () => {
283
205
  const cases = [
284
206
  [{ ok: true }, "completed", { kind: "structured", value: { ok: true } }],
285
207
  [undefined, "failed", undefined],
@@ -290,12 +212,12 @@ describe("public subagent delegation contract", () => {
290
212
  const bridge = registerPromptTemplateDelegationBridge({
291
213
  events,
292
214
  getContext: () => ({ cwd: "/repo" }),
293
- execute: async () => { throw new Error("ordinary executor must remain separate"); },
294
- executeVersioned: async () => ({
215
+ execute: async () => { throw new Error("legacy executor must remain separate"); },
216
+ executeStructured: async () => ({
295
217
  details: {
296
218
  mode: "single",
297
219
  results: [{
298
- agent: "reviewer",
220
+ agent: "commentator",
299
221
  exitCode: 0,
300
222
  ...(structuredOutput === undefined ? {} : { structuredOutput }),
301
223
  usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 1 },
@@ -304,8 +226,8 @@ describe("public subagent delegation contract", () => {
304
226
  }),
305
227
  });
306
228
  const responsePromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
307
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...v2Request, requestId: `structured-${expectedStatus}-${Math.random()}` });
308
- const response = await responsePromise as SubagentDelegationV2Response;
229
+ events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: `structured-${expectedStatus}-${Math.random()}` });
230
+ const response = await responsePromise as SubagentDelegationResponse;
309
231
  assert.equal(response.status, expectedStatus);
310
232
  assert.deepEqual(response.result, expectedResult);
311
233
  if (expectedStatus === "failed") assert.match(response.error ?? "", /structured result/);
@@ -313,91 +235,44 @@ describe("public subagent delegation contract", () => {
313
235
  }
314
236
  });
315
237
 
316
- it("rejects non-JSON structured results without executing toJSON hooks", async () => {
317
- let calls = 0;
318
- const events = new FakeEvents();
319
- const bridge = registerPromptTemplateDelegationBridge({
320
- events,
321
- getContext: () => ({ cwd: "/repo" }),
322
- execute: async () => { throw new Error("ordinary executor must remain separate"); },
323
- executeVersioned: async () => ({
324
- details: {
325
- mode: "single",
326
- results: [{
327
- agent: "reviewer",
328
- exitCode: 0,
329
- structuredOutput: { toJSON: () => { calls++; return {}; } },
330
- usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 1 },
331
- }],
332
- },
333
- }),
334
- });
335
- const responsePromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
336
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...v2Request, requestId: "unsafe-structured" });
337
- const response = await responsePromise as SubagentDelegationV2Response;
338
- assert.equal(response.status, "failed");
339
- assert.match(response.error ?? "", /structured result is not plain JSON data/);
340
- assert.equal(calls, 0);
341
- bridge.dispose();
342
- });
343
-
344
- it("rejects v2 text results exceeding 1 MiB when UTF-8 encoded", async () => {
345
- const events = new FakeEvents();
346
- const bridge = registerPromptTemplateDelegationBridge({
347
- events,
348
- getContext: () => ({ cwd: "/repo" }),
349
- execute: async () => { throw new Error("ordinary executor must remain separate"); },
350
- executeVersioned: async () => ({
351
- details: { mode: "single", results: [{ agent: "reviewer", exitCode: 0, finalOutput: "é".repeat(524_289) }] },
352
- }),
353
- });
354
- const responsePromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
355
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...v2Request, requestId: "oversized-text", result: { kind: "text" } });
356
- const response = await responsePromise as SubagentDelegationV2Response;
357
- assert.equal(response.status, "failed");
358
- assert.match(response.error ?? "", /text result exceeds 1 MiB/);
359
- assert.equal("result" in response, false);
360
- bridge.dispose();
361
- });
362
-
363
- it("isolates v2 logical-node ownership, exact cancellation, pre-cancellation, and reuse", async () => {
238
+ it("isolates logical-node ownership, exact cancellation, pre-cancellation, and reuse", async () => {
364
239
  const events = new FakeEvents();
365
240
  const releases = new Map<string, () => void>();
366
- const responses: SubagentDelegationV2Response[] = [];
367
- events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => responses.push(payload as SubagentDelegationV2Response));
241
+ const responses: SubagentDelegationResponse[] = [];
242
+ events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => responses.push(payload as SubagentDelegationResponse));
368
243
  const bridge = registerPromptTemplateDelegationBridge({
369
244
  events,
370
245
  getContext: () => ({ cwd: "/repo" }),
371
- execute: async () => { throw new Error("ordinary executor must remain separate"); },
372
- executeVersioned: async (id, params, signal) => await new Promise((resolve, reject) => {
246
+ execute: async () => { throw new Error("legacy executor must remain separate"); },
247
+ executeStructured: async (id, params, signal) => await new Promise((resolve, reject) => {
373
248
  releases.set(id, () => resolve({ details: { mode: "single", results: [{ agent: params.agent, exitCode: 0, finalOutput: id, usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 1 } }] } }));
374
249
  signal.addEventListener("abort", () => reject(new Error("aborted")), { once: true });
375
250
  }),
376
251
  });
377
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...v2Request, requestId: "owner-a", result: { kind: "text" } });
378
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...v2Request, requestId: "owner-b", result: { kind: "text" } });
379
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...v2Request, requestId: "owner-b", result: { kind: "text" } });
380
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...v2Request, requestId: "other-node", nodeId: "node-2", result: { kind: "text" } });
252
+ events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "owner-a", result: { kind: "text" } });
253
+ events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "owner-b", result: { kind: "text" } });
254
+ events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "owner-b", result: { kind: "text" } });
255
+ events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "other-node", nodeId: "node-2", result: { kind: "text" } });
381
256
  while (!releases.has("owner-a") || !releases.has("other-node")) await tick();
382
257
  await tick();
383
258
  assert.equal(responses.find((entry) => entry.requestId === "owner-b")?.status, "duplicate_node");
384
259
  assert.equal(responses.filter((entry) => entry.requestId === "owner-b").length, 1);
385
- events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { version: 2, requestId: "owner-a", ownerRunId: "wrong", nodeId: "node-1" });
386
- events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { version: 2, requestId: "owner-a", ownerRunId: "owner-1", nodeId: "wrong" });
260
+ events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { requestId: "owner-a", ownerRunId: "wrong", nodeId: "node-1" });
261
+ events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { requestId: "owner-a", ownerRunId: "owner-1", nodeId: "wrong" });
387
262
  await tick();
388
263
  assert.equal(responses.some((entry) => entry.requestId === "owner-a"), false);
389
- events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { version: 2, requestId: "owner-a", ownerRunId: "owner-1", nodeId: "node-1" });
264
+ events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { requestId: "owner-a", ownerRunId: "owner-1", nodeId: "node-1" });
390
265
  while (!responses.some((entry) => entry.requestId === "owner-a")) await tick();
391
266
  assert.equal(responses.find((entry) => entry.requestId === "owner-a")?.status, "cancelled");
392
267
  releases.get("other-node")?.();
393
268
  while (!responses.some((entry) => entry.requestId === "other-node")) await tick();
394
269
 
395
- events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { version: 2, requestId: "pre", ownerRunId: "owner-1", nodeId: "node-1" });
396
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...v2Request, requestId: "pre", result: { kind: "text" } });
270
+ events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { requestId: "pre", ownerRunId: "owner-1", nodeId: "node-1" });
271
+ events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "pre", result: { kind: "text" } });
397
272
  while (!responses.some((entry) => entry.requestId === "pre")) await tick();
398
273
  assert.equal(responses.find((entry) => entry.requestId === "pre")?.status, "cancelled");
399
274
 
400
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...v2Request, requestId: "reuse", result: { kind: "text" } });
275
+ events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "reuse", result: { kind: "text" } });
401
276
  while (!releases.has("reuse")) await tick();
402
277
  releases.get("reuse")?.();
403
278
  while (!responses.some((entry) => entry.requestId === "reuse")) await tick();
@@ -405,25 +280,35 @@ describe("public subagent delegation contract", () => {
405
280
  bridge.dispose();
406
281
  });
407
282
 
408
- it("keys concurrent v2 attempts and retransmissions by the full identity tuple", async () => {
283
+ it("keys concurrent structured attempts and retransmissions by the full identity tuple", async () => {
409
284
  const events = new FakeEvents();
410
285
  const releases = new Map<string, () => void>();
411
- const responses: SubagentDelegationV2Response[] = [];
286
+ const responses: SubagentDelegationResponse[] = [];
412
287
  let executeCalls = 0;
413
- events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => responses.push(payload as SubagentDelegationV2Response));
288
+ events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => responses.push(payload as SubagentDelegationResponse));
414
289
  const bridge = registerPromptTemplateDelegationBridge({
415
290
  events,
416
291
  getContext: () => ({ cwd: "/repo" }),
417
- execute: async () => { throw new Error("ordinary executor must remain separate"); },
418
- executeVersioned: async (_id, params) => {
292
+ execute: async () => { throw new Error("legacy executor must remain separate"); },
293
+ executeStructured: async (_id, params) => {
419
294
  executeCalls++;
420
295
  if (typeof params.task !== "string") throw new Error("expected a single delegated task");
421
296
  const task = params.task;
422
297
  await new Promise<void>((resolve) => releases.set(task, resolve));
423
- return { details: { mode: "single", results: [{ agent: params.agent, exitCode: 0, finalOutput: task }] } };
298
+ return {
299
+ details: {
300
+ mode: "single",
301
+ results: [{
302
+ agent: params.agent,
303
+ exitCode: 0,
304
+ finalOutput: task,
305
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 1 },
306
+ }],
307
+ },
308
+ };
424
309
  },
425
310
  });
426
- const first = { ...v2Request, requestId: "shared-attempt", task: "first", result: { kind: "text" as const } };
311
+ const first = { ...request, requestId: "shared-attempt", task: "first", result: { kind: "text" as const } };
427
312
  const second = { ...first, ownerRunId: "owner-2", nodeId: "node-2", task: "second" };
428
313
  events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, first);
429
314
  events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, second);
@@ -434,7 +319,7 @@ describe("public subagent delegation contract", () => {
434
319
  releases.get("first")?.();
435
320
  releases.get("second")?.();
436
321
  while (responses.length < 2) await tick();
437
- assert.deepEqual(responses.map(({ ownerRunId, nodeId, status }) => ({ ownerRunId, nodeId, status })).sort((a, b) => (a.ownerRunId ?? "").localeCompare(b.ownerRunId ?? "")), [
322
+ assert.deepEqual(responses.map(({ ownerRunId, nodeId, status }) => ({ ownerRunId, nodeId, status })).sort((a, b) => a.ownerRunId.localeCompare(b.ownerRunId)), [
438
323
  { ownerRunId: "owner-1", nodeId: "node-1", status: "completed" },
439
324
  { ownerRunId: "owner-2", nodeId: "node-2", status: "completed" },
440
325
  ]);
@@ -445,495 +330,152 @@ describe("public subagent delegation contract", () => {
445
330
  bridge.dispose();
446
331
  });
447
332
 
448
- it("applies exact v2 pre-cancellation despite logical-node and bare-id conflicts", async () => {
449
- const events = new FakeEvents();
450
- const releases = new Map<string, () => void>();
451
- const activeSignals = new Map<string, AbortSignal>();
452
- const responses: SubagentDelegationV2Response[] = [];
453
- events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => responses.push(payload as SubagentDelegationV2Response));
454
- const bridge = registerPromptTemplateDelegationBridge({
455
- events,
456
- getContext: () => ({ cwd: "/repo" }),
457
- execute: async () => { throw new Error("ordinary executor must remain separate"); },
458
- executeVersioned: async (_id, params, signal) => {
459
- if (typeof params.task !== "string") throw new Error("expected a single delegated task");
460
- const task = params.task;
461
- activeSignals.set(task, signal);
462
- await new Promise<void>((resolve) => releases.set(task, resolve));
463
- return { details: { mode: "single", results: [{ agent: params.agent, exitCode: 0, finalOutput: task }] } };
464
- },
465
- });
466
-
467
- const logicalOwner = { ...v2Request, requestId: "logical-owner", task: "logical-owner", result: { kind: "text" as const } };
468
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, logicalOwner);
469
- while (!releases.has("logical-owner")) await tick();
470
- events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { version: 2, requestId: "logical-pre", ownerRunId: "owner-1", nodeId: "node-1" });
471
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...logicalOwner, requestId: "logical-pre", task: "must-not-run" });
472
- await tick();
473
- assert.equal(responses.find((entry) => entry.requestId === "logical-pre")?.status, "cancelled");
474
- assert.equal(activeSignals.get("logical-owner")?.aborted, false);
475
- assert.equal(releases.has("must-not-run"), false);
476
-
477
- const bareOwner = { ...v2Request, requestId: "shared-bare", ownerRunId: "owner-2", nodeId: "node-2", task: "bare-owner", result: { kind: "text" as const } };
478
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, bareOwner);
479
- while (!releases.has("bare-owner")) await tick();
480
- events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { version: 2, requestId: "shared-bare", ownerRunId: "owner-3", nodeId: "node-3" });
481
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...bareOwner, ownerRunId: "owner-3", nodeId: "node-3", task: "also-must-not-run" });
482
- await tick();
483
- assert.equal(responses.find((entry) => entry.ownerRunId === "owner-3")?.status, "cancelled");
484
- assert.equal(activeSignals.get("bare-owner")?.aborted, false);
485
- assert.equal(releases.has("also-must-not-run"), false);
486
-
487
- releases.get("logical-owner")?.();
488
- releases.get("bare-owner")?.();
489
- bridge.dispose();
490
- });
491
-
492
- it("suppresses v2 terminal events after disposal", async () => {
493
- const events = new FakeEvents();
494
- const responses: unknown[] = [];
495
- events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => responses.push(payload));
496
- let rejectExecution: ((error: Error) => void) | undefined;
497
- const bridge = registerPromptTemplateDelegationBridge({
498
- events,
499
- getContext: () => ({ cwd: "/repo" }),
500
- execute: async () => { throw new Error("ordinary executor must remain separate"); },
501
- executeVersioned: async () => await new Promise((_resolve, reject) => { rejectExecution = reject; }),
502
- });
503
- const startedPromise = once(events, SUBAGENT_DELEGATION_STARTED_EVENT);
504
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...v2Request, requestId: "dispose-v2", result: { kind: "text" } });
505
- await startedPromise;
506
- bridge.dispose();
507
- rejectExecution?.(new Error("aborted"));
508
- await tick();
509
- assert.deepEqual(responses, []);
510
- });
511
-
512
- it("resolves an omitted v1 outputMode to explicit inline so response.output stays populated", () => {
513
- const minimal: SubagentDelegationRequest = {
514
- version: 1,
515
- requestId: "adapter-default-1",
516
- agent: "reviewer",
517
- task: "Review evidence",
518
- context: "fresh",
519
- cwd: "/repo",
520
- };
521
- // Omitted outputMode on a strict v1 request keeps the legacy full-text
522
- // contract: explicit inline, so `SubagentDelegationResponse.output` stays
523
- // populated instead of degrading to the reference-first file-only default.
524
- const params = toSubagentDelegationExecutionParams(minimal);
525
- assert.equal(params.outputMode, "inline");
526
- assert.equal(params.output, undefined);
527
-
528
- // Explicit v1 modes are forwarded exactly; v2 stays unaffected (output: false).
529
- assert.equal(toSubagentDelegationExecutionParams(request).outputMode, "file-only");
530
- const inline = toSubagentDelegationExecutionParams({ ...request, outputMode: "inline" });
531
- assert.equal(inline.outputMode, "inline");
532
- assert.equal(toSubagentDelegationExecutionParams({ ...request, outputMode: undefined }).outputMode, "inline");
533
- });
534
-
535
- it("runs one v1 request through the existing executor and returns structured metadata", async () => {
333
+ it("fails closed instead of evicting structured identity state", async () => {
536
334
  const events = new FakeEvents();
335
+ const responses: SubagentDelegationResponse[] = [];
537
336
  let executeCalls = 0;
538
- let observedRequest: unknown;
337
+ events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => responses.push(payload as SubagentDelegationResponse));
539
338
  const bridge = registerPromptTemplateDelegationBridge({
540
339
  events,
541
340
  getContext: () => ({ cwd: "/repo" }),
542
- execute: async (_requestId, delegatedRequest, _signal, _ctx, onUpdate) => {
341
+ execute: async () => { throw new Error("legacy executor must remain separate"); },
342
+ executeStructured: async (requestId) => {
543
343
  executeCalls++;
544
- observedRequest = delegatedRequest;
545
- onUpdate({
546
- details: {
547
- mode: "single",
548
- results: [{ agent: "reviewer", model: "openai/gpt-5" }],
549
- progress: [{ index: 0, agent: "reviewer", currentTool: "read", recentOutput: ["line 1"], recentTools: [], toolCount: 1, tokens: 42, durationMs: 10 }],
550
- },
551
- });
552
344
  return {
553
345
  details: {
554
346
  mode: "single",
555
- runId: "run-1",
556
347
  results: [{
557
- agent: "reviewer",
348
+ agent: "commentator",
558
349
  exitCode: 0,
559
- model: "openai/gpt-5",
560
- finalOutput: "done",
561
- savedOutputPath: "/repo/result.md",
562
- sessionFile: "/tmp/session.jsonl",
563
- usage: { input: 2, output: 3, cacheRead: 0, cacheWrite: 0, cost: 0.01, turns: 2 },
564
- progressSummary: { toolCount: 4, tokens: 5, durationMs: 6 },
565
- agentContract: { version: 1 },
566
- execution: { status: "completed", success: true, exitCode: 0 },
567
- acceptance: { status: "checked", evidenceStatus: "checked", explicit: true },
568
- review: { status: "not-requested" },
569
- effects: { fileMutation: { status: "missing", expected: true, attempted: false } },
570
- skillsWarning: "Skills not found: review",
571
- }],
572
- },
573
- };
574
- },
575
- });
576
- const startedPromise = once(events, SUBAGENT_DELEGATION_STARTED_EVENT);
577
- const updatePromise = once(events, SUBAGENT_DELEGATION_UPDATE_EVENT);
578
- const responsePromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
579
-
580
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, request);
581
-
582
- assert.deepEqual(await startedPromise, { version: 1, requestId: "delegation-1" });
583
- assert.deepEqual(await updatePromise, {
584
- version: 1,
585
- requestId: "delegation-1",
586
- currentTool: "read",
587
- recentOutput: "line 1",
588
- recentOutputLines: ["line 1"],
589
- model: "openai/gpt-5",
590
- toolCount: 1,
591
- durationMs: 10,
592
- tokens: 42,
593
- });
594
- const response = await responsePromise as SubagentDelegationResponse;
595
- assert.equal(executeCalls, 1);
596
- assert.deepEqual(observedRequest, {
597
- agent: "reviewer",
598
- task: "Review evidence",
599
- context: "fresh",
600
- cwd: "/repo",
601
- model: "openai/gpt-5",
602
- timeoutMs: 1_000,
603
- turnBudget: { maxTurns: 4, graceTurns: 1 },
604
- enforceHardTurnLimit: true,
605
- toolBudget: { soft: 3, hard: 5, block: "*" },
606
- skill: ["review"],
607
- output: "result.md",
608
- outputMode: "file-only",
609
- outputSchema: { type: "object", properties: { ok: { type: "boolean" } } },
610
- agentContract: { version: 1 },
611
- acceptance: "checked",
612
- artifacts: true,
613
- async: false,
614
- foregroundOnly: true,
615
- clarify: false,
616
- });
617
- assert.equal(response.status, "completed");
618
- assert.equal(response.runId, "run-1");
619
- assert.equal(response.agent, "reviewer");
620
- assert.equal(response.output, "done");
621
- assert.equal(response.outputPath, "/repo/result.md");
622
- assert.equal(response.sessionFile, "/tmp/session.jsonl");
623
- assert.deepEqual(response.execution, { status: "completed", success: true, exitCode: 0 });
624
- assert.deepEqual(response.review, { status: "not-requested" });
625
- assert.deepEqual(response.effects, { fileMutation: { status: "missing", expected: true, attempted: false } });
626
- assert.equal(response.turns, 2);
627
- assert.equal(response.toolCount, 4);
628
- assert.equal(response.tokens, 5);
629
- assert.deepEqual(response.acceptance, { status: "checked", evidenceStatus: "checked", explicit: true });
630
- assert.deepEqual(response.warnings, ["Skills not found: review"]);
631
- bridge.dispose();
632
- });
633
-
634
- it("routes independent v1 requests through the concurrent-safe delegated executor", async () => {
635
- const events = new FakeEvents();
636
- let ordinaryCalls = 0;
637
- let active = 0;
638
- let maxActive = 0;
639
- let started = 0;
640
- let release!: () => void;
641
- const barrier = new Promise<void>((resolve) => { release = resolve; });
642
- const responses: SubagentDelegationResponse[] = [];
643
- events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (value) => responses.push(value as SubagentDelegationResponse));
644
- const bridge = registerPromptTemplateDelegationBridge({
645
- events,
646
- getContext: () => ({ cwd: "/repo" }),
647
- execute: async () => {
648
- ordinaryCalls++;
649
- return { details: { mode: "single", results: [] } };
650
- },
651
- executeVersioned: async (_id, params) => {
652
- active++;
653
- started++;
654
- maxActive = Math.max(maxActive, active);
655
- await barrier;
656
- active--;
657
- return {
658
- details: {
659
- mode: "single",
660
- results: [{
661
- agent: params.agent,
662
- exitCode: 0,
663
- finalOutput: params.task,
350
+ finalOutput: requestId,
664
351
  usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 1 },
665
352
  }],
666
353
  },
667
354
  };
668
355
  },
669
356
  });
670
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "parallel-a", task: "A" });
671
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "parallel-b", task: "B" });
672
- while (started < 2) await tick();
673
- assert.equal(maxActive, 2);
674
- assert.equal(ordinaryCalls, 0);
675
- release();
676
- while (responses.length < 2) await tick();
677
- assert.deepEqual(responses.map((response) => response.requestId).sort(), ["parallel-a", "parallel-b"]);
678
- assert.ok(responses.every((response) => response.status === "completed"));
679
- bridge.dispose();
680
- });
681
-
682
- it("returns correlated invalid-request and unavailable-context statuses without executing", async () => {
683
- const events = new FakeEvents();
684
- let executeCalls = 0;
685
- const bridge = registerPromptTemplateDelegationBridge({
686
- events,
687
- getContext: () => null,
688
- execute: async () => {
689
- executeCalls++;
690
- return { details: { mode: "single", results: [] } };
691
- },
692
- });
693
- const invalidPromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
694
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, version: 2, requestId: "invalid-1" });
695
- assert.deepEqual(await invalidPromise, {
696
- version: 2,
697
- requestId: "invalid-1",
698
- status: "invalid_request",
699
- error: "Unsupported delegation protocol version: 2.",
700
- } satisfies SubagentDelegationV2InvalidResponse);
701
-
702
- const unavailablePromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
703
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "unavailable-1" });
704
- const unavailable = await unavailablePromise as SubagentDelegationResponse;
705
- assert.equal(unavailable.status, "unavailable_context");
706
- assert.equal(executeCalls, 0);
707
- bridge.dispose();
708
- });
709
-
710
- it("maps terminal executor outcomes without failing inferred acceptance", async () => {
711
- const cases = [
712
- [{ timedOut: true }, "timed_out"],
713
- [{ interrupted: true }, "interrupted"],
714
- [{ stopped: true }, "interrupted"],
715
- [{ turnBudgetExceeded: true }, "turn_budget_exhausted"],
716
- [{ toolBudgetBlocked: true }, "tool_budget_exhausted"],
717
- [{ turnBudgetExceeded: true, structuredOutputFailed: true }, "structured_output_failed"],
718
- [{ acceptance: { status: "rejected", explicit: true } }, "acceptance_failed"],
719
- [{ agentContract: { version: 1 }, acceptance: { status: "rejected", explicit: true } }, "completed"],
720
- [{ acceptance: { status: "rejected", explicit: false } }, "completed"],
721
- [{ exitCode: 1, error: "failed" }, "failed"],
722
- ] as const;
723
- for (const [child, expectedStatus] of cases) {
724
- const events = new FakeEvents();
725
- const bridge = registerPromptTemplateDelegationBridge({
726
- events,
727
- getContext: () => ({ cwd: "/repo" }),
728
- execute: async () => ({
729
- isError: expectedStatus !== "completed",
730
- details: {
731
- mode: "single",
732
- results: [{
733
- agent: "reviewer",
734
- exitCode: 0,
735
- usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 },
736
- ...child,
737
- }],
738
- },
739
- }),
740
- });
741
- const responsePromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
742
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: `case-${expectedStatus}-${Math.random()}` });
743
- assert.equal((await responsePromise as SubagentDelegationResponse).status, expectedStatus);
744
- bridge.dispose();
745
- }
746
- });
747
-
748
- it("ignores malformed versioned cancellation without aborting the owner", async () => {
749
- const events = new FakeEvents();
750
- const bridge = registerPromptTemplateDelegationBridge({
751
- events,
752
- getContext: () => ({ cwd: "/repo" }),
753
- execute: async () => { throw new Error("ordinary executor must not own a strict v1 request"); },
754
- executeVersioned: async (_id, _params, signal) => await new Promise((_resolve, reject) => {
755
- signal.addEventListener("abort", () => reject(new Error("aborted")), { once: true });
756
- }),
757
- });
758
- const startedPromise = once(events, SUBAGENT_DELEGATION_STARTED_EVENT);
759
- const responses: unknown[] = [];
760
- events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => responses.push(payload));
761
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "strict-cancel-1" });
762
- await startedPromise;
763
- events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { version: 2, requestId: "strict-cancel-1" });
764
- events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { version: 1, requestId: "strict-cancel-1", reason: "extra" });
765
- await tick();
766
- assert.deepEqual(responses, []);
767
- events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { version: 1, requestId: "strict-cancel-1" });
768
- await tick();
769
- assert.equal((responses[0] as SubagentDelegationResponse).status, "cancelled");
770
- bridge.dispose();
771
- });
772
-
773
- it("preserves active request ownership when a duplicate requestId arrives", async () => {
774
- const events = new FakeEvents();
775
- let executeCalls = 0;
776
- let finish: (() => void) | undefined;
777
- const responses: unknown[] = [];
778
- events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => responses.push(payload));
779
- const bridge = registerPromptTemplateDelegationBridge({
780
- events,
781
- getContext: () => ({ cwd: "/repo" }),
782
- execute: async () => {
783
- executeCalls++;
784
- await new Promise<void>((resolve) => { finish = resolve; });
785
- return { details: { mode: "single", results: [{ agent: "reviewer", exitCode: 0, usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 } }] } };
786
- },
787
- });
788
- const startedPromise = once(events, SUBAGENT_DELEGATION_STARTED_EVENT);
789
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "duplicate-1" });
790
- await startedPromise;
791
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "duplicate-1" });
792
- await tick();
793
- assert.equal(executeCalls, 1);
794
- assert.equal(responses.length, 0);
795
- finish?.();
796
- await tick();
797
- assert.equal(responses.length, 1);
798
- assert.equal((responses[0] as SubagentDelegationResponse).status, "completed");
799
- bridge.dispose();
800
- });
801
-
802
- it("bounds pending cancellation IDs and applies retained pre-cancellation once", async () => {
803
- const events = new FakeEvents();
804
- let executeCalls = 0;
805
- const bridge = registerPromptTemplateDelegationBridge({
806
- events,
807
- getContext: () => ({ cwd: "/repo" }),
808
- execute: async () => {
809
- executeCalls++;
810
- return { details: { mode: "single", results: [{ agent: "reviewer", exitCode: 0, usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 } }] } };
811
- },
812
- });
813
- for (let index = 0; index < 300; index++) {
814
- events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, { version: 1, requestId: `cancel-${index}` });
815
- }
816
357
 
817
- const evictedPromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
818
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "cancel-0" });
819
- assert.equal((await evictedPromise as SubagentDelegationResponse).status, "completed");
820
-
821
- const retainedPromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
822
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "cancel-299" });
823
- assert.equal((await retainedPromise as SubagentDelegationResponse).status, "cancelled");
824
- assert.equal(executeCalls, 1);
825
- bridge.dispose();
826
- });
827
-
828
- it("fails closed instead of evicting exact v2 cancellation identity", async () => {
829
- const events = new FakeEvents();
830
- let executeCalls = 0;
831
- const bridge = registerPromptTemplateDelegationBridge({
832
- events,
833
- getContext: () => ({ cwd: "/repo" }),
834
- execute: async () => {
835
- executeCalls++;
836
- return { details: { mode: "single", results: [{ agent: "reviewer", exitCode: 0, usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 } }] } };
837
- },
838
- });
839
358
  for (let index = 0; index < 8_192; index++) {
840
359
  events.emit(SUBAGENT_DELEGATION_CANCEL_EVENT, {
841
- version: 2,
842
- requestId: `attempt-${index}`,
360
+ requestId: `cancelled-${index}`,
843
361
  ownerRunId: "saturated-owner",
844
- nodeId: `node-${index}`,
362
+ nodeId: `cancelled-node-${index}`,
845
363
  });
846
364
  }
847
-
848
- const retainedPromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
849
365
  events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, {
850
- ...v2Request,
851
- requestId: "attempt-0",
366
+ ...request,
367
+ requestId: "cancelled-0",
852
368
  ownerRunId: "saturated-owner",
853
- nodeId: "node-0",
369
+ nodeId: "cancelled-node-0",
370
+ result: { kind: "text" },
854
371
  });
855
- assert.equal((await retainedPromise as SubagentDelegationV2Response).status, "cancelled");
372
+ while (!responses.some((entry) => entry.requestId === "cancelled-0")) await tick();
373
+ assert.equal(responses.at(-1)?.status, "cancelled");
856
374
 
857
- const overflowPromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
858
375
  events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, {
859
- ...v2Request,
860
- requestId: "overflow-attempt",
376
+ ...request,
377
+ requestId: "cancel-overflow",
861
378
  ownerRunId: "saturated-owner",
862
- nodeId: "overflow-node",
379
+ nodeId: "cancel-overflow-node",
380
+ result: { kind: "text" },
863
381
  });
864
- const overflow = await overflowPromise as SubagentDelegationV2Response;
865
- assert.equal(overflow.status, "unavailable_context");
866
- assert.match(overflow.error ?? "", /identity capacity/i);
382
+ while (!responses.some((entry) => entry.requestId === "cancel-overflow")) await tick();
383
+ assert.equal(responses.at(-1)?.status, "unavailable_context");
384
+ assert.match(responses.at(-1)?.error ?? "", /identity capacity/i);
867
385
  assert.equal(executeCalls, 0);
868
386
  bridge.dispose();
869
- });
870
387
 
871
- it("fails closed when settled v2 identity history reaches capacity", async () => {
872
- const events = new FakeEvents();
873
- const responses: SubagentDelegationV2Response[] = [];
874
- let executeCalls = 0;
875
- events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => responses.push(payload as SubagentDelegationV2Response));
876
- const bridge = registerPromptTemplateDelegationBridge({
877
- events,
388
+ const settledEvents = new FakeEvents();
389
+ const settledResponses: SubagentDelegationResponse[] = [];
390
+ let settledExecuteCalls = 0;
391
+ settledEvents.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => settledResponses.push(payload as SubagentDelegationResponse));
392
+ const settledBridge = registerPromptTemplateDelegationBridge({
393
+ events: settledEvents,
878
394
  getContext: () => ({ cwd: "/repo" }),
879
- execute: async (requestId) => {
880
- executeCalls++;
881
- return { details: { mode: "single", results: [{ agent: "reviewer", exitCode: 0, finalOutput: requestId }] } };
395
+ execute: async () => { throw new Error("legacy executor must remain separate"); },
396
+ executeStructured: async (requestId) => {
397
+ settledExecuteCalls++;
398
+ return {
399
+ details: {
400
+ mode: "single",
401
+ results: [{
402
+ agent: "commentator",
403
+ exitCode: 0,
404
+ finalOutput: requestId,
405
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 1 },
406
+ }],
407
+ },
408
+ };
882
409
  },
883
410
  });
884
411
  for (let index = 0; index < 8_192; index++) {
885
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, {
886
- ...v2Request,
412
+ settledEvents.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, {
413
+ ...request,
887
414
  requestId: `settled-${index}`,
888
415
  ownerRunId: "settled-owner",
889
416
  nodeId: `settled-node-${index}`,
890
417
  result: { kind: "text" },
891
418
  });
892
419
  }
893
- for (let attempt = 0; responses.length < 8_192 && attempt < 100; attempt++) await tick();
894
- assert.equal(responses.length, 8_192);
895
- assert.equal(executeCalls, 8_192);
420
+ for (let attempt = 0; settledResponses.length < 8_192 && attempt < 100; attempt++) await tick();
421
+ assert.equal(settledResponses.length, 8_192);
422
+ assert.equal(settledExecuteCalls, 8_192);
896
423
 
897
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, {
898
- ...v2Request,
424
+ settledEvents.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, {
425
+ ...request,
899
426
  requestId: "settled-overflow",
900
427
  ownerRunId: "settled-owner",
901
428
  nodeId: "settled-overflow-node",
902
429
  result: { kind: "text" },
903
430
  });
904
431
  await tick();
905
- assert.equal(responses.at(-1)?.status, "unavailable_context");
906
- assert.equal(executeCalls, 8_192);
432
+ assert.equal(settledResponses.at(-1)?.status, "unavailable_context");
433
+ assert.equal(settledExecuteCalls, 8_192);
907
434
 
908
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, {
909
- ...v2Request,
435
+ settledEvents.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, {
436
+ ...request,
910
437
  requestId: "settled-0",
911
438
  ownerRunId: "settled-owner",
912
439
  nodeId: "settled-node-0",
913
440
  result: { kind: "text" },
914
441
  });
915
442
  await tick();
916
- assert.equal(responses.length, 8_193);
917
- assert.equal(executeCalls, 8_192);
918
- bridge.dispose();
443
+ assert.equal(settledResponses.length, 8_193);
444
+ assert.equal(settledExecuteCalls, 8_192);
445
+ settledBridge.dispose();
919
446
  });
920
447
 
921
- it("suppresses stale terminal events after disposal", async () => {
448
+ it("retains the unversioned prompt-template bridge as legacy fallback", async () => {
922
449
  const events = new FakeEvents();
923
- const responses: unknown[] = [];
924
- events.on(SUBAGENT_DELEGATION_RESPONSE_EVENT, (payload) => responses.push(payload));
925
- let rejectExecution: ((error: Error) => void) | undefined;
450
+ let structuredCalls = 0;
451
+ let legacyCalls = 0;
926
452
  const bridge = registerPromptTemplateDelegationBridge({
927
453
  events,
928
454
  getContext: () => ({ cwd: "/repo" }),
929
- execute: async () => await new Promise((_resolve, reject) => { rejectExecution = reject; }),
455
+ execute: async () => {
456
+ legacyCalls++;
457
+ return { content: [{ type: "text", text: "legacy done" }], details: { mode: "single", results: [{ agent: "commentator", finalOutput: "legacy done", exitCode: 0 }] } };
458
+ },
459
+ executeStructured: async () => {
460
+ structuredCalls++;
461
+ return { details: { mode: "single", results: [] } };
462
+ },
930
463
  });
931
- const startedPromise = once(events, SUBAGENT_DELEGATION_STARTED_EVENT);
932
- events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, { ...request, requestId: "dispose-1" });
933
- await startedPromise;
464
+ const responsePromise = once(events, SUBAGENT_DELEGATION_RESPONSE_EVENT);
465
+ events.emit(SUBAGENT_DELEGATION_REQUEST_EVENT, {
466
+ requestId: "legacy-1",
467
+ agent: "commentator",
468
+ task: "Legacy prompt-template delegation",
469
+ context: "fresh",
470
+ model: "openai/gpt-5",
471
+ cwd: "/repo",
472
+ });
473
+ const response = await responsePromise as { requestId: string; isError: boolean; contentText?: string };
474
+ assert.equal(response.requestId, "legacy-1");
475
+ assert.equal(response.isError, false);
476
+ assert.equal(response.contentText, "legacy done");
477
+ assert.equal(legacyCalls, 1);
478
+ assert.equal(structuredCalls, 0);
934
479
  bridge.dispose();
935
- rejectExecution?.(new Error("aborted"));
936
- await tick();
937
- assert.deepEqual(responses, []);
938
480
  });
939
481
  });