openhorse 0.2.18 → 0.2.21

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 (337) hide show
  1. package/dist/agents/coordinator.d.ts.map +1 -1
  2. package/dist/agents/fork.d.ts.map +1 -1
  3. package/dist/agents/fork.js +0 -1
  4. package/dist/agents/fork.js.map +1 -1
  5. package/dist/agents/worker-pool.d.ts.map +1 -1
  6. package/dist/agents/worker-pool.js +3 -1
  7. package/dist/agents/worker-pool.js.map +1 -1
  8. package/dist/cli.js +3 -3
  9. package/dist/cli.js.map +1 -1
  10. package/dist/commands/index.d.ts.map +1 -1
  11. package/dist/commands/index.js +13 -28
  12. package/dist/commands/index.js.map +1 -1
  13. package/dist/core/checkpoint.d.ts.map +1 -1
  14. package/dist/core/checkpoint.js +3 -0
  15. package/dist/core/checkpoint.js.map +1 -1
  16. package/dist/framework/prompt.d.ts.map +1 -1
  17. package/dist/framework/prompt.js +16 -0
  18. package/dist/framework/prompt.js.map +1 -1
  19. package/dist/framework/query.d.ts.map +1 -1
  20. package/dist/framework/query.js +0 -7
  21. package/dist/framework/query.js.map +1 -1
  22. package/dist/harness/context-harness.d.ts.map +1 -1
  23. package/dist/harness/context-harness.js +6 -1
  24. package/dist/harness/context-harness.js.map +1 -1
  25. package/dist/harness/ledger.d.ts +1 -0
  26. package/dist/harness/ledger.d.ts.map +1 -1
  27. package/dist/harness/ledger.js +8 -0
  28. package/dist/harness/ledger.js.map +1 -1
  29. package/dist/harness/safety.d.ts +2 -0
  30. package/dist/harness/safety.d.ts.map +1 -1
  31. package/dist/harness/safety.js +27 -3
  32. package/dist/harness/safety.js.map +1 -1
  33. package/dist/init.d.ts +1 -1
  34. package/dist/init.d.ts.map +1 -1
  35. package/dist/init.js +1 -1
  36. package/dist/init.js.map +1 -1
  37. package/dist/ink-ui/components/Markdown.d.ts +1 -1
  38. package/dist/ink-ui/components/Markdown.d.ts.map +1 -1
  39. package/dist/ink-ui/components/Markdown.js +1 -1
  40. package/dist/ink-ui/components/Markdown.js.map +1 -1
  41. package/dist/ink-ui/runtime/grapheme.d.ts +9 -8
  42. package/dist/ink-ui/runtime/grapheme.d.ts.map +1 -1
  43. package/dist/ink-ui/runtime/grapheme.js +14 -60
  44. package/dist/ink-ui/runtime/grapheme.js.map +1 -1
  45. package/dist/ink-ui/runtime/input-buffer.d.ts +9 -31
  46. package/dist/ink-ui/runtime/input-buffer.d.ts.map +1 -1
  47. package/dist/ink-ui/runtime/input-buffer.js +15 -162
  48. package/dist/ink-ui/runtime/input-buffer.js.map +1 -1
  49. package/dist/ink-ui/runtime/native-cursor.js +0 -25
  50. package/dist/ink-ui/runtime/native-cursor.js.map +1 -1
  51. package/dist/ink-ui/runtime/prompt-layout.d.ts +9 -29
  52. package/dist/ink-ui/runtime/prompt-layout.d.ts.map +1 -1
  53. package/dist/ink-ui/runtime/prompt-layout.js +18 -166
  54. package/dist/ink-ui/runtime/prompt-layout.js.map +1 -1
  55. package/dist/ink-ui/runtime/transcript-state.d.ts.map +1 -1
  56. package/dist/ink-ui/runtime/transcript-state.js +2 -0
  57. package/dist/ink-ui/runtime/transcript-state.js.map +1 -1
  58. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  59. package/dist/ink-ui/screens/ReplScreen.js +11 -0
  60. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  61. package/dist/memory/entrypoint.js +1 -1
  62. package/dist/memory/entrypoint.js.map +1 -1
  63. package/dist/memory/storage.js +1 -1
  64. package/dist/memory/storage.js.map +1 -1
  65. package/dist/memory/store.d.ts +1 -0
  66. package/dist/memory/store.d.ts.map +1 -1
  67. package/dist/memory/store.js +9 -0
  68. package/dist/memory/store.js.map +1 -1
  69. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  70. package/dist/runtime/agent-runtime-controller.js +15 -0
  71. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  72. package/dist/runtime/agent-runtime-protocol.d.ts +4 -1
  73. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
  74. package/dist/runtime/agent-runtime-protocol.js +6 -0
  75. package/dist/runtime/agent-runtime-protocol.js.map +1 -1
  76. package/dist/runtime/chat-controller.d.ts +27 -0
  77. package/dist/runtime/chat-controller.d.ts.map +1 -1
  78. package/dist/runtime/chat-controller.js +148 -5
  79. package/dist/runtime/chat-controller.js.map +1 -1
  80. package/dist/runtime/composer/buffer.d.ts +43 -0
  81. package/dist/runtime/composer/buffer.d.ts.map +1 -0
  82. package/dist/runtime/composer/buffer.js +176 -0
  83. package/dist/runtime/composer/buffer.js.map +1 -0
  84. package/dist/runtime/composer/grapheme.d.ts +19 -0
  85. package/dist/runtime/composer/grapheme.d.ts.map +1 -0
  86. package/dist/runtime/composer/grapheme.js +73 -0
  87. package/dist/runtime/composer/grapheme.js.map +1 -0
  88. package/dist/runtime/composer/history.d.ts +39 -0
  89. package/dist/runtime/composer/history.d.ts.map +1 -0
  90. package/dist/runtime/composer/history.js +91 -0
  91. package/dist/runtime/composer/history.js.map +1 -0
  92. package/dist/runtime/composer/layout.d.ts +40 -0
  93. package/dist/runtime/composer/layout.d.ts.map +1 -0
  94. package/dist/runtime/composer/layout.js +174 -0
  95. package/dist/runtime/composer/layout.js.map +1 -0
  96. package/dist/runtime/rich-text/ansi-parser.d.ts +31 -0
  97. package/dist/runtime/rich-text/ansi-parser.d.ts.map +1 -0
  98. package/dist/runtime/rich-text/ansi-parser.js +272 -0
  99. package/dist/runtime/rich-text/ansi-parser.js.map +1 -0
  100. package/dist/runtime/rich-text/layout.d.ts +21 -0
  101. package/dist/runtime/rich-text/layout.d.ts.map +1 -0
  102. package/dist/runtime/rich-text/layout.js +327 -0
  103. package/dist/runtime/rich-text/layout.js.map +1 -0
  104. package/dist/runtime/rich-text/markdown-parser.d.ts +17 -0
  105. package/dist/runtime/rich-text/markdown-parser.d.ts.map +1 -0
  106. package/dist/runtime/rich-text/markdown-parser.js +211 -0
  107. package/dist/runtime/rich-text/markdown-parser.js.map +1 -0
  108. package/dist/runtime/rich-text/sanitizer.d.ts +18 -0
  109. package/dist/runtime/rich-text/sanitizer.d.ts.map +1 -0
  110. package/dist/runtime/rich-text/sanitizer.js +32 -0
  111. package/dist/runtime/rich-text/sanitizer.js.map +1 -0
  112. package/dist/runtime/rich-text/types.d.ts +59 -0
  113. package/dist/runtime/rich-text/types.d.ts.map +1 -0
  114. package/dist/runtime/rich-text/types.js +17 -0
  115. package/dist/runtime/rich-text/types.js.map +1 -0
  116. package/dist/runtime/subagents/budget.d.ts +118 -0
  117. package/dist/runtime/subagents/budget.d.ts.map +1 -0
  118. package/dist/runtime/subagents/budget.js +173 -0
  119. package/dist/runtime/subagents/budget.js.map +1 -0
  120. package/dist/runtime/subagents/child-executor-guard.d.ts +60 -0
  121. package/dist/runtime/subagents/child-executor-guard.d.ts.map +1 -0
  122. package/dist/runtime/subagents/child-executor-guard.js +219 -0
  123. package/dist/runtime/subagents/child-executor-guard.js.map +1 -0
  124. package/dist/runtime/subagents/context-builder.d.ts +34 -0
  125. package/dist/runtime/subagents/context-builder.d.ts.map +1 -0
  126. package/dist/runtime/subagents/context-builder.js +99 -0
  127. package/dist/runtime/subagents/context-builder.js.map +1 -0
  128. package/dist/runtime/subagents/index.d.ts +21 -0
  129. package/dist/runtime/subagents/index.d.ts.map +1 -0
  130. package/dist/runtime/subagents/index.js +62 -0
  131. package/dist/runtime/subagents/index.js.map +1 -0
  132. package/dist/runtime/subagents/policy.d.ts +68 -0
  133. package/dist/runtime/subagents/policy.d.ts.map +1 -0
  134. package/dist/runtime/subagents/policy.js +230 -0
  135. package/dist/runtime/subagents/policy.js.map +1 -0
  136. package/dist/runtime/subagents/presets.d.ts +44 -0
  137. package/dist/runtime/subagents/presets.d.ts.map +1 -0
  138. package/dist/runtime/subagents/presets.js +148 -0
  139. package/dist/runtime/subagents/presets.js.map +1 -0
  140. package/dist/runtime/subagents/production.d.ts +44 -0
  141. package/dist/runtime/subagents/production.d.ts.map +1 -0
  142. package/dist/runtime/subagents/production.js +118 -0
  143. package/dist/runtime/subagents/production.js.map +1 -0
  144. package/dist/runtime/subagents/provider-gate.d.ts +99 -0
  145. package/dist/runtime/subagents/provider-gate.d.ts.map +1 -0
  146. package/dist/runtime/subagents/provider-gate.js +186 -0
  147. package/dist/runtime/subagents/provider-gate.js.map +1 -0
  148. package/dist/runtime/subagents/result-parser.d.ts +40 -0
  149. package/dist/runtime/subagents/result-parser.d.ts.map +1 -0
  150. package/dist/runtime/subagents/result-parser.js +226 -0
  151. package/dist/runtime/subagents/result-parser.js.map +1 -0
  152. package/dist/runtime/subagents/runner.d.ts +53 -0
  153. package/dist/runtime/subagents/runner.d.ts.map +1 -0
  154. package/dist/runtime/subagents/runner.js +172 -0
  155. package/dist/runtime/subagents/runner.js.map +1 -0
  156. package/dist/runtime/subagents/runtime-integration.d.ts +73 -0
  157. package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -0
  158. package/dist/runtime/subagents/runtime-integration.js +148 -0
  159. package/dist/runtime/subagents/runtime-integration.js.map +1 -0
  160. package/dist/runtime/subagents/supervisor.d.ts +79 -0
  161. package/dist/runtime/subagents/supervisor.d.ts.map +1 -0
  162. package/dist/runtime/subagents/supervisor.js +301 -0
  163. package/dist/runtime/subagents/supervisor.js.map +1 -0
  164. package/dist/runtime/subagents/tool.d.ts +38 -0
  165. package/dist/runtime/subagents/tool.d.ts.map +1 -0
  166. package/dist/runtime/subagents/tool.js +171 -0
  167. package/dist/runtime/subagents/tool.js.map +1 -0
  168. package/dist/runtime/subagents/types.d.ts +150 -0
  169. package/dist/runtime/subagents/types.d.ts.map +1 -0
  170. package/dist/runtime/subagents/types.js +52 -0
  171. package/dist/runtime/subagents/types.js.map +1 -0
  172. package/dist/runtime/ui-events.d.ts +5 -0
  173. package/dist/runtime/ui-events.d.ts.map +1 -1
  174. package/dist/runtime/ui-events.js.map +1 -1
  175. package/dist/runtime/ui-view-model.d.ts +35 -1
  176. package/dist/runtime/ui-view-model.d.ts.map +1 -1
  177. package/dist/runtime/ui-view-model.js +32 -1
  178. package/dist/runtime/ui-view-model.js.map +1 -1
  179. package/dist/sdk/query.d.ts.map +1 -1
  180. package/dist/sdk/query.js +0 -1
  181. package/dist/sdk/query.js.map +1 -1
  182. package/dist/services/auto-fix/autoFixHook.d.ts.map +1 -1
  183. package/dist/services/auto-fix/autoFixHook.js +3 -2
  184. package/dist/services/auto-fix/autoFixHook.js.map +1 -1
  185. package/dist/services/auto-fix/autoFixRunner.d.ts +2 -2
  186. package/dist/services/auto-fix/autoFixRunner.d.ts.map +1 -1
  187. package/dist/services/auto-fix/autoFixRunner.js +2 -2
  188. package/dist/services/auto-fix/autoFixRunner.js.map +1 -1
  189. package/dist/services/compact/auto-compact.js +3 -3
  190. package/dist/services/compact/auto-compact.js.map +1 -1
  191. package/dist/services/compact/summary-generator.d.ts.map +1 -1
  192. package/dist/services/compact/summary-generator.js +0 -1
  193. package/dist/services/compact/summary-generator.js.map +1 -1
  194. package/dist/services/concurrent-sessions.d.ts.map +1 -1
  195. package/dist/services/concurrent-sessions.js +3 -0
  196. package/dist/services/concurrent-sessions.js.map +1 -1
  197. package/dist/services/config.d.ts +11 -4
  198. package/dist/services/config.d.ts.map +1 -1
  199. package/dist/services/config.js +45 -4
  200. package/dist/services/config.js.map +1 -1
  201. package/dist/services/doctor.d.ts.map +1 -1
  202. package/dist/services/doctor.js +1 -1
  203. package/dist/services/doctor.js.map +1 -1
  204. package/dist/services/global-config.d.ts +23 -1
  205. package/dist/services/global-config.d.ts.map +1 -1
  206. package/dist/services/global-config.js +3 -0
  207. package/dist/services/global-config.js.map +1 -1
  208. package/dist/services/llm.d.ts.map +1 -1
  209. package/dist/services/llm.js +9 -1
  210. package/dist/services/llm.js.map +1 -1
  211. package/dist/services/mcp/transports.d.ts +2 -0
  212. package/dist/services/mcp/transports.d.ts.map +1 -1
  213. package/dist/services/mcp/transports.js +23 -2
  214. package/dist/services/mcp/transports.js.map +1 -1
  215. package/dist/services/memory.d.ts.map +1 -1
  216. package/dist/services/memory.js.map +1 -1
  217. package/dist/services/model-context.d.ts.map +1 -1
  218. package/dist/services/model-context.js +7 -1
  219. package/dist/services/model-context.js.map +1 -1
  220. package/dist/services/session-memory/sessionMemory.js +1 -1
  221. package/dist/services/session-memory/sessionMemory.js.map +1 -1
  222. package/dist/services/session-storage.d.ts +1 -1
  223. package/dist/services/session-storage.d.ts.map +1 -1
  224. package/dist/services/session-storage.js +49 -5
  225. package/dist/services/session-storage.js.map +1 -1
  226. package/dist/services/task-manager.d.ts +2 -0
  227. package/dist/services/task-manager.d.ts.map +1 -1
  228. package/dist/services/task-manager.js +13 -0
  229. package/dist/services/task-manager.js.map +1 -1
  230. package/dist/services/usage-state.d.ts.map +1 -1
  231. package/dist/services/usage-state.js +3 -0
  232. package/dist/services/usage-state.js.map +1 -1
  233. package/dist/skills/loader.d.ts +1 -1
  234. package/dist/skills/loader.d.ts.map +1 -1
  235. package/dist/skills/loader.js +1 -1
  236. package/dist/skills/loader.js.map +1 -1
  237. package/dist/skills/registry.d.ts +1 -1
  238. package/dist/skills/registry.d.ts.map +1 -1
  239. package/dist/skills/registry.js +1 -1
  240. package/dist/skills/registry.js.map +1 -1
  241. package/dist/terminal-ui/launch.d.ts +18 -3
  242. package/dist/terminal-ui/launch.d.ts.map +1 -1
  243. package/dist/terminal-ui/launch.js +21 -4
  244. package/dist/terminal-ui/launch.js.map +1 -1
  245. package/dist/tools/index.d.ts.map +1 -1
  246. package/dist/tools/index.js +3 -4
  247. package/dist/tools/index.js.map +1 -1
  248. package/dist/tools/lsp.js.map +1 -1
  249. package/dist/tools/mcp.d.ts +1 -0
  250. package/dist/tools/mcp.d.ts.map +1 -1
  251. package/dist/tools/mcp.js +19 -4
  252. package/dist/tools/mcp.js.map +1 -1
  253. package/dist/tools/web.js +3 -3
  254. package/dist/tools/web.js.map +1 -1
  255. package/dist/tui-core/frame.d.ts +13 -1
  256. package/dist/tui-core/frame.d.ts.map +1 -1
  257. package/dist/tui-core/frame.js +61 -8
  258. package/dist/tui-core/frame.js.map +1 -1
  259. package/dist/tui-core/style.d.ts +87 -0
  260. package/dist/tui-core/style.d.ts.map +1 -0
  261. package/dist/tui-core/style.js +248 -0
  262. package/dist/tui-core/style.js.map +1 -0
  263. package/dist/tui-core/terminal-writer.d.ts.map +1 -1
  264. package/dist/tui-core/terminal-writer.js +16 -3
  265. package/dist/tui-core/terminal-writer.js.map +1 -1
  266. package/dist/tui-ui/inline-surface.d.ts +134 -0
  267. package/dist/tui-ui/inline-surface.d.ts.map +1 -0
  268. package/dist/tui-ui/inline-surface.js +364 -0
  269. package/dist/tui-ui/inline-surface.js.map +1 -0
  270. package/dist/tui-ui/launch.d.ts.map +1 -1
  271. package/dist/tui-ui/launch.js +251 -64
  272. package/dist/tui-ui/launch.js.map +1 -1
  273. package/dist/tui-ui/layout.js +31 -2
  274. package/dist/tui-ui/layout.js.map +1 -1
  275. package/dist/tui-ui/render-scheduler.d.ts +37 -0
  276. package/dist/tui-ui/render-scheduler.d.ts.map +1 -0
  277. package/dist/tui-ui/render-scheduler.js +118 -0
  278. package/dist/tui-ui/render-scheduler.js.map +1 -0
  279. package/dist/tui-ui/runner.d.ts +13 -0
  280. package/dist/tui-ui/runner.d.ts.map +1 -1
  281. package/dist/tui-ui/runner.js +60 -11
  282. package/dist/tui-ui/runner.js.map +1 -1
  283. package/dist/tui-ui/state.d.ts +33 -3
  284. package/dist/tui-ui/state.d.ts.map +1 -1
  285. package/dist/tui-ui/state.js +138 -25
  286. package/dist/tui-ui/state.js.map +1 -1
  287. package/dist/tui-ui/transcript-cache.d.ts +33 -0
  288. package/dist/tui-ui/transcript-cache.d.ts.map +1 -0
  289. package/dist/tui-ui/transcript-cache.js +67 -0
  290. package/dist/tui-ui/transcript-cache.js.map +1 -0
  291. package/dist/ui/box.d.ts.map +1 -1
  292. package/dist/ui/box.js +0 -11
  293. package/dist/ui/box.js.map +1 -1
  294. package/dist/ui/command-panel.d.ts.map +1 -1
  295. package/dist/ui/command-panel.js +1 -3
  296. package/dist/ui/command-panel.js.map +1 -1
  297. package/dist/ui/file-completion.js +1 -1
  298. package/dist/ui/file-completion.js.map +1 -1
  299. package/dist/ui/markdown.d.ts.map +1 -1
  300. package/dist/ui/markdown.js +1 -2
  301. package/dist/ui/markdown.js.map +1 -1
  302. package/dist/ui/multiline-input.d.ts.map +1 -1
  303. package/dist/ui/multiline-input.js +1 -2
  304. package/dist/ui/multiline-input.js.map +1 -1
  305. package/dist/ui/progress.d.ts.map +1 -1
  306. package/dist/ui/progress.js +0 -3
  307. package/dist/ui/progress.js.map +1 -1
  308. package/dist/ui/status-bar.d.ts.map +1 -1
  309. package/dist/ui/status-bar.js +0 -1
  310. package/dist/ui/status-bar.js.map +1 -1
  311. package/dist/ui/stream-markdown.d.ts +3 -0
  312. package/dist/ui/stream-markdown.d.ts.map +1 -1
  313. package/dist/ui/stream-markdown.js +0 -6
  314. package/dist/ui/stream-markdown.js.map +1 -1
  315. package/dist/ui/tool-preview.d.ts.map +1 -1
  316. package/dist/ui/tool-preview.js +0 -1
  317. package/dist/ui/tool-preview.js.map +1 -1
  318. package/package.json +1 -1
  319. package/dist/cli-dbg.js +0 -717
  320. package/dist/cli-debug.d.ts +0 -7
  321. package/dist/cli-debug.d.ts.map +0 -1
  322. package/dist/cli-debug.js +0 -717
  323. package/dist/cli-debug.js.map +0 -1
  324. package/dist/cli-debug2.d.ts +0 -7
  325. package/dist/cli-debug2.d.ts.map +0 -1
  326. package/dist/cli-debug2.js +0 -717
  327. package/dist/cli-debug2.js.map +0 -1
  328. package/dist/cli-debug3.d.ts +0 -7
  329. package/dist/cli-debug3.d.ts.map +0 -1
  330. package/dist/cli-debug3.js +0 -719
  331. package/dist/cli-debug3.js.map +0 -1
  332. package/dist/cli-ink.d.ts +0 -8
  333. package/dist/cli-ink.d.ts.map +0 -1
  334. package/dist/cli-ink.js +0 -32
  335. package/dist/cli-ink.js.map +0 -1
  336. package/dist/cli-patch.js +0 -716
  337. package/dist/cli-test.js +0 -726
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ /**
3
+ * Turn-level integration: build the runtime-bound `subtask` tool for a root turn.
4
+ *
5
+ * This is the bridge between {@link AgentChatController} and the subagent
6
+ * runtime. It resolves the child tool set from the global runtime tools, builds
7
+ * the production executeQuery, the budget ledger, the provider gate and the
8
+ * Supervisor, and returns the `subtask` OpenHorseTool to merge into the root
9
+ * turn's tool list. Returns null when subagents are off or the LLM is absent,
10
+ * so the root loop is unchanged.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.runSubtaskBatch = void 0;
14
+ exports.createSubagentBundleForTurn = createSubagentBundleForTurn;
15
+ exports.createSubagentToolForTurn = createSubagentToolForTurn;
16
+ exports.deriveRootLlmConfig = deriveRootLlmConfig;
17
+ const budget_1 = require("./budget");
18
+ const provider_gate_1 = require("./provider-gate");
19
+ const production_1 = require("./production");
20
+ const supervisor_1 = require("./supervisor");
21
+ Object.defineProperty(exports, "runSubtaskBatch", { enumerable: true, get: function () { return supervisor_1.runSubtaskBatch; } });
22
+ const tool_1 = require("./tool");
23
+ const presets_1 = require("./presets");
24
+ const child_executor_guard_1 = require("./child-executor-guard");
25
+ /**
26
+ * Lazy accessor for the runtime tool pool.
27
+ *
28
+ * Importing `../../tools` at module top-level creates a circular dependency:
29
+ * subagents barrel → runtime-integration → tools/index → web → config → subagents/types
30
+ * When `tools/index` loads before `web.ts` finishes, `WEB_TOOLS` is still
31
+ * `undefined` and `...WEB_TOOLS` throws "not iterable". Deferring the import
32
+ * to call-time breaks the cycle because by then all modules have initialized.
33
+ */
34
+ function lazyRuntimeTools() {
35
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
36
+ const tools = require('../../tools');
37
+ return { executeTool: tools.executeTool, getRuntimeTools: tools.getRuntimeTools };
38
+ }
39
+ /**
40
+ * Build the `subtask` tool for a root turn, or null if disabled.
41
+ *
42
+ * Returns a bundle: the tool to merge into the root turn's tool list, plus an
43
+ * accessor for the aggregate child usage so the root loop can fold child cost
44
+ * into its loop stats and `/cost`. The bundle is null when subagents are off.
45
+ */
46
+ function createSubagentBundleForTurn(inputs) {
47
+ const { config, cwd, rootLlmConfig, abortSignal, onSubtaskEvent } = inputs;
48
+ if (config.mode === 'off')
49
+ return null;
50
+ if (!rootLlmConfig.apiKey)
51
+ return null;
52
+ // Resolve child tools: all v0.2.20 roles share the read-only allowlist, so
53
+ // filter once for 'research'. Assert no forbidden tool slips in as a
54
+ // defense-in-depth check (the allowlist already excludes them, but this
55
+ // catches future regressions).
56
+ const { executeTool, getRuntimeTools } = lazyRuntimeTools();
57
+ const runtimeTools = getRuntimeTools();
58
+ const availableNames = runtimeTools.map(t => t.name);
59
+ const allowedNames = new Set((0, presets_1.filterToolsForRole)(availableNames, 'research', runtimeTools));
60
+ const childTools = runtimeTools.filter(t => allowedNames.has(t.name));
61
+ (0, presets_1.assertNoForbiddenTools)(childTools.map(t => t.name));
62
+ // Defense-in-depth: map tool name -> definition so the executor can re-verify
63
+ // isReadOnly() on every call. A tool that is not read-only must never execute
64
+ // in a child context, regardless of what the allowlist says at construction.
65
+ const childToolByName = new Map();
66
+ for (const t of childTools)
67
+ childToolByName.set(t.name, t);
68
+ // R3: scope holder lets the supervisor set the current packet's scope
69
+ // before each child runs, so the turn-level guard enforces per-packet
70
+ // containment without rebuilding the executor.
71
+ const scopeHolder = new child_executor_guard_1.ScopeHolder();
72
+ const unguardedExecutor = async (name, args, signal) => {
73
+ if (!allowedNames.has(name)) {
74
+ return JSON.stringify({ success: false, error: `Tool ${name} is not available to subagents.` });
75
+ }
76
+ // Re-verify read-only at execution time: catches tools whose isReadOnly()
77
+ // returns false (mutating MCP actions, future regressions).
78
+ const tool = childToolByName.get(name);
79
+ if (!tool || tool.isReadOnly?.(args) !== true) {
80
+ return JSON.stringify({ success: false, error: `Tool ${name} is not read-only and cannot run in a subagent.` });
81
+ }
82
+ const toolContext = { cwd, config: { name: 'openhorse-subagent', mode: 'subagent' }, abortSignal: signal };
83
+ return executeTool(name, args, signal, toolContext);
84
+ };
85
+ const childToolExecutor = (0, child_executor_guard_1.createChildToolExecutorGuard)(unguardedExecutor, {
86
+ rootCwd: cwd,
87
+ scopeHolder,
88
+ });
89
+ const providerGate = new provider_gate_1.SubagentProviderGate({ maxConcurrent: config.maxParallel });
90
+ const budget = new budget_1.SubagentBudgetLedger((0, budget_1.budgetLimitsFromConfig)({
91
+ maxModelRequestsPerTurn: config.maxModelRequestsPerTurn,
92
+ maxModelRequestsPerTask: config.maxModelRequestsPerTask,
93
+ maxToolCallsPerTask: config.maxToolCallsPerTask,
94
+ timeoutMs: config.timeoutMs,
95
+ }));
96
+ // R6: turn-level task counter persists across `subtask` calls so multiple
97
+ // calls in one root turn cannot exceed `maxTasksPerTurn`.
98
+ const turnTaskState = new budget_1.TurnTaskState();
99
+ const executeQuery = (0, production_1.createProductionExecuteQuery)({
100
+ rootConfig: rootLlmConfig,
101
+ providerGate,
102
+ maxTurnsPerTask: config.maxTurnsPerTask,
103
+ });
104
+ const supervisorDeps = {
105
+ config,
106
+ cwd,
107
+ budget,
108
+ providerGate,
109
+ executeQuery,
110
+ toolSet: { tools: childTools, toolExecutor: childToolExecutor },
111
+ scopeHolder,
112
+ turnTaskState,
113
+ hasPendingPermission: inputs.hasPendingPermission,
114
+ onChildUsage: inputs.onChildUsage,
115
+ parentAbortSignal: abortSignal,
116
+ rootObjectiveSummary: inputs.rootObjectiveSummary,
117
+ modelLabel: inputs.modelLabel,
118
+ onEvent: onSubtaskEvent,
119
+ onSubtaskResult: inputs.onSubtaskResult,
120
+ };
121
+ const tool = (0, tool_1.createSubtaskTool)(supervisorDeps);
122
+ return {
123
+ tool,
124
+ /** Read-only accessor for the reconciled aggregate child usage this turn. */
125
+ getAggregateUsage: () => budget.aggregateUsage(),
126
+ /** Number of subtasks that ran (reconciled) this turn. */
127
+ getSubtaskCount: () => budget.reconciledTaskCount(),
128
+ };
129
+ }
130
+ /**
131
+ * Backwards-compatible wrapper returning only the tool. Prefer
132
+ * {@link createSubagentBundleForTurn} when the root loop needs to fold child
133
+ * usage into its stats.
134
+ */
135
+ function createSubagentToolForTurn(inputs) {
136
+ const bundle = createSubagentBundleForTurn(inputs);
137
+ return bundle ? bundle.tool : null;
138
+ }
139
+ /** Derive the root LLM config slice from the runtime config. */
140
+ function deriveRootLlmConfig(config) {
141
+ return {
142
+ apiKey: config.apiKey,
143
+ baseUrl: config.apiBaseUrl,
144
+ model: config.model,
145
+ fallbackModel: config.fallbackModel,
146
+ };
147
+ }
148
+ //# sourceMappingURL=runtime-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-integration.js","sourceRoot":"","sources":["../../../src/runtime/subagents/runtime-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * SubagentSupervisor: orchestrates a batch of child subtasks.
3
+ *
4
+ * Owns the task/batch ID space, the state machine, the concurrency queue and
5
+ * ordered aggregation. It is the single place that decides when children start,
6
+ * how they are bounded, and how their results are folded back to the root.
7
+ *
8
+ * The supervisor does NOT own LLM state, tool execution, permission policy or
9
+ * transcript storage. It composes the policy gate, the budget ledger, the
10
+ * provider gate and the runner, and emits renderer-independent lifecycle
11
+ * events that the root loop forwards to terminal/Ink/TUI.
12
+ */
13
+ import { SubagentBudgetLedger, TurnTaskState } from './budget';
14
+ import { type PolicyRejectReason } from './policy';
15
+ import { SubagentProviderGate } from './provider-gate';
16
+ import { type ExecuteChildQuery, type ChildToolSet } from './runner';
17
+ import type { ScopeHolder } from './child-executor-guard';
18
+ import { type RuntimeSubtaskEvent, type SubagentConfig, type SubtaskBatchResult, type SubtaskRequest, type SubtaskResult } from './types';
19
+ export interface SubagentSupervisorDeps {
20
+ config: SubagentConfig;
21
+ cwd: string;
22
+ budget: SubagentBudgetLedger;
23
+ providerGate: SubagentProviderGate;
24
+ /** Injectable query binding shared with the runner (tests mock this). */
25
+ executeQuery: ExecuteChildQuery;
26
+ /** Filtered, child-safe tool set (already passed through presets). */
27
+ toolSet: ChildToolSet;
28
+ /**
29
+ * R3: mutable scope holder. The supervisor sets the current packet's
30
+ * canonical scope before running it, so the turn-level executor guard can
31
+ * enforce per-packet containment. Optional: when absent, only root
32
+ * containment is enforced.
33
+ */
34
+ scopeHolder?: ScopeHolder;
35
+ /**
36
+ * R6: turn-level task counter. Persists across `subtask` calls so multiple
37
+ * calls in one root turn cannot exceed `maxTasksPerTurn`. When absent, the
38
+ * supervisor falls back to a per-batch counter (weaker; logged).
39
+ */
40
+ turnTaskState?: TurnTaskState;
41
+ /**
42
+ * R6: live permission state from the root runtime. Returns true when a
43
+ * permission request is awaiting user decision. When absent, defaults to
44
+ * false (no pending permission) - the root loop should inject the real
45
+ * state to prevent background auto-approval bypass.
46
+ */
47
+ hasPendingPermission?: () => boolean;
48
+ /**
49
+ * R6: called with each child's observed usage (never clamped) so the root
50
+ * loop can record it into its shared CostTracker. Fires for every terminal
51
+ * state (completed/failed/cancelled/timed_out), so partial usage before a
52
+ * failure is still accounted.
53
+ */
54
+ onChildUsage?: (taskId: string, role: import('./types').SubagentRole, usage: import('./types').SubtaskUsage, modelLabel?: string) => void;
55
+ /** Parent turn abort signal; propagated to every child. */
56
+ parentAbortSignal?: AbortSignal;
57
+ /** Read-only context forwarded to each child. */
58
+ rootObjectiveSummary?: string;
59
+ modelLabel?: string;
60
+ /** Lifecycle event sink (runtime event + trace). */
61
+ onEvent?: (event: RuntimeSubtaskEvent) => void;
62
+ /** Called once per task with its final SubtaskResult (for artifact persistence). */
63
+ onSubtaskResult?: (result: SubtaskResult, batchId: string) => void;
64
+ }
65
+ export interface RunBatchOutcome {
66
+ result: SubtaskBatchResult;
67
+ /** Whether policy rejected the entire batch before any child ran. */
68
+ rejected: boolean;
69
+ rejectReason?: PolicyRejectReason;
70
+ }
71
+ /**
72
+ * Run a batch of subtasks. Returns a {@link SubtaskBatchResult} whose results
73
+ * are always in request order, regardless of completion order.
74
+ *
75
+ * Never throws: policy rejection, child failures, timeouts and cancels are
76
+ * all normalized into result entries.
77
+ */
78
+ export declare function runSubtaskBatch(request: SubtaskRequest, deps: SubagentSupervisorDeps): Promise<RunBatchOutcome>;
79
+ //# sourceMappingURL=supervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/runtime/subagents/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAA6C,KAAK,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAc,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAA2B,MAAM,UAAU,CAAC;AAC1G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EAEvB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,oBAAoB,CAAC;IAC7B,YAAY,EAAE,oBAAoB,CAAC;IACnC,yEAAyE;IACzE,YAAY,EAAE,iBAAiB,CAAC;IAChC,sEAAsE;IACtE,OAAO,EAAE,YAAY,CAAC;IACtB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC;IACrC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1I,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC/C,oFAAoF;IACpF,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpE;AAeD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,qEAAqE;IACrE,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAyG1B"}
@@ -0,0 +1,301 @@
1
+ "use strict";
2
+ /**
3
+ * SubagentSupervisor: orchestrates a batch of child subtasks.
4
+ *
5
+ * Owns the task/batch ID space, the state machine, the concurrency queue and
6
+ * ordered aggregation. It is the single place that decides when children start,
7
+ * how they are bounded, and how their results are folded back to the root.
8
+ *
9
+ * The supervisor does NOT own LLM state, tool execution, permission policy or
10
+ * transcript storage. It composes the policy gate, the budget ledger, the
11
+ * provider gate and the runner, and emits renderer-independent lifecycle
12
+ * events that the root loop forwards to terminal/Ink/TUI.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.runSubtaskBatch = runSubtaskBatch;
16
+ const policy_1 = require("./policy");
17
+ const runner_1 = require("./runner");
18
+ const types_1 = require("./types");
19
+ let batchCounter = 0;
20
+ let taskCounter = 0;
21
+ function nextBatchId() {
22
+ batchCounter += 1;
23
+ return `batch-${batchCounter}`;
24
+ }
25
+ function nextTaskId() {
26
+ taskCounter += 1;
27
+ return `task-${taskCounter}`;
28
+ }
29
+ /**
30
+ * Run a batch of subtasks. Returns a {@link SubtaskBatchResult} whose results
31
+ * are always in request order, regardless of completion order.
32
+ *
33
+ * Never throws: policy rejection, child failures, timeouts and cancels are
34
+ * all normalized into result entries.
35
+ */
36
+ async function runSubtaskBatch(request, deps) {
37
+ const policyCtx = {
38
+ depth: 0,
39
+ cwd: deps.cwd,
40
+ config: deps.config,
41
+ rootObjective: deps.rootObjectiveSummary ?? '',
42
+ // R6: turn-level counter persists across `subtask` calls so multiple
43
+ // calls in one root turn cannot exceed `maxTasksPerTurn`.
44
+ tasksStartedThisTurn: deps.turnTaskState?.tasksStarted() ?? 0,
45
+ runningChildren: deps.providerGate.activeCount(),
46
+ // R6: live permission state from the root runtime, not a hardcoded false.
47
+ hasPendingPermission: deps.hasPendingPermission ? deps.hasPendingPermission() : false,
48
+ parentAborted: Boolean(deps.parentAbortSignal?.aborted),
49
+ remainingModelRequests: deps.budget.availableModelRequests(),
50
+ providerCanReserve: (count) => deps.providerGate.canReserve(count),
51
+ };
52
+ const verdict = (0, policy_1.evaluateSubtaskPolicy)(request, policyCtx);
53
+ if (!verdict.allowed) {
54
+ const batchId = nextBatchId();
55
+ const results = request.tasks.map(packet => {
56
+ const result = buildRejectedResult(packet, verdict.reason);
57
+ // R7: finalize (trace/artifact/usage) exactly once even for rejected tasks.
58
+ finalizeTask(deps, batchId, result.id, packet, result);
59
+ return result;
60
+ });
61
+ return {
62
+ result: { batchId, results, aggregateUsage: (0, types_1.sumSubtaskUsage)([]) },
63
+ rejected: true,
64
+ rejectReason: verdict.reason,
65
+ };
66
+ }
67
+ // R6: account for the accepted tasks in the turn-level counter so the
68
+ // next `subtask` call in the same turn sees the updated total.
69
+ deps.turnTaskState?.addStarted(request.tasks.length);
70
+ const batchId = nextBatchId();
71
+ const tasks = request.tasks;
72
+ const taskIds = tasks.map(() => nextTaskId());
73
+ // Reserve a fair share per task: the per-task cap, but no more than an even
74
+ // slice of the turn budget. This lets a 3-task batch fit when the turn limit
75
+ // is smaller than 3x the per-task cap, while the per-task cap still binds at
76
+ // reconcile time. Reserving the full per-task cap for every task would
77
+ // reject batches that would actually fit once real usage is known.
78
+ const reservePerTask = Math.max(1, Math.min(deps.config.maxModelRequestsPerTask, Math.floor(deps.config.maxModelRequestsPerTurn / tasks.length)));
79
+ // Reserve budget for every task up front; abort the batch if any reserve fails.
80
+ for (let i = 0; i < tasks.length; i++) {
81
+ const reserved = deps.budget.reserve(taskIds[i], reservePerTask);
82
+ if (!reserved) {
83
+ // Release what we reserved and reject the rest.
84
+ for (let j = 0; j <= i; j++)
85
+ deps.budget.release(taskIds[j]);
86
+ const results = tasks.map((packet, i) => {
87
+ const result = buildRejectedResult(packet, 'budget_exhausted', taskIds[i]);
88
+ // R7: finalize rejected tasks too.
89
+ finalizeTask(deps, batchId, result.id, packet, result);
90
+ return result;
91
+ });
92
+ return {
93
+ result: { batchId, results, aggregateUsage: (0, types_1.sumSubtaskUsage)([]) },
94
+ rejected: true,
95
+ rejectReason: 'budget_exhausted',
96
+ };
97
+ }
98
+ emit(deps, {
99
+ batchId, taskId: taskIds[i], role: tasks[i].role, state: 'queued',
100
+ objective: tasks[i].objective,
101
+ });
102
+ }
103
+ const runnerDeps = (i) => ({
104
+ cwd: deps.cwd,
105
+ canonicalScopePaths: verdict.canonicalScope.get(i),
106
+ toolSet: deps.toolSet,
107
+ executeQuery: deps.executeQuery,
108
+ timeoutMs: deps.config.timeoutMs,
109
+ parentAbortSignal: deps.parentAbortSignal,
110
+ rootObjectiveSummary: deps.rootObjectiveSummary,
111
+ modelLabel: deps.modelLabel,
112
+ });
113
+ let outcomes;
114
+ if (request.execution === 'parallel') {
115
+ outcomes = await runParallel(tasks, taskIds, batchId, deps, runnerDeps);
116
+ }
117
+ else {
118
+ outcomes = await runSerial(tasks, taskIds, batchId, deps, runnerDeps);
119
+ }
120
+ // Reconcile budget for each task with its real usage.
121
+ for (const outcome of outcomes) {
122
+ deps.budget.reconcile(outcome.result.id, outcome.result.usage);
123
+ }
124
+ const results = outcomes.map(o => o.result);
125
+ const aggregateUsage = (0, types_1.sumSubtaskUsage)(results.map(r => r.usage));
126
+ return {
127
+ result: { batchId, results, aggregateUsage },
128
+ rejected: false,
129
+ };
130
+ }
131
+ async function runParallel(tasks, taskIds, batchId, deps, runnerDeps) {
132
+ // Launch each child; the provider gate bounds actual concurrency. Collect
133
+ // by index so the final order matches the request order.
134
+ // allSettled guarantees every task is accounted for even if a future
135
+ // refactor breaks the "runOne never throws" contract.
136
+ const slots = tasks.map((task, i) => runOne(task, taskIds[i], batchId, i, deps, runnerDeps(i)));
137
+ const settled = await Promise.allSettled(slots);
138
+ return settled.map((s, i) => {
139
+ if (s.status === 'fulfilled')
140
+ return s.value;
141
+ // Defensive: construct a failed result for any slot that threw unexpectedly.
142
+ const task = tasks[i];
143
+ const result = {
144
+ id: taskIds[i],
145
+ role: task.role,
146
+ status: 'failed',
147
+ summary: 'Unexpected runner error.',
148
+ findings: [],
149
+ files: [],
150
+ commands: [],
151
+ verification: [],
152
+ risks: ['runner threw unexpectedly'],
153
+ usage: { modelRequests: 0, toolCalls: 0, promptTokens: 0, completionTokens: 0, durationMs: 0 },
154
+ };
155
+ finalizeTask(deps, batchId, taskIds[i], task, result);
156
+ return { result, parentCancelled: false };
157
+ });
158
+ }
159
+ async function runSerial(tasks, taskIds, batchId, deps, runnerDeps) {
160
+ const outcomes = [];
161
+ for (let i = 0; i < tasks.length; i++) {
162
+ if (deps.parentAbortSignal?.aborted) {
163
+ // Mark remaining as cancelled without running them.
164
+ // R7: finalize each cancelled result (trace/artifact/usage) exactly
165
+ // once, same as a ran task, so resume sees the cancelled state.
166
+ for (let j = i; j < tasks.length; j++) {
167
+ const cancelled = cancelledResult(taskIds[j], tasks[j]);
168
+ finalizeTask(deps, batchId, taskIds[j], tasks[j], cancelled);
169
+ outcomes.push({
170
+ result: cancelled,
171
+ parentCancelled: true,
172
+ });
173
+ }
174
+ break;
175
+ }
176
+ const outcome = await runOne(tasks[i], taskIds[i], batchId, i, deps, runnerDeps(i));
177
+ outcomes.push(outcome);
178
+ }
179
+ return outcomes;
180
+ }
181
+ async function runOne(task, taskId, batchId, _index, deps, runnerDeps) {
182
+ // R4: pass the parent abort signal so a queued waiter is removed and
183
+ // rejected when the user hits Ctrl+C, instead of hanging until a slot
184
+ // frees. A rejected acquire yields a cancelled result, not a hung batch.
185
+ try {
186
+ await deps.providerGate.acquire(deps.parentAbortSignal);
187
+ }
188
+ catch {
189
+ // AcquireAbortedError: parent aborted while queued. Treat as cancelled.
190
+ // R7: finalize the cancelled result so trace/artifact/usage are recorded
191
+ // exactly once, same as any other terminal state.
192
+ const cancelled = cancelledResult(taskId, task);
193
+ finalizeTask(deps, batchId, taskId, task, cancelled);
194
+ return { result: cancelled, parentCancelled: true };
195
+ }
196
+ try {
197
+ // R3: set the current packet's canonical scope so the executor guard
198
+ // enforces per-packet containment. Cleared in finally.
199
+ if (deps.scopeHolder) {
200
+ deps.scopeHolder.setScope(runnerDeps.canonicalScopePaths ?? []);
201
+ }
202
+ emit(deps, { batchId, taskId, role: task.role, state: 'running', objective: task.objective });
203
+ const outcome = await (0, runner_1.runSubtask)(task, runnerDeps, taskId);
204
+ // R7: single finalize path - terminal event + result callback + usage
205
+ // callback all happen here, exactly once, with errors isolated so a
206
+ // throwing sink cannot reject the batch or corrupt sibling aggregation.
207
+ finalizeTask(deps, batchId, taskId, task, outcome.result);
208
+ return outcome;
209
+ }
210
+ finally {
211
+ deps.providerGate.release();
212
+ deps.scopeHolder?.clear();
213
+ }
214
+ }
215
+ /**
216
+ * R7: finalize exactly once per task. Emits the terminal lifecycle event,
217
+ * persists the result (artifact), and reports observed usage to the root
218
+ * CostTracker. Sink errors (event/trace/artifact/usage) are isolated into
219
+ * diagnostics: they must NOT change the child's business terminal state or
220
+ * reject the batch, so a failing sink cannot corrupt sibling aggregation.
221
+ */
222
+ function finalizeTask(deps, batchId, taskId, task, result) {
223
+ // Terminal lifecycle event - isolated.
224
+ try {
225
+ emit(deps, {
226
+ batchId, taskId, role: task.role,
227
+ state: toEventState(result.status),
228
+ objective: task.objective,
229
+ summary: result.summary,
230
+ durationMs: result.usage.durationMs,
231
+ usage: result.usage,
232
+ });
233
+ }
234
+ catch {
235
+ // Sink failure must not affect the result.
236
+ }
237
+ // Persist the structured result for trace/resume durability - isolated.
238
+ try {
239
+ deps.onSubtaskResult?.(result, batchId);
240
+ }
241
+ catch {
242
+ // An artifact/trace sink throwing cannot reject the batch.
243
+ }
244
+ // Report observed usage (never clamped) to the root CostTracker - isolated.
245
+ try {
246
+ deps.onChildUsage?.(taskId, task.role, result.usage, deps.modelLabel);
247
+ }
248
+ catch {
249
+ // CostTracker failure must not affect the result.
250
+ }
251
+ }
252
+ function toEventState(status) {
253
+ switch (status) {
254
+ case 'completed': return 'completed';
255
+ case 'failed': return 'failed';
256
+ case 'cancelled': return 'cancelled';
257
+ case 'timed_out': return 'timed_out';
258
+ case 'rejected': return 'rejected';
259
+ }
260
+ }
261
+ /** Build a rejected result (does not emit - finalizeTask handles that). */
262
+ function buildRejectedResult(packet, reason, taskId) {
263
+ const id = taskId ?? nextTaskId();
264
+ return {
265
+ id,
266
+ role: packet.role,
267
+ status: 'rejected',
268
+ summary: `Rejected by policy: ${reason}`,
269
+ findings: [],
270
+ files: [],
271
+ commands: [],
272
+ verification: [],
273
+ risks: [`policy rejected: ${reason}`],
274
+ usage: { modelRequests: 0, toolCalls: 0, promptTokens: 0, completionTokens: 0, durationMs: 0 },
275
+ };
276
+ }
277
+ function cancelledResult(taskId, packet) {
278
+ return {
279
+ id: taskId,
280
+ role: packet.role,
281
+ status: 'cancelled',
282
+ summary: 'Cancelled: parent turn aborted before this task started.',
283
+ findings: [],
284
+ files: [],
285
+ commands: [],
286
+ verification: [],
287
+ risks: ['parent turn aborted'],
288
+ usage: { modelRequests: 0, toolCalls: 0, promptTokens: 0, completionTokens: 0, durationMs: 0 },
289
+ };
290
+ }
291
+ function emit(deps, event) {
292
+ // R7: an event sink throwing must never reject the batch or corrupt
293
+ // sibling aggregation - isolate it as a diagnostic.
294
+ try {
295
+ deps.onEvent?.(event);
296
+ }
297
+ catch {
298
+ // Event sink failure is best-effort; the result is unaffected.
299
+ }
300
+ }
301
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../../src/runtime/subagents/supervisor.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AA2FH,0CA4GC;AApMD,qCAA8F;AAE9F,qCAA0G;AAE1G,mCAQiB;AAiDjB,IAAI,YAAY,GAAG,CAAC,CAAC;AACrB,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB,SAAS,WAAW;IAClB,YAAY,IAAI,CAAC,CAAC;IAClB,OAAO,SAAS,YAAY,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,UAAU;IACjB,WAAW,IAAI,CAAC,CAAC;IACjB,OAAO,QAAQ,WAAW,EAAE,CAAC;AAC/B,CAAC;AASD;;;;;;GAMG;AACI,KAAK,UAAU,eAAe,CACnC,OAAuB,EACvB,IAA4B;IAE5B,MAAM,SAAS,GAAkB;QAC/B,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,aAAa,EAAE,IAAI,CAAC,oBAAoB,IAAI,EAAE;QAC9C,qEAAqE;QACrE,0DAA0D;QAC1D,oBAAoB,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC;QAC7D,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;QAChD,0EAA0E;QAC1E,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,KAAK;QACrF,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC;QACvD,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;QAC5D,kBAAkB,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC;KAC3E,CAAC;IAEF,MAAM,OAAO,GAAG,IAAA,8BAAqB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACzC,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3D,4EAA4E;YAC5E,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACvD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,OAAO;YACL,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,IAAA,uBAAe,EAAC,EAAE,CAAC,EAAE;YACjE,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,OAAO,CAAC,MAAM;SAC7B,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,+DAA+D;IAC/D,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;IAE9C,4EAA4E;IAC5E,6EAA6E;IAC7E,6EAA6E;IAC7E,uEAAuE;IACvE,mEAAmE;IACnE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAC7B,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAC9G,CAAC;IAEF,gFAAgF;IAChF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,gDAAgD;YAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtC,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3E,mCAAmC;gBACnC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBACvD,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,OAAO;gBACL,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,IAAA,uBAAe,EAAC,EAAE,CAAC,EAAE;gBACjE,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,kBAAkB;aACjC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ;YACjE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,CAAS,EAAsB,EAAE,CAAC,CAAC;QACrD,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,mBAAmB,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;QAChC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;QAC/C,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAC;IAEH,IAAI,QAAoE,CAAC;IACzE,IAAI,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QACrC,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACxE,CAAC;IAED,sDAAsD;IACtD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,IAAA,uBAAe,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAElE,OAAO;QACL,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE;QAC5C,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,KAAsB,EACtB,OAAiB,EACjB,OAAe,EACf,IAA4B,EAC5B,UAA6C;IAE7C,0EAA0E;IAC1E,yDAAyD;IACzD,qEAAqE;IACrE,sDAAsD;IACtD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC;QAC7C,6EAA6E;QAC7E,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,MAAM,GAAkB;YAC5B,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,0BAA0B;YACnC,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,EAAE;YAChB,KAAK,EAAE,CAAC,2BAA2B,CAAC;YACpC,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;SAC/F,CAAC;QACF,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,KAAsB,EACtB,OAAiB,EACjB,OAAe,EACf,IAA4B,EAC5B,UAA6C;IAE7C,MAAM,QAAQ,GAA+D,EAAE,CAAC;IAChF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC;YACpC,oDAAoD;YACpD,oEAAoE;YACpE,gEAAgE;YAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxD,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBAC7D,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,SAAS;oBACjB,eAAe,EAAE,IAAI;iBACtB,CAAC,CAAC;YACL,CAAC;YACD,MAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,IAAmB,EACnB,MAAc,EACd,OAAe,EACf,MAAc,EACd,IAA4B,EAC5B,UAA8B;IAE9B,qEAAqE;IACrE,sEAAsE;IACtE,yEAAyE;IACzE,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,yEAAyE;QACzE,kDAAkD;QAClD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChD,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,CAAC;QACH,qEAAqE;QACrE,uDAAuD;QACvD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9F,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAU,EAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3D,sEAAsE;QACtE,oEAAoE;QACpE,wEAAwE;QACxE,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CACnB,IAA4B,EAC5B,OAAe,EACf,MAAc,EACd,IAAmB,EACnB,MAAqB;IAErB,uCAAuC;IACvC,IAAI,CAAC;QACH,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI;YAChC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;YAClC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;YACnC,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;IAC7C,CAAC;IAED,wEAAwE;IACxE,IAAI,CAAC;QACH,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;IAED,4EAA4E;IAC5E,IAAI,CAAC;QACH,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAA+B;IACnD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW,CAAC,CAAC,OAAO,WAAW,CAAC;QACrC,KAAK,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC;QAC/B,KAAK,WAAW,CAAC,CAAC,OAAO,WAAW,CAAC;QACrC,KAAK,WAAW,CAAC,CAAC,OAAO,WAAW,CAAC;QACrC,KAAK,UAAU,CAAC,CAAC,OAAO,UAAU,CAAC;IACrC,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,SAAS,mBAAmB,CAAC,MAAqB,EAAE,MAAc,EAAE,MAAe;IACjF,MAAM,EAAE,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC;IAClC,OAAO;QACL,EAAE;QACF,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,uBAAuB,MAAM,EAAE;QACxC,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,EAAE;QAChB,KAAK,EAAE,CAAC,oBAAoB,MAAM,EAAE,CAAC;QACrC,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;KAC/F,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,MAAqB;IAC5D,OAAO;QACL,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,0DAA0D;QACnE,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,EAAE;QAChB,KAAK,EAAE,CAAC,qBAAqB,CAAC;QAC9B,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;KAC/F,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,IAA4B,EAAE,KAA0B;IACpE,oEAAoE;IACpE,oDAAoD;IACpD,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * createSubtaskTool: the runtime-bound `subtask` tool factory.
3
+ *
4
+ * Unlike global stateless tools, this tool is created per root turn and bound
5
+ * to a {@link SubagentSupervisor}. It is the only way the root Agent can
6
+ * request child investigations; children themselves never receive it (the
7
+ * preset allowlist strips `subtask`), so delegation depth is structurally 1.
8
+ *
9
+ * The tool is read-only orchestration: it never writes, and its result is the
10
+ * structured batch summary the root Agent consumes to continue its own work.
11
+ */
12
+ import { type OpenHorseTool } from '../../framework/tool';
13
+ import { type SubagentSupervisorDeps } from './supervisor';
14
+ import type { SubtaskRequest } from './types';
15
+ /** Coerce model-provided args into a validated SubtaskRequest. */
16
+ export declare function coerceSubtaskRequest(args: Record<string, unknown>): SubtaskRequest | null;
17
+ /**
18
+ * Create the runtime-bound `subtask` tool. The supervisor is captured in the
19
+ * closure so the tool is stateless from the scheduler's perspective.
20
+ */
21
+ export declare function createSubtaskTool(supervisorDeps: SubagentSupervisorDeps): OpenHorseTool;
22
+ /** Produce a compact, model-facing summary of a batch result. */
23
+ export declare function summarizeBatchForModel(batch: {
24
+ batchId: string;
25
+ results: Array<{
26
+ role: string;
27
+ status: string;
28
+ summary: string;
29
+ findings: unknown[];
30
+ risks: string[];
31
+ }>;
32
+ aggregateUsage: {
33
+ modelRequests: number;
34
+ toolCalls: number;
35
+ durationMs: number;
36
+ };
37
+ }): string;
38
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/runtime/subagents/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAa,KAAK,aAAa,EAA4B,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EAA+B,cAAc,EAAE,MAAM,SAAS,CAAC;AAyC3E,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,GAAG,IAAI,CA4BzF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,sBAAsB,GAAG,aAAa,CA4DvF;AAED,iEAAiE;AACjE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAAC,cAAc,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAWpQ"}