attocode 0.2.3 → 0.2.5

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 (787) hide show
  1. package/CHANGELOG.md +122 -1
  2. package/README.md +65 -5
  3. package/dist/src/adapters.d.ts +2 -1
  4. package/dist/src/adapters.d.ts.map +1 -1
  5. package/dist/src/adapters.js +74 -12
  6. package/dist/src/adapters.js.map +1 -1
  7. package/dist/src/agent/agent-builder.d.ts +117 -0
  8. package/dist/src/agent/agent-builder.d.ts.map +1 -0
  9. package/dist/src/agent/agent-builder.js +204 -0
  10. package/dist/src/agent/agent-builder.js.map +1 -0
  11. package/dist/src/agent/feature-initializer.d.ts +80 -0
  12. package/dist/src/agent/feature-initializer.d.ts.map +1 -0
  13. package/dist/src/agent/feature-initializer.js +677 -0
  14. package/dist/src/agent/feature-initializer.js.map +1 -0
  15. package/dist/src/agent/index.d.ts +13 -0
  16. package/dist/src/agent/index.d.ts.map +1 -0
  17. package/dist/src/agent/index.js +13 -0
  18. package/dist/src/agent/index.js.map +1 -0
  19. package/dist/src/agent/message-builder.d.ts +50 -0
  20. package/dist/src/agent/message-builder.d.ts.map +1 -0
  21. package/dist/src/agent/message-builder.js +173 -0
  22. package/dist/src/agent/message-builder.js.map +1 -0
  23. package/dist/src/agent/session-api.d.ts +94 -0
  24. package/dist/src/agent/session-api.d.ts.map +1 -0
  25. package/dist/src/agent/session-api.js +262 -0
  26. package/dist/src/agent/session-api.js.map +1 -0
  27. package/dist/src/agent-tools/lsp-file-tools.d.ts +1 -1
  28. package/dist/src/agent-tools/lsp-file-tools.d.ts.map +1 -1
  29. package/dist/src/agent.d.ts +52 -213
  30. package/dist/src/agent.d.ts.map +1 -1
  31. package/dist/src/agent.js +544 -4072
  32. package/dist/src/agent.js.map +1 -1
  33. package/dist/src/cli.d.ts.map +1 -1
  34. package/dist/src/cli.js +2 -1
  35. package/dist/src/cli.js.map +1 -1
  36. package/dist/src/commands/handler.d.ts.map +1 -1
  37. package/dist/src/commands/handler.js +18 -9
  38. package/dist/src/commands/handler.js.map +1 -1
  39. package/dist/src/commands/init-commands.d.ts.map +1 -1
  40. package/dist/src/commands/init-commands.js +16 -1
  41. package/dist/src/commands/init-commands.js.map +1 -1
  42. package/dist/src/commands/init.d.ts.map +1 -1
  43. package/dist/src/commands/init.js +31 -0
  44. package/dist/src/commands/init.js.map +1 -1
  45. package/dist/src/config/base-types.d.ts +45 -0
  46. package/dist/src/config/base-types.d.ts.map +1 -0
  47. package/dist/src/config/base-types.js +9 -0
  48. package/dist/src/config/base-types.js.map +1 -0
  49. package/dist/src/config/config-manager.d.ts +35 -0
  50. package/dist/src/config/config-manager.d.ts.map +1 -0
  51. package/dist/src/config/config-manager.js +108 -0
  52. package/dist/src/config/config-manager.js.map +1 -0
  53. package/dist/src/config/index.d.ts +4 -0
  54. package/dist/src/config/index.d.ts.map +1 -0
  55. package/dist/src/config/index.js +3 -0
  56. package/dist/src/config/index.js.map +1 -0
  57. package/dist/src/config/schema.d.ts +1546 -0
  58. package/dist/src/config/schema.d.ts.map +1 -0
  59. package/dist/src/config/schema.js +268 -0
  60. package/dist/src/config/schema.js.map +1 -0
  61. package/dist/src/config.d.ts +4 -1
  62. package/dist/src/config.d.ts.map +1 -1
  63. package/dist/src/config.js +8 -12
  64. package/dist/src/config.js.map +1 -1
  65. package/dist/src/core/agent-state-machine.d.ts +131 -0
  66. package/dist/src/core/agent-state-machine.d.ts.map +1 -0
  67. package/dist/src/core/agent-state-machine.js +302 -0
  68. package/dist/src/core/agent-state-machine.js.map +1 -0
  69. package/dist/src/core/base-manager.d.ts +79 -0
  70. package/dist/src/core/base-manager.d.ts.map +1 -0
  71. package/dist/src/core/base-manager.js +170 -0
  72. package/dist/src/core/base-manager.js.map +1 -0
  73. package/dist/src/core/completion-analyzer.d.ts +15 -0
  74. package/dist/src/core/completion-analyzer.d.ts.map +1 -0
  75. package/dist/src/core/completion-analyzer.js +53 -0
  76. package/dist/src/core/completion-analyzer.js.map +1 -0
  77. package/dist/src/core/execution-loop.d.ts +46 -0
  78. package/dist/src/core/execution-loop.d.ts.map +1 -0
  79. package/dist/src/core/execution-loop.js +1397 -0
  80. package/dist/src/core/execution-loop.js.map +1 -0
  81. package/dist/src/core/index.d.ts +7 -0
  82. package/dist/src/core/index.d.ts.map +1 -1
  83. package/dist/src/core/index.js +9 -0
  84. package/dist/src/core/index.js.map +1 -1
  85. package/dist/src/core/process-handlers.d.ts.map +1 -1
  86. package/dist/src/core/process-handlers.js +14 -0
  87. package/dist/src/core/process-handlers.js.map +1 -1
  88. package/dist/src/core/protocol/types.d.ts +12 -12
  89. package/dist/src/core/response-handler.d.ts +16 -0
  90. package/dist/src/core/response-handler.d.ts.map +1 -0
  91. package/dist/src/core/response-handler.js +235 -0
  92. package/dist/src/core/response-handler.js.map +1 -0
  93. package/dist/src/core/subagent-spawner.d.ts +43 -0
  94. package/dist/src/core/subagent-spawner.d.ts.map +1 -0
  95. package/dist/src/core/subagent-spawner.js +973 -0
  96. package/dist/src/core/subagent-spawner.js.map +1 -0
  97. package/dist/src/core/tool-executor.d.ts +59 -0
  98. package/dist/src/core/tool-executor.d.ts.map +1 -0
  99. package/dist/src/core/tool-executor.js +682 -0
  100. package/dist/src/core/tool-executor.js.map +1 -0
  101. package/dist/src/core/types.d.ts +134 -0
  102. package/dist/src/core/types.d.ts.map +1 -0
  103. package/dist/src/core/types.js +12 -0
  104. package/dist/src/core/types.js.map +1 -0
  105. package/dist/src/defaults.d.ts +2 -2
  106. package/dist/src/defaults.d.ts.map +1 -1
  107. package/dist/src/defaults.js +29 -1
  108. package/dist/src/defaults.js.map +1 -1
  109. package/dist/src/integrations/agents/agent-registry.d.ts +262 -0
  110. package/dist/src/integrations/agents/agent-registry.d.ts.map +1 -0
  111. package/dist/src/integrations/agents/agent-registry.js +686 -0
  112. package/dist/src/integrations/agents/agent-registry.js.map +1 -0
  113. package/dist/src/integrations/agents/async-subagent.d.ts +135 -0
  114. package/dist/src/integrations/agents/async-subagent.d.ts.map +1 -0
  115. package/dist/src/integrations/agents/async-subagent.js +213 -0
  116. package/dist/src/integrations/agents/async-subagent.js.map +1 -0
  117. package/dist/src/integrations/agents/complexity-classifier.d.ts +86 -0
  118. package/dist/src/integrations/agents/complexity-classifier.d.ts.map +1 -0
  119. package/dist/src/integrations/agents/complexity-classifier.js +233 -0
  120. package/dist/src/integrations/agents/complexity-classifier.js.map +1 -0
  121. package/dist/src/integrations/agents/delegation-protocol.d.ts +86 -0
  122. package/dist/src/integrations/agents/delegation-protocol.d.ts.map +1 -0
  123. package/dist/src/integrations/agents/delegation-protocol.js +127 -0
  124. package/dist/src/integrations/agents/delegation-protocol.js.map +1 -0
  125. package/dist/src/integrations/agents/multi-agent.d.ts +150 -0
  126. package/dist/src/integrations/agents/multi-agent.d.ts.map +1 -0
  127. package/dist/src/integrations/agents/multi-agent.js +306 -0
  128. package/dist/src/integrations/agents/multi-agent.js.map +1 -0
  129. package/dist/src/integrations/agents/result-synthesizer.d.ts +389 -0
  130. package/dist/src/integrations/agents/result-synthesizer.d.ts.map +1 -0
  131. package/dist/src/integrations/agents/result-synthesizer.js +951 -0
  132. package/dist/src/integrations/agents/result-synthesizer.js.map +1 -0
  133. package/dist/src/integrations/agents/shared-blackboard.d.ts +406 -0
  134. package/dist/src/integrations/agents/shared-blackboard.d.ts.map +1 -0
  135. package/dist/src/integrations/agents/shared-blackboard.js +757 -0
  136. package/dist/src/integrations/agents/shared-blackboard.js.map +1 -0
  137. package/dist/src/integrations/agents/subagent-output-store.d.ts +91 -0
  138. package/dist/src/integrations/agents/subagent-output-store.d.ts.map +1 -0
  139. package/dist/src/integrations/agents/subagent-output-store.js +257 -0
  140. package/dist/src/integrations/agents/subagent-output-store.js.map +1 -0
  141. package/dist/src/integrations/auto-compaction.d.ts.map +1 -1
  142. package/dist/src/integrations/auto-compaction.js +3 -2
  143. package/dist/src/integrations/auto-compaction.js.map +1 -1
  144. package/dist/src/integrations/budget/budget-pool.d.ts +115 -0
  145. package/dist/src/integrations/budget/budget-pool.d.ts.map +1 -0
  146. package/dist/src/integrations/budget/budget-pool.js +205 -0
  147. package/dist/src/integrations/budget/budget-pool.js.map +1 -0
  148. package/dist/src/integrations/budget/cancellation.d.ts +229 -0
  149. package/dist/src/integrations/budget/cancellation.d.ts.map +1 -0
  150. package/dist/src/integrations/budget/cancellation.js +520 -0
  151. package/dist/src/integrations/budget/cancellation.js.map +1 -0
  152. package/dist/src/integrations/budget/dynamic-budget.d.ts +81 -0
  153. package/dist/src/integrations/budget/dynamic-budget.d.ts.map +1 -0
  154. package/dist/src/integrations/budget/dynamic-budget.js +151 -0
  155. package/dist/src/integrations/budget/dynamic-budget.js.map +1 -0
  156. package/dist/src/integrations/budget/economics.d.ts +435 -0
  157. package/dist/src/integrations/budget/economics.d.ts.map +1 -0
  158. package/dist/src/integrations/budget/economics.js +1007 -0
  159. package/dist/src/integrations/budget/economics.js.map +1 -0
  160. package/dist/src/integrations/budget/injection-budget.d.ts +71 -0
  161. package/dist/src/integrations/budget/injection-budget.d.ts.map +1 -0
  162. package/dist/src/integrations/budget/injection-budget.js +137 -0
  163. package/dist/src/integrations/budget/injection-budget.js.map +1 -0
  164. package/dist/src/integrations/budget/loop-detector.d.ts +105 -0
  165. package/dist/src/integrations/budget/loop-detector.d.ts.map +1 -0
  166. package/dist/src/integrations/budget/loop-detector.js +287 -0
  167. package/dist/src/integrations/budget/loop-detector.js.map +1 -0
  168. package/dist/src/integrations/budget/phase-tracker.d.ts +114 -0
  169. package/dist/src/integrations/budget/phase-tracker.d.ts.map +1 -0
  170. package/dist/src/integrations/budget/phase-tracker.js +262 -0
  171. package/dist/src/integrations/budget/phase-tracker.js.map +1 -0
  172. package/dist/src/integrations/budget/resources.d.ts +182 -0
  173. package/dist/src/integrations/budget/resources.d.ts.map +1 -0
  174. package/dist/src/integrations/budget/resources.js +318 -0
  175. package/dist/src/integrations/budget/resources.js.map +1 -0
  176. package/dist/src/integrations/budget-pool.d.ts +7 -0
  177. package/dist/src/integrations/budget-pool.d.ts.map +1 -1
  178. package/dist/src/integrations/budget-pool.js +43 -0
  179. package/dist/src/integrations/budget-pool.js.map +1 -1
  180. package/dist/src/integrations/codebase-ast.d.ts +52 -0
  181. package/dist/src/integrations/codebase-ast.d.ts.map +1 -0
  182. package/dist/src/integrations/codebase-ast.js +457 -0
  183. package/dist/src/integrations/codebase-ast.js.map +1 -0
  184. package/dist/src/integrations/codebase-context.d.ts +18 -0
  185. package/dist/src/integrations/codebase-context.d.ts.map +1 -1
  186. package/dist/src/integrations/codebase-context.js +197 -17
  187. package/dist/src/integrations/codebase-context.js.map +1 -1
  188. package/dist/src/integrations/compaction.d.ts.map +1 -1
  189. package/dist/src/integrations/compaction.js +14 -6
  190. package/dist/src/integrations/compaction.js.map +1 -1
  191. package/dist/src/integrations/context/auto-compaction.d.ts +210 -0
  192. package/dist/src/integrations/context/auto-compaction.d.ts.map +1 -0
  193. package/dist/src/integrations/context/auto-compaction.js +477 -0
  194. package/dist/src/integrations/context/auto-compaction.js.map +1 -0
  195. package/dist/src/integrations/context/code-analyzer.d.ts +71 -0
  196. package/dist/src/integrations/context/code-analyzer.d.ts.map +1 -0
  197. package/dist/src/integrations/context/code-analyzer.js +448 -0
  198. package/dist/src/integrations/context/code-analyzer.js.map +1 -0
  199. package/dist/src/integrations/context/code-selector.d.ts +78 -0
  200. package/dist/src/integrations/context/code-selector.d.ts.map +1 -0
  201. package/dist/src/integrations/context/code-selector.js +649 -0
  202. package/dist/src/integrations/context/code-selector.js.map +1 -0
  203. package/dist/src/integrations/context/codebase-ast.d.ts +138 -0
  204. package/dist/src/integrations/context/codebase-ast.d.ts.map +1 -0
  205. package/dist/src/integrations/context/codebase-ast.js +818 -0
  206. package/dist/src/integrations/context/codebase-ast.js.map +1 -0
  207. package/dist/src/integrations/context/codebase-context.d.ts +473 -0
  208. package/dist/src/integrations/context/codebase-context.d.ts.map +1 -0
  209. package/dist/src/integrations/context/codebase-context.js +685 -0
  210. package/dist/src/integrations/context/codebase-context.js.map +1 -0
  211. package/dist/src/integrations/context/compaction.d.ts +191 -0
  212. package/dist/src/integrations/context/compaction.d.ts.map +1 -0
  213. package/dist/src/integrations/context/compaction.js +384 -0
  214. package/dist/src/integrations/context/compaction.js.map +1 -0
  215. package/dist/src/integrations/context/context-engineering.d.ts +274 -0
  216. package/dist/src/integrations/context/context-engineering.d.ts.map +1 -0
  217. package/dist/src/integrations/context/context-engineering.js +437 -0
  218. package/dist/src/integrations/context/context-engineering.js.map +1 -0
  219. package/dist/src/integrations/context/file-cache.d.ts +97 -0
  220. package/dist/src/integrations/context/file-cache.d.ts.map +1 -0
  221. package/dist/src/integrations/context/file-cache.js +218 -0
  222. package/dist/src/integrations/context/file-cache.js.map +1 -0
  223. package/dist/src/integrations/context/semantic-cache.d.ts +178 -0
  224. package/dist/src/integrations/context/semantic-cache.d.ts.map +1 -0
  225. package/dist/src/integrations/context/semantic-cache.js +372 -0
  226. package/dist/src/integrations/context/semantic-cache.js.map +1 -0
  227. package/dist/src/integrations/context-engineering.d.ts +8 -0
  228. package/dist/src/integrations/context-engineering.d.ts.map +1 -1
  229. package/dist/src/integrations/context-engineering.js +19 -0
  230. package/dist/src/integrations/context-engineering.js.map +1 -1
  231. package/dist/src/integrations/economics.d.ts +25 -1
  232. package/dist/src/integrations/economics.d.ts.map +1 -1
  233. package/dist/src/integrations/economics.js +217 -38
  234. package/dist/src/integrations/economics.js.map +1 -1
  235. package/dist/src/integrations/edit-validator.d.ts +30 -0
  236. package/dist/src/integrations/edit-validator.d.ts.map +1 -0
  237. package/dist/src/integrations/edit-validator.js +85 -0
  238. package/dist/src/integrations/edit-validator.js.map +1 -0
  239. package/dist/src/integrations/file-cache.d.ts +7 -0
  240. package/dist/src/integrations/file-cache.d.ts.map +1 -1
  241. package/dist/src/integrations/file-cache.js +54 -0
  242. package/dist/src/integrations/file-cache.js.map +1 -1
  243. package/dist/src/integrations/health-check.d.ts.map +1 -1
  244. package/dist/src/integrations/health-check.js +3 -2
  245. package/dist/src/integrations/health-check.js.map +1 -1
  246. package/dist/src/integrations/hierarchical-config.d.ts +3 -0
  247. package/dist/src/integrations/hierarchical-config.d.ts.map +1 -1
  248. package/dist/src/integrations/hierarchical-config.js +3 -0
  249. package/dist/src/integrations/hierarchical-config.js.map +1 -1
  250. package/dist/src/integrations/hooks.d.ts +2 -0
  251. package/dist/src/integrations/hooks.d.ts.map +1 -1
  252. package/dist/src/integrations/hooks.js +99 -15
  253. package/dist/src/integrations/hooks.js.map +1 -1
  254. package/dist/src/integrations/index.d.ts +77 -66
  255. package/dist/src/integrations/index.d.ts.map +1 -1
  256. package/dist/src/integrations/index.js +83 -67
  257. package/dist/src/integrations/index.js.map +1 -1
  258. package/dist/src/integrations/logger.d.ts +104 -0
  259. package/dist/src/integrations/logger.d.ts.map +1 -0
  260. package/dist/src/integrations/logger.js +219 -0
  261. package/dist/src/integrations/logger.js.map +1 -0
  262. package/dist/src/integrations/lsp/lsp.d.ts +196 -0
  263. package/dist/src/integrations/lsp/lsp.d.ts.map +1 -0
  264. package/dist/src/integrations/lsp/lsp.js +583 -0
  265. package/dist/src/integrations/lsp/lsp.js.map +1 -0
  266. package/dist/src/integrations/lsp.d.ts.map +1 -1
  267. package/dist/src/integrations/lsp.js +5 -4
  268. package/dist/src/integrations/lsp.js.map +1 -1
  269. package/dist/src/integrations/mcp/mcp-client.d.ts +279 -0
  270. package/dist/src/integrations/mcp/mcp-client.d.ts.map +1 -0
  271. package/dist/src/integrations/mcp/mcp-client.js +755 -0
  272. package/dist/src/integrations/mcp/mcp-client.js.map +1 -0
  273. package/dist/src/integrations/mcp/mcp-custom-tools.d.ts +102 -0
  274. package/dist/src/integrations/mcp/mcp-custom-tools.d.ts.map +1 -0
  275. package/dist/src/integrations/mcp/mcp-custom-tools.js +232 -0
  276. package/dist/src/integrations/mcp/mcp-custom-tools.js.map +1 -0
  277. package/dist/src/integrations/mcp/mcp-tool-search.d.ts +77 -0
  278. package/dist/src/integrations/mcp/mcp-tool-search.d.ts.map +1 -0
  279. package/dist/src/integrations/mcp/mcp-tool-search.js +220 -0
  280. package/dist/src/integrations/mcp/mcp-tool-search.js.map +1 -0
  281. package/dist/src/integrations/mcp/mcp-tool-validator.d.ts +60 -0
  282. package/dist/src/integrations/mcp/mcp-tool-validator.d.ts.map +1 -0
  283. package/dist/src/integrations/mcp/mcp-tool-validator.js +141 -0
  284. package/dist/src/integrations/mcp/mcp-tool-validator.js.map +1 -0
  285. package/dist/src/integrations/mcp-client.d.ts.map +1 -1
  286. package/dist/src/integrations/mcp-client.js +8 -7
  287. package/dist/src/integrations/mcp-client.js.map +1 -1
  288. package/dist/src/integrations/observability.d.ts.map +1 -1
  289. package/dist/src/integrations/observability.js +5 -4
  290. package/dist/src/integrations/observability.js.map +1 -1
  291. package/dist/src/integrations/openrouter-pricing.d.ts.map +1 -1
  292. package/dist/src/integrations/openrouter-pricing.js +4 -3
  293. package/dist/src/integrations/openrouter-pricing.js.map +1 -1
  294. package/dist/src/integrations/persistence/codebase-repository.d.ts +45 -0
  295. package/dist/src/integrations/persistence/codebase-repository.d.ts.map +1 -0
  296. package/dist/src/integrations/persistence/codebase-repository.js +81 -0
  297. package/dist/src/integrations/persistence/codebase-repository.js.map +1 -0
  298. package/dist/src/integrations/persistence/goal-repository.d.ts +71 -0
  299. package/dist/src/integrations/persistence/goal-repository.d.ts.map +1 -0
  300. package/dist/src/integrations/persistence/goal-repository.js +184 -0
  301. package/dist/src/integrations/persistence/goal-repository.js.map +1 -0
  302. package/dist/src/integrations/persistence/history.d.ts +72 -0
  303. package/dist/src/integrations/persistence/history.d.ts.map +1 -0
  304. package/dist/src/integrations/persistence/history.js +165 -0
  305. package/dist/src/integrations/persistence/history.js.map +1 -0
  306. package/dist/src/integrations/persistence/persistence.d.ts +49 -0
  307. package/dist/src/integrations/persistence/persistence.d.ts.map +1 -0
  308. package/dist/src/integrations/persistence/persistence.js +197 -0
  309. package/dist/src/integrations/persistence/persistence.js.map +1 -0
  310. package/dist/src/integrations/persistence/session-repository.d.ts +212 -0
  311. package/dist/src/integrations/persistence/session-repository.d.ts.map +1 -0
  312. package/dist/src/integrations/persistence/session-repository.js +770 -0
  313. package/dist/src/integrations/persistence/session-repository.js.map +1 -0
  314. package/dist/src/integrations/persistence/session-store.d.ts +184 -0
  315. package/dist/src/integrations/persistence/session-store.d.ts.map +1 -0
  316. package/dist/src/integrations/persistence/session-store.js +346 -0
  317. package/dist/src/integrations/persistence/session-store.js.map +1 -0
  318. package/dist/src/integrations/persistence/sqlite-store.d.ts +453 -0
  319. package/dist/src/integrations/persistence/sqlite-store.d.ts.map +1 -0
  320. package/dist/src/integrations/persistence/sqlite-store.js +676 -0
  321. package/dist/src/integrations/persistence/sqlite-store.js.map +1 -0
  322. package/dist/src/integrations/persistence/worker-repository.d.ts +65 -0
  323. package/dist/src/integrations/persistence/worker-repository.d.ts.map +1 -0
  324. package/dist/src/integrations/persistence/worker-repository.js +183 -0
  325. package/dist/src/integrations/persistence/worker-repository.js.map +1 -0
  326. package/dist/src/integrations/persistence.d.ts.map +1 -1
  327. package/dist/src/integrations/persistence.js +5 -4
  328. package/dist/src/integrations/persistence.js.map +1 -1
  329. package/dist/src/integrations/planning.d.ts.map +1 -1
  330. package/dist/src/integrations/planning.js +5 -4
  331. package/dist/src/integrations/planning.js.map +1 -1
  332. package/dist/src/integrations/quality/auto-checkpoint.d.ts +98 -0
  333. package/dist/src/integrations/quality/auto-checkpoint.d.ts.map +1 -0
  334. package/dist/src/integrations/quality/auto-checkpoint.js +252 -0
  335. package/dist/src/integrations/quality/auto-checkpoint.js.map +1 -0
  336. package/dist/src/integrations/quality/dead-letter-queue.d.ts +233 -0
  337. package/dist/src/integrations/quality/dead-letter-queue.d.ts.map +1 -0
  338. package/dist/src/integrations/quality/dead-letter-queue.js +543 -0
  339. package/dist/src/integrations/quality/dead-letter-queue.js.map +1 -0
  340. package/dist/src/integrations/quality/health-check.d.ts +218 -0
  341. package/dist/src/integrations/quality/health-check.d.ts.map +1 -0
  342. package/dist/src/integrations/quality/health-check.js +415 -0
  343. package/dist/src/integrations/quality/health-check.js.map +1 -0
  344. package/dist/src/integrations/quality/learning-store.d.ts +291 -0
  345. package/dist/src/integrations/quality/learning-store.d.ts.map +1 -0
  346. package/dist/src/integrations/quality/learning-store.js +646 -0
  347. package/dist/src/integrations/quality/learning-store.js.map +1 -0
  348. package/dist/src/integrations/quality/self-improvement.d.ts +90 -0
  349. package/dist/src/integrations/quality/self-improvement.d.ts.map +1 -0
  350. package/dist/src/integrations/quality/self-improvement.js +229 -0
  351. package/dist/src/integrations/quality/self-improvement.js.map +1 -0
  352. package/dist/src/integrations/quality/tool-recommendation.d.ts +61 -0
  353. package/dist/src/integrations/quality/tool-recommendation.d.ts.map +1 -0
  354. package/dist/src/integrations/quality/tool-recommendation.js +268 -0
  355. package/dist/src/integrations/quality/tool-recommendation.js.map +1 -0
  356. package/dist/src/integrations/retry.d.ts +1 -0
  357. package/dist/src/integrations/retry.d.ts.map +1 -1
  358. package/dist/src/integrations/retry.js.map +1 -1
  359. package/dist/src/integrations/routing.d.ts.map +1 -1
  360. package/dist/src/integrations/routing.js +2 -1
  361. package/dist/src/integrations/routing.js.map +1 -1
  362. package/dist/src/integrations/safety/bash-policy.d.ts +33 -0
  363. package/dist/src/integrations/safety/bash-policy.d.ts.map +1 -0
  364. package/dist/src/integrations/safety/bash-policy.js +144 -0
  365. package/dist/src/integrations/safety/bash-policy.js.map +1 -0
  366. package/dist/src/integrations/safety/edit-validator.d.ts +30 -0
  367. package/dist/src/integrations/safety/edit-validator.d.ts.map +1 -0
  368. package/dist/src/integrations/safety/edit-validator.js +87 -0
  369. package/dist/src/integrations/safety/edit-validator.js.map +1 -0
  370. package/dist/src/integrations/safety/execution-policy.d.ts +189 -0
  371. package/dist/src/integrations/safety/execution-policy.d.ts.map +1 -0
  372. package/dist/src/integrations/safety/execution-policy.js +352 -0
  373. package/dist/src/integrations/safety/execution-policy.js.map +1 -0
  374. package/dist/src/integrations/safety/policy-engine.d.ts +55 -0
  375. package/dist/src/integrations/safety/policy-engine.d.ts.map +1 -0
  376. package/dist/src/integrations/safety/policy-engine.js +247 -0
  377. package/dist/src/integrations/safety/policy-engine.js.map +1 -0
  378. package/dist/src/integrations/safety/safety.d.ts +174 -0
  379. package/dist/src/integrations/safety/safety.d.ts.map +1 -0
  380. package/dist/src/integrations/safety/safety.js +470 -0
  381. package/dist/src/integrations/safety/safety.js.map +1 -0
  382. package/dist/src/integrations/safety/sandbox/basic.d.ts +81 -0
  383. package/dist/src/integrations/safety/sandbox/basic.d.ts.map +1 -0
  384. package/dist/src/integrations/safety/sandbox/basic.js +335 -0
  385. package/dist/src/integrations/safety/sandbox/basic.js.map +1 -0
  386. package/dist/src/integrations/safety/sandbox/docker.d.ts +94 -0
  387. package/dist/src/integrations/safety/sandbox/docker.d.ts.map +1 -0
  388. package/dist/src/integrations/safety/sandbox/docker.js +294 -0
  389. package/dist/src/integrations/safety/sandbox/docker.js.map +1 -0
  390. package/dist/src/integrations/safety/sandbox/index.d.ts +188 -0
  391. package/dist/src/integrations/safety/sandbox/index.d.ts.map +1 -0
  392. package/dist/src/integrations/safety/sandbox/index.js +386 -0
  393. package/dist/src/integrations/safety/sandbox/index.js.map +1 -0
  394. package/dist/src/integrations/safety/sandbox/landlock.d.ts +59 -0
  395. package/dist/src/integrations/safety/sandbox/landlock.d.ts.map +1 -0
  396. package/dist/src/integrations/safety/sandbox/landlock.js +329 -0
  397. package/dist/src/integrations/safety/sandbox/landlock.js.map +1 -0
  398. package/dist/src/integrations/safety/sandbox/seatbelt.d.ts +68 -0
  399. package/dist/src/integrations/safety/sandbox/seatbelt.d.ts.map +1 -0
  400. package/dist/src/integrations/safety/sandbox/seatbelt.js +298 -0
  401. package/dist/src/integrations/safety/sandbox/seatbelt.js.map +1 -0
  402. package/dist/src/integrations/safety/type-checker.d.ts +53 -0
  403. package/dist/src/integrations/safety/type-checker.d.ts.map +1 -0
  404. package/dist/src/integrations/safety/type-checker.js +142 -0
  405. package/dist/src/integrations/safety/type-checker.js.map +1 -0
  406. package/dist/src/integrations/safety.d.ts.map +1 -1
  407. package/dist/src/integrations/safety.js +13 -13
  408. package/dist/src/integrations/safety.js.map +1 -1
  409. package/dist/src/integrations/sandbox/docker.d.ts.map +1 -1
  410. package/dist/src/integrations/sandbox/docker.js +2 -1
  411. package/dist/src/integrations/sandbox/docker.js.map +1 -1
  412. package/dist/src/integrations/sandbox/index.d.ts.map +1 -1
  413. package/dist/src/integrations/sandbox/index.js +5 -4
  414. package/dist/src/integrations/sandbox/index.js.map +1 -1
  415. package/dist/src/integrations/session-store.d.ts +1 -0
  416. package/dist/src/integrations/session-store.d.ts.map +1 -1
  417. package/dist/src/integrations/session-store.js +1 -0
  418. package/dist/src/integrations/session-store.js.map +1 -1
  419. package/dist/src/integrations/shared-blackboard.d.ts +3 -0
  420. package/dist/src/integrations/shared-blackboard.d.ts.map +1 -1
  421. package/dist/src/integrations/shared-blackboard.js +47 -0
  422. package/dist/src/integrations/shared-blackboard.js.map +1 -1
  423. package/dist/src/integrations/skills/skill-executor.d.ts +113 -0
  424. package/dist/src/integrations/skills/skill-executor.d.ts.map +1 -0
  425. package/dist/src/integrations/skills/skill-executor.js +270 -0
  426. package/dist/src/integrations/skills/skill-executor.js.map +1 -0
  427. package/dist/src/integrations/skills/skills.d.ts +262 -0
  428. package/dist/src/integrations/skills/skills.d.ts.map +1 -0
  429. package/dist/src/integrations/skills/skills.js +602 -0
  430. package/dist/src/integrations/skills/skills.js.map +1 -0
  431. package/dist/src/integrations/smart-decomposer.d.ts +27 -0
  432. package/dist/src/integrations/smart-decomposer.d.ts.map +1 -1
  433. package/dist/src/integrations/smart-decomposer.js +414 -30
  434. package/dist/src/integrations/smart-decomposer.js.map +1 -1
  435. package/dist/src/integrations/sqlite-store.d.ts +2 -0
  436. package/dist/src/integrations/sqlite-store.d.ts.map +1 -1
  437. package/dist/src/integrations/sqlite-store.js +18 -6
  438. package/dist/src/integrations/sqlite-store.js.map +1 -1
  439. package/dist/src/integrations/streaming/pty-shell.d.ts +169 -0
  440. package/dist/src/integrations/streaming/pty-shell.d.ts.map +1 -0
  441. package/dist/src/integrations/streaming/pty-shell.js +367 -0
  442. package/dist/src/integrations/streaming/pty-shell.js.map +1 -0
  443. package/dist/src/integrations/streaming/streaming.d.ts +102 -0
  444. package/dist/src/integrations/streaming/streaming.d.ts.map +1 -0
  445. package/dist/src/integrations/streaming/streaming.js +362 -0
  446. package/dist/src/integrations/streaming/streaming.js.map +1 -0
  447. package/dist/src/integrations/swarm/failure-classifier.d.ts +11 -0
  448. package/dist/src/integrations/swarm/failure-classifier.d.ts.map +1 -0
  449. package/dist/src/integrations/swarm/failure-classifier.js +95 -0
  450. package/dist/src/integrations/swarm/failure-classifier.js.map +1 -0
  451. package/dist/src/integrations/swarm/index.d.ts +2 -1
  452. package/dist/src/integrations/swarm/index.d.ts.map +1 -1
  453. package/dist/src/integrations/swarm/index.js +2 -0
  454. package/dist/src/integrations/swarm/index.js.map +1 -1
  455. package/dist/src/integrations/swarm/model-selector.d.ts.map +1 -1
  456. package/dist/src/integrations/swarm/model-selector.js +2 -1
  457. package/dist/src/integrations/swarm/model-selector.js.map +1 -1
  458. package/dist/src/integrations/swarm/swarm-budget.d.ts +1 -1
  459. package/dist/src/integrations/swarm/swarm-budget.d.ts.map +1 -1
  460. package/dist/src/integrations/swarm/swarm-budget.js +1 -1
  461. package/dist/src/integrations/swarm/swarm-budget.js.map +1 -1
  462. package/dist/src/integrations/swarm/swarm-config-loader.d.ts +8 -0
  463. package/dist/src/integrations/swarm/swarm-config-loader.d.ts.map +1 -1
  464. package/dist/src/integrations/swarm/swarm-config-loader.js +102 -0
  465. package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -1
  466. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts +74 -0
  467. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts.map +1 -1
  468. package/dist/src/integrations/swarm/swarm-event-bridge.js +37 -0
  469. package/dist/src/integrations/swarm/swarm-event-bridge.js.map +1 -1
  470. package/dist/src/integrations/swarm/swarm-events.d.ts +4 -1
  471. package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -1
  472. package/dist/src/integrations/swarm/swarm-events.js +1 -1
  473. package/dist/src/integrations/swarm/swarm-events.js.map +1 -1
  474. package/dist/src/integrations/swarm/swarm-execution.d.ts +27 -0
  475. package/dist/src/integrations/swarm/swarm-execution.d.ts.map +1 -0
  476. package/dist/src/integrations/swarm/swarm-execution.js +1021 -0
  477. package/dist/src/integrations/swarm/swarm-execution.js.map +1 -0
  478. package/dist/src/integrations/swarm/swarm-helpers.d.ts +26 -0
  479. package/dist/src/integrations/swarm/swarm-helpers.d.ts.map +1 -0
  480. package/dist/src/integrations/swarm/swarm-helpers.js +95 -0
  481. package/dist/src/integrations/swarm/swarm-helpers.js.map +1 -0
  482. package/dist/src/integrations/swarm/swarm-lifecycle.d.ts +100 -0
  483. package/dist/src/integrations/swarm/swarm-lifecycle.d.ts.map +1 -0
  484. package/dist/src/integrations/swarm/swarm-lifecycle.js +922 -0
  485. package/dist/src/integrations/swarm/swarm-lifecycle.js.map +1 -0
  486. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +96 -192
  487. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -1
  488. package/dist/src/integrations/swarm/swarm-orchestrator.js +384 -2528
  489. package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -1
  490. package/dist/src/integrations/swarm/swarm-quality-gate.js +1 -1
  491. package/dist/src/integrations/swarm/swarm-quality-gate.js.map +1 -1
  492. package/dist/src/integrations/swarm/swarm-recovery.d.ts +75 -0
  493. package/dist/src/integrations/swarm/swarm-recovery.d.ts.map +1 -0
  494. package/dist/src/integrations/swarm/swarm-recovery.js +550 -0
  495. package/dist/src/integrations/swarm/swarm-recovery.js.map +1 -0
  496. package/dist/src/integrations/swarm/swarm-state-store.d.ts +4 -1
  497. package/dist/src/integrations/swarm/swarm-state-store.d.ts.map +1 -1
  498. package/dist/src/integrations/swarm/swarm-state-store.js +14 -1
  499. package/dist/src/integrations/swarm/swarm-state-store.js.map +1 -1
  500. package/dist/src/integrations/swarm/task-queue.d.ts +11 -1
  501. package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -1
  502. package/dist/src/integrations/swarm/task-queue.js +64 -2
  503. package/dist/src/integrations/swarm/task-queue.js.map +1 -1
  504. package/dist/src/integrations/swarm/types.d.ts +57 -4
  505. package/dist/src/integrations/swarm/types.d.ts.map +1 -1
  506. package/dist/src/integrations/swarm/types.js +9 -0
  507. package/dist/src/integrations/swarm/types.js.map +1 -1
  508. package/dist/src/integrations/swarm/worker-pool.d.ts +13 -3
  509. package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -1
  510. package/dist/src/integrations/swarm/worker-pool.js +66 -13
  511. package/dist/src/integrations/swarm/worker-pool.js.map +1 -1
  512. package/dist/src/integrations/task-manager.d.ts +33 -1
  513. package/dist/src/integrations/task-manager.d.ts.map +1 -1
  514. package/dist/src/integrations/task-manager.js +78 -4
  515. package/dist/src/integrations/task-manager.js.map +1 -1
  516. package/dist/src/integrations/tasks/dependency-analyzer.d.ts +34 -0
  517. package/dist/src/integrations/tasks/dependency-analyzer.d.ts.map +1 -0
  518. package/dist/src/integrations/tasks/dependency-analyzer.js +232 -0
  519. package/dist/src/integrations/tasks/dependency-analyzer.js.map +1 -0
  520. package/dist/src/integrations/tasks/interactive-planning.d.ts +322 -0
  521. package/dist/src/integrations/tasks/interactive-planning.d.ts.map +1 -0
  522. package/dist/src/integrations/tasks/interactive-planning.js +655 -0
  523. package/dist/src/integrations/tasks/interactive-planning.js.map +1 -0
  524. package/dist/src/integrations/tasks/pending-plan.d.ts +196 -0
  525. package/dist/src/integrations/tasks/pending-plan.d.ts.map +1 -0
  526. package/dist/src/integrations/tasks/pending-plan.js +431 -0
  527. package/dist/src/integrations/tasks/pending-plan.js.map +1 -0
  528. package/dist/src/integrations/tasks/planning.d.ts +115 -0
  529. package/dist/src/integrations/tasks/planning.d.ts.map +1 -0
  530. package/dist/src/integrations/tasks/planning.js +413 -0
  531. package/dist/src/integrations/tasks/planning.js.map +1 -0
  532. package/dist/src/integrations/tasks/smart-decomposer.d.ts +316 -0
  533. package/dist/src/integrations/tasks/smart-decomposer.d.ts.map +1 -0
  534. package/dist/src/integrations/tasks/smart-decomposer.js +661 -0
  535. package/dist/src/integrations/tasks/smart-decomposer.js.map +1 -0
  536. package/dist/src/integrations/tasks/task-manager.d.ts +164 -0
  537. package/dist/src/integrations/tasks/task-manager.d.ts.map +1 -0
  538. package/dist/src/integrations/tasks/task-manager.js +383 -0
  539. package/dist/src/integrations/tasks/task-manager.js.map +1 -0
  540. package/dist/src/integrations/tasks/task-splitter.d.ts +56 -0
  541. package/dist/src/integrations/tasks/task-splitter.d.ts.map +1 -0
  542. package/dist/src/integrations/tasks/task-splitter.js +537 -0
  543. package/dist/src/integrations/tasks/task-splitter.js.map +1 -0
  544. package/dist/src/integrations/tasks/verification-gate.d.ts +103 -0
  545. package/dist/src/integrations/tasks/verification-gate.d.ts.map +1 -0
  546. package/dist/src/integrations/tasks/verification-gate.js +193 -0
  547. package/dist/src/integrations/tasks/verification-gate.js.map +1 -0
  548. package/dist/src/integrations/tasks/work-log.d.ts +87 -0
  549. package/dist/src/integrations/tasks/work-log.d.ts.map +1 -0
  550. package/dist/src/integrations/tasks/work-log.js +275 -0
  551. package/dist/src/integrations/tasks/work-log.js.map +1 -0
  552. package/dist/src/integrations/utilities/capabilities.d.ts +160 -0
  553. package/dist/src/integrations/utilities/capabilities.d.ts.map +1 -0
  554. package/dist/src/integrations/utilities/capabilities.js +426 -0
  555. package/dist/src/integrations/utilities/capabilities.js.map +1 -0
  556. package/dist/src/integrations/utilities/diff-utils.d.ts +105 -0
  557. package/dist/src/integrations/utilities/diff-utils.d.ts.map +1 -0
  558. package/dist/src/integrations/utilities/diff-utils.js +497 -0
  559. package/dist/src/integrations/utilities/diff-utils.js.map +1 -0
  560. package/dist/src/integrations/utilities/environment-facts.d.ts +52 -0
  561. package/dist/src/integrations/utilities/environment-facts.d.ts.map +1 -0
  562. package/dist/src/integrations/utilities/environment-facts.js +84 -0
  563. package/dist/src/integrations/utilities/environment-facts.js.map +1 -0
  564. package/dist/src/integrations/utilities/file-change-tracker.d.ts +162 -0
  565. package/dist/src/integrations/utilities/file-change-tracker.d.ts.map +1 -0
  566. package/dist/src/integrations/utilities/file-change-tracker.js +538 -0
  567. package/dist/src/integrations/utilities/file-change-tracker.js.map +1 -0
  568. package/dist/src/integrations/utilities/graph-visualization.d.ts +72 -0
  569. package/dist/src/integrations/utilities/graph-visualization.d.ts.map +1 -0
  570. package/dist/src/integrations/utilities/graph-visualization.js +383 -0
  571. package/dist/src/integrations/utilities/graph-visualization.js.map +1 -0
  572. package/dist/src/integrations/utilities/hierarchical-config.d.ts +215 -0
  573. package/dist/src/integrations/utilities/hierarchical-config.d.ts.map +1 -0
  574. package/dist/src/integrations/utilities/hierarchical-config.js +504 -0
  575. package/dist/src/integrations/utilities/hierarchical-config.js.map +1 -0
  576. package/dist/src/integrations/utilities/hooks.d.ts +116 -0
  577. package/dist/src/integrations/utilities/hooks.d.ts.map +1 -0
  578. package/dist/src/integrations/utilities/hooks.js +410 -0
  579. package/dist/src/integrations/utilities/hooks.js.map +1 -0
  580. package/dist/src/integrations/utilities/ignore.d.ts +143 -0
  581. package/dist/src/integrations/utilities/ignore.d.ts.map +1 -0
  582. package/dist/src/integrations/utilities/ignore.js +417 -0
  583. package/dist/src/integrations/utilities/ignore.js.map +1 -0
  584. package/dist/src/integrations/utilities/image-renderer.d.ts +119 -0
  585. package/dist/src/integrations/utilities/image-renderer.d.ts.map +1 -0
  586. package/dist/src/integrations/utilities/image-renderer.js +306 -0
  587. package/dist/src/integrations/utilities/image-renderer.js.map +1 -0
  588. package/dist/src/integrations/utilities/logger.d.ts +104 -0
  589. package/dist/src/integrations/utilities/logger.d.ts.map +1 -0
  590. package/dist/src/integrations/utilities/logger.js +219 -0
  591. package/dist/src/integrations/utilities/logger.js.map +1 -0
  592. package/dist/src/integrations/utilities/memory.d.ts +116 -0
  593. package/dist/src/integrations/utilities/memory.d.ts.map +1 -0
  594. package/dist/src/integrations/utilities/memory.js +311 -0
  595. package/dist/src/integrations/utilities/memory.js.map +1 -0
  596. package/dist/src/integrations/utilities/observability.d.ts +162 -0
  597. package/dist/src/integrations/utilities/observability.d.ts.map +1 -0
  598. package/dist/src/integrations/utilities/observability.js +407 -0
  599. package/dist/src/integrations/utilities/observability.js.map +1 -0
  600. package/dist/src/integrations/utilities/openrouter-pricing.d.ts +67 -0
  601. package/dist/src/integrations/utilities/openrouter-pricing.d.ts.map +1 -0
  602. package/dist/src/integrations/utilities/openrouter-pricing.js +166 -0
  603. package/dist/src/integrations/utilities/openrouter-pricing.js.map +1 -0
  604. package/dist/src/integrations/utilities/react.d.ts +139 -0
  605. package/dist/src/integrations/utilities/react.d.ts.map +1 -0
  606. package/dist/src/integrations/utilities/react.js +273 -0
  607. package/dist/src/integrations/utilities/react.js.map +1 -0
  608. package/dist/src/integrations/utilities/retry.d.ts +132 -0
  609. package/dist/src/integrations/utilities/retry.d.ts.map +1 -0
  610. package/dist/src/integrations/utilities/retry.js +233 -0
  611. package/dist/src/integrations/utilities/retry.js.map +1 -0
  612. package/dist/src/integrations/utilities/routing.d.ts +118 -0
  613. package/dist/src/integrations/utilities/routing.d.ts.map +1 -0
  614. package/dist/src/integrations/utilities/routing.js +348 -0
  615. package/dist/src/integrations/utilities/routing.js.map +1 -0
  616. package/dist/src/integrations/utilities/rules.d.ts +131 -0
  617. package/dist/src/integrations/utilities/rules.d.ts.map +1 -0
  618. package/dist/src/integrations/utilities/rules.js +284 -0
  619. package/dist/src/integrations/utilities/rules.js.map +1 -0
  620. package/dist/src/integrations/utilities/sourcegraph.d.ts +169 -0
  621. package/dist/src/integrations/utilities/sourcegraph.d.ts.map +1 -0
  622. package/dist/src/integrations/utilities/sourcegraph.js +379 -0
  623. package/dist/src/integrations/utilities/sourcegraph.js.map +1 -0
  624. package/dist/src/integrations/utilities/thinking-strategy.d.ts +52 -0
  625. package/dist/src/integrations/utilities/thinking-strategy.d.ts.map +1 -0
  626. package/dist/src/integrations/utilities/thinking-strategy.js +129 -0
  627. package/dist/src/integrations/utilities/thinking-strategy.js.map +1 -0
  628. package/dist/src/integrations/utilities/thread-manager.d.ts +199 -0
  629. package/dist/src/integrations/utilities/thread-manager.d.ts.map +1 -0
  630. package/dist/src/integrations/utilities/thread-manager.js +357 -0
  631. package/dist/src/integrations/utilities/thread-manager.js.map +1 -0
  632. package/dist/src/integrations/utilities/token-estimate.d.ts +11 -0
  633. package/dist/src/integrations/utilities/token-estimate.d.ts.map +1 -0
  634. package/dist/src/integrations/utilities/token-estimate.js +14 -0
  635. package/dist/src/integrations/utilities/token-estimate.js.map +1 -0
  636. package/dist/src/main.js +92 -35
  637. package/dist/src/main.js.map +1 -1
  638. package/dist/src/modes/repl.d.ts.map +1 -1
  639. package/dist/src/modes/repl.js +60 -11
  640. package/dist/src/modes/repl.js.map +1 -1
  641. package/dist/src/modes/tui.d.ts.map +1 -1
  642. package/dist/src/modes/tui.js +57 -10
  643. package/dist/src/modes/tui.js.map +1 -1
  644. package/dist/src/modes.js +1 -1
  645. package/dist/src/modes.js.map +1 -1
  646. package/dist/src/observability/tracer.d.ts.map +1 -1
  647. package/dist/src/observability/tracer.js +2 -1
  648. package/dist/src/observability/tracer.js.map +1 -1
  649. package/dist/src/persistence/schema.d.ts +2 -0
  650. package/dist/src/persistence/schema.d.ts.map +1 -1
  651. package/dist/src/persistence/schema.js +42 -0
  652. package/dist/src/persistence/schema.js.map +1 -1
  653. package/dist/src/providers/adapters/anthropic.d.ts +6 -0
  654. package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
  655. package/dist/src/providers/adapters/anthropic.js +101 -16
  656. package/dist/src/providers/adapters/anthropic.js.map +1 -1
  657. package/dist/src/providers/adapters/azure.d.ts +74 -0
  658. package/dist/src/providers/adapters/azure.d.ts.map +1 -0
  659. package/dist/src/providers/adapters/azure.js +354 -0
  660. package/dist/src/providers/adapters/azure.js.map +1 -0
  661. package/dist/src/providers/adapters/mock.d.ts +16 -2
  662. package/dist/src/providers/adapters/mock.d.ts.map +1 -1
  663. package/dist/src/providers/adapters/mock.js +44 -3
  664. package/dist/src/providers/adapters/mock.js.map +1 -1
  665. package/dist/src/providers/adapters/openai.d.ts +6 -1
  666. package/dist/src/providers/adapters/openai.d.ts.map +1 -1
  667. package/dist/src/providers/adapters/openai.js +41 -9
  668. package/dist/src/providers/adapters/openai.js.map +1 -1
  669. package/dist/src/providers/adapters/openrouter.d.ts +6 -0
  670. package/dist/src/providers/adapters/openrouter.d.ts.map +1 -1
  671. package/dist/src/providers/adapters/openrouter.js +83 -13
  672. package/dist/src/providers/adapters/openrouter.js.map +1 -1
  673. package/dist/src/providers/circuit-breaker.d.ts +1 -0
  674. package/dist/src/providers/circuit-breaker.d.ts.map +1 -1
  675. package/dist/src/providers/circuit-breaker.js.map +1 -1
  676. package/dist/src/providers/provider.d.ts.map +1 -1
  677. package/dist/src/providers/provider.js +2 -1
  678. package/dist/src/providers/provider.js.map +1 -1
  679. package/dist/src/providers/resilient-provider.d.ts.map +1 -1
  680. package/dist/src/providers/resilient-provider.js +2 -1
  681. package/dist/src/providers/resilient-provider.js.map +1 -1
  682. package/dist/src/providers/types.d.ts +23 -2
  683. package/dist/src/providers/types.d.ts.map +1 -1
  684. package/dist/src/session-picker.d.ts +1 -1
  685. package/dist/src/session-picker.d.ts.map +1 -1
  686. package/dist/src/session-picker.js +40 -5
  687. package/dist/src/session-picker.js.map +1 -1
  688. package/dist/src/shared/budget-tracker.d.ts +65 -0
  689. package/dist/src/shared/budget-tracker.d.ts.map +1 -0
  690. package/dist/src/shared/budget-tracker.js +128 -0
  691. package/dist/src/shared/budget-tracker.js.map +1 -0
  692. package/dist/src/shared/context-engine.d.ts +64 -0
  693. package/dist/src/shared/context-engine.d.ts.map +1 -0
  694. package/dist/src/shared/context-engine.js +117 -0
  695. package/dist/src/shared/context-engine.js.map +1 -0
  696. package/dist/src/shared/index.d.ts +12 -0
  697. package/dist/src/shared/index.d.ts.map +1 -0
  698. package/dist/src/shared/index.js +12 -0
  699. package/dist/src/shared/index.js.map +1 -0
  700. package/dist/src/shared/persistence.d.ts +57 -0
  701. package/dist/src/shared/persistence.d.ts.map +1 -0
  702. package/dist/src/shared/persistence.js +168 -0
  703. package/dist/src/shared/persistence.js.map +1 -0
  704. package/dist/src/shared/shared-context-state.d.ts +89 -0
  705. package/dist/src/shared/shared-context-state.d.ts.map +1 -0
  706. package/dist/src/shared/shared-context-state.js +175 -0
  707. package/dist/src/shared/shared-context-state.js.map +1 -0
  708. package/dist/src/shared/shared-economics-state.d.ts +61 -0
  709. package/dist/src/shared/shared-economics-state.d.ts.map +1 -0
  710. package/dist/src/shared/shared-economics-state.js +100 -0
  711. package/dist/src/shared/shared-economics-state.js.map +1 -0
  712. package/dist/src/tools/agent.d.ts +1 -1
  713. package/dist/src/tools/agent.d.ts.map +1 -1
  714. package/dist/src/tools/bash.d.ts +3 -3
  715. package/dist/src/tools/bash.d.ts.map +1 -1
  716. package/dist/src/tools/bash.js +2 -1
  717. package/dist/src/tools/bash.js.map +1 -1
  718. package/dist/src/tools/file.d.ts +3 -3
  719. package/dist/src/tools/file.js +1 -1
  720. package/dist/src/tools/file.js.map +1 -1
  721. package/dist/src/tools/permission.d.ts.map +1 -1
  722. package/dist/src/tools/permission.js +7 -6
  723. package/dist/src/tools/permission.js.map +1 -1
  724. package/dist/src/tools/registry.d.ts +1 -1
  725. package/dist/src/tools/registry.d.ts.map +1 -1
  726. package/dist/src/tools/registry.js +1 -1
  727. package/dist/src/tools/registry.js.map +1 -1
  728. package/dist/src/tools/tasks.d.ts +1 -1
  729. package/dist/src/tools/tasks.d.ts.map +1 -1
  730. package/dist/src/tools/types.d.ts +1 -0
  731. package/dist/src/tools/types.d.ts.map +1 -1
  732. package/dist/src/tools/types.js.map +1 -1
  733. package/dist/src/tools/undo.d.ts +1 -1
  734. package/dist/src/tools/undo.d.ts.map +1 -1
  735. package/dist/src/tracing/cache-boundary-tracker.d.ts.map +1 -1
  736. package/dist/src/tracing/cache-boundary-tracker.js +2 -2
  737. package/dist/src/tracing/cache-boundary-tracker.js.map +1 -1
  738. package/dist/src/tracing/trace-collector.d.ts +147 -0
  739. package/dist/src/tracing/trace-collector.d.ts.map +1 -1
  740. package/dist/src/tracing/trace-collector.js +138 -7
  741. package/dist/src/tracing/trace-collector.js.map +1 -1
  742. package/dist/src/tracing/types.d.ts +112 -1
  743. package/dist/src/tracing/types.d.ts.map +1 -1
  744. package/dist/src/tracing/types.js.map +1 -1
  745. package/dist/src/tricks/failure-evidence.d.ts.map +1 -1
  746. package/dist/src/tricks/failure-evidence.js +2 -1
  747. package/dist/src/tricks/failure-evidence.js.map +1 -1
  748. package/dist/src/tricks/recitation.d.ts.map +1 -1
  749. package/dist/src/tricks/recitation.js +2 -1
  750. package/dist/src/tricks/recitation.js.map +1 -1
  751. package/dist/src/tricks/recursive-context.d.ts.map +1 -1
  752. package/dist/src/tricks/recursive-context.js +2 -2
  753. package/dist/src/tricks/recursive-context.js.map +1 -1
  754. package/dist/src/tricks/reversible-compaction.d.ts.map +1 -1
  755. package/dist/src/tricks/reversible-compaction.js +6 -2
  756. package/dist/src/tricks/reversible-compaction.js.map +1 -1
  757. package/dist/src/tui/app.d.ts +16 -3
  758. package/dist/src/tui/app.d.ts.map +1 -1
  759. package/dist/src/tui/app.js +211 -25
  760. package/dist/src/tui/app.js.map +1 -1
  761. package/dist/src/tui/components/CollapsibleDiffView.d.ts +1 -1
  762. package/dist/src/tui/components/CollapsibleDiffView.d.ts.map +1 -1
  763. package/dist/src/tui/components/DiagnosticsPanel.d.ts +24 -0
  764. package/dist/src/tui/components/DiagnosticsPanel.d.ts.map +1 -0
  765. package/dist/src/tui/components/DiagnosticsPanel.js +47 -0
  766. package/dist/src/tui/components/DiagnosticsPanel.js.map +1 -0
  767. package/dist/src/tui/components/DiffView.d.ts +1 -1
  768. package/dist/src/tui/components/DiffView.d.ts.map +1 -1
  769. package/dist/src/tui/components/ErrorBoundary.d.ts.map +1 -1
  770. package/dist/src/tui/components/ErrorBoundary.js +3 -2
  771. package/dist/src/tui/components/ErrorBoundary.js.map +1 -1
  772. package/dist/src/tui/components/TasksPanel.d.ts +1 -1
  773. package/dist/src/tui/components/TasksPanel.d.ts.map +1 -1
  774. package/dist/src/tui/event-display.d.ts.map +1 -1
  775. package/dist/src/tui/event-display.js +36 -62
  776. package/dist/src/tui/event-display.js.map +1 -1
  777. package/dist/src/tui/index.d.ts +4 -0
  778. package/dist/src/tui/index.d.ts.map +1 -1
  779. package/dist/src/tui/index.js +17 -0
  780. package/dist/src/tui/index.js.map +1 -1
  781. package/dist/src/tui/transparency-aggregator.d.ts +13 -0
  782. package/dist/src/tui/transparency-aggregator.d.ts.map +1 -1
  783. package/dist/src/tui/transparency-aggregator.js +21 -0
  784. package/dist/src/tui/transparency-aggregator.js.map +1 -1
  785. package/dist/src/types.d.ts +170 -3
  786. package/dist/src/types.d.ts.map +1 -1
  787. package/package.json +18 -3
