attocode 0.2.4 → 0.2.6

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 (813) hide show
  1. package/CHANGELOG.md +88 -1
  2. package/dist/src/adapters.d.ts +39 -1
  3. package/dist/src/adapters.d.ts.map +1 -1
  4. package/dist/src/adapters.js +201 -16
  5. package/dist/src/adapters.js.map +1 -1
  6. package/dist/src/agent/agent-builder.d.ts +117 -0
  7. package/dist/src/agent/agent-builder.d.ts.map +1 -0
  8. package/dist/src/agent/agent-builder.js +204 -0
  9. package/dist/src/agent/agent-builder.js.map +1 -0
  10. package/dist/src/agent/feature-initializer.d.ts +80 -0
  11. package/dist/src/agent/feature-initializer.d.ts.map +1 -0
  12. package/dist/src/agent/feature-initializer.js +676 -0
  13. package/dist/src/agent/feature-initializer.js.map +1 -0
  14. package/dist/src/agent/index.d.ts +13 -0
  15. package/dist/src/agent/index.d.ts.map +1 -0
  16. package/dist/src/agent/index.js +13 -0
  17. package/dist/src/agent/index.js.map +1 -0
  18. package/dist/src/agent/message-builder.d.ts +50 -0
  19. package/dist/src/agent/message-builder.d.ts.map +1 -0
  20. package/dist/src/agent/message-builder.js +176 -0
  21. package/dist/src/agent/message-builder.js.map +1 -0
  22. package/dist/src/agent/session-api.d.ts +94 -0
  23. package/dist/src/agent/session-api.d.ts.map +1 -0
  24. package/dist/src/agent/session-api.js +264 -0
  25. package/dist/src/agent/session-api.js.map +1 -0
  26. package/dist/src/agent-tools/lsp-file-tools.d.ts +1 -1
  27. package/dist/src/agent-tools/lsp-file-tools.d.ts.map +1 -1
  28. package/dist/src/agent-tools/lsp-file-tools.js +17 -13
  29. package/dist/src/agent-tools/lsp-file-tools.js.map +1 -1
  30. package/dist/src/agent.d.ts +26 -117
  31. package/dist/src/agent.d.ts.map +1 -1
  32. package/dist/src/agent.js +239 -1249
  33. package/dist/src/agent.js.map +1 -1
  34. package/dist/src/analysis/feedback-loop.d.ts.map +1 -1
  35. package/dist/src/analysis/feedback-loop.js +13 -9
  36. package/dist/src/analysis/feedback-loop.js.map +1 -1
  37. package/dist/src/analysis/index.d.ts +1 -1
  38. package/dist/src/analysis/index.d.ts.map +1 -1
  39. package/dist/src/analysis/index.js +1 -1
  40. package/dist/src/analysis/index.js.map +1 -1
  41. package/dist/src/analysis/prompt-templates.d.ts.map +1 -1
  42. package/dist/src/analysis/prompt-templates.js.map +1 -1
  43. package/dist/src/analysis/trace-summary.d.ts.map +1 -1
  44. package/dist/src/analysis/trace-summary.js +25 -9
  45. package/dist/src/analysis/trace-summary.js.map +1 -1
  46. package/dist/src/cli.d.ts.map +1 -1
  47. package/dist/src/cli.js +4 -2
  48. package/dist/src/cli.js.map +1 -1
  49. package/dist/src/commands/agents-commands.d.ts.map +1 -1
  50. package/dist/src/commands/agents-commands.js +3 -3
  51. package/dist/src/commands/agents-commands.js.map +1 -1
  52. package/dist/src/commands/handler.d.ts.map +1 -1
  53. package/dist/src/commands/handler.js +68 -44
  54. package/dist/src/commands/handler.js.map +1 -1
  55. package/dist/src/commands/init-commands.d.ts.map +1 -1
  56. package/dist/src/commands/init-commands.js +8 -10
  57. package/dist/src/commands/init-commands.js.map +1 -1
  58. package/dist/src/commands/init.js +17 -17
  59. package/dist/src/commands/init.js.map +1 -1
  60. package/dist/src/commands/skills-commands.d.ts.map +1 -1
  61. package/dist/src/commands/skills-commands.js +10 -7
  62. package/dist/src/commands/skills-commands.js.map +1 -1
  63. package/dist/src/commands/types.d.ts.map +1 -1
  64. package/dist/src/config/config-manager.d.ts.map +1 -1
  65. package/dist/src/config/config-manager.js +4 -1
  66. package/dist/src/config/config-manager.js.map +1 -1
  67. package/dist/src/config/index.d.ts +1 -1
  68. package/dist/src/config/index.d.ts.map +1 -1
  69. package/dist/src/config/schema.d.ts +6 -6
  70. package/dist/src/config/schema.d.ts.map +1 -1
  71. package/dist/src/config/schema.js +6 -2
  72. package/dist/src/config/schema.js.map +1 -1
  73. package/dist/src/core/agent-state-machine.d.ts.map +1 -1
  74. package/dist/src/core/agent-state-machine.js +5 -2
  75. package/dist/src/core/agent-state-machine.js.map +1 -1
  76. package/dist/src/core/completion-analyzer.d.ts.map +1 -1
  77. package/dist/src/core/completion-analyzer.js +2 -2
  78. package/dist/src/core/completion-analyzer.js.map +1 -1
  79. package/dist/src/core/execution-loop.d.ts +172 -1
  80. package/dist/src/core/execution-loop.d.ts.map +1 -1
  81. package/dist/src/core/execution-loop.js +597 -360
  82. package/dist/src/core/execution-loop.js.map +1 -1
  83. package/dist/src/core/index.d.ts +2 -2
  84. package/dist/src/core/index.d.ts.map +1 -1
  85. package/dist/src/core/index.js +1 -1
  86. package/dist/src/core/index.js.map +1 -1
  87. package/dist/src/core/queues/event-queue.d.ts.map +1 -1
  88. package/dist/src/core/queues/event-queue.js.map +1 -1
  89. package/dist/src/core/response-handler.d.ts.map +1 -1
  90. package/dist/src/core/response-handler.js +20 -10
  91. package/dist/src/core/response-handler.js.map +1 -1
  92. package/dist/src/core/subagent-spawner.d.ts.map +1 -1
  93. package/dist/src/core/subagent-spawner.js +98 -59
  94. package/dist/src/core/subagent-spawner.js.map +1 -1
  95. package/dist/src/core/tool-executor.d.ts.map +1 -1
  96. package/dist/src/core/tool-executor.js +63 -27
  97. package/dist/src/core/tool-executor.js.map +1 -1
  98. package/dist/src/core/types.d.ts +1 -0
  99. package/dist/src/core/types.d.ts.map +1 -1
  100. package/dist/src/core/types.js.map +1 -1
  101. package/dist/src/costs/model-registry.js +6 -6
  102. package/dist/src/costs/model-registry.js.map +1 -1
  103. package/dist/src/defaults.d.ts.map +1 -1
  104. package/dist/src/defaults.js +67 -20
  105. package/dist/src/defaults.js.map +1 -1
  106. package/dist/src/errors/index.d.ts.map +1 -1
  107. package/dist/src/errors/index.js +6 -8
  108. package/dist/src/errors/index.js.map +1 -1
  109. package/dist/src/first-run.d.ts.map +1 -1
  110. package/dist/src/first-run.js +11 -11
  111. package/dist/src/first-run.js.map +1 -1
  112. package/dist/src/integrations/agents/agent-registry.d.ts +262 -0
  113. package/dist/src/integrations/agents/agent-registry.d.ts.map +1 -0
  114. package/dist/src/integrations/agents/agent-registry.js +686 -0
  115. package/dist/src/integrations/agents/agent-registry.js.map +1 -0
  116. package/dist/src/integrations/agents/async-subagent.d.ts +135 -0
  117. package/dist/src/integrations/agents/async-subagent.d.ts.map +1 -0
  118. package/dist/src/integrations/agents/async-subagent.js +211 -0
  119. package/dist/src/integrations/agents/async-subagent.js.map +1 -0
  120. package/dist/src/integrations/agents/complexity-classifier.d.ts +86 -0
  121. package/dist/src/integrations/agents/complexity-classifier.d.ts.map +1 -0
  122. package/dist/src/integrations/agents/complexity-classifier.js +264 -0
  123. package/dist/src/integrations/agents/complexity-classifier.js.map +1 -0
  124. package/dist/src/integrations/agents/delegation-protocol.d.ts +86 -0
  125. package/dist/src/integrations/agents/delegation-protocol.d.ts.map +1 -0
  126. package/dist/src/integrations/agents/delegation-protocol.js +127 -0
  127. package/dist/src/integrations/agents/delegation-protocol.js.map +1 -0
  128. package/dist/src/integrations/agents/multi-agent.d.ts +150 -0
  129. package/dist/src/integrations/agents/multi-agent.d.ts.map +1 -0
  130. package/dist/src/integrations/agents/multi-agent.js +302 -0
  131. package/dist/src/integrations/agents/multi-agent.js.map +1 -0
  132. package/dist/src/integrations/agents/result-synthesizer.d.ts +389 -0
  133. package/dist/src/integrations/agents/result-synthesizer.d.ts.map +1 -0
  134. package/dist/src/integrations/agents/result-synthesizer.js +953 -0
  135. package/dist/src/integrations/agents/result-synthesizer.js.map +1 -0
  136. package/dist/src/integrations/agents/shared-blackboard.d.ts +406 -0
  137. package/dist/src/integrations/agents/shared-blackboard.d.ts.map +1 -0
  138. package/dist/src/integrations/agents/shared-blackboard.js +757 -0
  139. package/dist/src/integrations/agents/shared-blackboard.js.map +1 -0
  140. package/dist/src/integrations/agents/subagent-output-store.d.ts +91 -0
  141. package/dist/src/integrations/agents/subagent-output-store.d.ts.map +1 -0
  142. package/dist/src/integrations/agents/subagent-output-store.js +256 -0
  143. package/dist/src/integrations/agents/subagent-output-store.js.map +1 -0
  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 +201 -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 +534 -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 +149 -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 +1039 -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 +304 -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 +265 -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 +362 -0
  175. package/dist/src/integrations/budget/resources.js.map +1 -0
  176. package/dist/src/integrations/context/auto-compaction.d.ts +210 -0
  177. package/dist/src/integrations/context/auto-compaction.d.ts.map +1 -0
  178. package/dist/src/integrations/context/auto-compaction.js +485 -0
  179. package/dist/src/integrations/context/auto-compaction.js.map +1 -0
  180. package/dist/src/integrations/context/code-analyzer.d.ts +71 -0
  181. package/dist/src/integrations/context/code-analyzer.d.ts.map +1 -0
  182. package/dist/src/integrations/context/code-analyzer.js +445 -0
  183. package/dist/src/integrations/context/code-analyzer.js.map +1 -0
  184. package/dist/src/integrations/context/code-selector.d.ts +78 -0
  185. package/dist/src/integrations/context/code-selector.d.ts.map +1 -0
  186. package/dist/src/integrations/context/code-selector.js +668 -0
  187. package/dist/src/integrations/context/code-selector.js.map +1 -0
  188. package/dist/src/integrations/context/codebase-ast.d.ts +138 -0
  189. package/dist/src/integrations/context/codebase-ast.d.ts.map +1 -0
  190. package/dist/src/integrations/context/codebase-ast.js +881 -0
  191. package/dist/src/integrations/context/codebase-ast.js.map +1 -0
  192. package/dist/src/integrations/context/codebase-context.d.ts +473 -0
  193. package/dist/src/integrations/context/codebase-context.d.ts.map +1 -0
  194. package/dist/src/integrations/context/codebase-context.js +694 -0
  195. package/dist/src/integrations/context/codebase-context.js.map +1 -0
  196. package/dist/src/integrations/context/compaction.d.ts +191 -0
  197. package/dist/src/integrations/context/compaction.d.ts.map +1 -0
  198. package/dist/src/integrations/context/compaction.js +391 -0
  199. package/dist/src/integrations/context/compaction.js.map +1 -0
  200. package/dist/src/integrations/context/context-engineering.d.ts +274 -0
  201. package/dist/src/integrations/context/context-engineering.d.ts.map +1 -0
  202. package/dist/src/integrations/context/context-engineering.js +437 -0
  203. package/dist/src/integrations/context/context-engineering.js.map +1 -0
  204. package/dist/src/integrations/context/file-cache.d.ts +97 -0
  205. package/dist/src/integrations/context/file-cache.d.ts.map +1 -0
  206. package/dist/src/integrations/context/file-cache.js +218 -0
  207. package/dist/src/integrations/context/file-cache.js.map +1 -0
  208. package/dist/src/integrations/context/semantic-cache.d.ts +178 -0
  209. package/dist/src/integrations/context/semantic-cache.d.ts.map +1 -0
  210. package/dist/src/integrations/context/semantic-cache.js +377 -0
  211. package/dist/src/integrations/context/semantic-cache.js.map +1 -0
  212. package/dist/src/integrations/index.d.ts +72 -68
  213. package/dist/src/integrations/index.d.ts.map +1 -1
  214. package/dist/src/integrations/index.js +76 -68
  215. package/dist/src/integrations/index.js.map +1 -1
  216. package/dist/src/integrations/lsp/lsp.d.ts +196 -0
  217. package/dist/src/integrations/lsp/lsp.d.ts.map +1 -0
  218. package/dist/src/integrations/lsp/lsp.js +583 -0
  219. package/dist/src/integrations/lsp/lsp.js.map +1 -0
  220. package/dist/src/integrations/mcp/mcp-client.d.ts +279 -0
  221. package/dist/src/integrations/mcp/mcp-client.d.ts.map +1 -0
  222. package/dist/src/integrations/mcp/mcp-client.js +776 -0
  223. package/dist/src/integrations/mcp/mcp-client.js.map +1 -0
  224. package/dist/src/integrations/mcp/mcp-custom-tools.d.ts +102 -0
  225. package/dist/src/integrations/mcp/mcp-custom-tools.d.ts.map +1 -0
  226. package/dist/src/integrations/mcp/mcp-custom-tools.js +232 -0
  227. package/dist/src/integrations/mcp/mcp-custom-tools.js.map +1 -0
  228. package/dist/src/integrations/mcp/mcp-tool-search.d.ts +77 -0
  229. package/dist/src/integrations/mcp/mcp-tool-search.d.ts.map +1 -0
  230. package/dist/src/integrations/mcp/mcp-tool-search.js +220 -0
  231. package/dist/src/integrations/mcp/mcp-tool-search.js.map +1 -0
  232. package/dist/src/integrations/mcp/mcp-tool-validator.d.ts +60 -0
  233. package/dist/src/integrations/mcp/mcp-tool-validator.d.ts.map +1 -0
  234. package/dist/src/integrations/mcp/mcp-tool-validator.js +139 -0
  235. package/dist/src/integrations/mcp/mcp-tool-validator.js.map +1 -0
  236. package/dist/src/integrations/persistence/codebase-repository.d.ts +45 -0
  237. package/dist/src/integrations/persistence/codebase-repository.d.ts.map +1 -0
  238. package/dist/src/integrations/persistence/codebase-repository.js +85 -0
  239. package/dist/src/integrations/persistence/codebase-repository.js.map +1 -0
  240. package/dist/src/integrations/persistence/goal-repository.d.ts +71 -0
  241. package/dist/src/integrations/persistence/goal-repository.d.ts.map +1 -0
  242. package/dist/src/integrations/persistence/goal-repository.js +187 -0
  243. package/dist/src/integrations/persistence/goal-repository.js.map +1 -0
  244. package/dist/src/integrations/persistence/history.d.ts +72 -0
  245. package/dist/src/integrations/persistence/history.d.ts.map +1 -0
  246. package/dist/src/integrations/persistence/history.js +163 -0
  247. package/dist/src/integrations/persistence/history.js.map +1 -0
  248. package/dist/src/integrations/persistence/persistence.d.ts +49 -0
  249. package/dist/src/integrations/persistence/persistence.d.ts.map +1 -0
  250. package/dist/src/integrations/persistence/persistence.js +200 -0
  251. package/dist/src/integrations/persistence/persistence.js.map +1 -0
  252. package/dist/src/integrations/persistence/session-repository.d.ts +212 -0
  253. package/dist/src/integrations/persistence/session-repository.d.ts.map +1 -0
  254. package/dist/src/integrations/persistence/session-repository.js +781 -0
  255. package/dist/src/integrations/persistence/session-repository.js.map +1 -0
  256. package/dist/src/integrations/persistence/session-store.d.ts +184 -0
  257. package/dist/src/integrations/persistence/session-store.d.ts.map +1 -0
  258. package/dist/src/integrations/persistence/session-store.js +346 -0
  259. package/dist/src/integrations/persistence/session-store.js.map +1 -0
  260. package/dist/src/integrations/persistence/sqlite-store.d.ts +453 -0
  261. package/dist/src/integrations/persistence/sqlite-store.d.ts.map +1 -0
  262. package/dist/src/integrations/persistence/sqlite-store.js +680 -0
  263. package/dist/src/integrations/persistence/sqlite-store.js.map +1 -0
  264. package/dist/src/integrations/persistence/worker-repository.d.ts +65 -0
  265. package/dist/src/integrations/persistence/worker-repository.d.ts.map +1 -0
  266. package/dist/src/integrations/persistence/worker-repository.js +181 -0
  267. package/dist/src/integrations/persistence/worker-repository.js.map +1 -0
  268. package/dist/src/integrations/quality/auto-checkpoint.d.ts +98 -0
  269. package/dist/src/integrations/quality/auto-checkpoint.d.ts.map +1 -0
  270. package/dist/src/integrations/quality/auto-checkpoint.js +250 -0
  271. package/dist/src/integrations/quality/auto-checkpoint.js.map +1 -0
  272. package/dist/src/integrations/quality/dead-letter-queue.d.ts +233 -0
  273. package/dist/src/integrations/quality/dead-letter-queue.d.ts.map +1 -0
  274. package/dist/src/integrations/quality/dead-letter-queue.js +549 -0
  275. package/dist/src/integrations/quality/dead-letter-queue.js.map +1 -0
  276. package/dist/src/integrations/quality/health-check.d.ts +218 -0
  277. package/dist/src/integrations/quality/health-check.d.ts.map +1 -0
  278. package/dist/src/integrations/quality/health-check.js +418 -0
  279. package/dist/src/integrations/quality/health-check.js.map +1 -0
  280. package/dist/src/integrations/quality/learning-store.d.ts +291 -0
  281. package/dist/src/integrations/quality/learning-store.d.ts.map +1 -0
  282. package/dist/src/integrations/quality/learning-store.js +723 -0
  283. package/dist/src/integrations/quality/learning-store.js.map +1 -0
  284. package/dist/src/integrations/quality/self-improvement.d.ts +90 -0
  285. package/dist/src/integrations/quality/self-improvement.d.ts.map +1 -0
  286. package/dist/src/integrations/quality/self-improvement.js +229 -0
  287. package/dist/src/integrations/quality/self-improvement.js.map +1 -0
  288. package/dist/src/integrations/quality/tool-recommendation.d.ts +61 -0
  289. package/dist/src/integrations/quality/tool-recommendation.d.ts.map +1 -0
  290. package/dist/src/integrations/quality/tool-recommendation.js +298 -0
  291. package/dist/src/integrations/quality/tool-recommendation.js.map +1 -0
  292. package/dist/src/integrations/safety/bash-policy.d.ts +33 -0
  293. package/dist/src/integrations/safety/bash-policy.d.ts.map +1 -0
  294. package/dist/src/integrations/safety/bash-policy.js +147 -0
  295. package/dist/src/integrations/safety/bash-policy.js.map +1 -0
  296. package/dist/src/integrations/safety/edit-validator.d.ts +30 -0
  297. package/dist/src/integrations/safety/edit-validator.d.ts.map +1 -0
  298. package/dist/src/integrations/safety/edit-validator.js +87 -0
  299. package/dist/src/integrations/safety/edit-validator.js.map +1 -0
  300. package/dist/src/integrations/safety/execution-policy.d.ts +189 -0
  301. package/dist/src/integrations/safety/execution-policy.d.ts.map +1 -0
  302. package/dist/src/integrations/safety/execution-policy.js +362 -0
  303. package/dist/src/integrations/safety/execution-policy.js.map +1 -0
  304. package/dist/src/integrations/safety/policy-engine.d.ts +55 -0
  305. package/dist/src/integrations/safety/policy-engine.d.ts.map +1 -0
  306. package/dist/src/integrations/safety/policy-engine.js +287 -0
  307. package/dist/src/integrations/safety/policy-engine.js.map +1 -0
  308. package/dist/src/integrations/safety/safety.d.ts +174 -0
  309. package/dist/src/integrations/safety/safety.d.ts.map +1 -0
  310. package/dist/src/integrations/safety/safety.js +473 -0
  311. package/dist/src/integrations/safety/safety.js.map +1 -0
  312. package/dist/src/integrations/safety/sandbox/basic.d.ts +81 -0
  313. package/dist/src/integrations/safety/sandbox/basic.d.ts.map +1 -0
  314. package/dist/src/integrations/safety/sandbox/basic.js +333 -0
  315. package/dist/src/integrations/safety/sandbox/basic.js.map +1 -0
  316. package/dist/src/integrations/safety/sandbox/docker.d.ts +94 -0
  317. package/dist/src/integrations/safety/sandbox/docker.d.ts.map +1 -0
  318. package/dist/src/integrations/safety/sandbox/docker.js +294 -0
  319. package/dist/src/integrations/safety/sandbox/docker.js.map +1 -0
  320. package/dist/src/integrations/safety/sandbox/index.d.ts +188 -0
  321. package/dist/src/integrations/safety/sandbox/index.d.ts.map +1 -0
  322. package/dist/src/integrations/safety/sandbox/index.js +410 -0
  323. package/dist/src/integrations/safety/sandbox/index.js.map +1 -0
  324. package/dist/src/integrations/safety/sandbox/landlock.d.ts +59 -0
  325. package/dist/src/integrations/safety/sandbox/landlock.d.ts.map +1 -0
  326. package/dist/src/integrations/safety/sandbox/landlock.js +333 -0
  327. package/dist/src/integrations/safety/sandbox/landlock.js.map +1 -0
  328. package/dist/src/integrations/safety/sandbox/seatbelt.d.ts +68 -0
  329. package/dist/src/integrations/safety/sandbox/seatbelt.d.ts.map +1 -0
  330. package/dist/src/integrations/safety/sandbox/seatbelt.js +291 -0
  331. package/dist/src/integrations/safety/sandbox/seatbelt.js.map +1 -0
  332. package/dist/src/integrations/safety/type-checker.d.ts +53 -0
  333. package/dist/src/integrations/safety/type-checker.d.ts.map +1 -0
  334. package/dist/src/integrations/safety/type-checker.js +146 -0
  335. package/dist/src/integrations/safety/type-checker.js.map +1 -0
  336. package/dist/src/integrations/skills/skill-executor.d.ts +113 -0
  337. package/dist/src/integrations/skills/skill-executor.d.ts.map +1 -0
  338. package/dist/src/integrations/skills/skill-executor.js +266 -0
  339. package/dist/src/integrations/skills/skill-executor.js.map +1 -0
  340. package/dist/src/integrations/skills/skills.d.ts +262 -0
  341. package/dist/src/integrations/skills/skills.d.ts.map +1 -0
  342. package/dist/src/integrations/skills/skills.js +611 -0
  343. package/dist/src/integrations/skills/skills.js.map +1 -0
  344. package/dist/src/integrations/streaming/pty-shell.d.ts +169 -0
  345. package/dist/src/integrations/streaming/pty-shell.d.ts.map +1 -0
  346. package/dist/src/integrations/streaming/pty-shell.js +371 -0
  347. package/dist/src/integrations/streaming/pty-shell.js.map +1 -0
  348. package/dist/src/integrations/streaming/streaming.d.ts +102 -0
  349. package/dist/src/integrations/streaming/streaming.d.ts.map +1 -0
  350. package/dist/src/integrations/streaming/streaming.js +364 -0
  351. package/dist/src/integrations/streaming/streaming.js.map +1 -0
  352. package/dist/src/integrations/swarm/failure-classifier.d.ts.map +1 -1
  353. package/dist/src/integrations/swarm/failure-classifier.js +18 -3
  354. package/dist/src/integrations/swarm/failure-classifier.js.map +1 -1
  355. package/dist/src/integrations/swarm/index.d.ts +6 -5
  356. package/dist/src/integrations/swarm/index.d.ts.map +1 -1
  357. package/dist/src/integrations/swarm/index.js +5 -3
  358. package/dist/src/integrations/swarm/index.js.map +1 -1
  359. package/dist/src/integrations/swarm/model-selector.d.ts.map +1 -1
  360. package/dist/src/integrations/swarm/model-selector.js +21 -24
  361. package/dist/src/integrations/swarm/model-selector.js.map +1 -1
  362. package/dist/src/integrations/swarm/request-throttle.d.ts.map +1 -1
  363. package/dist/src/integrations/swarm/request-throttle.js +7 -4
  364. package/dist/src/integrations/swarm/request-throttle.js.map +1 -1
  365. package/dist/src/integrations/swarm/swarm-budget.d.ts +1 -1
  366. package/dist/src/integrations/swarm/swarm-budget.d.ts.map +1 -1
  367. package/dist/src/integrations/swarm/swarm-budget.js +1 -1
  368. package/dist/src/integrations/swarm/swarm-budget.js.map +1 -1
  369. package/dist/src/integrations/swarm/swarm-config-loader.d.ts.map +1 -1
  370. package/dist/src/integrations/swarm/swarm-config-loader.js +53 -17
  371. package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -1
  372. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts.map +1 -1
  373. package/dist/src/integrations/swarm/swarm-event-bridge.js +69 -23
  374. package/dist/src/integrations/swarm/swarm-event-bridge.js.map +1 -1
  375. package/dist/src/integrations/swarm/swarm-events.d.ts +1 -1
  376. package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -1
  377. package/dist/src/integrations/swarm/swarm-events.js +1 -1
  378. package/dist/src/integrations/swarm/swarm-events.js.map +1 -1
  379. package/dist/src/integrations/swarm/swarm-execution.d.ts +27 -0
  380. package/dist/src/integrations/swarm/swarm-execution.d.ts.map +1 -0
  381. package/dist/src/integrations/swarm/swarm-execution.js +1071 -0
  382. package/dist/src/integrations/swarm/swarm-execution.js.map +1 -0
  383. package/dist/src/integrations/swarm/swarm-helpers.d.ts +26 -0
  384. package/dist/src/integrations/swarm/swarm-helpers.d.ts.map +1 -0
  385. package/dist/src/integrations/swarm/swarm-helpers.js +108 -0
  386. package/dist/src/integrations/swarm/swarm-helpers.js.map +1 -0
  387. package/dist/src/integrations/swarm/swarm-lifecycle.d.ts +100 -0
  388. package/dist/src/integrations/swarm/swarm-lifecycle.d.ts.map +1 -0
  389. package/dist/src/integrations/swarm/swarm-lifecycle.js +977 -0
  390. package/dist/src/integrations/swarm/swarm-lifecycle.js.map +1 -0
  391. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +84 -203
  392. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -1
  393. package/dist/src/integrations/swarm/swarm-orchestrator.js +338 -2899
  394. package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -1
  395. package/dist/src/integrations/swarm/swarm-quality-gate.d.ts.map +1 -1
  396. package/dist/src/integrations/swarm/swarm-quality-gate.js +19 -15
  397. package/dist/src/integrations/swarm/swarm-quality-gate.js.map +1 -1
  398. package/dist/src/integrations/swarm/swarm-recovery.d.ts +75 -0
  399. package/dist/src/integrations/swarm/swarm-recovery.d.ts.map +1 -0
  400. package/dist/src/integrations/swarm/swarm-recovery.js +563 -0
  401. package/dist/src/integrations/swarm/swarm-recovery.js.map +1 -0
  402. package/dist/src/integrations/swarm/swarm-state-store.d.ts.map +1 -1
  403. package/dist/src/integrations/swarm/swarm-state-store.js +8 -0
  404. package/dist/src/integrations/swarm/swarm-state-store.js.map +1 -1
  405. package/dist/src/integrations/swarm/task-queue.d.ts +8 -2
  406. package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -1
  407. package/dist/src/integrations/swarm/task-queue.js +60 -26
  408. package/dist/src/integrations/swarm/task-queue.js.map +1 -1
  409. package/dist/src/integrations/swarm/types.d.ts +17 -5
  410. package/dist/src/integrations/swarm/types.d.ts.map +1 -1
  411. package/dist/src/integrations/swarm/types.js +89 -12
  412. package/dist/src/integrations/swarm/types.js.map +1 -1
  413. package/dist/src/integrations/swarm/worker-pool.d.ts +1 -1
  414. package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -1
  415. package/dist/src/integrations/swarm/worker-pool.js +43 -31
  416. package/dist/src/integrations/swarm/worker-pool.js.map +1 -1
  417. package/dist/src/integrations/tasks/dependency-analyzer.d.ts +34 -0
  418. package/dist/src/integrations/tasks/dependency-analyzer.d.ts.map +1 -0
  419. package/dist/src/integrations/tasks/dependency-analyzer.js +231 -0
  420. package/dist/src/integrations/tasks/dependency-analyzer.js.map +1 -0
  421. package/dist/src/integrations/tasks/interactive-planning.d.ts +322 -0
  422. package/dist/src/integrations/tasks/interactive-planning.d.ts.map +1 -0
  423. package/dist/src/integrations/tasks/interactive-planning.js +648 -0
  424. package/dist/src/integrations/tasks/interactive-planning.js.map +1 -0
  425. package/dist/src/integrations/tasks/pending-plan.d.ts +196 -0
  426. package/dist/src/integrations/tasks/pending-plan.d.ts.map +1 -0
  427. package/dist/src/integrations/tasks/pending-plan.js +431 -0
  428. package/dist/src/integrations/tasks/pending-plan.js.map +1 -0
  429. package/dist/src/integrations/tasks/planning.d.ts +115 -0
  430. package/dist/src/integrations/tasks/planning.d.ts.map +1 -0
  431. package/dist/src/integrations/tasks/planning.js +432 -0
  432. package/dist/src/integrations/tasks/planning.js.map +1 -0
  433. package/dist/src/integrations/tasks/smart-decomposer.d.ts +316 -0
  434. package/dist/src/integrations/tasks/smart-decomposer.d.ts.map +1 -0
  435. package/dist/src/integrations/tasks/smart-decomposer.js +668 -0
  436. package/dist/src/integrations/tasks/smart-decomposer.js.map +1 -0
  437. package/dist/src/integrations/tasks/task-manager.d.ts +164 -0
  438. package/dist/src/integrations/tasks/task-manager.d.ts.map +1 -0
  439. package/dist/src/integrations/tasks/task-manager.js +390 -0
  440. package/dist/src/integrations/tasks/task-manager.js.map +1 -0
  441. package/dist/src/integrations/tasks/task-splitter.d.ts +56 -0
  442. package/dist/src/integrations/tasks/task-splitter.d.ts.map +1 -0
  443. package/dist/src/integrations/tasks/task-splitter.js +542 -0
  444. package/dist/src/integrations/tasks/task-splitter.js.map +1 -0
  445. package/dist/src/integrations/tasks/verification-gate.d.ts +103 -0
  446. package/dist/src/integrations/tasks/verification-gate.d.ts.map +1 -0
  447. package/dist/src/integrations/tasks/verification-gate.js +195 -0
  448. package/dist/src/integrations/tasks/verification-gate.js.map +1 -0
  449. package/dist/src/integrations/tasks/work-log.d.ts +87 -0
  450. package/dist/src/integrations/tasks/work-log.d.ts.map +1 -0
  451. package/dist/src/integrations/tasks/work-log.js +287 -0
  452. package/dist/src/integrations/tasks/work-log.js.map +1 -0
  453. package/dist/src/integrations/utilities/capabilities.d.ts +160 -0
  454. package/dist/src/integrations/utilities/capabilities.d.ts.map +1 -0
  455. package/dist/src/integrations/utilities/capabilities.js +464 -0
  456. package/dist/src/integrations/utilities/capabilities.js.map +1 -0
  457. package/dist/src/integrations/utilities/diff-utils.d.ts +105 -0
  458. package/dist/src/integrations/utilities/diff-utils.d.ts.map +1 -0
  459. package/dist/src/integrations/utilities/diff-utils.js +496 -0
  460. package/dist/src/integrations/utilities/diff-utils.js.map +1 -0
  461. package/dist/src/integrations/utilities/environment-facts.d.ts +52 -0
  462. package/dist/src/integrations/utilities/environment-facts.d.ts.map +1 -0
  463. package/dist/src/integrations/utilities/environment-facts.js +94 -0
  464. package/dist/src/integrations/utilities/environment-facts.js.map +1 -0
  465. package/dist/src/integrations/utilities/file-change-tracker.d.ts +162 -0
  466. package/dist/src/integrations/utilities/file-change-tracker.d.ts.map +1 -0
  467. package/dist/src/integrations/utilities/file-change-tracker.js +537 -0
  468. package/dist/src/integrations/utilities/file-change-tracker.js.map +1 -0
  469. package/dist/src/integrations/utilities/graph-visualization.d.ts +72 -0
  470. package/dist/src/integrations/utilities/graph-visualization.d.ts.map +1 -0
  471. package/dist/src/integrations/utilities/graph-visualization.js +385 -0
  472. package/dist/src/integrations/utilities/graph-visualization.js.map +1 -0
  473. package/dist/src/integrations/utilities/hierarchical-config.d.ts +215 -0
  474. package/dist/src/integrations/utilities/hierarchical-config.d.ts.map +1 -0
  475. package/dist/src/integrations/utilities/hierarchical-config.js +508 -0
  476. package/dist/src/integrations/utilities/hierarchical-config.js.map +1 -0
  477. package/dist/src/integrations/utilities/hooks.d.ts +116 -0
  478. package/dist/src/integrations/utilities/hooks.d.ts.map +1 -0
  479. package/dist/src/integrations/utilities/hooks.js +410 -0
  480. package/dist/src/integrations/utilities/hooks.js.map +1 -0
  481. package/dist/src/integrations/utilities/ignore.d.ts +143 -0
  482. package/dist/src/integrations/utilities/ignore.d.ts.map +1 -0
  483. package/dist/src/integrations/utilities/ignore.js +417 -0
  484. package/dist/src/integrations/utilities/ignore.js.map +1 -0
  485. package/dist/src/integrations/utilities/image-renderer.d.ts +119 -0
  486. package/dist/src/integrations/utilities/image-renderer.d.ts.map +1 -0
  487. package/dist/src/integrations/utilities/image-renderer.js +301 -0
  488. package/dist/src/integrations/utilities/image-renderer.js.map +1 -0
  489. package/dist/src/integrations/utilities/logger.d.ts +104 -0
  490. package/dist/src/integrations/utilities/logger.d.ts.map +1 -0
  491. package/dist/src/integrations/utilities/logger.js +217 -0
  492. package/dist/src/integrations/utilities/logger.js.map +1 -0
  493. package/dist/src/integrations/utilities/memory.d.ts +116 -0
  494. package/dist/src/integrations/utilities/memory.d.ts.map +1 -0
  495. package/dist/src/integrations/utilities/memory.js +309 -0
  496. package/dist/src/integrations/utilities/memory.js.map +1 -0
  497. package/dist/src/integrations/utilities/observability.d.ts +162 -0
  498. package/dist/src/integrations/utilities/observability.d.ts.map +1 -0
  499. package/dist/src/integrations/utilities/observability.js +408 -0
  500. package/dist/src/integrations/utilities/observability.js.map +1 -0
  501. package/dist/src/integrations/utilities/openrouter-pricing.d.ts +67 -0
  502. package/dist/src/integrations/utilities/openrouter-pricing.d.ts.map +1 -0
  503. package/dist/src/integrations/utilities/openrouter-pricing.js +166 -0
  504. package/dist/src/integrations/utilities/openrouter-pricing.js.map +1 -0
  505. package/dist/src/integrations/utilities/react.d.ts +139 -0
  506. package/dist/src/integrations/utilities/react.d.ts.map +1 -0
  507. package/dist/src/integrations/utilities/react.js +269 -0
  508. package/dist/src/integrations/utilities/react.js.map +1 -0
  509. package/dist/src/integrations/utilities/retry.d.ts +132 -0
  510. package/dist/src/integrations/utilities/retry.d.ts.map +1 -0
  511. package/dist/src/integrations/utilities/retry.js +233 -0
  512. package/dist/src/integrations/utilities/retry.js.map +1 -0
  513. package/dist/src/integrations/utilities/routing.d.ts +118 -0
  514. package/dist/src/integrations/utilities/routing.d.ts.map +1 -0
  515. package/dist/src/integrations/utilities/routing.js +360 -0
  516. package/dist/src/integrations/utilities/routing.js.map +1 -0
  517. package/dist/src/integrations/utilities/rules.d.ts +131 -0
  518. package/dist/src/integrations/utilities/rules.d.ts.map +1 -0
  519. package/dist/src/integrations/utilities/rules.js +282 -0
  520. package/dist/src/integrations/utilities/rules.js.map +1 -0
  521. package/dist/src/integrations/utilities/sourcegraph.d.ts +169 -0
  522. package/dist/src/integrations/utilities/sourcegraph.d.ts.map +1 -0
  523. package/dist/src/integrations/utilities/sourcegraph.js +377 -0
  524. package/dist/src/integrations/utilities/sourcegraph.js.map +1 -0
  525. package/dist/src/integrations/utilities/thinking-strategy.d.ts +52 -0
  526. package/dist/src/integrations/utilities/thinking-strategy.d.ts.map +1 -0
  527. package/dist/src/integrations/utilities/thinking-strategy.js +129 -0
  528. package/dist/src/integrations/utilities/thinking-strategy.js.map +1 -0
  529. package/dist/src/integrations/utilities/thread-manager.d.ts +199 -0
  530. package/dist/src/integrations/utilities/thread-manager.d.ts.map +1 -0
  531. package/dist/src/integrations/utilities/thread-manager.js +359 -0
  532. package/dist/src/integrations/utilities/thread-manager.js.map +1 -0
  533. package/dist/src/integrations/utilities/token-estimate.d.ts +16 -0
  534. package/dist/src/integrations/utilities/token-estimate.d.ts.map +1 -0
  535. package/dist/src/integrations/utilities/token-estimate.js +20 -0
  536. package/dist/src/integrations/utilities/token-estimate.js.map +1 -0
  537. package/dist/src/main.js +50 -27
  538. package/dist/src/main.js.map +1 -1
  539. package/dist/src/modes/repl.d.ts.map +1 -1
  540. package/dist/src/modes/repl.js +73 -22
  541. package/dist/src/modes/repl.js.map +1 -1
  542. package/dist/src/modes/tui.d.ts.map +1 -1
  543. package/dist/src/modes/tui.js +93 -16
  544. package/dist/src/modes/tui.js.map +1 -1
  545. package/dist/src/modes.d.ts.map +1 -1
  546. package/dist/src/modes.js +14 -14
  547. package/dist/src/modes.js.map +1 -1
  548. package/dist/src/observability/tracer.d.ts.map +1 -1
  549. package/dist/src/observability/tracer.js +8 -4
  550. package/dist/src/observability/tracer.js.map +1 -1
  551. package/dist/src/observability/types.d.ts.map +1 -1
  552. package/dist/src/observability/types.js.map +1 -1
  553. package/dist/src/paths.d.ts.map +1 -1
  554. package/dist/src/paths.js +2 -6
  555. package/dist/src/paths.js.map +1 -1
  556. package/dist/src/persistence/migrator.d.ts.map +1 -1
  557. package/dist/src/persistence/migrator.js +7 -7
  558. package/dist/src/persistence/migrator.js.map +1 -1
  559. package/dist/src/persistence/schema.d.ts +2 -0
  560. package/dist/src/persistence/schema.d.ts.map +1 -1
  561. package/dist/src/persistence/schema.js +31 -0
  562. package/dist/src/persistence/schema.js.map +1 -1
  563. package/dist/src/providers/adapters/anthropic.d.ts +6 -0
  564. package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
  565. package/dist/src/providers/adapters/anthropic.js +132 -36
  566. package/dist/src/providers/adapters/anthropic.js.map +1 -1
  567. package/dist/src/providers/adapters/azure.d.ts +74 -0
  568. package/dist/src/providers/adapters/azure.d.ts.map +1 -0
  569. package/dist/src/providers/adapters/azure.js +369 -0
  570. package/dist/src/providers/adapters/azure.js.map +1 -0
  571. package/dist/src/providers/adapters/mock.d.ts +16 -2
  572. package/dist/src/providers/adapters/mock.d.ts.map +1 -1
  573. package/dist/src/providers/adapters/mock.js +51 -10
  574. package/dist/src/providers/adapters/mock.js.map +1 -1
  575. package/dist/src/providers/adapters/openai.d.ts +6 -1
  576. package/dist/src/providers/adapters/openai.d.ts.map +1 -1
  577. package/dist/src/providers/adapters/openai.js +57 -19
  578. package/dist/src/providers/adapters/openai.js.map +1 -1
  579. package/dist/src/providers/adapters/openrouter.d.ts +6 -0
  580. package/dist/src/providers/adapters/openrouter.d.ts.map +1 -1
  581. package/dist/src/providers/adapters/openrouter.js +127 -30
  582. package/dist/src/providers/adapters/openrouter.js.map +1 -1
  583. package/dist/src/providers/circuit-breaker.d.ts.map +1 -1
  584. package/dist/src/providers/circuit-breaker.js +4 -3
  585. package/dist/src/providers/circuit-breaker.js.map +1 -1
  586. package/dist/src/providers/fallback-chain.d.ts.map +1 -1
  587. package/dist/src/providers/fallback-chain.js +3 -3
  588. package/dist/src/providers/fallback-chain.js.map +1 -1
  589. package/dist/src/providers/llm-resilience.d.ts.map +1 -1
  590. package/dist/src/providers/llm-resilience.js +2 -2
  591. package/dist/src/providers/llm-resilience.js.map +1 -1
  592. package/dist/src/providers/provider.d.ts.map +1 -1
  593. package/dist/src/providers/provider.js +2 -3
  594. package/dist/src/providers/provider.js.map +1 -1
  595. package/dist/src/providers/resilient-fetch.d.ts.map +1 -1
  596. package/dist/src/providers/resilient-fetch.js +3 -4
  597. package/dist/src/providers/resilient-fetch.js.map +1 -1
  598. package/dist/src/providers/resilient-provider.d.ts.map +1 -1
  599. package/dist/src/providers/resilient-provider.js +9 -6
  600. package/dist/src/providers/resilient-provider.js.map +1 -1
  601. package/dist/src/providers/types.d.ts +23 -2
  602. package/dist/src/providers/types.d.ts.map +1 -1
  603. package/dist/src/session-picker.d.ts +1 -1
  604. package/dist/src/session-picker.d.ts.map +1 -1
  605. package/dist/src/session-picker.js +10 -6
  606. package/dist/src/session-picker.js.map +1 -1
  607. package/dist/src/shared/budget-tracker.d.ts.map +1 -1
  608. package/dist/src/shared/budget-tracker.js +2 -2
  609. package/dist/src/shared/budget-tracker.js.map +1 -1
  610. package/dist/src/shared/context-engine.d.ts.map +1 -1
  611. package/dist/src/shared/context-engine.js +1 -1
  612. package/dist/src/shared/context-engine.js.map +1 -1
  613. package/dist/src/shared/persistence.d.ts.map +1 -1
  614. package/dist/src/shared/persistence.js +2 -6
  615. package/dist/src/shared/persistence.js.map +1 -1
  616. package/dist/src/shared/shared-context-state.d.ts.map +1 -1
  617. package/dist/src/shared/shared-context-state.js.map +1 -1
  618. package/dist/src/shared/shared-economics-state.d.ts.map +1 -1
  619. package/dist/src/shared/shared-economics-state.js.map +1 -1
  620. package/dist/src/tools/agent.d.ts +2 -2
  621. package/dist/src/tools/agent.d.ts.map +1 -1
  622. package/dist/src/tools/agent.js +10 -7
  623. package/dist/src/tools/agent.js.map +1 -1
  624. package/dist/src/tools/bash.d.ts.map +1 -1
  625. package/dist/src/tools/bash.js +1 -1
  626. package/dist/src/tools/bash.js.map +1 -1
  627. package/dist/src/tools/coercion.js +1 -1
  628. package/dist/src/tools/coercion.js.map +1 -1
  629. package/dist/src/tools/file.d.ts.map +1 -1
  630. package/dist/src/tools/file.js +2 -2
  631. package/dist/src/tools/file.js.map +1 -1
  632. package/dist/src/tools/permission.js +7 -8
  633. package/dist/src/tools/permission.js.map +1 -1
  634. package/dist/src/tools/registry.d.ts +1 -1
  635. package/dist/src/tools/registry.d.ts.map +1 -1
  636. package/dist/src/tools/registry.js +4 -6
  637. package/dist/src/tools/registry.js.map +1 -1
  638. package/dist/src/tools/standard.d.ts.map +1 -1
  639. package/dist/src/tools/standard.js +1 -3
  640. package/dist/src/tools/standard.js.map +1 -1
  641. package/dist/src/tools/tasks.d.ts +1 -1
  642. package/dist/src/tools/tasks.d.ts.map +1 -1
  643. package/dist/src/tools/tasks.js +4 -4
  644. package/dist/src/tools/tasks.js.map +1 -1
  645. package/dist/src/tools/types.d.ts.map +1 -1
  646. package/dist/src/tools/types.js +5 -1
  647. package/dist/src/tools/types.js.map +1 -1
  648. package/dist/src/tools/undo.d.ts +1 -1
  649. package/dist/src/tools/undo.d.ts.map +1 -1
  650. package/dist/src/tools/undo.js +4 -2
  651. package/dist/src/tools/undo.js.map +1 -1
  652. package/dist/src/tracing/cache-boundary-tracker.d.ts.map +1 -1
  653. package/dist/src/tracing/cache-boundary-tracker.js +9 -13
  654. package/dist/src/tracing/cache-boundary-tracker.js.map +1 -1
  655. package/dist/src/tracing/trace-collector.d.ts +22 -0
  656. package/dist/src/tracing/trace-collector.d.ts.map +1 -1
  657. package/dist/src/tracing/trace-collector.js +55 -31
  658. package/dist/src/tracing/trace-collector.js.map +1 -1
  659. package/dist/src/tracing/types.d.ts +17 -1
  660. package/dist/src/tracing/types.d.ts.map +1 -1
  661. package/dist/src/tracing/types.js.map +1 -1
  662. package/dist/src/tricks/failure-evidence.d.ts.map +1 -1
  663. package/dist/src/tricks/failure-evidence.js +17 -27
  664. package/dist/src/tricks/failure-evidence.js.map +1 -1
  665. package/dist/src/tricks/json-utils.d.ts.map +1 -1
  666. package/dist/src/tricks/json-utils.js +1 -4
  667. package/dist/src/tricks/json-utils.js.map +1 -1
  668. package/dist/src/tricks/kv-cache-context.d.ts.map +1 -1
  669. package/dist/src/tricks/kv-cache-context.js +2 -3
  670. package/dist/src/tricks/kv-cache-context.js.map +1 -1
  671. package/dist/src/tricks/recitation.d.ts.map +1 -1
  672. package/dist/src/tricks/recitation.js +24 -19
  673. package/dist/src/tricks/recitation.js.map +1 -1
  674. package/dist/src/tricks/recursive-context.d.ts.map +1 -1
  675. package/dist/src/tricks/recursive-context.js +10 -7
  676. package/dist/src/tricks/recursive-context.js.map +1 -1
  677. package/dist/src/tricks/reversible-compaction.d.ts.map +1 -1
  678. package/dist/src/tricks/reversible-compaction.js +17 -9
  679. package/dist/src/tricks/reversible-compaction.js.map +1 -1
  680. package/dist/src/tricks/serialization-diversity.d.ts.map +1 -1
  681. package/dist/src/tricks/serialization-diversity.js +12 -12
  682. package/dist/src/tricks/serialization-diversity.js.map +1 -1
  683. package/dist/src/tui/app.d.ts +9 -5
  684. package/dist/src/tui/app.d.ts.map +1 -1
  685. package/dist/src/tui/app.js +690 -565
  686. package/dist/src/tui/app.js.map +1 -1
  687. package/dist/src/tui/components/ActiveAgentsPanel.d.ts +2 -0
  688. package/dist/src/tui/components/ActiveAgentsPanel.d.ts.map +1 -1
  689. package/dist/src/tui/components/ActiveAgentsPanel.js +5 -5
  690. package/dist/src/tui/components/ActiveAgentsPanel.js.map +1 -1
  691. package/dist/src/tui/components/ApprovalDialog.d.ts.map +1 -1
  692. package/dist/src/tui/components/ApprovalDialog.js +14 -0
  693. package/dist/src/tui/components/ApprovalDialog.js.map +1 -1
  694. package/dist/src/tui/components/BudgetExtensionDialog.d.ts +18 -0
  695. package/dist/src/tui/components/BudgetExtensionDialog.d.ts.map +1 -0
  696. package/dist/src/tui/components/BudgetExtensionDialog.js +40 -0
  697. package/dist/src/tui/components/BudgetExtensionDialog.js.map +1 -0
  698. package/dist/src/tui/components/CollapsibleDiffView.d.ts +1 -1
  699. package/dist/src/tui/components/CollapsibleDiffView.d.ts.map +1 -1
  700. package/dist/src/tui/components/CollapsibleDiffView.js +18 -13
  701. package/dist/src/tui/components/CollapsibleDiffView.js.map +1 -1
  702. package/dist/src/tui/components/DebugPanel.d.ts.map +1 -1
  703. package/dist/src/tui/components/DebugPanel.js +46 -26
  704. package/dist/src/tui/components/DebugPanel.js.map +1 -1
  705. package/dist/src/tui/components/DiagnosticsPanel.d.ts +24 -0
  706. package/dist/src/tui/components/DiagnosticsPanel.d.ts.map +1 -0
  707. package/dist/src/tui/components/DiagnosticsPanel.js +63 -0
  708. package/dist/src/tui/components/DiagnosticsPanel.js.map +1 -0
  709. package/dist/src/tui/components/DiffView.d.ts +1 -1
  710. package/dist/src/tui/components/DiffView.d.ts.map +1 -1
  711. package/dist/src/tui/components/DiffView.js +21 -14
  712. package/dist/src/tui/components/DiffView.js.map +1 -1
  713. package/dist/src/tui/components/ErrorBoundary.d.ts.map +1 -1
  714. package/dist/src/tui/components/ErrorBoundary.js +8 -3
  715. package/dist/src/tui/components/ErrorBoundary.js.map +1 -1
  716. package/dist/src/tui/components/ErrorDetailPanel.d.ts.map +1 -1
  717. package/dist/src/tui/components/ErrorDetailPanel.js +4 -4
  718. package/dist/src/tui/components/ErrorDetailPanel.js.map +1 -1
  719. package/dist/src/tui/components/FileChangeSummary.d.ts.map +1 -1
  720. package/dist/src/tui/components/FileChangeSummary.js +3 -3
  721. package/dist/src/tui/components/FileChangeSummary.js.map +1 -1
  722. package/dist/src/tui/components/InputArea.d.ts.map +1 -1
  723. package/dist/src/tui/components/InputArea.js +32 -15
  724. package/dist/src/tui/components/InputArea.js.map +1 -1
  725. package/dist/src/tui/components/LearningValidationDialog.d.ts +25 -0
  726. package/dist/src/tui/components/LearningValidationDialog.d.ts.map +1 -0
  727. package/dist/src/tui/components/LearningValidationDialog.js +35 -0
  728. package/dist/src/tui/components/LearningValidationDialog.js.map +1 -0
  729. package/dist/src/tui/components/MessageItem.d.ts.map +1 -1
  730. package/dist/src/tui/components/MessageItem.js.map +1 -1
  731. package/dist/src/tui/components/PlanPanel.d.ts +27 -0
  732. package/dist/src/tui/components/PlanPanel.d.ts.map +1 -0
  733. package/dist/src/tui/components/PlanPanel.js +45 -0
  734. package/dist/src/tui/components/PlanPanel.js.map +1 -0
  735. package/dist/src/tui/components/ScrollableBox.d.ts.map +1 -1
  736. package/dist/src/tui/components/ScrollableBox.js +2 -2
  737. package/dist/src/tui/components/ScrollableBox.js.map +1 -1
  738. package/dist/src/tui/components/SideBySideDiff.d.ts.map +1 -1
  739. package/dist/src/tui/components/SideBySideDiff.js +20 -18
  740. package/dist/src/tui/components/SideBySideDiff.js.map +1 -1
  741. package/dist/src/tui/components/StatusBar.d.ts +41 -0
  742. package/dist/src/tui/components/StatusBar.d.ts.map +1 -0
  743. package/dist/src/tui/components/StatusBar.js +114 -0
  744. package/dist/src/tui/components/StatusBar.js.map +1 -0
  745. package/dist/src/tui/components/SwarmStatusPanel.d.ts.map +1 -1
  746. package/dist/src/tui/components/SwarmStatusPanel.js +25 -17
  747. package/dist/src/tui/components/SwarmStatusPanel.js.map +1 -1
  748. package/dist/src/tui/components/TasksPanel.d.ts +1 -1
  749. package/dist/src/tui/components/TasksPanel.d.ts.map +1 -1
  750. package/dist/src/tui/components/TasksPanel.js +12 -11
  751. package/dist/src/tui/components/TasksPanel.js.map +1 -1
  752. package/dist/src/tui/components/ToolCallItem.d.ts.map +1 -1
  753. package/dist/src/tui/components/ToolCallItem.js +19 -6
  754. package/dist/src/tui/components/ToolCallItem.js.map +1 -1
  755. package/dist/src/tui/components/ToolCallsPanel.d.ts +15 -0
  756. package/dist/src/tui/components/ToolCallsPanel.d.ts.map +1 -0
  757. package/dist/src/tui/components/ToolCallsPanel.js +34 -0
  758. package/dist/src/tui/components/ToolCallsPanel.js.map +1 -0
  759. package/dist/src/tui/components/TransparencyPanel.d.ts +15 -0
  760. package/dist/src/tui/components/TransparencyPanel.d.ts.map +1 -0
  761. package/dist/src/tui/components/TransparencyPanel.js +46 -0
  762. package/dist/src/tui/components/TransparencyPanel.js.map +1 -0
  763. package/dist/src/tui/components/index.d.ts +8 -2
  764. package/dist/src/tui/components/index.d.ts.map +1 -1
  765. package/dist/src/tui/components/index.js +14 -2
  766. package/dist/src/tui/components/index.js.map +1 -1
  767. package/dist/src/tui/event-display.d.ts.map +1 -1
  768. package/dist/src/tui/event-display.js +13 -4
  769. package/dist/src/tui/event-display.js.map +1 -1
  770. package/dist/src/tui/hooks/index.d.ts +1 -0
  771. package/dist/src/tui/hooks/index.d.ts.map +1 -1
  772. package/dist/src/tui/hooks/index.js +1 -0
  773. package/dist/src/tui/hooks/index.js.map +1 -1
  774. package/dist/src/tui/hooks/use-agent-events.d.ts +53 -0
  775. package/dist/src/tui/hooks/use-agent-events.d.ts.map +1 -0
  776. package/dist/src/tui/hooks/use-agent-events.js +444 -0
  777. package/dist/src/tui/hooks/use-agent-events.js.map +1 -0
  778. package/dist/src/tui/hooks/use-throttled-state.d.ts +18 -0
  779. package/dist/src/tui/hooks/use-throttled-state.d.ts.map +1 -0
  780. package/dist/src/tui/hooks/use-throttled-state.js +93 -0
  781. package/dist/src/tui/hooks/use-throttled-state.js.map +1 -0
  782. package/dist/src/tui/hooks/useMessagePruning.d.ts.map +1 -1
  783. package/dist/src/tui/hooks/useMessagePruning.js.map +1 -1
  784. package/dist/src/tui/index.d.ts +2 -2
  785. package/dist/src/tui/index.d.ts.map +1 -1
  786. package/dist/src/tui/index.js +102 -7
  787. package/dist/src/tui/index.js.map +1 -1
  788. package/dist/src/tui/input/CommandPalette.d.ts.map +1 -1
  789. package/dist/src/tui/input/CommandPalette.js +2 -2
  790. package/dist/src/tui/input/CommandPalette.js.map +1 -1
  791. package/dist/src/tui/input/index.d.ts +1 -1
  792. package/dist/src/tui/input/index.d.ts.map +1 -1
  793. package/dist/src/tui/input/index.js +1 -1
  794. package/dist/src/tui/input/index.js.map +1 -1
  795. package/dist/src/tui/syntax/languages/bash.js +94 -16
  796. package/dist/src/tui/syntax/languages/bash.js.map +1 -1
  797. package/dist/src/tui/syntax/languages/javascript.js +65 -12
  798. package/dist/src/tui/syntax/languages/javascript.js.map +1 -1
  799. package/dist/src/tui/syntax/languages/json.js.map +1 -1
  800. package/dist/src/tui/syntax/languages/python.js +81 -15
  801. package/dist/src/tui/syntax/languages/python.js.map +1 -1
  802. package/dist/src/tui/theme/index.js.map +1 -1
  803. package/dist/src/tui/transparency-aggregator.d.ts +13 -0
  804. package/dist/src/tui/transparency-aggregator.d.ts.map +1 -1
  805. package/dist/src/tui/transparency-aggregator.js +39 -4
  806. package/dist/src/tui/transparency-aggregator.js.map +1 -1
  807. package/dist/src/tui/types.d.ts.map +1 -1
  808. package/dist/src/tui/types.js.map +1 -1
  809. package/dist/src/tui/utils/keyboard.d.ts.map +1 -1
  810. package/dist/src/tui/utils/keyboard.js.map +1 -1
  811. package/dist/src/types.d.ts +39 -2
  812. package/dist/src/types.d.ts.map +1 -1
  813. package/package.json +1 -1