@@ -0,0 +1,973 @@
1
+ /**
2
+ * Subagent Spawner Module (Phase 2.1)
3
+ *
4
+ * Extracted from ProductionAgent.spawnAgent(), getSubagentBudget(),
5
+ * and spawnAgentsParallel(). Handles the full subagent lifecycle:
6
+ * config, budget, delegation, timeout, cleanup.
7
+ *
8
+ * Uses SubAgentFactory to create subagent instances without importing
9
+ * ProductionAgent directly — avoids circular dependencies.
10
+ */
11
+ import { estimateTokenCount } from '../integrations/utilities/token-estimate.js';
12
+ import { getSubagentTimeout, getSubagentMaxIterations, } from '../defaults.js';
13
+ import { calculateTaskSimilarity, SUBAGENT_PLAN_MODE_ADDITION, } from '../modes.js';
14
+ import { SUBAGENT_BUDGET, filterToolsForAgent, isCancellationError, createLinkedToken, createGracefulTimeout, race, createDynamicBudgetPool, buildDelegationPrompt, createMinimalDelegationSpec, getSubagentQualityPrompt, ToolRecommendationEngine, createSubagentSupervisor, createSubagentHandle, } from '../integrations/index.js';
15
+ import { mergeApprovalScopeWithProfile, resolvePolicyProfile, } from '../integrations/safety/policy-engine.js';
16
+ /** Duplicate spawn prevention window (60 seconds). */
17
+ const SPAWN_DEDUP_WINDOW_MS = 60000;
18
+ /**
19
+ * Parse a structured closure report from a subagent's text response.
20
+ * The subagent may have produced JSON in response to a TIMEOUT_WRAPUP_PROMPT.
21
+ */
22
+ export function parseStructuredClosureReport(text, defaultExitReason, fallbackTask) {
23
+ if (!text) {
24
+ if (fallbackTask) {
25
+ return {
26
+ findings: [],
27
+ actionsTaken: [],
28
+ failures: ['Timeout before producing structured summary'],
29
+ remainingWork: [fallbackTask],
30
+ exitReason: 'timeout_hard',
31
+ };
32
+ }
33
+ return undefined;
34
+ }
35
+ try {
36
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
37
+ if (jsonMatch) {
38
+ const parsed = JSON.parse(jsonMatch[0]);
39
+ if (parsed.findings || parsed.actionsTaken || parsed.failures || parsed.remainingWork) {
40
+ return {
41
+ findings: Array.isArray(parsed.findings) ? parsed.findings : [],
42
+ actionsTaken: Array.isArray(parsed.actionsTaken) ? parsed.actionsTaken : [],
43
+ failures: Array.isArray(parsed.failures) ? parsed.failures : [],
44
+ remainingWork: Array.isArray(parsed.remainingWork) ? parsed.remainingWork : [],
45
+ exitReason: defaultExitReason,
46
+ suggestedNextSteps: Array.isArray(parsed.suggestedNextSteps) ? parsed.suggestedNextSteps : undefined,
47
+ };
48
+ }
49
+ }
50
+ }
51
+ catch {
52
+ // JSON parse failed — fall through to fallback
53
+ }
54
+ if (defaultExitReason !== 'completed') {
55
+ return {
56
+ findings: [text.slice(0, 500)],
57
+ actionsTaken: [],
58
+ failures: ['Did not produce structured JSON summary'],
59
+ remainingWork: fallbackTask ? [fallbackTask] : [],
60
+ exitReason: defaultExitReason === 'timeout_graceful' ? 'timeout_hard' : defaultExitReason,
61
+ };
62
+ }
63
+ return undefined;
64
+ }
65
+ /**
66
+ * Get budget for a subagent, using the pooled budget when available.
67
+ * Falls back to the static SUBAGENT_BUDGET if no pool is configured.
68
+ */
69
+ export function getSubagentBudget(ctx, agentName, constraints) {
70
+ if (constraints?.maxTokens) {
71
+ return {
72
+ budget: { ...SUBAGENT_BUDGET, maxTokens: constraints.maxTokens },
73
+ allocationId: null,
74
+ };
75
+ }
76
+ if (ctx.budgetPool) {
77
+ const allocationId = `${agentName}-${Date.now()}`;
78
+ const allocation = ctx.budgetPool.reserve(allocationId);
79
+ if (allocation) {
80
+ return {
81
+ budget: {
82
+ ...SUBAGENT_BUDGET,
83
+ maxTokens: allocation.tokenBudget,
84
+ softTokenLimit: Math.floor(allocation.tokenBudget * 0.7),
85
+ maxCost: allocation.costBudget,
86
+ },
87
+ allocationId,
88
+ };
89
+ }
90
+ return {
91
+ budget: {
92
+ ...SUBAGENT_BUDGET,
93
+ maxTokens: 5000,
94
+ softTokenLimit: 3000,
95
+ maxCost: 0.01,
96
+ },
97
+ allocationId: null,
98
+ };
99
+ }
100
+ return { budget: SUBAGENT_BUDGET, allocationId: null };
101
+ }
102
+ /**
103
+ * Spawn a single subagent to handle a delegated task.
104
+ * Extracted from ProductionAgent.spawnAgent().
105
+ */
106
+ export async function spawnAgent(agentName, task, ctx, createSubAgent, constraints) {
107
+ if (!ctx.agentRegistry) {
108
+ return {
109
+ success: false,
110
+ output: 'Agent registry not initialized',
111
+ metrics: { tokens: 0, duration: 0, toolCalls: 0 },
112
+ };
113
+ }
114
+ const agentDef = ctx.agentRegistry.getAgent(agentName);
115
+ if (!agentDef) {
116
+ return {
117
+ success: false,
118
+ output: `Agent not found: ${agentName}`,
119
+ metrics: { tokens: 0, duration: 0, toolCalls: 0 },
120
+ };
121
+ }
122
+ // DUPLICATE SPAWN PREVENTION with SEMANTIC SIMILARITY
123
+ const isSwarmWorker = agentName.startsWith('swarm-');
124
+ const SEMANTIC_SIMILARITY_THRESHOLD = 0.75;
125
+ const taskKey = `${agentName}:${task.slice(0, 150).toLowerCase().replace(/\s+/g, ' ').trim()}`;
126
+ const now = Date.now();
127
+ // Clean up old entries
128
+ for (const [key, entry] of ctx.spawnedTasks.entries()) {
129
+ if (now - entry.timestamp > SPAWN_DEDUP_WINDOW_MS) {
130
+ ctx.spawnedTasks.delete(key);
131
+ }
132
+ }
133
+ let existingMatch;
134
+ let matchType = 'exact';
135
+ if (!isSwarmWorker) {
136
+ existingMatch = ctx.spawnedTasks.get(taskKey);
137
+ if (!existingMatch) {
138
+ for (const [key, entry] of ctx.spawnedTasks.entries()) {
139
+ if (!key.startsWith(`${agentName}:`))
140
+ continue;
141
+ if (now - entry.timestamp >= SPAWN_DEDUP_WINDOW_MS)
142
+ continue;
143
+ const existingTask = key.slice(agentName.length + 1);
144
+ const similarity = calculateTaskSimilarity(task, existingTask);
145
+ if (similarity >= SEMANTIC_SIMILARITY_THRESHOLD) {
146
+ existingMatch = entry;
147
+ matchType = 'semantic';
148
+ ctx.observability?.logger?.debug('Semantic duplicate detected', {
149
+ agent: agentName,
150
+ newTask: task.slice(0, 80),
151
+ existingTask: existingTask.slice(0, 80),
152
+ similarity: (similarity * 100).toFixed(1) + '%',
153
+ });
154
+ break;
155
+ }
156
+ }
157
+ }
158
+ }
159
+ if (existingMatch && now - existingMatch.timestamp < SPAWN_DEDUP_WINDOW_MS) {
160
+ ctx.observability?.logger?.warn('Duplicate spawn prevented', {
161
+ agent: agentName,
162
+ task: task.slice(0, 100),
163
+ matchType,
164
+ originalTimestamp: existingMatch.timestamp,
165
+ elapsedMs: now - existingMatch.timestamp,
166
+ });
167
+ const duplicateMessage = `[DUPLICATE SPAWN PREVENTED${matchType === 'semantic' ? ' - SEMANTIC MATCH' : ''}]\n` +
168
+ `This task was already spawned ${Math.round((now - existingMatch.timestamp) / 1000)}s ago.\n` +
169
+ `${existingMatch.queuedChanges > 0
170
+ ? `The previous spawn queued ${existingMatch.queuedChanges} change(s) to the pending plan.\n` +
171
+ `These changes are already in your plan - do NOT spawn again.\n`
172
+ : ''}Previous result summary:\n${existingMatch.result.slice(0, 500)}`;
173
+ return {
174
+ success: true,
175
+ output: duplicateMessage,
176
+ metrics: { tokens: 0, duration: 0, toolCalls: 0 },
177
+ };
178
+ }
179
+ const agentId = `spawn-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
180
+ ctx.emit({ type: 'agent.spawn', agentId, name: agentName, task });
181
+ ctx.observability?.logger?.info('Spawning agent', { name: agentName, task });
182
+ const startTime = Date.now();
183
+ const childSessionId = `subagent-${agentName}-${Date.now()}`;
184
+ const childTraceId = `trace-${childSessionId}`;
185
+ let workerResultId;
186
+ try {
187
+ // Filter tools for this agent
188
+ let agentTools = filterToolsForAgent(agentDef, Array.from(ctx.tools.values()));
189
+ // Resolve policy profile
190
+ const inferredTaskType = agentDef.taskType ?? ToolRecommendationEngine.inferTaskType(agentName);
191
+ const policyResolution = resolvePolicyProfile({
192
+ policyEngine: ctx.config.policyEngine,
193
+ requestedProfile: agentDef.policyProfile,
194
+ swarmConfig: isSwarmWorker && ctx.config.swarm && typeof ctx.config.swarm === 'object'
195
+ ? ctx.config.swarm
196
+ : undefined,
197
+ taskType: inferredTaskType,
198
+ isSwarmWorker,
199
+ sandboxConfig: ctx.config.sandbox && typeof ctx.config.sandbox === 'object'
200
+ ? ctx.config.sandbox
201
+ : undefined,
202
+ });
203
+ ctx.emit({
204
+ type: 'policy.profile.resolved',
205
+ profile: policyResolution.profileName,
206
+ context: isSwarmWorker ? 'swarm' : 'subagent',
207
+ selectionSource: policyResolution.metadata.selectionSource,
208
+ usedLegacyMappings: policyResolution.metadata.usedLegacyMappings,
209
+ legacySources: policyResolution.metadata.legacyMappingSources,
210
+ });
211
+ if (policyResolution.metadata.usedLegacyMappings) {
212
+ ctx.emit({
213
+ type: 'policy.legacy.fallback.used',
214
+ profile: policyResolution.profileName,
215
+ sources: policyResolution.metadata.legacyMappingSources,
216
+ warnings: policyResolution.metadata.warnings,
217
+ });
218
+ ctx.observability?.logger?.warn('Policy legacy mappings used', {
219
+ agent: agentName,
220
+ profile: policyResolution.profileName,
221
+ sources: policyResolution.metadata.legacyMappingSources,
222
+ });
223
+ }
224
+ // Apply tool recommendations
225
+ if (ctx.toolRecommendation && agentTools.length > 15) {
226
+ const taskType = ToolRecommendationEngine.inferTaskType(agentName);
227
+ const recommendations = ctx.toolRecommendation.recommendTools(task, taskType, agentTools.map(t => t.name));
228
+ if (recommendations.length > 0) {
229
+ const recommendedNames = new Set(recommendations.map(r => r.toolName));
230
+ const alwaysKeep = new Set(['spawn_agent', 'spawn_agents_parallel']);
231
+ if (policyResolution.profile.allowedTools) {
232
+ for (const t of policyResolution.profile.allowedTools)
233
+ alwaysKeep.add(t);
234
+ }
235
+ agentTools = agentTools.filter(t => recommendedNames.has(t.name) || alwaysKeep.has(t.name));
236
+ }
237
+ }
238
+ // Enforce unified tool policy
239
+ if (policyResolution.profile.toolAccessMode === 'whitelist' && policyResolution.profile.allowedTools) {
240
+ const allowed = new Set(policyResolution.profile.allowedTools);
241
+ agentTools = agentTools.filter(t => allowed.has(t.name));
242
+ }
243
+ else if (policyResolution.profile.deniedTools && policyResolution.profile.deniedTools.length > 0) {
244
+ const denied = new Set(policyResolution.profile.deniedTools);
245
+ agentTools = agentTools.filter(t => !denied.has(t.name));
246
+ }
247
+ if (agentTools.length === 0) {
248
+ throw new Error(`Worker '${agentName}' has zero available tools after filtering. Check toolAccessMode and policy profile '${policyResolution.profileName}'.`);
249
+ }
250
+ // Resolve model
251
+ const resolvedModel = (agentDef.model && agentDef.model.includes('/'))
252
+ ? agentDef.model
253
+ : ctx.config.model;
254
+ // Persist subagent task lifecycle
255
+ if (ctx.store?.hasWorkerResultsFeature()) {
256
+ try {
257
+ workerResultId = ctx.store.createWorkerResult(agentId, task.slice(0, 500), resolvedModel || 'default');
258
+ }
259
+ catch (storeErr) {
260
+ ctx.observability?.logger?.warn('Failed to create worker result record', {
261
+ agentId,
262
+ error: storeErr.message,
263
+ });
264
+ }
265
+ }
266
+ // Get subagent config with agent-type-specific timeouts and iteration limits
267
+ const subagentConfig = ctx.config.subagent;
268
+ const hasSubagentConfig = subagentConfig !== false && subagentConfig !== undefined;
269
+ // Timeout precedence
270
+ const agentTypeTimeout = getSubagentTimeout(agentName);
271
+ const rawPerTypeTimeout = hasSubagentConfig
272
+ ? subagentConfig.timeouts?.[agentName]
273
+ : undefined;
274
+ const rawGlobalTimeout = hasSubagentConfig
275
+ ? subagentConfig.defaultTimeout
276
+ : undefined;
277
+ const isValidTimeout = (v) => v !== undefined && Number.isFinite(v) && v > 0;
278
+ const agentDefTimeout = isValidTimeout(agentDef.timeout) ? agentDef.timeout : undefined;
279
+ const perTypeConfigTimeout = isValidTimeout(rawPerTypeTimeout) ? rawPerTypeTimeout : undefined;
280
+ const globalConfigTimeout = isValidTimeout(rawGlobalTimeout) ? rawGlobalTimeout : undefined;
281
+ const subagentTimeout = agentDefTimeout ?? perTypeConfigTimeout ?? agentTypeTimeout ?? globalConfigTimeout ?? 300000;
282
+ // Iteration precedence
283
+ const agentTypeMaxIter = getSubagentMaxIterations(agentName);
284
+ const rawPerTypeMaxIter = hasSubagentConfig
285
+ ? subagentConfig.maxIterations?.[agentName]
286
+ : undefined;
287
+ const rawGlobalMaxIter = hasSubagentConfig
288
+ ? subagentConfig.defaultMaxIterations
289
+ : undefined;
290
+ const isValidIter = (v) => v !== undefined && Number.isFinite(v) && v > 0 && Number.isInteger(v);
291
+ const perTypeConfigMaxIter = isValidIter(rawPerTypeMaxIter) ? rawPerTypeMaxIter : undefined;
292
+ const globalConfigMaxIter = isValidIter(rawGlobalMaxIter) ? rawGlobalMaxIter : undefined;
293
+ const defaultMaxIterations = agentDef.maxIterations ?? perTypeConfigMaxIter ?? agentTypeMaxIter ?? globalConfigMaxIter ?? 15;
294
+ // BLACKBOARD CONTEXT INJECTION
295
+ let blackboardContext = '';
296
+ let blackboardFindingsCount = 0;
297
+ const parentAgentId = `parent-${Date.now()}`;
298
+ if (ctx.blackboard) {
299
+ ctx.blackboard.post(parentAgentId, {
300
+ topic: 'spawn.parent_context',
301
+ content: `Parent spawning ${agentName} for task: ${task.slice(0, 200)}`,
302
+ type: 'progress',
303
+ confidence: 1,
304
+ metadata: { agentName, taskPreview: task.slice(0, 100) },
305
+ });
306
+ const recentFindings = ctx.blackboard.query({
307
+ limit: 5,
308
+ types: ['discovery', 'analysis', 'progress'],
309
+ minConfidence: 0.7,
310
+ });
311
+ blackboardFindingsCount = recentFindings.length;
312
+ if (recentFindings.length > 0) {
313
+ const findingsSummary = recentFindings
314
+ .map(f => `- [${f.agentId}] ${f.topic}: ${f.content.slice(0, 150)}${f.content.length > 150 ? '...' : ''}`)
315
+ .join('\n');
316
+ blackboardContext = `\n\n**BLACKBOARD CONTEXT (from parent/sibling agents):**\n${findingsSummary}\n`;
317
+ }
318
+ }
319
+ // Check for files already in parent's pending plan
320
+ const currentPlan = ctx.pendingPlanManager.getPendingPlan();
321
+ if (currentPlan && currentPlan.proposedChanges.length > 0) {
322
+ const pendingFiles = currentPlan.proposedChanges
323
+ .filter((c) => c.tool === 'write_file' || c.tool === 'edit_file')
324
+ .map((c) => c.args.path || c.args.file_path)
325
+ .filter(Boolean);
326
+ if (pendingFiles.length > 0) {
327
+ blackboardContext += `\n**FILES ALREADY IN PENDING PLAN (do not duplicate):**\n${pendingFiles.slice(0, 10).join('\n')}\n`;
328
+ }
329
+ }
330
+ // CONSTRAINT INJECTION
331
+ const constraintParts = [];
332
+ const subagentBudgetTokens = constraints?.maxTokens ?? SUBAGENT_BUDGET.maxTokens ?? 100000;
333
+ const subagentBudgetMinutes = Math.round((SUBAGENT_BUDGET.maxDuration ?? 240000) / 60000);
334
+ if (isSwarmWorker) {
335
+ constraintParts.push(`**Execution Mode:** You are a focused worker agent.\n` +
336
+ `- Complete your assigned task using tool calls.\n` +
337
+ `- Your FIRST action must be a tool call (read_file, write_file, edit_file, grep, glob, etc.).\n` +
338
+ `- To create files use write_file. To modify files use edit_file. Do NOT use bash for file operations.\n` +
339
+ `- You will receive a system message if you need to wrap up. Until then, work normally.\n` +
340
+ `- Do NOT produce summaries or reports — produce CODE and FILE CHANGES.`);
341
+ }
342
+ else {
343
+ constraintParts.push(`**RESOURCE AWARENESS (CRITICAL):**\n` +
344
+ `- Token budget: ~${(subagentBudgetTokens / 1000).toFixed(0)}k tokens\n` +
345
+ `- Time limit: ~${subagentBudgetMinutes} minutes\n` +
346
+ `- You will receive warnings at 70% usage. When warned, WRAP UP immediately.\n` +
347
+ `- Do not explore indefinitely - be focused and efficient.\n` +
348
+ `- If approaching limits, summarize findings and return.\n` +
349
+ `- **STRUCTURED WRAPUP:** When told to wrap up, respond with ONLY this JSON (no tool calls):\n` +
350
+ ` {"findings":[...], "actionsTaken":[...], "failures":[...], "remainingWork":[...], "suggestedNextSteps":[...]}`);
351
+ }
352
+ if (constraints) {
353
+ if (constraints.focusAreas && constraints.focusAreas.length > 0) {
354
+ constraintParts.push(`**FOCUS AREAS (limit exploration to these paths):**\n${constraints.focusAreas.map(a => ` - ${a}`).join('\n')}`);
355
+ }
356
+ if (constraints.excludeAreas && constraints.excludeAreas.length > 0) {
357
+ constraintParts.push(`**EXCLUDED AREAS (do NOT explore these):**\n${constraints.excludeAreas.map(a => ` - ${a}`).join('\n')}`);
358
+ }
359
+ if (constraints.requiredDeliverables && constraints.requiredDeliverables.length > 0) {
360
+ constraintParts.push(`**REQUIRED DELIVERABLES (you must produce these):**\n${constraints.requiredDeliverables.map(d => ` - ${d}`).join('\n')}`);
361
+ }
362
+ if (constraints.timeboxMinutes) {
363
+ constraintParts.push(`**TIME LIMIT:** ${constraints.timeboxMinutes} minutes (soft limit - wrap up if approaching)`);
364
+ }
365
+ }
366
+ const constraintContext = `\n\n**EXECUTION CONSTRAINTS:**\n${constraintParts.join('\n\n')}\n`;
367
+ // Build delegation-enhanced system prompt
368
+ let delegationContext = '';
369
+ if (ctx.lastComplexityAssessment && ctx.lastComplexityAssessment.tier !== 'simple') {
370
+ const spec = createMinimalDelegationSpec(task, agentName);
371
+ delegationContext = '\n\n' + buildDelegationPrompt(spec);
372
+ }
373
+ const qualityPrompt = '\n\n' + getSubagentQualityPrompt();
374
+ // REPO CONTEXT INJECTION — give subagents a lightweight file structure map
375
+ let repoContextStr = '';
376
+ if (ctx.codebaseContext) {
377
+ const repoMap = ctx.codebaseContext.getRepoMap();
378
+ if (repoMap) {
379
+ // Lightweight repo map: file tree with key symbols (capped at 3000 tokens)
380
+ const { generateLightweightRepoMap } = await import('../integrations/context/codebase-context.js');
381
+ repoContextStr = '\n\n**REPOSITORY STRUCTURE:**\n' + generateLightweightRepoMap(repoMap, 3000);
382
+ }
383
+ }
384
+ // Inject parent's recently modified files so subagent knows the working context
385
+ let recentFilesStr = '';
386
+ let modifiedFilesList = [];
387
+ if (ctx.economics) {
388
+ const modifiedPaths = ctx.economics.getModifiedFilePaths();
389
+ modifiedFilesList = modifiedPaths.slice(0, 15);
390
+ if (modifiedPaths.length > 0) {
391
+ recentFilesStr = '\n\n**RECENTLY MODIFIED FILES (by parent agent):**\n' +
392
+ modifiedPaths.slice(0, 15).map(f => `- ${f}`).join('\n');
393
+ }
394
+ }
395
+ // Build subagent system prompt
396
+ const parentMode = ctx.modeManager.getMode();
397
+ const subagentSystemPrompt = parentMode === 'plan'
398
+ ? `${agentDef.systemPrompt}\n\n${SUBAGENT_PLAN_MODE_ADDITION}${blackboardContext}${repoContextStr}${recentFilesStr}${constraintContext}${delegationContext}${qualityPrompt}`
399
+ : `${agentDef.systemPrompt}${blackboardContext}${repoContextStr}${recentFilesStr}${constraintContext}${delegationContext}${qualityPrompt}`;
400
+ // Trace context injection for subagent prompt
401
+ ctx.traceCollector?.record({
402
+ type: 'context.injection',
403
+ data: {
404
+ agentId: agentName,
405
+ parentAgentId: ctx.traceCollector.getSessionId() || 'unknown',
406
+ repoMapTokens: estimateTokenCount(repoContextStr),
407
+ blackboardFindings: blackboardFindingsCount,
408
+ modifiedFiles: modifiedFilesList,
409
+ toolCount: agentTools.length,
410
+ model: resolvedModel || 'default',
411
+ },
412
+ });
413
+ // Allocate budget
414
+ const pooledBudget = getSubagentBudget(ctx, agentName, constraints);
415
+ const poolAllocationId = pooledBudget.allocationId;
416
+ const deniedByProfile = new Set(policyResolution.profile.deniedTools ?? []);
417
+ const policyToolPolicies = {};
418
+ for (const toolName of deniedByProfile) {
419
+ policyToolPolicies[toolName] = {
420
+ policy: 'forbidden',
421
+ reason: `Denied by policy profile '${policyResolution.profileName}'`,
422
+ };
423
+ }
424
+ if ((policyResolution.profile.bashMode ?? 'full') === 'disabled') {
425
+ policyToolPolicies.bash = {
426
+ policy: 'forbidden',
427
+ reason: `Bash is disabled by policy profile '${policyResolution.profileName}'`,
428
+ };
429
+ }
430
+ // Create the sub-agent via factory (avoids circular import)
431
+ const subAgent = createSubAgent({
432
+ provider: ctx.provider,
433
+ tools: agentTools,
434
+ toolResolver: ctx.toolResolver || undefined,
435
+ mcpToolSummaries: ctx.config.mcpToolSummaries,
436
+ systemPrompt: subagentSystemPrompt,
437
+ model: resolvedModel,
438
+ maxIterations: agentDef.maxIterations || defaultMaxIterations,
439
+ memory: false,
440
+ planning: false,
441
+ reflection: false,
442
+ compaction: {
443
+ enabled: true,
444
+ mode: 'auto',
445
+ tokenThreshold: 40000,
446
+ preserveRecentCount: 4,
447
+ preserveToolResults: false,
448
+ summaryMaxTokens: 500,
449
+ },
450
+ maxContextTokens: 80000,
451
+ observability: ctx.config.observability,
452
+ sandbox: (() => {
453
+ const swarm = ctx.config.swarm;
454
+ const extraCmds = swarm && typeof swarm === 'object' && swarm.permissions?.additionalAllowedCommands;
455
+ const baseSbx = ctx.config.sandbox;
456
+ if (baseSbx && typeof baseSbx === 'object') {
457
+ const sbx = baseSbx;
458
+ const allowedCommands = extraCmds
459
+ ? [...(sbx.allowedCommands || []), ...extraCmds]
460
+ : sbx.allowedCommands;
461
+ return {
462
+ ...sbx,
463
+ allowedCommands,
464
+ bashMode: policyResolution.profile.bashMode ?? sbx.bashMode,
465
+ bashWriteProtection: policyResolution.profile.bashWriteProtection ?? sbx.bashWriteProtection,
466
+ blockFileCreationViaBash: (policyResolution.profile.bashWriteProtection ?? 'off') === 'block_file_mutation'
467
+ ? true
468
+ : sbx.blockFileCreationViaBash,
469
+ };
470
+ }
471
+ return baseSbx;
472
+ })(),
473
+ // Subagents: raise riskThreshold to 'high' so moderate-risk tools (write_file, edit_file)
474
+ // pass without approval dialogs. High-risk tools (delete_file) still require approval.
475
+ // The scopedApprove paths still constrain WHERE subagents can write.
476
+ humanInLoop: ctx.config.humanInLoop
477
+ ? {
478
+ ...ctx.config.humanInLoop,
479
+ riskThreshold: 'high',
480
+ }
481
+ : ctx.config.humanInLoop,
482
+ executionPolicy: (() => {
483
+ const hasPolicyOverrides = Object.keys(policyToolPolicies).length > 0;
484
+ if (ctx.config.executionPolicy) {
485
+ return {
486
+ ...ctx.config.executionPolicy,
487
+ defaultPolicy: 'allow',
488
+ toolPolicies: {
489
+ ...(ctx.config.executionPolicy.toolPolicies ?? {}),
490
+ ...policyToolPolicies,
491
+ },
492
+ };
493
+ }
494
+ if (hasPolicyOverrides) {
495
+ return {
496
+ enabled: true,
497
+ defaultPolicy: 'allow',
498
+ toolPolicies: policyToolPolicies,
499
+ intentAware: false,
500
+ };
501
+ }
502
+ return { enabled: true, defaultPolicy: 'allow', toolPolicies: {}, intentAware: false };
503
+ })(),
504
+ policyEngine: ctx.config.policyEngine
505
+ ? { ...ctx.config.policyEngine, defaultProfile: policyResolution.profileName }
506
+ : ctx.config.policyEngine,
507
+ threads: false,
508
+ hooks: ctx.config.hooks === false ? false : {
509
+ enabled: true,
510
+ builtIn: { logging: false, timing: false, metrics: false },
511
+ custom: [],
512
+ },
513
+ agentId,
514
+ blackboard: ctx.blackboard || undefined,
515
+ fileCache: ctx.fileCache || undefined,
516
+ budget: {
517
+ ...pooledBudget.budget,
518
+ ...(agentDef.economicsTuning ? { tuning: agentDef.economicsTuning } : {}),
519
+ ...(agentDef.enforcementMode ? { enforcementMode: agentDef.enforcementMode } : {}),
520
+ },
521
+ sharedContextState: ctx.sharedContextState || undefined,
522
+ sharedEconomicsState: ctx.sharedEconomicsState || undefined,
523
+ });
524
+ // Inherit parent's mode
525
+ if (parentMode !== 'build') {
526
+ subAgent.setMode(parentMode);
527
+ }
528
+ // APPROVAL BATCHING
529
+ const swarmPerms = ctx.config.swarm && typeof ctx.config.swarm === 'object'
530
+ ? ctx.config.swarm.permissions : undefined;
531
+ const baseAutoApprove = ['read_file', 'list_files', 'glob', 'grep', 'show_file_history', 'show_session_changes'];
532
+ const baseScopedApprove = isSwarmWorker
533
+ ? {
534
+ write_file: { paths: ['src/', 'tests/', 'tools/'] },
535
+ edit_file: { paths: ['src/', 'tests/', 'tools/'] },
536
+ bash: { paths: ['src/', 'tests/', 'tools/'] },
537
+ }
538
+ : {
539
+ write_file: { paths: ['src/', 'tests/', 'tools/'] },
540
+ edit_file: { paths: ['src/', 'tests/', 'tools/'] },
541
+ };
542
+ const baseRequireApproval = isSwarmWorker ? ['delete_file'] : ['bash', 'delete_file'];
543
+ const mergedScope = mergeApprovalScopeWithProfile({
544
+ autoApprove: swarmPerms?.autoApprove
545
+ ? [...new Set([...baseAutoApprove, ...swarmPerms.autoApprove])]
546
+ : baseAutoApprove,
547
+ scopedApprove: swarmPerms?.scopedApprove
548
+ ? { ...baseScopedApprove, ...swarmPerms.scopedApprove }
549
+ : baseScopedApprove,
550
+ requireApproval: swarmPerms?.requireApproval
551
+ ? swarmPerms.requireApproval
552
+ : baseRequireApproval,
553
+ }, policyResolution.profile);
554
+ subAgent.setApprovalScope(mergedScope);
555
+ subAgent.setParentIterations(ctx.getTotalIterations());
556
+ // UNIFIED TRACING
557
+ if (ctx.traceCollector) {
558
+ const subagentTraceView = ctx.traceCollector.createSubagentView({
559
+ parentSessionId: ctx.traceCollector.getSessionId() || 'unknown',
560
+ agentType: agentName,
561
+ spawnedAtIteration: ctx.state.iteration,
562
+ });
563
+ subAgent.setTraceCollector(subagentTraceView);
564
+ }
565
+ // GRACEFUL TIMEOUT with WRAPUP PHASE
566
+ const IDLE_TIMEOUT = agentDef.idleTimeout ?? 120000;
567
+ let WRAPUP_WINDOW = 30000;
568
+ let IDLE_CHECK_INTERVAL = 5000;
569
+ if (ctx.config.subagent) {
570
+ WRAPUP_WINDOW = ctx.config.subagent.wrapupWindowMs ?? WRAPUP_WINDOW;
571
+ IDLE_CHECK_INTERVAL = ctx.config.subagent.idleCheckIntervalMs ?? IDLE_CHECK_INTERVAL;
572
+ }
573
+ const progressAwareTimeout = createGracefulTimeout(subagentTimeout, IDLE_TIMEOUT, WRAPUP_WINDOW, IDLE_CHECK_INTERVAL);
574
+ progressAwareTimeout.onWrapupWarning(() => {
575
+ ctx.emit({
576
+ type: 'subagent.wrapup.started',
577
+ agentId,
578
+ agentType: agentName,
579
+ reason: 'Timeout approaching - graceful wrapup window opened',
580
+ elapsedMs: Date.now() - startTime,
581
+ });
582
+ subAgent.requestWrapup('Timeout approaching — produce structured summary');
583
+ });
584
+ // Forward events from subagent
585
+ const unsubSubAgent = subAgent.subscribe(event => {
586
+ const taggedEvent = { ...event, subagent: agentName, subagentId: agentId };
587
+ ctx.emit(taggedEvent);
588
+ const progressEvents = ['tool.start', 'tool.complete', 'llm.start', 'llm.complete'];
589
+ if (progressEvents.includes(event.type)) {
590
+ progressAwareTimeout.reportProgress();
591
+ }
592
+ });
593
+ // Link parent's cancellation
594
+ const parentSource = ctx.cancellation?.getSource();
595
+ const effectiveSource = parentSource
596
+ ? createLinkedToken(parentSource, progressAwareTimeout)
597
+ : progressAwareTimeout;
598
+ subAgent.setExternalCancellation(effectiveSource.token);
599
+ // Pause parent's duration timer
600
+ ctx.economics?.pauseDuration();
601
+ try {
602
+ const result = await race(subAgent.run(task), effectiveSource.token);
603
+ const duration = Date.now() - startTime;
604
+ // Extract subagent's pending plan and merge into parent's plan
605
+ let queuedChangeSummary = '';
606
+ let queuedChangesCount = 0;
607
+ if (subAgent.hasPendingPlan()) {
608
+ const subPlan = subAgent.getPendingPlan();
609
+ if (subPlan && subPlan.proposedChanges.length > 0) {
610
+ queuedChangesCount = subPlan.proposedChanges.length;
611
+ ctx.emit({
612
+ type: 'agent.pending_plan',
613
+ agentId: agentName,
614
+ changes: subPlan.proposedChanges,
615
+ });
616
+ const changeSummaries = subPlan.proposedChanges.map(c => {
617
+ if (c.tool === 'write_file' || c.tool === 'edit_file') {
618
+ const path = c.args.path || c.args.file_path || '(unknown file)';
619
+ return ` - [${c.tool}] ${path}: ${c.reason}`;
620
+ }
621
+ else if (c.tool === 'bash') {
622
+ const cmd = String(c.args.command || '').slice(0, 60);
623
+ return ` - [bash] ${cmd}${String(c.args.command || '').length > 60 ? '...' : ''}: ${c.reason}`;
624
+ }
625
+ return ` - [${c.tool}]: ${c.reason}`;
626
+ });
627
+ queuedChangeSummary = `\n\n[PLAN MODE - CHANGES QUEUED TO PARENT]\n` +
628
+ `The following ${subPlan.proposedChanges.length} change(s) have been queued in the parent's pending plan:\n` +
629
+ changeSummaries.join('\n') + '\n' +
630
+ `\nThese changes are now in YOUR pending plan. The task for this subagent is COMPLETE.\n` +
631
+ `Do NOT spawn another agent for the same task - the changes are already queued.\n` +
632
+ `Use /show-plan to see all pending changes, /approve to execute them.`;
633
+ for (const change of subPlan.proposedChanges) {
634
+ ctx.pendingPlanManager.addProposedChange(change.tool, { ...change.args, _fromSubagent: agentName }, `[${agentName}] ${change.reason}`, change.toolCallId);
635
+ }
636
+ }
637
+ if (subPlan?.explorationSummary) {
638
+ ctx.pendingPlanManager.appendExplorationFinding(`[${agentName}] ${subPlan.explorationSummary}`);
639
+ }
640
+ }
641
+ const finalOutput = queuedChangeSummary
642
+ ? (result.response || '') + queuedChangeSummary
643
+ : (result.response || result.error || '');
644
+ const structured = parseStructuredClosureReport(result.response || '', 'completed');
645
+ const subagentFilePaths = subAgent.getModifiedFilePaths();
646
+ const spawnResultFinal = {
647
+ success: result.success,
648
+ output: finalOutput,
649
+ metrics: {
650
+ tokens: result.metrics.totalTokens,
651
+ inputTokens: result.metrics.inputTokens,
652
+ outputTokens: result.metrics.outputTokens,
653
+ duration,
654
+ toolCalls: result.metrics.toolCalls,
655
+ },
656
+ structured,
657
+ filesModified: subagentFilePaths,
658
+ };
659
+ // Save to output store
660
+ if (ctx.subagentOutputStore) {
661
+ const outputEntry = {
662
+ id: agentId,
663
+ agentId,
664
+ agentName,
665
+ task,
666
+ fullOutput: finalOutput,
667
+ structured,
668
+ filesModified: subagentFilePaths,
669
+ filesCreated: [],
670
+ timestamp: new Date(),
671
+ tokensUsed: result.metrics.totalTokens,
672
+ durationMs: duration,
673
+ };
674
+ const storeId = ctx.subagentOutputStore.save(outputEntry);
675
+ spawnResultFinal.outputStoreId = storeId;
676
+ }
677
+ if (workerResultId && ctx.store?.hasWorkerResultsFeature()) {
678
+ try {
679
+ ctx.store.completeWorkerResult(workerResultId, {
680
+ fullOutput: finalOutput,
681
+ summary: finalOutput.slice(0, 500),
682
+ artifacts: structured ? [{ type: 'structured_report', data: structured }] : undefined,
683
+ metrics: {
684
+ tokens: result.metrics.totalTokens,
685
+ duration,
686
+ toolCalls: result.metrics.toolCalls,
687
+ },
688
+ });
689
+ }
690
+ catch (storeErr) {
691
+ ctx.observability?.logger?.warn('Failed to persist worker result', {
692
+ agentId,
693
+ error: storeErr.message,
694
+ });
695
+ }
696
+ }
697
+ ctx.emit({
698
+ type: 'agent.complete',
699
+ agentId,
700
+ agentType: agentName,
701
+ success: result.success,
702
+ output: finalOutput.slice(0, 500),
703
+ });
704
+ if (progressAwareTimeout.isInWrapupPhase()) {
705
+ ctx.emit({
706
+ type: 'subagent.wrapup.completed',
707
+ agentId,
708
+ agentType: agentName,
709
+ elapsedMs: Date.now() - startTime,
710
+ });
711
+ }
712
+ // Enhanced tracing
713
+ ctx.traceCollector?.record({
714
+ type: 'subagent.link',
715
+ data: {
716
+ parentSessionId: ctx.traceCollector.getSessionId() || 'unknown',
717
+ childSessionId,
718
+ childTraceId,
719
+ childConfig: {
720
+ agentType: agentName,
721
+ model: resolvedModel || 'default',
722
+ task,
723
+ tools: agentTools.map(t => t.name),
724
+ },
725
+ spawnContext: {
726
+ reason: `Delegated task: ${task.slice(0, 100)}`,
727
+ expectedOutcome: agentDef.description,
728
+ parentIteration: ctx.state.iteration,
729
+ },
730
+ result: {
731
+ success: result.success,
732
+ summary: (result.response || result.error || '').slice(0, 500),
733
+ tokensUsed: result.metrics.totalTokens,
734
+ durationMs: duration,
735
+ },
736
+ },
737
+ });
738
+ unsubSubAgent();
739
+ await subAgent.cleanup();
740
+ ctx.spawnedTasks.set(taskKey, {
741
+ timestamp: Date.now(),
742
+ result: finalOutput,
743
+ queuedChanges: queuedChangesCount,
744
+ });
745
+ return spawnResultFinal;
746
+ }
747
+ catch (err) {
748
+ // Handle cancellation
749
+ if (isCancellationError(err)) {
750
+ const duration = Date.now() - startTime;
751
+ const isUserCancellation = parentSource?.isCancellationRequested;
752
+ const reason = isUserCancellation
753
+ ? 'User cancelled'
754
+ : err.reason || `Timed out after ${subagentTimeout}ms`;
755
+ ctx.emit({ type: 'agent.error', agentId, agentType: agentName, error: reason });
756
+ if (!isUserCancellation) {
757
+ ctx.emit({
758
+ type: 'subagent.timeout.hard_kill',
759
+ agentId,
760
+ agentType: agentName,
761
+ reason,
762
+ elapsedMs: Date.now() - startTime,
763
+ });
764
+ }
765
+ // PRESERVE PARTIAL RESULTS
766
+ const subagentState = subAgent.getState();
767
+ const subagentMetrics = subAgent.getMetrics();
768
+ const assistantMessages = subagentState.messages.filter(m => m.role === 'assistant');
769
+ const lastAssistantMsg = assistantMessages[assistantMessages.length - 1];
770
+ const partialResponse = typeof lastAssistantMsg?.content === 'string'
771
+ ? lastAssistantMsg.content
772
+ : '';
773
+ let cancelledQueuedSummary = '';
774
+ if (subAgent.hasPendingPlan()) {
775
+ const subPlan = subAgent.getPendingPlan();
776
+ if (subPlan && subPlan.proposedChanges.length > 0) {
777
+ ctx.emit({
778
+ type: 'agent.pending_plan',
779
+ agentId: agentName,
780
+ changes: subPlan.proposedChanges,
781
+ });
782
+ const changeSummaries = subPlan.proposedChanges.map(c => {
783
+ if (c.tool === 'write_file' || c.tool === 'edit_file') {
784
+ const path = c.args.path || c.args.file_path || '(unknown file)';
785
+ return ` - [${c.tool}] ${path}: ${c.reason}`;
786
+ }
787
+ else if (c.tool === 'bash') {
788
+ const cmd = String(c.args.command || '').slice(0, 60);
789
+ return ` - [bash] ${cmd}...: ${c.reason}`;
790
+ }
791
+ return ` - [${c.tool}]: ${c.reason}`;
792
+ });
793
+ cancelledQueuedSummary = `\n\n[PLAN MODE - CHANGES QUEUED BEFORE CANCELLATION]\n` +
794
+ `${subPlan.proposedChanges.length} change(s) were queued to the parent plan:\n` +
795
+ changeSummaries.join('\n') + '\n' +
796
+ `These changes are preserved in your pending plan.`;
797
+ for (const change of subPlan.proposedChanges) {
798
+ ctx.pendingPlanManager.addProposedChange(change.tool, { ...change.args, _fromSubagent: agentName }, `[${agentName}] ${change.reason}`, change.toolCallId);
799
+ }
800
+ }
801
+ if (subPlan?.explorationSummary) {
802
+ ctx.pendingPlanManager.appendExplorationFinding(`[${agentName}] ${subPlan.explorationSummary}`);
803
+ }
804
+ }
805
+ const subagentFilePaths = subAgent.getModifiedFilePaths();
806
+ unsubSubAgent();
807
+ try {
808
+ await subAgent.cleanup();
809
+ }
810
+ catch {
811
+ // Ignore cleanup errors on cancellation
812
+ }
813
+ const baseOutput = isUserCancellation
814
+ ? `Subagent '${agentName}' was cancelled by user.`
815
+ : `Subagent '${agentName}' timed out after ${Math.round(subagentTimeout / 1000)}s.`;
816
+ const partialResultSection = partialResponse
817
+ ? `\n\n[PARTIAL RESULTS BEFORE TIMEOUT]\n${partialResponse.slice(0, 2000)}${partialResponse.length > 2000 ? '...(truncated)' : ''}`
818
+ : '';
819
+ ctx.traceCollector?.record({
820
+ type: 'subagent.link',
821
+ data: {
822
+ parentSessionId: ctx.traceCollector.getSessionId() || 'unknown',
823
+ childSessionId,
824
+ childTraceId,
825
+ childConfig: {
826
+ agentType: agentName,
827
+ model: resolvedModel || 'default',
828
+ task,
829
+ tools: agentTools.map(t => t.name),
830
+ },
831
+ spawnContext: {
832
+ reason: `Delegated task: ${task.slice(0, 100)}`,
833
+ expectedOutcome: agentDef.description,
834
+ parentIteration: ctx.state.iteration,
835
+ },
836
+ result: {
837
+ success: false,
838
+ summary: `[TIMEOUT] ${baseOutput}\n${partialResponse.slice(0, 200)}`,
839
+ tokensUsed: subagentMetrics.totalTokens,
840
+ durationMs: duration,
841
+ },
842
+ },
843
+ });
844
+ const exitReason = isUserCancellation ? 'cancelled' : 'timeout_graceful';
845
+ const structured = parseStructuredClosureReport(partialResponse, exitReason, task);
846
+ if (workerResultId && ctx.store?.hasWorkerResultsFeature()) {
847
+ try {
848
+ ctx.store.failWorkerResult(workerResultId, reason);
849
+ }
850
+ catch (storeErr) {
851
+ ctx.observability?.logger?.warn('Failed to mark cancelled worker result as failed', {
852
+ agentId,
853
+ error: storeErr.message,
854
+ });
855
+ }
856
+ }
857
+ return {
858
+ success: false,
859
+ output: baseOutput + partialResultSection + cancelledQueuedSummary,
860
+ metrics: {
861
+ tokens: subagentMetrics.totalTokens,
862
+ inputTokens: subagentMetrics.inputTokens,
863
+ outputTokens: subagentMetrics.outputTokens,
864
+ duration,
865
+ toolCalls: subagentMetrics.toolCalls,
866
+ },
867
+ structured,
868
+ filesModified: subagentFilePaths,
869
+ };
870
+ }
871
+ throw err;
872
+ }
873
+ finally {
874
+ ctx.economics?.resumeDuration();
875
+ effectiveSource.dispose();
876
+ progressAwareTimeout.dispose();
877
+ if (ctx.budgetPool && poolAllocationId) {
878
+ const subMetrics = subAgent.getMetrics();
879
+ ctx.budgetPool.recordUsage(poolAllocationId, subMetrics.totalTokens, subMetrics.estimatedCost);
880
+ ctx.budgetPool.release(poolAllocationId);
881
+ }
882
+ }
883
+ }
884
+ catch (err) {
885
+ const error = err instanceof Error ? err.message : String(err);
886
+ ctx.emit({ type: 'agent.error', agentId, agentType: agentName, error });
887
+ if (workerResultId && ctx.store?.hasWorkerResultsFeature()) {
888
+ try {
889
+ ctx.store.failWorkerResult(workerResultId, error);
890
+ }
891
+ catch (storeErr) {
892
+ ctx.observability?.logger?.warn('Failed to mark worker result as failed', {
893
+ agentId,
894
+ error: storeErr.message,
895
+ });
896
+ }
897
+ }
898
+ return {
899
+ success: false,
900
+ output: `Agent error: ${error}`,
901
+ metrics: { tokens: 0, duration: Date.now() - startTime, toolCalls: 0 },
902
+ };
903
+ }
904
+ }
905
+ /**
906
+ * Spawn multiple agents in parallel to work on independent tasks.
907
+ * Uses DynamicBudgetPool for parallel spawns and SubagentSupervisor for monitoring.
908
+ * Extracted from ProductionAgent.spawnAgentsParallel().
909
+ */
910
+ export async function spawnAgentsParallel(tasks, ctx, mutators, createSubAgent) {
911
+ ctx.emit({
912
+ type: 'parallel.spawn.start',
913
+ count: tasks.length,
914
+ agents: tasks.map(t => t.agent),
915
+ });
916
+ let settled;
917
+ const originalPool = ctx.budgetPool;
918
+ const supervisor = tasks.length > 1 ? createSubagentSupervisor() : null;
919
+ if (ctx.budgetPool && tasks.length > 1) {
920
+ const poolStats = ctx.budgetPool.getStats();
921
+ const dynamicPool = createDynamicBudgetPool(poolStats.tokensRemaining, 0.1);
922
+ dynamicPool.setExpectedChildren(tasks.length);
923
+ // Temporarily replace the budget pool
924
+ mutators.setBudgetPool(dynamicPool);
925
+ try {
926
+ const promises = tasks.map(({ agent, task }) => {
927
+ const spawnPromise = spawnAgent(agent, task, ctx, createSubAgent);
928
+ if (supervisor) {
929
+ const handle = createSubagentHandle(`parallel-${agent}-${Date.now()}`, agent, task, spawnPromise, {});
930
+ supervisor.add(handle);
931
+ }
932
+ return spawnPromise;
933
+ });
934
+ settled = await Promise.allSettled(promises);
935
+ }
936
+ finally {
937
+ mutators.setBudgetPool(originalPool);
938
+ supervisor?.stop();
939
+ }
940
+ }
941
+ else {
942
+ const promises = tasks.map(({ agent, task }) => spawnAgent(agent, task, ctx, createSubAgent));
943
+ settled = await Promise.allSettled(promises);
944
+ }
945
+ const results = settled.map((result, i) => {
946
+ if (result.status === 'fulfilled') {
947
+ return result.value;
948
+ }
949
+ const error = result.reason instanceof Error ? result.reason.message : String(result.reason);
950
+ ctx.emit({
951
+ type: 'agent.error',
952
+ agentId: tasks[i].agent,
953
+ error: `Unexpected parallel spawn error: ${error}`,
954
+ });
955
+ return {
956
+ success: false,
957
+ output: `Parallel spawn error: ${error}`,
958
+ metrics: { tokens: 0, duration: 0, toolCalls: 0 },
959
+ };
960
+ });
961
+ ctx.emit({
962
+ type: 'parallel.spawn.complete',
963
+ count: tasks.length,
964
+ successCount: results.filter(r => r.success).length,
965
+ results: results.map((r, i) => ({
966
+ agent: tasks[i].agent,
967
+ success: r.success,
968
+ tokens: r.metrics?.tokens || 0,
969
+ })),
970
+ });
971
+ return results;
972
+ }
973
+ //# sourceMappingURL=subagent-spawner.js.map