@@ -0,0 +1,1071 @@
1
+ /**
2
+ * Swarm Execution — Task dispatch loop, wave management, and completion handling.
3
+ *
4
+ * Extracted from swarm-orchestrator.ts (Phase 3a).
5
+ * Contains: executeWaves, executeWave, dispatchTask, handleTaskCompletion.
6
+ */
7
+ import { getTaskTypeConfig } from './types.js';
8
+ import { selectAlternativeModel } from './model-selector.js';
9
+ import { evaluateWorkerOutput, runPreFlightChecks, checkArtifacts, checkArtifactsEnhanced, runConcreteChecks, } from './swarm-quality-gate.js';
10
+ import { classifySwarmFailure } from './failure-classifier.js';
11
+ import { isHollowCompletion, FAILURE_INDICATORS, hasFutureIntentLanguage, } from './swarm-helpers.js';
12
+ import { reviewWave, saveCheckpoint, emitBudgetUpdate, getEffectiveRetries, getSwarmProgressSummary, getModelHealthSummary, extractFileArtifacts, } from './swarm-lifecycle.js';
13
+ import { tryResilienceRecovery, rescueCascadeSkipped, assessAndAdapt, shouldAutoSplit, judgeSplit, recordRateLimit, isCircuitBreakerActive, decreaseStagger, getStaggerMs, } from './swarm-recovery.js';
14
+ // ─── Wave Execution ─────────────────────────────────────────────────────
15
+ /**
16
+ * Execute all waves in sequence, with review after each.
17
+ */
18
+ export async function executeWaves(ctx, recoveryState, getStatus) {
19
+ let waveIndex = ctx.taskQueue.getCurrentWave();
20
+ const totalWaves = ctx.taskQueue.getTotalWaves();
21
+ const dispatchLeaseStaleMs = ctx.config.dispatchLeaseStaleMs ?? 5 * 60 * 1000;
22
+ while (waveIndex < totalWaves && !ctx.cancelled) {
23
+ const activeTaskIds = new Set(ctx.workerPool.getActiveWorkerStatus().map((w) => w.taskId));
24
+ const recovered = ctx.taskQueue.reconcileStaleDispatched({
25
+ staleAfterMs: dispatchLeaseStaleMs,
26
+ activeTaskIds,
27
+ });
28
+ if (recovered.length > 0) {
29
+ ctx.logDecision('lease-recovery', `Recovered ${recovered.length} stale dispatched task(s)`, recovered.join(', '));
30
+ }
31
+ const readyTasks = ctx.taskQueue.getReadyTasks();
32
+ const queueStats = ctx.taskQueue.getStats();
33
+ // F18: Skip empty waves
34
+ if (readyTasks.length === 0 && queueStats.running === 0 && queueStats.ready === 0) {
35
+ ctx.logDecision('wave-skip', `Skipping waves ${waveIndex + 1}-${totalWaves}: no dispatchable tasks remain`, `Stats: ${queueStats.completed} completed, ${queueStats.failed} failed, ${queueStats.skipped} skipped`);
36
+ break;
37
+ }
38
+ ctx.emit({
39
+ type: 'swarm.wave.start',
40
+ wave: waveIndex + 1,
41
+ totalWaves,
42
+ taskCount: readyTasks.length,
43
+ });
44
+ // Dispatch tasks up to concurrency limit
45
+ await executeWave(ctx, recoveryState, readyTasks, getStatus);
46
+ // Wave complete stats
47
+ const afterStats = ctx.taskQueue.getStats();
48
+ const waveCompleted = afterStats.completed - queueStats.completed;
49
+ const waveFailed = afterStats.failed - queueStats.failed;
50
+ const waveSkipped = afterStats.skipped - queueStats.skipped;
51
+ ctx.emit({
52
+ type: 'swarm.wave.complete',
53
+ wave: waveIndex + 1,
54
+ totalWaves,
55
+ completed: waveCompleted,
56
+ failed: waveFailed,
57
+ skipped: waveSkipped,
58
+ });
59
+ // Wave failure recovery: if ALL tasks in a wave failed, retry with adapted context
60
+ if (waveCompleted === 0 && waveFailed > 0 && readyTasks.length > 0) {
61
+ ctx.emit({ type: 'swarm.wave.allFailed', wave: waveIndex + 1 });
62
+ ctx.logDecision('wave-recovery', `Entire wave ${waveIndex + 1} failed (${waveFailed} tasks)`, 'Checking if budget allows retry with adapted strategy');
63
+ const budgetRemaining = ctx.budgetPool.hasCapacity();
64
+ const failedWaveTasks = readyTasks.filter((t) => {
65
+ const task = ctx.taskQueue.getTask(t.id);
66
+ return task && task.status === 'failed' && task.attempts < ctx.config.workerRetries + 1;
67
+ });
68
+ if (budgetRemaining && failedWaveTasks.length > 0) {
69
+ for (const t of failedWaveTasks) {
70
+ const task = ctx.taskQueue.getTask(t.id);
71
+ if (!task)
72
+ continue;
73
+ task.status = 'ready';
74
+ task.retryContext = {
75
+ previousFeedback: 'All tasks in this batch failed. Try a fundamentally different approach — the previous strategy did not work.',
76
+ previousScore: 0,
77
+ attempt: task.attempts,
78
+ previousModel: task.assignedModel,
79
+ swarmProgress: getSwarmProgressSummary(ctx),
80
+ };
81
+ }
82
+ ctx.logDecision('wave-recovery', `Re-queued ${failedWaveTasks.length} tasks with adapted retry context`, 'Budget allows retry');
83
+ await executeWave(ctx, recoveryState, failedWaveTasks
84
+ .map((t) => ctx.taskQueue.getTask(t.id))
85
+ .filter((t) => t.status === 'ready'), getStatus);
86
+ }
87
+ }
88
+ // F5: Adaptive re-decomposition signal
89
+ const waveTotal = waveCompleted + waveFailed + waveSkipped;
90
+ const waveSuccessRate = waveTotal > 0 ? waveCompleted / waveTotal : 0;
91
+ if (waveSuccessRate < 0.5 && waveTotal >= 2) {
92
+ ctx.logDecision('decomposition-quality', `Wave ${waveIndex + 1} success rate ${(waveSuccessRate * 100).toFixed(0)}% (${waveCompleted}/${waveTotal})`, 'Low success rate may indicate decomposition quality issues');
93
+ }
94
+ // V2: Review wave outputs
95
+ const review = await reviewWave(ctx, waveIndex);
96
+ if (review && review.fixupTasks.length > 0) {
97
+ await executeWave(ctx, recoveryState, review.fixupTasks, getStatus);
98
+ }
99
+ // Rescue cascade-skipped tasks that can still run
100
+ const rescued = rescueCascadeSkipped(ctx);
101
+ if (rescued.length > 0) {
102
+ ctx.logDecision('cascade-rescue', `Rescued ${rescued.length} cascade-skipped tasks after wave ${waveIndex + 1}`, rescued.map((t) => t.id).join(', '));
103
+ await executeWave(ctx, recoveryState, rescued, getStatus);
104
+ }
105
+ // Reset quality circuit breaker at wave boundary
106
+ if (recoveryState.qualityGateDisabledModels.size > 0) {
107
+ recoveryState.qualityGateDisabledModels.clear();
108
+ recoveryState.perModelQualityRejections.clear();
109
+ ctx.logDecision('quality-circuit-breaker', `Re-enabled quality gates for all models at wave ${waveIndex + 1} boundary`, 'Each wave gets a fresh quality evaluation window');
110
+ }
111
+ // F3: Log budget reallocation after wave completion
112
+ const budgetStats = ctx.budgetPool.getStats();
113
+ ctx.logDecision('budget-reallocation', `After wave ${waveIndex + 1}: ${budgetStats.tokensRemaining} tokens remaining (${(budgetStats.utilization * 100).toFixed(0)}% utilized)`, '');
114
+ ctx.budgetPool.reallocateUnused(budgetStats.tokensRemaining);
115
+ // F21: Mid-swarm situational assessment
116
+ await assessAndAdapt(ctx, recoveryState, waveIndex);
117
+ // V2: Checkpoint after each wave
118
+ saveCheckpoint(ctx, `wave-${waveIndex}`);
119
+ // Advance to next wave
120
+ if (!ctx.taskQueue.advanceWave())
121
+ break;
122
+ waveIndex++;
123
+ }
124
+ }
125
+ /**
126
+ * Execute a single wave's tasks with concurrency control.
127
+ */
128
+ export async function executeWave(ctx, recoveryState, tasks, getStatus) {
129
+ // Dispatch initial batch with stagger
130
+ let taskIndex = 0;
131
+ while (taskIndex < tasks.length && ctx.workerPool.availableSlots > 0 && !ctx.cancelled) {
132
+ if (isCircuitBreakerActive(recoveryState, ctx)) {
133
+ const waitMs = recoveryState.circuitBreakerUntil - Date.now();
134
+ if (waitMs > 0)
135
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
136
+ continue;
137
+ }
138
+ const task = tasks[taskIndex];
139
+ await dispatchTask(ctx, recoveryState, task, getStatus);
140
+ taskIndex++;
141
+ if (taskIndex < tasks.length && ctx.workerPool.availableSlots > 0) {
142
+ await new Promise((resolve) => setTimeout(resolve, getStaggerMs(recoveryState)));
143
+ }
144
+ }
145
+ // Process completions and dispatch more tasks as slots open
146
+ while (ctx.workerPool.activeCount > 0 && !ctx.cancelled) {
147
+ const completed = await ctx.workerPool.waitForAny();
148
+ if (!completed)
149
+ break;
150
+ await handleTaskCompletion(ctx, recoveryState, completed.taskId, completed.result, completed.startedAt, getStatus);
151
+ emitBudgetUpdate(ctx);
152
+ ctx.emit({ type: 'swarm.status', status: getStatus() });
153
+ // Dispatch more tasks if slots available and tasks remain
154
+ while (taskIndex < tasks.length && ctx.workerPool.availableSlots > 0 && !ctx.cancelled) {
155
+ const task = tasks[taskIndex];
156
+ if (task.status === 'ready') {
157
+ await dispatchTask(ctx, recoveryState, task, getStatus);
158
+ if (taskIndex + 1 < tasks.length && ctx.workerPool.availableSlots > 0) {
159
+ await new Promise((resolve) => setTimeout(resolve, getStaggerMs(recoveryState)));
160
+ }
161
+ }
162
+ taskIndex++;
163
+ }
164
+ // Also check for cross-wave ready tasks to fill slots
165
+ if (ctx.workerPool.availableSlots > 0 && !isCircuitBreakerActive(recoveryState, ctx)) {
166
+ const moreReady = ctx.taskQueue
167
+ .getAllReadyTasks()
168
+ .filter((t) => !ctx.workerPool.getActiveWorkerStatus().some((w) => w.taskId === t.id));
169
+ for (let i = 0; i < moreReady.length; i++) {
170
+ if (ctx.workerPool.availableSlots <= 0)
171
+ break;
172
+ await dispatchTask(ctx, recoveryState, moreReady[i], getStatus);
173
+ if (i + 1 < moreReady.length && ctx.workerPool.availableSlots > 0) {
174
+ await new Promise((resolve) => setTimeout(resolve, getStaggerMs(recoveryState)));
175
+ }
176
+ }
177
+ }
178
+ }
179
+ // F20: Re-dispatch pass — after all workers finish, budget may have been freed
180
+ if (!ctx.cancelled && ctx.budgetPool.hasCapacity()) {
181
+ const stillReady = ctx.taskQueue
182
+ .getAllReadyTasks()
183
+ .filter((t) => !ctx.workerPool.getActiveWorkerStatus().some((w) => w.taskId === t.id));
184
+ if (stillReady.length > 0) {
185
+ ctx.logDecision('budget-redispatch', `Budget freed after wave — re-dispatching ${stillReady.length} ready task(s)`, `Budget: ${JSON.stringify(ctx.budgetPool.getStats())}`);
186
+ for (const task of stillReady) {
187
+ if (ctx.workerPool.availableSlots <= 0 || !ctx.budgetPool.hasCapacity())
188
+ break;
189
+ await dispatchTask(ctx, recoveryState, task, getStatus);
190
+ if (ctx.workerPool.availableSlots > 0) {
191
+ await new Promise((resolve) => setTimeout(resolve, getStaggerMs(recoveryState)));
192
+ }
193
+ }
194
+ while (ctx.workerPool.activeCount > 0 && !ctx.cancelled) {
195
+ const completed = await ctx.workerPool.waitForAny();
196
+ if (!completed)
197
+ break;
198
+ await handleTaskCompletion(ctx, recoveryState, completed.taskId, completed.result, completed.startedAt, getStatus);
199
+ emitBudgetUpdate(ctx);
200
+ ctx.emit({ type: 'swarm.status', status: getStatus() });
201
+ }
202
+ }
203
+ }
204
+ }
205
+ // ─── Task Dispatch ──────────────────────────────────────────────────────
206
+ /**
207
+ * Dispatch a single task to a worker.
208
+ */
209
+ export async function dispatchTask(ctx, recoveryState, task, _getStatus) {
210
+ const worker = ctx.workerPool.selectWorker(task);
211
+ if (!worker) {
212
+ ctx.logDecision('no-worker', `${task.id}: no worker for type ${task.type}`, '');
213
+ if (task.attempts > 0) {
214
+ const syntheticTaskResult = {
215
+ success: false,
216
+ output: '',
217
+ tokensUsed: 0,
218
+ costUsed: 0,
219
+ durationMs: 0,
220
+ model: 'none',
221
+ };
222
+ const syntheticSpawn = {
223
+ success: false,
224
+ output: '',
225
+ metrics: { tokens: 0, duration: 0, toolCalls: 0 },
226
+ };
227
+ if (await tryResilienceRecovery(ctx, recoveryState, task, task.id, syntheticTaskResult, syntheticSpawn)) {
228
+ return;
229
+ }
230
+ }
231
+ ctx.taskQueue.markFailedWithoutCascade(task.id, 0);
232
+ ctx.taskQueue.triggerCascadeSkip(task.id);
233
+ ctx.emit({
234
+ type: 'swarm.task.failed',
235
+ taskId: task.id,
236
+ error: `No worker available for task type: ${task.type}`,
237
+ attempt: task.attempts,
238
+ maxAttempts: 0,
239
+ willRetry: false,
240
+ failureMode: 'error',
241
+ });
242
+ return;
243
+ }
244
+ try {
245
+ // Pre-dispatch auto-split for critical-path bottlenecks
246
+ if (shouldAutoSplit(ctx, task)) {
247
+ try {
248
+ const splitResult = await judgeSplit(ctx, task);
249
+ if (splitResult.shouldSplit && splitResult.subtasks) {
250
+ task.status = 'dispatched';
251
+ ctx.taskQueue.replaceWithSubtasks(task.id, splitResult.subtasks);
252
+ ctx.emit({
253
+ type: 'swarm.task.resilience',
254
+ taskId: task.id,
255
+ strategy: 'auto-split',
256
+ succeeded: true,
257
+ reason: `Pre-dispatch split into ${splitResult.subtasks.length} parallel subtasks`,
258
+ artifactsFound: 0,
259
+ toolCalls: 0,
260
+ });
261
+ return;
262
+ }
263
+ }
264
+ catch (err) {
265
+ ctx.logDecision('auto-split', `${task.id}: split judge failed — ${err.message}`, '');
266
+ }
267
+ }
268
+ ctx.totalDispatches++;
269
+ const dispatchedModel = task.assignedModel ?? worker.model;
270
+ ctx.taskQueue.markDispatched(task.id, dispatchedModel);
271
+ if (task.assignedModel && task.assignedModel !== worker.model) {
272
+ ctx.logDecision('failover', `Dispatching ${task.id} with failover model ${task.assignedModel} (worker default: ${worker.model})`, 'Retry model override is active');
273
+ }
274
+ await ctx.workerPool.dispatch(task, worker);
275
+ ctx.emit({
276
+ type: 'swarm.task.dispatched',
277
+ taskId: task.id,
278
+ description: task.description,
279
+ model: dispatchedModel,
280
+ workerName: worker.name,
281
+ toolCount: worker.allowedTools?.length ?? -1,
282
+ tools: worker.allowedTools,
283
+ retryContext: task.retryContext,
284
+ fromModel: task.retryContext ? task.retryContext.previousModel : undefined,
285
+ attempts: task.attempts,
286
+ });
287
+ }
288
+ catch (error) {
289
+ const errorMsg = error.message;
290
+ // F20: Budget exhaustion is NOT a task failure
291
+ if (errorMsg.includes('Budget pool exhausted')) {
292
+ task.status = 'ready';
293
+ ctx.logDecision('budget-pause', `Cannot dispatch ${task.id}: budget exhausted — task kept ready for potential re-dispatch`, `Budget stats: ${JSON.stringify(ctx.budgetPool.getStats())}`);
294
+ return;
295
+ }
296
+ ctx.errors.push({
297
+ taskId: task.id,
298
+ phase: 'dispatch',
299
+ message: errorMsg,
300
+ recovered: false,
301
+ });
302
+ ctx.logDecision('dispatch-error', `${task.id}: dispatch failed: ${errorMsg.slice(0, 100)}`, `attempts: ${task.attempts}`);
303
+ if (task.attempts > 0) {
304
+ const syntheticTaskResult = {
305
+ success: false,
306
+ output: '',
307
+ tokensUsed: 0,
308
+ costUsed: 0,
309
+ durationMs: 0,
310
+ model: 'none',
311
+ };
312
+ const syntheticSpawn = {
313
+ success: false,
314
+ output: '',
315
+ metrics: { tokens: 0, duration: 0, toolCalls: 0 },
316
+ };
317
+ if (await tryResilienceRecovery(ctx, recoveryState, task, task.id, syntheticTaskResult, syntheticSpawn)) {
318
+ ctx.errors[ctx.errors.length - 1].recovered = true;
319
+ return;
320
+ }
321
+ }
322
+ ctx.taskQueue.markFailedWithoutCascade(task.id, 0);
323
+ ctx.taskQueue.triggerCascadeSkip(task.id);
324
+ ctx.emit({
325
+ type: 'swarm.task.failed',
326
+ taskId: task.id,
327
+ error: errorMsg,
328
+ attempt: task.attempts,
329
+ maxAttempts: 1 + ctx.config.workerRetries,
330
+ willRetry: false,
331
+ failureMode: 'error',
332
+ });
333
+ }
334
+ }
335
+ // ─── Task Completion Handling ───────────────────────────────────────────
336
+ /**
337
+ * Handle a completed task: quality gate, bookkeeping, retry logic, model health, failover.
338
+ */
339
+ export async function handleTaskCompletion(ctx, recoveryState, taskId, spawnResult, startedAt, _getStatus) {
340
+ const task = ctx.taskQueue.getTask(taskId);
341
+ if (!task)
342
+ return;
343
+ // Guard: task was terminally resolved while its worker was running
344
+ if ((task.status === 'skipped' || task.status === 'failed') && !task.pendingCascadeSkip)
345
+ return;
346
+ // V7: Global dispatch cap
347
+ const maxDispatches = ctx.config.maxDispatchesPerTask ?? 5;
348
+ if (task.attempts >= maxDispatches) {
349
+ const durationMs = Date.now() - startedAt;
350
+ const taskResult = ctx.workerPool.toTaskResult(spawnResult, task, durationMs);
351
+ ctx.totalTokens += taskResult.tokensUsed;
352
+ ctx.totalCost += taskResult.costUsed;
353
+ if (await tryResilienceRecovery(ctx, recoveryState, task, taskId, taskResult, spawnResult)) {
354
+ return;
355
+ }
356
+ ctx.taskQueue.markFailedWithoutCascade(taskId, 0);
357
+ ctx.taskQueue.triggerCascadeSkip(taskId);
358
+ ctx.emit({
359
+ type: 'swarm.task.failed',
360
+ taskId,
361
+ error: `Dispatch cap reached (${maxDispatches} attempts)`,
362
+ attempt: task.attempts,
363
+ maxAttempts: maxDispatches,
364
+ willRetry: false,
365
+ failureMode: task.failureMode,
366
+ });
367
+ ctx.logDecision('dispatch-cap', `${taskId}: hard cap reached (${task.attempts}/${maxDispatches})`, 'No more retries — resilience recovery also failed');
368
+ return;
369
+ }
370
+ const durationMs = Date.now() - startedAt;
371
+ const taskResult = ctx.workerPool.toTaskResult(spawnResult, task, durationMs);
372
+ // Track model usage
373
+ const model = task.assignedModel ?? 'unknown';
374
+ const usage = ctx.modelUsage.get(model) ?? { tasks: 0, tokens: 0, cost: 0 };
375
+ usage.tasks++;
376
+ usage.tokens += taskResult.tokensUsed;
377
+ usage.cost += taskResult.costUsed;
378
+ ctx.modelUsage.set(model, usage);
379
+ ctx.totalTokens += taskResult.tokensUsed;
380
+ ctx.totalCost += taskResult.costUsed;
381
+ if (taskResult.budgetUtilization) {
382
+ ctx.logDecision('budget-utilization', `${taskId}: token ${taskResult.budgetUtilization.tokenPercent}%, iter ${taskResult.budgetUtilization.iterationPercent}%`, `model=${model}, tokens=${taskResult.tokensUsed}, duration=${durationMs}ms`);
383
+ }
384
+ // V10: Emit per-attempt event
385
+ ctx.emit({
386
+ type: 'swarm.task.attempt',
387
+ taskId,
388
+ attempt: task.attempts,
389
+ model,
390
+ success: spawnResult.success,
391
+ durationMs,
392
+ toolCalls: spawnResult.metrics.toolCalls ?? 0,
393
+ failureMode: !spawnResult.success ? task.failureMode : undefined,
394
+ qualityScore: taskResult.qualityScore,
395
+ output: taskResult.output.slice(0, 500),
396
+ });
397
+ if (!spawnResult.success) {
398
+ return handleFailedCompletion(ctx, recoveryState, task, taskId, spawnResult, taskResult, model, durationMs, startedAt, maxDispatches);
399
+ }
400
+ // V6: Hollow completion detection
401
+ if (isHollowCompletion(spawnResult, task.type, ctx.config)) {
402
+ return handleHollowCompletion(ctx, recoveryState, task, taskId, spawnResult, taskResult, model, maxDispatches);
403
+ }
404
+ // F4: Task had pendingCascadeSkip but produced non-hollow results
405
+ if (task.pendingCascadeSkip) {
406
+ const cachedReport = checkArtifacts(task);
407
+ const preFlight = runPreFlightChecks(task, taskResult, ctx.config, cachedReport);
408
+ if (preFlight && !preFlight.passed) {
409
+ task.pendingCascadeSkip = undefined;
410
+ task.status = 'skipped';
411
+ ctx.logDecision('cascade-skip', `${taskId}: pending cascade skip honored (pre-flight failed: ${preFlight.feedback})`, '');
412
+ ctx.emit({
413
+ type: 'swarm.task.skipped',
414
+ taskId,
415
+ reason: `cascade skip honored — output failed pre-flight: ${preFlight.feedback}`,
416
+ });
417
+ return;
418
+ }
419
+ task.pendingCascadeSkip = undefined;
420
+ task.status = 'dispatched';
421
+ ctx.logDecision('cascade-skip', `${taskId}: pending cascade skip overridden — worker produced valid output`, '');
422
+ }
423
+ // Record model health on success
424
+ ctx.healthTracker.recordSuccess(model, durationMs);
425
+ decreaseStagger(recoveryState);
426
+ // Run quality gate if enabled
427
+ const effectiveRetries = getEffectiveRetries(ctx, task);
428
+ const recentRLCount = recoveryState.recentRateLimits.filter((t) => t > Date.now() - 30_000).length;
429
+ const isLastAttempt = task.attempts >= effectiveRetries + 1;
430
+ const shouldRunQualityGate = ctx.config.qualityGates &&
431
+ !recoveryState.qualityGateDisabledModels.has(model) &&
432
+ !isLastAttempt &&
433
+ Date.now() >= recoveryState.circuitBreakerUntil &&
434
+ recentRLCount < 2;
435
+ const cachedArtifactReport = checkArtifacts(task);
436
+ if (shouldRunQualityGate) {
437
+ const rejected = await runQualityGate(ctx, recoveryState, task, taskId, spawnResult, taskResult, model, effectiveRetries, cachedArtifactReport);
438
+ if (rejected)
439
+ return;
440
+ }
441
+ // F7: When quality gate was skipped, still run pre-flight + concrete checks
442
+ if (!shouldRunQualityGate && ctx.config.qualityGates) {
443
+ const preFlight = runPreFlightChecks(task, taskResult, ctx.config, cachedArtifactReport);
444
+ if (preFlight && !preFlight.passed) {
445
+ taskResult.qualityScore = preFlight.score;
446
+ taskResult.qualityFeedback = preFlight.feedback;
447
+ ctx.qualityRejections++;
448
+ const canRetry = ctx.taskQueue.markFailedWithoutCascade(taskId, effectiveRetries);
449
+ if (canRetry) {
450
+ ctx.retries++;
451
+ }
452
+ else {
453
+ ctx.logDecision('preflight-reject', `${taskId}: pre-flight failed: ${preFlight.feedback}`, '');
454
+ if (await tryResilienceRecovery(ctx, recoveryState, task, taskId, taskResult, spawnResult)) {
455
+ return;
456
+ }
457
+ ctx.taskQueue.triggerCascadeSkip(taskId);
458
+ }
459
+ ctx.emit({
460
+ type: 'swarm.quality.rejected',
461
+ taskId,
462
+ score: preFlight.score,
463
+ feedback: preFlight.feedback,
464
+ artifactCount: 0,
465
+ outputLength: taskResult.output.length,
466
+ preFlightReject: true,
467
+ });
468
+ return;
469
+ }
470
+ // F2: Run concrete validation when pre-flight passes but gate was skipped
471
+ if (ctx.config.enableConcreteValidation !== false) {
472
+ const concreteResult = runConcreteChecks(task, taskResult);
473
+ if (!concreteResult.passed) {
474
+ taskResult.qualityScore = 2;
475
+ taskResult.qualityFeedback = `Concrete validation failed: ${concreteResult.issues.join('; ')}`;
476
+ ctx.qualityRejections++;
477
+ const canRetry = ctx.taskQueue.markFailedWithoutCascade(taskId, effectiveRetries);
478
+ if (canRetry) {
479
+ ctx.retries++;
480
+ }
481
+ else {
482
+ ctx.logDecision('concrete-reject', `${taskId}: concrete validation failed: ${concreteResult.issues.join('; ')}`, '');
483
+ if (await tryResilienceRecovery(ctx, recoveryState, task, taskId, taskResult, spawnResult)) {
484
+ return;
485
+ }
486
+ ctx.taskQueue.triggerCascadeSkip(taskId);
487
+ }
488
+ ctx.emit({
489
+ type: 'swarm.quality.rejected',
490
+ taskId,
491
+ score: 2,
492
+ feedback: taskResult.qualityFeedback,
493
+ artifactCount: 0,
494
+ outputLength: taskResult.output.length,
495
+ preFlightReject: false,
496
+ });
497
+ return;
498
+ }
499
+ }
500
+ }
501
+ // Final completion guard: block "narrative success" for action tasks
502
+ const completionGuard = ctx.config.completionGuard ?? {};
503
+ const rejectFutureIntentOutputs = completionGuard.rejectFutureIntentOutputs ?? true;
504
+ const requireConcreteArtifactsForActionTasks = completionGuard.requireConcreteArtifactsForActionTasks ?? true;
505
+ const typeConfig = getTaskTypeConfig(task.type, ctx.config);
506
+ const artifactReport = checkArtifactsEnhanced(task, taskResult);
507
+ const filesOnDisk = artifactReport.files.filter((f) => f.exists && f.sizeBytes > 0).length;
508
+ const hasConcreteArtifacts = filesOnDisk > 0 || (taskResult.filesModified?.length ?? 0) > 0;
509
+ const isActionTask = !!typeConfig.requiresToolCalls;
510
+ if (rejectFutureIntentOutputs && hasFutureIntentLanguage(taskResult.output ?? '')) {
511
+ taskResult.qualityScore = 1;
512
+ taskResult.qualityFeedback = 'Completion rejected: output indicates pending, unexecuted work';
513
+ const canRetry = ctx.taskQueue.markFailedWithoutCascade(taskId, effectiveRetries);
514
+ if (canRetry) {
515
+ ctx.retries++;
516
+ }
517
+ else {
518
+ if (await tryResilienceRecovery(ctx, recoveryState, task, taskId, taskResult, spawnResult)) {
519
+ return;
520
+ }
521
+ ctx.taskQueue.triggerCascadeSkip(taskId);
522
+ }
523
+ ctx.emit({
524
+ type: 'swarm.quality.rejected',
525
+ taskId,
526
+ score: 1,
527
+ feedback: taskResult.qualityFeedback,
528
+ artifactCount: filesOnDisk,
529
+ outputLength: taskResult.output.length,
530
+ preFlightReject: true,
531
+ filesOnDisk,
532
+ });
533
+ return;
534
+ }
535
+ if (requireConcreteArtifactsForActionTasks && isActionTask && !hasConcreteArtifacts) {
536
+ taskResult.qualityScore = 1;
537
+ taskResult.qualityFeedback = 'Completion rejected: action task produced no concrete artifacts';
538
+ const canRetry = ctx.taskQueue.markFailedWithoutCascade(taskId, effectiveRetries);
539
+ if (canRetry) {
540
+ ctx.retries++;
541
+ }
542
+ else {
543
+ if (await tryResilienceRecovery(ctx, recoveryState, task, taskId, taskResult, spawnResult)) {
544
+ return;
545
+ }
546
+ ctx.taskQueue.triggerCascadeSkip(taskId);
547
+ }
548
+ ctx.emit({
549
+ type: 'swarm.quality.rejected',
550
+ taskId,
551
+ score: 1,
552
+ feedback: taskResult.qualityFeedback,
553
+ artifactCount: filesOnDisk,
554
+ outputLength: taskResult.output.length,
555
+ preFlightReject: true,
556
+ filesOnDisk,
557
+ });
558
+ return;
559
+ }
560
+ // Task passed — mark completed
561
+ ctx.taskQueue.markCompleted(taskId, taskResult);
562
+ ctx.hollowStreak = 0;
563
+ recoveryState.taskTimeoutCounts.delete(taskId);
564
+ // H6: Post findings to blackboard
565
+ if (ctx.blackboard && taskResult.findings) {
566
+ try {
567
+ for (const finding of taskResult.findings) {
568
+ ctx.blackboard.post(`swarm-worker-${taskId}`, {
569
+ topic: `swarm.task.${task.type}`,
570
+ content: finding,
571
+ type: 'progress',
572
+ confidence: (taskResult.qualityScore ?? 3) / 5,
573
+ tags: ['swarm', task.type],
574
+ relatedFiles: task.targetFiles,
575
+ });
576
+ }
577
+ }
578
+ catch {
579
+ ctx.errors.push({
580
+ taskId,
581
+ phase: 'execution',
582
+ message: 'Failed to post findings to blackboard',
583
+ recovered: true,
584
+ });
585
+ }
586
+ }
587
+ ctx.emit({
588
+ type: 'swarm.task.completed',
589
+ taskId,
590
+ success: true,
591
+ tokensUsed: taskResult.tokensUsed,
592
+ costUsed: taskResult.costUsed,
593
+ durationMs: taskResult.durationMs,
594
+ qualityScore: taskResult.qualityScore,
595
+ qualityFeedback: taskResult.qualityFeedback,
596
+ output: taskResult.output,
597
+ closureReport: taskResult.closureReport,
598
+ toolCalls: spawnResult.metrics.toolCalls,
599
+ });
600
+ }
601
+ // ─── Internal Helpers ───────────────────────────────────────────────────
602
+ /**
603
+ * Handle the case where a worker fails (spawnResult.success === false).
604
+ */
605
+ async function handleFailedCompletion(ctx, recoveryState, task, taskId, spawnResult, taskResult, model, durationMs, startedAt, maxDispatches) {
606
+ const failure = classifySwarmFailure(spawnResult.output, spawnResult.metrics.toolCalls);
607
+ const { failureClass, retryable, errorType, failureMode, reason } = failure;
608
+ const isTimeout = failureMode === 'timeout';
609
+ const isRateLimited = failureClass === 'rate_limited';
610
+ const isSpendLimit = failureClass === 'provider_spend_limit';
611
+ const isNonRetryable = !retryable;
612
+ ctx.healthTracker.recordFailure(model, errorType);
613
+ ctx.emit({ type: 'swarm.model.health', record: { model, ...getModelHealthSummary(ctx, model) } });
614
+ task.failureMode = failureMode;
615
+ if (isRateLimited) {
616
+ recordRateLimit(recoveryState, ctx);
617
+ }
618
+ // F25a: Consecutive timeout tracking
619
+ if (isTimeout) {
620
+ const count = (recoveryState.taskTimeoutCounts.get(taskId) ?? 0) + 1;
621
+ recoveryState.taskTimeoutCounts.set(taskId, count);
622
+ const timeoutLimit = ctx.config.consecutiveTimeoutLimit ?? 3;
623
+ ctx.logDecision('timeout-tracking', `${taskId}: consecutive timeout ${count}/${timeoutLimit}`, '');
624
+ if (count >= timeoutLimit) {
625
+ let failoverSucceeded = false;
626
+ if (ctx.config.enableModelFailover) {
627
+ const capability = getTaskTypeConfig(task.type, ctx.config).capability ?? 'code';
628
+ const alternative = selectAlternativeModel(ctx.config.workers, model, capability, ctx.healthTracker);
629
+ if (alternative) {
630
+ ctx.emit({
631
+ type: 'swarm.model.failover',
632
+ taskId,
633
+ fromModel: model,
634
+ toModel: alternative.model,
635
+ reason: 'consecutive-timeouts',
636
+ });
637
+ task.assignedModel = alternative.model;
638
+ recoveryState.taskTimeoutCounts.set(taskId, 0);
639
+ ctx.logDecision('failover', `Timeout failover ${taskId}: ${model} → ${alternative.model}`, `${count} consecutive timeouts`);
640
+ failoverSucceeded = true;
641
+ }
642
+ }
643
+ if (!failoverSucceeded) {
644
+ task.failureMode = 'timeout';
645
+ const timeoutTaskResult = ctx.workerPool.toTaskResult(spawnResult, task, Date.now() - startedAt);
646
+ if (await tryResilienceRecovery(ctx, recoveryState, task, taskId, timeoutTaskResult, spawnResult)) {
647
+ recoveryState.taskTimeoutCounts.delete(taskId);
648
+ return;
649
+ }
650
+ ctx.taskQueue.markFailedWithoutCascade(taskId, 0);
651
+ ctx.taskQueue.triggerCascadeSkip(taskId);
652
+ ctx.emit({
653
+ type: 'swarm.task.failed',
654
+ taskId,
655
+ error: `${count} consecutive timeouts — no alternative model available`,
656
+ attempt: task.attempts,
657
+ maxAttempts: maxDispatches,
658
+ willRetry: false,
659
+ failureMode: 'timeout',
660
+ failureClass: 'timeout',
661
+ retrySuppressed: true,
662
+ retryReason: 'Consecutive timeout limit reached with no alternative model',
663
+ });
664
+ ctx.logDecision('timeout-early-fail', `${taskId}: ${count} consecutive timeouts, no alt model — resilience recovery also failed`, '');
665
+ recoveryState.taskTimeoutCounts.delete(taskId);
666
+ return;
667
+ }
668
+ }
669
+ }
670
+ else {
671
+ recoveryState.taskTimeoutCounts.delete(taskId);
672
+ }
673
+ // V2: Model failover on retryable rate limits
674
+ if (isRateLimited && ctx.config.enableModelFailover) {
675
+ const capability = getTaskTypeConfig(task.type, ctx.config).capability ?? 'code';
676
+ const alternative = selectAlternativeModel(ctx.config.workers, model, capability, ctx.healthTracker);
677
+ if (alternative) {
678
+ ctx.emit({
679
+ type: 'swarm.model.failover',
680
+ taskId,
681
+ fromModel: model,
682
+ toModel: alternative.model,
683
+ reason: errorType,
684
+ });
685
+ task.assignedModel = alternative.model;
686
+ ctx.logDecision('failover', `Switched ${taskId} from ${model} to ${alternative.model}`, `${errorType} error`);
687
+ }
688
+ }
689
+ // V5/V7: Store error context so retry gets different prompt
690
+ if (!(isRateLimited || isSpendLimit)) {
691
+ const timeoutSeconds = isTimeout ? Math.round(durationMs / 1000) : 0;
692
+ task.retryContext = {
693
+ previousFeedback: isTimeout
694
+ ? `Previous attempt timed out after ${timeoutSeconds}s. You must complete this task more efficiently — work faster, use fewer tool calls, and produce your result sooner.`
695
+ : spawnResult.output.slice(0, 2000),
696
+ previousScore: 0,
697
+ attempt: task.attempts,
698
+ previousModel: model,
699
+ previousFiles: taskResult.filesModified,
700
+ swarmProgress: getSwarmProgressSummary(ctx),
701
+ };
702
+ ctx.sharedContextEngine.reportFailure(taskId, {
703
+ action: task.description.slice(0, 200),
704
+ error: spawnResult.output.slice(0, 500),
705
+ });
706
+ }
707
+ // V7: Reset hollow streak on non-hollow failure
708
+ ctx.hollowStreak = 0;
709
+ // Worker failed — use higher retry limit for rate limit errors
710
+ const baseRetries = getEffectiveRetries(ctx, task);
711
+ const retryLimit = isNonRetryable
712
+ ? 0
713
+ : isRateLimited
714
+ ? Math.min(ctx.config.rateLimitRetries ?? 3, baseRetries + 1)
715
+ : baseRetries;
716
+ const canRetry = ctx.taskQueue.markFailedWithoutCascade(taskId, retryLimit);
717
+ if (isNonRetryable) {
718
+ ctx.logDecision('retry-suppressed', `${taskId}: ${failureClass}`, reason);
719
+ }
720
+ if (canRetry) {
721
+ ctx.retries++;
722
+ if (isRateLimited) {
723
+ const baseDelay = ctx.config.retryBaseDelayMs ?? 5000;
724
+ const cooldownMs = Math.min(baseDelay * Math.pow(2, task.attempts - 1), 30000);
725
+ ctx.taskQueue.setRetryAfter(taskId, cooldownMs);
726
+ ctx.logDecision('rate-limit-cooldown', `${taskId}: ${errorType} cooldown ${cooldownMs}ms, model ${model}`, '');
727
+ }
728
+ }
729
+ else if (!isRateLimited) {
730
+ if (await tryResilienceRecovery(ctx, recoveryState, task, taskId, taskResult, spawnResult)) {
731
+ return;
732
+ }
733
+ ctx.taskQueue.triggerCascadeSkip(taskId);
734
+ }
735
+ else {
736
+ ctx.taskQueue.triggerCascadeSkip(taskId);
737
+ }
738
+ ctx.emit({
739
+ type: 'swarm.task.failed',
740
+ taskId,
741
+ error: spawnResult.output.slice(0, 200),
742
+ attempt: task.attempts,
743
+ maxAttempts: 1 + ctx.config.workerRetries,
744
+ willRetry: canRetry,
745
+ toolCalls: spawnResult.metrics.toolCalls,
746
+ failoverModel: task.assignedModel !== model ? task.assignedModel : undefined,
747
+ failureMode: task.failureMode,
748
+ failureClass,
749
+ retrySuppressed: isNonRetryable,
750
+ retryReason: reason,
751
+ });
752
+ }
753
+ /**
754
+ * Handle hollow completion — workers that "succeed" without doing any work.
755
+ */
756
+ async function handleHollowCompletion(ctx, recoveryState, task, taskId, spawnResult, taskResult, model, maxDispatches) {
757
+ // F4: Hollow result + pendingCascadeSkip
758
+ if (task.pendingCascadeSkip) {
759
+ task.pendingCascadeSkip = undefined;
760
+ task.status = 'skipped';
761
+ ctx.totalHollows++;
762
+ ctx.logDecision('cascade-skip', `${taskId}: pending cascade skip honored (hollow completion)`, '');
763
+ ctx.emit({
764
+ type: 'swarm.task.skipped',
765
+ taskId,
766
+ reason: 'cascade skip honored — hollow completion',
767
+ });
768
+ return;
769
+ }
770
+ task.failureMode = 'hollow';
771
+ ctx.healthTracker.recordHollow(model);
772
+ const admitsFailure = spawnResult.success &&
773
+ FAILURE_INDICATORS.some((f) => (spawnResult.output ?? '').toLowerCase().includes(f));
774
+ task.retryContext = {
775
+ previousFeedback: admitsFailure
776
+ ? 'Previous attempt reported success but admitted failure (e.g., "budget exhausted", "unable to complete"). You MUST execute tool calls and produce concrete output this time.'
777
+ : 'Previous attempt produced no meaningful output. Try again with a concrete approach.',
778
+ previousScore: 1,
779
+ attempt: task.attempts,
780
+ previousModel: model,
781
+ previousFiles: taskResult.filesModified,
782
+ swarmProgress: getSwarmProgressSummary(ctx),
783
+ };
784
+ ctx.sharedContextEngine.reportFailure(taskId, {
785
+ action: task.description.slice(0, 200),
786
+ error: 'Hollow completion: worker produced no meaningful output',
787
+ });
788
+ // Model failover for hollow completions
789
+ if (ctx.config.enableModelFailover) {
790
+ const capability = getTaskTypeConfig(task.type, ctx.config).capability ?? 'code';
791
+ const alternative = selectAlternativeModel(ctx.config.workers, model, capability, ctx.healthTracker);
792
+ if (alternative) {
793
+ ctx.emit({
794
+ type: 'swarm.model.failover',
795
+ taskId,
796
+ fromModel: model,
797
+ toModel: alternative.model,
798
+ reason: 'hollow-completion',
799
+ });
800
+ task.assignedModel = alternative.model;
801
+ ctx.logDecision('failover', `Hollow failover ${taskId}: ${model} → ${alternative.model}`, 'Model produced hollow completion');
802
+ }
803
+ }
804
+ const hollowRetries = getEffectiveRetries(ctx, task);
805
+ const canRetry = ctx.taskQueue.markFailedWithoutCascade(taskId, hollowRetries);
806
+ if (canRetry) {
807
+ ctx.retries++;
808
+ }
809
+ else {
810
+ if (await tryResilienceRecovery(ctx, recoveryState, task, taskId, taskResult, spawnResult)) {
811
+ return;
812
+ }
813
+ ctx.taskQueue.triggerCascadeSkip(taskId);
814
+ }
815
+ ctx.emit({
816
+ type: 'swarm.task.failed',
817
+ taskId,
818
+ error: 'Hollow completion: worker used no tools',
819
+ attempt: task.attempts,
820
+ maxAttempts: 1 + ctx.config.workerRetries,
821
+ willRetry: canRetry,
822
+ toolCalls: spawnResult.metrics.toolCalls,
823
+ failoverModel: task.assignedModel !== model ? task.assignedModel : undefined,
824
+ failureMode: 'hollow',
825
+ });
826
+ ctx.hollowStreak++;
827
+ ctx.totalHollows++;
828
+ ctx.logDecision('hollow-completion', `${taskId}: worker completed with 0 tool calls (streak: ${ctx.hollowStreak}, total hollows: ${ctx.totalHollows}/${ctx.totalDispatches})`, canRetry ? 'Marking as failed for retry' : 'Retries exhausted — hard fail');
829
+ // B2: Hollow streak handling
830
+ const HOLLOW_STREAK_THRESHOLD = 3;
831
+ if (ctx.hollowStreak >= HOLLOW_STREAK_THRESHOLD) {
832
+ const uniqueModels = new Set(ctx.config.workers.map((w) => w.model));
833
+ const singleModel = uniqueModels.size === 1;
834
+ const onlyModel = [...uniqueModels][0];
835
+ const modelUnhealthy = singleModel && !ctx.healthTracker.getAllRecords().find((r) => r.model === onlyModel)?.healthy;
836
+ if (singleModel && modelUnhealthy) {
837
+ if (ctx.config.enableHollowTermination) {
838
+ ctx.logDecision('early-termination', `Terminating swarm: ${ctx.hollowStreak} consecutive hollow completions on sole model ${onlyModel}`, 'Single-model swarm with unhealthy model — enableHollowTermination is on');
839
+ skipRemainingTasksInternal(ctx, `Single-model hollow streak (${ctx.hollowStreak}x on ${onlyModel})`);
840
+ }
841
+ else {
842
+ ctx.logDecision('stall-mode', `${ctx.hollowStreak} consecutive hollows on sole model ${onlyModel} — entering stall mode`, 'Will attempt model failover or simplified retry on next dispatch');
843
+ ctx.hollowStreak = 0;
844
+ }
845
+ }
846
+ }
847
+ // V7: Multi-model hollow ratio
848
+ const minDispatches = ctx.config.hollowTerminationMinDispatches ?? 8;
849
+ const threshold = ctx.config.hollowTerminationRatio ?? 0.55;
850
+ if (ctx.totalDispatches >= minDispatches) {
851
+ const ratio = ctx.totalHollows / ctx.totalDispatches;
852
+ if (ratio > threshold) {
853
+ if (ctx.config.enableHollowTermination) {
854
+ ctx.logDecision('early-termination', `Terminating swarm: hollow ratio ${(ratio * 100).toFixed(0)}% (${ctx.totalHollows}/${ctx.totalDispatches})`, `Exceeds threshold ${(threshold * 100).toFixed(0)}% after ${minDispatches}+ dispatches — enableHollowTermination is on`);
855
+ skipRemainingTasksInternal(ctx, `Hollow ratio ${(ratio * 100).toFixed(0)}% — models cannot execute tasks`);
856
+ }
857
+ else if (!recoveryState.hollowRatioWarned) {
858
+ recoveryState.hollowRatioWarned = true;
859
+ ctx.logDecision('stall-warning', `Hollow ratio ${(ratio * 100).toFixed(0)}% (${ctx.totalHollows}/${ctx.totalDispatches})`, 'High hollow rate but continuing — tasks may still recover via resilience');
860
+ }
861
+ }
862
+ }
863
+ }
864
+ /**
865
+ * Run the quality gate (LLM judge) on a task completion.
866
+ * Returns true if the task was rejected (caller should return), false if it passed.
867
+ */
868
+ async function runQualityGate(ctx, recoveryState, task, taskId, spawnResult, taskResult, model, effectiveRetries, cachedArtifactReport) {
869
+ const judgeModel = ctx.config.hierarchy?.judge?.model ??
870
+ ctx.config.qualityGateModel ??
871
+ ctx.config.orchestratorModel;
872
+ const judgeConfig = {
873
+ model: judgeModel,
874
+ persona: ctx.config.hierarchy?.judge?.persona,
875
+ };
876
+ ctx.emit({
877
+ type: 'swarm.role.action',
878
+ role: 'judge',
879
+ action: 'quality-gate',
880
+ model: judgeModel,
881
+ taskId,
882
+ });
883
+ const fileArtifacts = extractFileArtifacts(ctx, task, taskResult);
884
+ const baseThreshold = ctx.config.qualityThreshold ?? 3;
885
+ const qualityThreshold = task.isFoundation ? Math.max(2, baseThreshold - 1) : baseThreshold;
886
+ const quality = await evaluateWorkerOutput(ctx.provider, judgeModel, task, taskResult, judgeConfig, qualityThreshold, (resp, purpose) => ctx.trackOrchestratorUsage(resp, purpose), fileArtifacts, ctx.config, cachedArtifactReport);
887
+ taskResult.qualityScore = quality.score;
888
+ taskResult.qualityFeedback = quality.feedback;
889
+ // F11: Foundation tasks that barely pass
890
+ if (quality.passed && task.isFoundation && quality.score <= baseThreshold - 1) {
891
+ const concreteResult = runConcreteChecks(task, taskResult);
892
+ if (!concreteResult.passed) {
893
+ quality.passed = false;
894
+ quality.feedback += ` [F11: foundation task barely passed (${quality.score}/${baseThreshold}) but concrete validation failed: ${concreteResult.issues.join('; ')}]`;
895
+ ctx.logDecision('foundation-concrete-gate', `${taskId}: foundation task scored ${quality.score} (relaxed threshold ${qualityThreshold}) but concrete checks failed — rejecting`, concreteResult.issues.join('; '));
896
+ }
897
+ }
898
+ if (!quality.passed) {
899
+ // F7: Gate error fallback
900
+ if (quality.gateError && ctx.config.enableConcreteValidation !== false) {
901
+ const concreteResult = runConcreteChecks(task, taskResult);
902
+ if (concreteResult.passed) {
903
+ ctx.logDecision('gate-error-fallback', `${taskId}: gate error but concrete checks passed — tentatively accepting`, quality.gateErrorMessage ?? 'unknown');
904
+ taskResult.qualityScore = quality.score;
905
+ taskResult.qualityFeedback = `${quality.feedback} [concrete validation passed — tentative accept]`;
906
+ recoveryState.perModelQualityRejections.delete(model);
907
+ return false; // passed
908
+ }
909
+ else {
910
+ ctx.logDecision('gate-error-fallback', `${taskId}: gate error AND concrete checks failed — rejecting`, `Concrete issues: ${concreteResult.issues.join('; ')}`);
911
+ ctx.qualityRejections++;
912
+ task.failureMode = 'quality';
913
+ ctx.healthTracker.recordQualityRejection(model, quality.score);
914
+ ctx.emit({
915
+ type: 'swarm.model.health',
916
+ record: { model, ...getModelHealthSummary(ctx, model) },
917
+ });
918
+ ctx.hollowStreak = 0;
919
+ task.retryContext = {
920
+ previousFeedback: `Gate error + concrete validation failed: ${concreteResult.issues.join('; ')}`,
921
+ previousScore: quality.score,
922
+ attempt: task.attempts,
923
+ previousModel: model,
924
+ previousFiles: taskResult.filesModified,
925
+ swarmProgress: getSwarmProgressSummary(ctx),
926
+ };
927
+ const canRetry = ctx.taskQueue.markFailedWithoutCascade(taskId, effectiveRetries);
928
+ if (canRetry) {
929
+ ctx.retries++;
930
+ }
931
+ else {
932
+ if (await tryResilienceRecovery(ctx, recoveryState, task, taskId, taskResult, spawnResult)) {
933
+ return true;
934
+ }
935
+ ctx.taskQueue.triggerCascadeSkip(taskId);
936
+ }
937
+ ctx.emit({
938
+ type: 'swarm.quality.rejected',
939
+ taskId,
940
+ score: quality.score,
941
+ feedback: quality.feedback,
942
+ artifactCount: fileArtifacts.length,
943
+ outputLength: taskResult.output.length,
944
+ preFlightReject: false,
945
+ filesOnDisk: checkArtifactsEnhanced(task, taskResult).files.filter((f) => f.exists && f.sizeBytes > 0).length,
946
+ });
947
+ return true;
948
+ }
949
+ }
950
+ else if (!quality.gateError) {
951
+ // Normal quality rejection
952
+ ctx.qualityRejections++;
953
+ task.failureMode = 'quality';
954
+ ctx.healthTracker.recordQualityRejection(model, quality.score);
955
+ ctx.emit({
956
+ type: 'swarm.model.health',
957
+ record: { model, ...getModelHealthSummary(ctx, model) },
958
+ });
959
+ ctx.hollowStreak = 0;
960
+ // F7: Per-model circuit breaker
961
+ if (!quality.preFlightReject) {
962
+ const QUALITY_CIRCUIT_BREAKER_THRESHOLD = 5;
963
+ const modelRejections = (recoveryState.perModelQualityRejections.get(model) ?? 0) + 1;
964
+ recoveryState.perModelQualityRejections.set(model, modelRejections);
965
+ if (modelRejections >= QUALITY_CIRCUIT_BREAKER_THRESHOLD) {
966
+ recoveryState.qualityGateDisabledModels.add(model);
967
+ ctx.logDecision('quality-circuit-breaker', `Switched model ${model} to pre-flight-only mode after ${modelRejections} rejections`, 'Skipping LLM judge but keeping pre-flight checks mandatory');
968
+ }
969
+ }
970
+ task.retryContext = {
971
+ previousFeedback: quality.feedback,
972
+ previousScore: quality.score,
973
+ attempt: task.attempts,
974
+ previousModel: model,
975
+ previousFiles: taskResult.filesModified,
976
+ swarmProgress: getSwarmProgressSummary(ctx),
977
+ };
978
+ ctx.sharedContextEngine.reportFailure(taskId, {
979
+ action: task.description.slice(0, 200),
980
+ error: `Quality gate rejection (score ${quality.score}): ${quality.feedback.slice(0, 300)}`,
981
+ });
982
+ // V5: Model failover on quality rejection
983
+ if (quality.score < qualityThreshold &&
984
+ ctx.config.enableModelFailover &&
985
+ !quality.artifactAutoFail) {
986
+ const capability = getTaskTypeConfig(task.type, ctx.config).capability ?? 'code';
987
+ const alternative = selectAlternativeModel(ctx.config.workers, model, capability, ctx.healthTracker);
988
+ if (alternative) {
989
+ ctx.emit({
990
+ type: 'swarm.model.failover',
991
+ taskId,
992
+ fromModel: model,
993
+ toModel: alternative.model,
994
+ reason: `quality-score-${quality.score}`,
995
+ });
996
+ task.assignedModel = alternative.model;
997
+ ctx.logDecision('failover', `Quality failover ${taskId}: ${model} → ${alternative.model}`, `Score ${quality.score}/5`);
998
+ }
999
+ }
1000
+ const canRetry = ctx.taskQueue.markFailedWithoutCascade(taskId, effectiveRetries);
1001
+ if (canRetry) {
1002
+ ctx.retries++;
1003
+ }
1004
+ else {
1005
+ if (await tryResilienceRecovery(ctx, recoveryState, task, taskId, taskResult, spawnResult)) {
1006
+ return true;
1007
+ }
1008
+ ctx.taskQueue.triggerCascadeSkip(taskId);
1009
+ }
1010
+ ctx.emit({
1011
+ type: 'swarm.quality.rejected',
1012
+ taskId,
1013
+ score: quality.score,
1014
+ feedback: quality.feedback,
1015
+ artifactCount: fileArtifacts.length,
1016
+ outputLength: taskResult.output.length,
1017
+ preFlightReject: quality.preFlightReject,
1018
+ filesOnDisk: checkArtifactsEnhanced(task, taskResult).files.filter((f) => f.exists && f.sizeBytes > 0).length,
1019
+ });
1020
+ return true;
1021
+ }
1022
+ else {
1023
+ // gateError=true but concrete validation disabled
1024
+ ctx.qualityRejections++;
1025
+ task.failureMode = 'quality';
1026
+ ctx.hollowStreak = 0;
1027
+ task.retryContext = {
1028
+ previousFeedback: quality.feedback,
1029
+ previousScore: quality.score,
1030
+ attempt: task.attempts,
1031
+ previousModel: model,
1032
+ previousFiles: taskResult.filesModified,
1033
+ swarmProgress: getSwarmProgressSummary(ctx),
1034
+ };
1035
+ const canRetry = ctx.taskQueue.markFailedWithoutCascade(taskId, effectiveRetries);
1036
+ if (canRetry) {
1037
+ ctx.retries++;
1038
+ }
1039
+ else {
1040
+ if (await tryResilienceRecovery(ctx, recoveryState, task, taskId, taskResult, spawnResult)) {
1041
+ return true;
1042
+ }
1043
+ ctx.taskQueue.triggerCascadeSkip(taskId);
1044
+ }
1045
+ ctx.emit({
1046
+ type: 'swarm.quality.rejected',
1047
+ taskId,
1048
+ score: quality.score,
1049
+ feedback: quality.feedback,
1050
+ artifactCount: fileArtifacts.length,
1051
+ outputLength: taskResult.output.length,
1052
+ preFlightReject: false,
1053
+ filesOnDisk: checkArtifactsEnhanced(task, taskResult).files.filter((f) => f.exists && f.sizeBytes > 0).length,
1054
+ });
1055
+ return true;
1056
+ }
1057
+ }
1058
+ // Quality passed — reset per-model rejection counter
1059
+ recoveryState.perModelQualityRejections.delete(model);
1060
+ return false; // passed
1061
+ }
1062
+ /** Internal helper for skipRemainingTasks within execution context */
1063
+ function skipRemainingTasksInternal(ctx, reason) {
1064
+ for (const task of ctx.taskQueue.getAllTasks()) {
1065
+ if (task.status === 'pending' || task.status === 'ready') {
1066
+ task.status = 'skipped';
1067
+ ctx.emit({ type: 'swarm.task.skipped', taskId: task.id, reason });
1068
+ }
1069
+ }
1070
+ }
1071
+ //# sourceMappingURL=swarm-execution.js.map