attocode 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (787) hide show
  1. package/CHANGELOG.md +122 -1
  2. package/README.md +65 -5
  3. package/dist/src/adapters.d.ts +2 -1
  4. package/dist/src/adapters.d.ts.map +1 -1
  5. package/dist/src/adapters.js +74 -12
  6. package/dist/src/adapters.js.map +1 -1
  7. package/dist/src/agent/agent-builder.d.ts +117 -0
  8. package/dist/src/agent/agent-builder.d.ts.map +1 -0
  9. package/dist/src/agent/agent-builder.js +204 -0
  10. package/dist/src/agent/agent-builder.js.map +1 -0
  11. package/dist/src/agent/feature-initializer.d.ts +80 -0
  12. package/dist/src/agent/feature-initializer.d.ts.map +1 -0
  13. package/dist/src/agent/feature-initializer.js +677 -0
  14. package/dist/src/agent/feature-initializer.js.map +1 -0
  15. package/dist/src/agent/index.d.ts +13 -0
  16. package/dist/src/agent/index.d.ts.map +1 -0
  17. package/dist/src/agent/index.js +13 -0
  18. package/dist/src/agent/index.js.map +1 -0
  19. package/dist/src/agent/message-builder.d.ts +50 -0
  20. package/dist/src/agent/message-builder.d.ts.map +1 -0
  21. package/dist/src/agent/message-builder.js +173 -0
  22. package/dist/src/agent/message-builder.js.map +1 -0
  23. package/dist/src/agent/session-api.d.ts +94 -0
  24. package/dist/src/agent/session-api.d.ts.map +1 -0
  25. package/dist/src/agent/session-api.js +262 -0
  26. package/dist/src/agent/session-api.js.map +1 -0
  27. package/dist/src/agent-tools/lsp-file-tools.d.ts +1 -1
  28. package/dist/src/agent-tools/lsp-file-tools.d.ts.map +1 -1
  29. package/dist/src/agent.d.ts +52 -213
  30. package/dist/src/agent.d.ts.map +1 -1
  31. package/dist/src/agent.js +544 -4072
  32. package/dist/src/agent.js.map +1 -1
  33. package/dist/src/cli.d.ts.map +1 -1
  34. package/dist/src/cli.js +2 -1
  35. package/dist/src/cli.js.map +1 -1
  36. package/dist/src/commands/handler.d.ts.map +1 -1
  37. package/dist/src/commands/handler.js +18 -9
  38. package/dist/src/commands/handler.js.map +1 -1
  39. package/dist/src/commands/init-commands.d.ts.map +1 -1
  40. package/dist/src/commands/init-commands.js +16 -1
  41. package/dist/src/commands/init-commands.js.map +1 -1
  42. package/dist/src/commands/init.d.ts.map +1 -1
  43. package/dist/src/commands/init.js +31 -0
  44. package/dist/src/commands/init.js.map +1 -1
  45. package/dist/src/config/base-types.d.ts +45 -0
  46. package/dist/src/config/base-types.d.ts.map +1 -0
  47. package/dist/src/config/base-types.js +9 -0
  48. package/dist/src/config/base-types.js.map +1 -0
  49. package/dist/src/config/config-manager.d.ts +35 -0
  50. package/dist/src/config/config-manager.d.ts.map +1 -0
  51. package/dist/src/config/config-manager.js +108 -0
  52. package/dist/src/config/config-manager.js.map +1 -0
  53. package/dist/src/config/index.d.ts +4 -0
  54. package/dist/src/config/index.d.ts.map +1 -0
  55. package/dist/src/config/index.js +3 -0
  56. package/dist/src/config/index.js.map +1 -0
  57. package/dist/src/config/schema.d.ts +1546 -0
  58. package/dist/src/config/schema.d.ts.map +1 -0
  59. package/dist/src/config/schema.js +268 -0
  60. package/dist/src/config/schema.js.map +1 -0
  61. package/dist/src/config.d.ts +4 -1
  62. package/dist/src/config.d.ts.map +1 -1
  63. package/dist/src/config.js +8 -12
  64. package/dist/src/config.js.map +1 -1
  65. package/dist/src/core/agent-state-machine.d.ts +131 -0
  66. package/dist/src/core/agent-state-machine.d.ts.map +1 -0
  67. package/dist/src/core/agent-state-machine.js +302 -0
  68. package/dist/src/core/agent-state-machine.js.map +1 -0
  69. package/dist/src/core/base-manager.d.ts +79 -0
  70. package/dist/src/core/base-manager.d.ts.map +1 -0
  71. package/dist/src/core/base-manager.js +170 -0
  72. package/dist/src/core/base-manager.js.map +1 -0
  73. package/dist/src/core/completion-analyzer.d.ts +15 -0
  74. package/dist/src/core/completion-analyzer.d.ts.map +1 -0
  75. package/dist/src/core/completion-analyzer.js +53 -0
  76. package/dist/src/core/completion-analyzer.js.map +1 -0
  77. package/dist/src/core/execution-loop.d.ts +46 -0
  78. package/dist/src/core/execution-loop.d.ts.map +1 -0
  79. package/dist/src/core/execution-loop.js +1397 -0
  80. package/dist/src/core/execution-loop.js.map +1 -0
  81. package/dist/src/core/index.d.ts +7 -0
  82. package/dist/src/core/index.d.ts.map +1 -1
  83. package/dist/src/core/index.js +9 -0
  84. package/dist/src/core/index.js.map +1 -1
  85. package/dist/src/core/process-handlers.d.ts.map +1 -1
  86. package/dist/src/core/process-handlers.js +14 -0
  87. package/dist/src/core/process-handlers.js.map +1 -1
  88. package/dist/src/core/protocol/types.d.ts +12 -12
  89. package/dist/src/core/response-handler.d.ts +16 -0
  90. package/dist/src/core/response-handler.d.ts.map +1 -0
  91. package/dist/src/core/response-handler.js +235 -0
  92. package/dist/src/core/response-handler.js.map +1 -0
  93. package/dist/src/core/subagent-spawner.d.ts +43 -0
  94. package/dist/src/core/subagent-spawner.d.ts.map +1 -0
  95. package/dist/src/core/subagent-spawner.js +973 -0
  96. package/dist/src/core/subagent-spawner.js.map +1 -0
  97. package/dist/src/core/tool-executor.d.ts +59 -0
  98. package/dist/src/core/tool-executor.d.ts.map +1 -0
  99. package/dist/src/core/tool-executor.js +682 -0
  100. package/dist/src/core/tool-executor.js.map +1 -0
  101. package/dist/src/core/types.d.ts +134 -0
  102. package/dist/src/core/types.d.ts.map +1 -0
  103. package/dist/src/core/types.js +12 -0
  104. package/dist/src/core/types.js.map +1 -0
  105. package/dist/src/defaults.d.ts +2 -2
  106. package/dist/src/defaults.d.ts.map +1 -1
  107. package/dist/src/defaults.js +29 -1
  108. package/dist/src/defaults.js.map +1 -1
  109. package/dist/src/integrations/agents/agent-registry.d.ts +262 -0
  110. package/dist/src/integrations/agents/agent-registry.d.ts.map +1 -0
  111. package/dist/src/integrations/agents/agent-registry.js +686 -0
  112. package/dist/src/integrations/agents/agent-registry.js.map +1 -0
  113. package/dist/src/integrations/agents/async-subagent.d.ts +135 -0
  114. package/dist/src/integrations/agents/async-subagent.d.ts.map +1 -0
  115. package/dist/src/integrations/agents/async-subagent.js +213 -0
  116. package/dist/src/integrations/agents/async-subagent.js.map +1 -0
  117. package/dist/src/integrations/agents/complexity-classifier.d.ts +86 -0
  118. package/dist/src/integrations/agents/complexity-classifier.d.ts.map +1 -0
  119. package/dist/src/integrations/agents/complexity-classifier.js +233 -0
  120. package/dist/src/integrations/agents/complexity-classifier.js.map +1 -0
  121. package/dist/src/integrations/agents/delegation-protocol.d.ts +86 -0
  122. package/dist/src/integrations/agents/delegation-protocol.d.ts.map +1 -0
  123. package/dist/src/integrations/agents/delegation-protocol.js +127 -0
  124. package/dist/src/integrations/agents/delegation-protocol.js.map +1 -0
  125. package/dist/src/integrations/agents/multi-agent.d.ts +150 -0
  126. package/dist/src/integrations/agents/multi-agent.d.ts.map +1 -0
  127. package/dist/src/integrations/agents/multi-agent.js +306 -0
  128. package/dist/src/integrations/agents/multi-agent.js.map +1 -0
  129. package/dist/src/integrations/agents/result-synthesizer.d.ts +389 -0
  130. package/dist/src/integrations/agents/result-synthesizer.d.ts.map +1 -0
  131. package/dist/src/integrations/agents/result-synthesizer.js +951 -0
  132. package/dist/src/integrations/agents/result-synthesizer.js.map +1 -0
  133. package/dist/src/integrations/agents/shared-blackboard.d.ts +406 -0
  134. package/dist/src/integrations/agents/shared-blackboard.d.ts.map +1 -0
  135. package/dist/src/integrations/agents/shared-blackboard.js +757 -0
  136. package/dist/src/integrations/agents/shared-blackboard.js.map +1 -0
  137. package/dist/src/integrations/agents/subagent-output-store.d.ts +91 -0
  138. package/dist/src/integrations/agents/subagent-output-store.d.ts.map +1 -0
  139. package/dist/src/integrations/agents/subagent-output-store.js +257 -0
  140. package/dist/src/integrations/agents/subagent-output-store.js.map +1 -0
  141. package/dist/src/integrations/auto-compaction.d.ts.map +1 -1
  142. package/dist/src/integrations/auto-compaction.js +3 -2
  143. package/dist/src/integrations/auto-compaction.js.map +1 -1
  144. package/dist/src/integrations/budget/budget-pool.d.ts +115 -0
  145. package/dist/src/integrations/budget/budget-pool.d.ts.map +1 -0
  146. package/dist/src/integrations/budget/budget-pool.js +205 -0
  147. package/dist/src/integrations/budget/budget-pool.js.map +1 -0
  148. package/dist/src/integrations/budget/cancellation.d.ts +229 -0
  149. package/dist/src/integrations/budget/cancellation.d.ts.map +1 -0
  150. package/dist/src/integrations/budget/cancellation.js +520 -0
  151. package/dist/src/integrations/budget/cancellation.js.map +1 -0
  152. package/dist/src/integrations/budget/dynamic-budget.d.ts +81 -0
  153. package/dist/src/integrations/budget/dynamic-budget.d.ts.map +1 -0
  154. package/dist/src/integrations/budget/dynamic-budget.js +151 -0
  155. package/dist/src/integrations/budget/dynamic-budget.js.map +1 -0
  156. package/dist/src/integrations/budget/economics.d.ts +435 -0
  157. package/dist/src/integrations/budget/economics.d.ts.map +1 -0
  158. package/dist/src/integrations/budget/economics.js +1007 -0
  159. package/dist/src/integrations/budget/economics.js.map +1 -0
  160. package/dist/src/integrations/budget/injection-budget.d.ts +71 -0
  161. package/dist/src/integrations/budget/injection-budget.d.ts.map +1 -0
  162. package/dist/src/integrations/budget/injection-budget.js +137 -0
  163. package/dist/src/integrations/budget/injection-budget.js.map +1 -0
  164. package/dist/src/integrations/budget/loop-detector.d.ts +105 -0
  165. package/dist/src/integrations/budget/loop-detector.d.ts.map +1 -0
  166. package/dist/src/integrations/budget/loop-detector.js +287 -0
  167. package/dist/src/integrations/budget/loop-detector.js.map +1 -0
  168. package/dist/src/integrations/budget/phase-tracker.d.ts +114 -0
  169. package/dist/src/integrations/budget/phase-tracker.d.ts.map +1 -0
  170. package/dist/src/integrations/budget/phase-tracker.js +262 -0
  171. package/dist/src/integrations/budget/phase-tracker.js.map +1 -0
  172. package/dist/src/integrations/budget/resources.d.ts +182 -0
  173. package/dist/src/integrations/budget/resources.d.ts.map +1 -0
  174. package/dist/src/integrations/budget/resources.js +318 -0
  175. package/dist/src/integrations/budget/resources.js.map +1 -0
  176. package/dist/src/integrations/budget-pool.d.ts +7 -0
  177. package/dist/src/integrations/budget-pool.d.ts.map +1 -1
  178. package/dist/src/integrations/budget-pool.js +43 -0
  179. package/dist/src/integrations/budget-pool.js.map +1 -1
  180. package/dist/src/integrations/codebase-ast.d.ts +52 -0
  181. package/dist/src/integrations/codebase-ast.d.ts.map +1 -0
  182. package/dist/src/integrations/codebase-ast.js +457 -0
  183. package/dist/src/integrations/codebase-ast.js.map +1 -0
  184. package/dist/src/integrations/codebase-context.d.ts +18 -0
  185. package/dist/src/integrations/codebase-context.d.ts.map +1 -1
  186. package/dist/src/integrations/codebase-context.js +197 -17
  187. package/dist/src/integrations/codebase-context.js.map +1 -1
  188. package/dist/src/integrations/compaction.d.ts.map +1 -1
  189. package/dist/src/integrations/compaction.js +14 -6
  190. package/dist/src/integrations/compaction.js.map +1 -1
  191. package/dist/src/integrations/context/auto-compaction.d.ts +210 -0
  192. package/dist/src/integrations/context/auto-compaction.d.ts.map +1 -0
  193. package/dist/src/integrations/context/auto-compaction.js +477 -0
  194. package/dist/src/integrations/context/auto-compaction.js.map +1 -0
  195. package/dist/src/integrations/context/code-analyzer.d.ts +71 -0
  196. package/dist/src/integrations/context/code-analyzer.d.ts.map +1 -0
  197. package/dist/src/integrations/context/code-analyzer.js +448 -0
  198. package/dist/src/integrations/context/code-analyzer.js.map +1 -0
  199. package/dist/src/integrations/context/code-selector.d.ts +78 -0
  200. package/dist/src/integrations/context/code-selector.d.ts.map +1 -0
  201. package/dist/src/integrations/context/code-selector.js +649 -0
  202. package/dist/src/integrations/context/code-selector.js.map +1 -0
  203. package/dist/src/integrations/context/codebase-ast.d.ts +138 -0
  204. package/dist/src/integrations/context/codebase-ast.d.ts.map +1 -0
  205. package/dist/src/integrations/context/codebase-ast.js +818 -0
  206. package/dist/src/integrations/context/codebase-ast.js.map +1 -0
  207. package/dist/src/integrations/context/codebase-context.d.ts +473 -0
  208. package/dist/src/integrations/context/codebase-context.d.ts.map +1 -0
  209. package/dist/src/integrations/context/codebase-context.js +685 -0
  210. package/dist/src/integrations/context/codebase-context.js.map +1 -0
  211. package/dist/src/integrations/context/compaction.d.ts +191 -0
  212. package/dist/src/integrations/context/compaction.d.ts.map +1 -0
  213. package/dist/src/integrations/context/compaction.js +384 -0
  214. package/dist/src/integrations/context/compaction.js.map +1 -0
  215. package/dist/src/integrations/context/context-engineering.d.ts +274 -0
  216. package/dist/src/integrations/context/context-engineering.d.ts.map +1 -0
  217. package/dist/src/integrations/context/context-engineering.js +437 -0
  218. package/dist/src/integrations/context/context-engineering.js.map +1 -0
  219. package/dist/src/integrations/context/file-cache.d.ts +97 -0
  220. package/dist/src/integrations/context/file-cache.d.ts.map +1 -0
  221. package/dist/src/integrations/context/file-cache.js +218 -0
  222. package/dist/src/integrations/context/file-cache.js.map +1 -0
  223. package/dist/src/integrations/context/semantic-cache.d.ts +178 -0
  224. package/dist/src/integrations/context/semantic-cache.d.ts.map +1 -0
  225. package/dist/src/integrations/context/semantic-cache.js +372 -0
  226. package/dist/src/integrations/context/semantic-cache.js.map +1 -0
  227. package/dist/src/integrations/context-engineering.d.ts +8 -0
  228. package/dist/src/integrations/context-engineering.d.ts.map +1 -1
  229. package/dist/src/integrations/context-engineering.js +19 -0
  230. package/dist/src/integrations/context-engineering.js.map +1 -1
  231. package/dist/src/integrations/economics.d.ts +25 -1
  232. package/dist/src/integrations/economics.d.ts.map +1 -1
  233. package/dist/src/integrations/economics.js +217 -38
  234. package/dist/src/integrations/economics.js.map +1 -1
  235. package/dist/src/integrations/edit-validator.d.ts +30 -0
  236. package/dist/src/integrations/edit-validator.d.ts.map +1 -0
  237. package/dist/src/integrations/edit-validator.js +85 -0
  238. package/dist/src/integrations/edit-validator.js.map +1 -0
  239. package/dist/src/integrations/file-cache.d.ts +7 -0
  240. package/dist/src/integrations/file-cache.d.ts.map +1 -1
  241. package/dist/src/integrations/file-cache.js +54 -0
  242. package/dist/src/integrations/file-cache.js.map +1 -1
  243. package/dist/src/integrations/health-check.d.ts.map +1 -1
  244. package/dist/src/integrations/health-check.js +3 -2
  245. package/dist/src/integrations/health-check.js.map +1 -1
  246. package/dist/src/integrations/hierarchical-config.d.ts +3 -0
  247. package/dist/src/integrations/hierarchical-config.d.ts.map +1 -1
  248. package/dist/src/integrations/hierarchical-config.js +3 -0
  249. package/dist/src/integrations/hierarchical-config.js.map +1 -1
  250. package/dist/src/integrations/hooks.d.ts +2 -0
  251. package/dist/src/integrations/hooks.d.ts.map +1 -1
  252. package/dist/src/integrations/hooks.js +99 -15
  253. package/dist/src/integrations/hooks.js.map +1 -1
  254. package/dist/src/integrations/index.d.ts +77 -66
  255. package/dist/src/integrations/index.d.ts.map +1 -1
  256. package/dist/src/integrations/index.js +83 -67
  257. package/dist/src/integrations/index.js.map +1 -1
  258. package/dist/src/integrations/logger.d.ts +104 -0
  259. package/dist/src/integrations/logger.d.ts.map +1 -0
  260. package/dist/src/integrations/logger.js +219 -0
  261. package/dist/src/integrations/logger.js.map +1 -0
  262. package/dist/src/integrations/lsp/lsp.d.ts +196 -0
  263. package/dist/src/integrations/lsp/lsp.d.ts.map +1 -0
  264. package/dist/src/integrations/lsp/lsp.js +583 -0
  265. package/dist/src/integrations/lsp/lsp.js.map +1 -0
  266. package/dist/src/integrations/lsp.d.ts.map +1 -1
  267. package/dist/src/integrations/lsp.js +5 -4
  268. package/dist/src/integrations/lsp.js.map +1 -1
  269. package/dist/src/integrations/mcp/mcp-client.d.ts +279 -0
  270. package/dist/src/integrations/mcp/mcp-client.d.ts.map +1 -0
  271. package/dist/src/integrations/mcp/mcp-client.js +755 -0
  272. package/dist/src/integrations/mcp/mcp-client.js.map +1 -0
  273. package/dist/src/integrations/mcp/mcp-custom-tools.d.ts +102 -0
  274. package/dist/src/integrations/mcp/mcp-custom-tools.d.ts.map +1 -0
  275. package/dist/src/integrations/mcp/mcp-custom-tools.js +232 -0
  276. package/dist/src/integrations/mcp/mcp-custom-tools.js.map +1 -0
  277. package/dist/src/integrations/mcp/mcp-tool-search.d.ts +77 -0
  278. package/dist/src/integrations/mcp/mcp-tool-search.d.ts.map +1 -0
  279. package/dist/src/integrations/mcp/mcp-tool-search.js +220 -0
  280. package/dist/src/integrations/mcp/mcp-tool-search.js.map +1 -0
  281. package/dist/src/integrations/mcp/mcp-tool-validator.d.ts +60 -0
  282. package/dist/src/integrations/mcp/mcp-tool-validator.d.ts.map +1 -0
  283. package/dist/src/integrations/mcp/mcp-tool-validator.js +141 -0
  284. package/dist/src/integrations/mcp/mcp-tool-validator.js.map +1 -0
  285. package/dist/src/integrations/mcp-client.d.ts.map +1 -1
  286. package/dist/src/integrations/mcp-client.js +8 -7
  287. package/dist/src/integrations/mcp-client.js.map +1 -1
  288. package/dist/src/integrations/observability.d.ts.map +1 -1
  289. package/dist/src/integrations/observability.js +5 -4
  290. package/dist/src/integrations/observability.js.map +1 -1
  291. package/dist/src/integrations/openrouter-pricing.d.ts.map +1 -1
  292. package/dist/src/integrations/openrouter-pricing.js +4 -3
  293. package/dist/src/integrations/openrouter-pricing.js.map +1 -1
  294. package/dist/src/integrations/persistence/codebase-repository.d.ts +45 -0
  295. package/dist/src/integrations/persistence/codebase-repository.d.ts.map +1 -0
  296. package/dist/src/integrations/persistence/codebase-repository.js +81 -0
  297. package/dist/src/integrations/persistence/codebase-repository.js.map +1 -0
  298. package/dist/src/integrations/persistence/goal-repository.d.ts +71 -0
  299. package/dist/src/integrations/persistence/goal-repository.d.ts.map +1 -0
  300. package/dist/src/integrations/persistence/goal-repository.js +184 -0
  301. package/dist/src/integrations/persistence/goal-repository.js.map +1 -0
  302. package/dist/src/integrations/persistence/history.d.ts +72 -0
  303. package/dist/src/integrations/persistence/history.d.ts.map +1 -0
  304. package/dist/src/integrations/persistence/history.js +165 -0
  305. package/dist/src/integrations/persistence/history.js.map +1 -0
  306. package/dist/src/integrations/persistence/persistence.d.ts +49 -0
  307. package/dist/src/integrations/persistence/persistence.d.ts.map +1 -0
  308. package/dist/src/integrations/persistence/persistence.js +197 -0
  309. package/dist/src/integrations/persistence/persistence.js.map +1 -0
  310. package/dist/src/integrations/persistence/session-repository.d.ts +212 -0
  311. package/dist/src/integrations/persistence/session-repository.d.ts.map +1 -0
  312. package/dist/src/integrations/persistence/session-repository.js +770 -0
  313. package/dist/src/integrations/persistence/session-repository.js.map +1 -0
  314. package/dist/src/integrations/persistence/session-store.d.ts +184 -0
  315. package/dist/src/integrations/persistence/session-store.d.ts.map +1 -0
  316. package/dist/src/integrations/persistence/session-store.js +346 -0
  317. package/dist/src/integrations/persistence/session-store.js.map +1 -0
  318. package/dist/src/integrations/persistence/sqlite-store.d.ts +453 -0
  319. package/dist/src/integrations/persistence/sqlite-store.d.ts.map +1 -0
  320. package/dist/src/integrations/persistence/sqlite-store.js +676 -0
  321. package/dist/src/integrations/persistence/sqlite-store.js.map +1 -0
  322. package/dist/src/integrations/persistence/worker-repository.d.ts +65 -0
  323. package/dist/src/integrations/persistence/worker-repository.d.ts.map +1 -0
  324. package/dist/src/integrations/persistence/worker-repository.js +183 -0
  325. package/dist/src/integrations/persistence/worker-repository.js.map +1 -0
  326. package/dist/src/integrations/persistence.d.ts.map +1 -1
  327. package/dist/src/integrations/persistence.js +5 -4
  328. package/dist/src/integrations/persistence.js.map +1 -1
  329. package/dist/src/integrations/planning.d.ts.map +1 -1
  330. package/dist/src/integrations/planning.js +5 -4
  331. package/dist/src/integrations/planning.js.map +1 -1
  332. package/dist/src/integrations/quality/auto-checkpoint.d.ts +98 -0
  333. package/dist/src/integrations/quality/auto-checkpoint.d.ts.map +1 -0
  334. package/dist/src/integrations/quality/auto-checkpoint.js +252 -0
  335. package/dist/src/integrations/quality/auto-checkpoint.js.map +1 -0
  336. package/dist/src/integrations/quality/dead-letter-queue.d.ts +233 -0
  337. package/dist/src/integrations/quality/dead-letter-queue.d.ts.map +1 -0
  338. package/dist/src/integrations/quality/dead-letter-queue.js +543 -0
  339. package/dist/src/integrations/quality/dead-letter-queue.js.map +1 -0
  340. package/dist/src/integrations/quality/health-check.d.ts +218 -0
  341. package/dist/src/integrations/quality/health-check.d.ts.map +1 -0
  342. package/dist/src/integrations/quality/health-check.js +415 -0
  343. package/dist/src/integrations/quality/health-check.js.map +1 -0
  344. package/dist/src/integrations/quality/learning-store.d.ts +291 -0
  345. package/dist/src/integrations/quality/learning-store.d.ts.map +1 -0
  346. package/dist/src/integrations/quality/learning-store.js +646 -0
  347. package/dist/src/integrations/quality/learning-store.js.map +1 -0
  348. package/dist/src/integrations/quality/self-improvement.d.ts +90 -0
  349. package/dist/src/integrations/quality/self-improvement.d.ts.map +1 -0
  350. package/dist/src/integrations/quality/self-improvement.js +229 -0
  351. package/dist/src/integrations/quality/self-improvement.js.map +1 -0
  352. package/dist/src/integrations/quality/tool-recommendation.d.ts +61 -0
  353. package/dist/src/integrations/quality/tool-recommendation.d.ts.map +1 -0
  354. package/dist/src/integrations/quality/tool-recommendation.js +268 -0
  355. package/dist/src/integrations/quality/tool-recommendation.js.map +1 -0
  356. package/dist/src/integrations/retry.d.ts +1 -0
  357. package/dist/src/integrations/retry.d.ts.map +1 -1
  358. package/dist/src/integrations/retry.js.map +1 -1
  359. package/dist/src/integrations/routing.d.ts.map +1 -1
  360. package/dist/src/integrations/routing.js +2 -1
  361. package/dist/src/integrations/routing.js.map +1 -1
  362. package/dist/src/integrations/safety/bash-policy.d.ts +33 -0
  363. package/dist/src/integrations/safety/bash-policy.d.ts.map +1 -0
  364. package/dist/src/integrations/safety/bash-policy.js +144 -0
  365. package/dist/src/integrations/safety/bash-policy.js.map +1 -0
  366. package/dist/src/integrations/safety/edit-validator.d.ts +30 -0
  367. package/dist/src/integrations/safety/edit-validator.d.ts.map +1 -0
  368. package/dist/src/integrations/safety/edit-validator.js +87 -0
  369. package/dist/src/integrations/safety/edit-validator.js.map +1 -0
  370. package/dist/src/integrations/safety/execution-policy.d.ts +189 -0
  371. package/dist/src/integrations/safety/execution-policy.d.ts.map +1 -0
  372. package/dist/src/integrations/safety/execution-policy.js +352 -0
  373. package/dist/src/integrations/safety/execution-policy.js.map +1 -0
  374. package/dist/src/integrations/safety/policy-engine.d.ts +55 -0
  375. package/dist/src/integrations/safety/policy-engine.d.ts.map +1 -0
  376. package/dist/src/integrations/safety/policy-engine.js +247 -0
  377. package/dist/src/integrations/safety/policy-engine.js.map +1 -0
  378. package/dist/src/integrations/safety/safety.d.ts +174 -0
  379. package/dist/src/integrations/safety/safety.d.ts.map +1 -0
  380. package/dist/src/integrations/safety/safety.js +470 -0
  381. package/dist/src/integrations/safety/safety.js.map +1 -0
  382. package/dist/src/integrations/safety/sandbox/basic.d.ts +81 -0
  383. package/dist/src/integrations/safety/sandbox/basic.d.ts.map +1 -0
  384. package/dist/src/integrations/safety/sandbox/basic.js +335 -0
  385. package/dist/src/integrations/safety/sandbox/basic.js.map +1 -0
  386. package/dist/src/integrations/safety/sandbox/docker.d.ts +94 -0
  387. package/dist/src/integrations/safety/sandbox/docker.d.ts.map +1 -0
  388. package/dist/src/integrations/safety/sandbox/docker.js +294 -0
  389. package/dist/src/integrations/safety/sandbox/docker.js.map +1 -0
  390. package/dist/src/integrations/safety/sandbox/index.d.ts +188 -0
  391. package/dist/src/integrations/safety/sandbox/index.d.ts.map +1 -0
  392. package/dist/src/integrations/safety/sandbox/index.js +386 -0
  393. package/dist/src/integrations/safety/sandbox/index.js.map +1 -0
  394. package/dist/src/integrations/safety/sandbox/landlock.d.ts +59 -0
  395. package/dist/src/integrations/safety/sandbox/landlock.d.ts.map +1 -0
  396. package/dist/src/integrations/safety/sandbox/landlock.js +329 -0
  397. package/dist/src/integrations/safety/sandbox/landlock.js.map +1 -0
  398. package/dist/src/integrations/safety/sandbox/seatbelt.d.ts +68 -0
  399. package/dist/src/integrations/safety/sandbox/seatbelt.d.ts.map +1 -0
  400. package/dist/src/integrations/safety/sandbox/seatbelt.js +298 -0
  401. package/dist/src/integrations/safety/sandbox/seatbelt.js.map +1 -0
  402. package/dist/src/integrations/safety/type-checker.d.ts +53 -0
  403. package/dist/src/integrations/safety/type-checker.d.ts.map +1 -0
  404. package/dist/src/integrations/safety/type-checker.js +142 -0
  405. package/dist/src/integrations/safety/type-checker.js.map +1 -0
  406. package/dist/src/integrations/safety.d.ts.map +1 -1
  407. package/dist/src/integrations/safety.js +13 -13
  408. package/dist/src/integrations/safety.js.map +1 -1
  409. package/dist/src/integrations/sandbox/docker.d.ts.map +1 -1
  410. package/dist/src/integrations/sandbox/docker.js +2 -1
  411. package/dist/src/integrations/sandbox/docker.js.map +1 -1
  412. package/dist/src/integrations/sandbox/index.d.ts.map +1 -1
  413. package/dist/src/integrations/sandbox/index.js +5 -4
  414. package/dist/src/integrations/sandbox/index.js.map +1 -1
  415. package/dist/src/integrations/session-store.d.ts +1 -0
  416. package/dist/src/integrations/session-store.d.ts.map +1 -1
  417. package/dist/src/integrations/session-store.js +1 -0
  418. package/dist/src/integrations/session-store.js.map +1 -1
  419. package/dist/src/integrations/shared-blackboard.d.ts +3 -0
  420. package/dist/src/integrations/shared-blackboard.d.ts.map +1 -1
  421. package/dist/src/integrations/shared-blackboard.js +47 -0
  422. package/dist/src/integrations/shared-blackboard.js.map +1 -1
  423. package/dist/src/integrations/skills/skill-executor.d.ts +113 -0
  424. package/dist/src/integrations/skills/skill-executor.d.ts.map +1 -0
  425. package/dist/src/integrations/skills/skill-executor.js +270 -0
  426. package/dist/src/integrations/skills/skill-executor.js.map +1 -0
  427. package/dist/src/integrations/skills/skills.d.ts +262 -0
  428. package/dist/src/integrations/skills/skills.d.ts.map +1 -0
  429. package/dist/src/integrations/skills/skills.js +602 -0
  430. package/dist/src/integrations/skills/skills.js.map +1 -0
  431. package/dist/src/integrations/smart-decomposer.d.ts +27 -0
  432. package/dist/src/integrations/smart-decomposer.d.ts.map +1 -1
  433. package/dist/src/integrations/smart-decomposer.js +414 -30
  434. package/dist/src/integrations/smart-decomposer.js.map +1 -1
  435. package/dist/src/integrations/sqlite-store.d.ts +2 -0
  436. package/dist/src/integrations/sqlite-store.d.ts.map +1 -1
  437. package/dist/src/integrations/sqlite-store.js +18 -6
  438. package/dist/src/integrations/sqlite-store.js.map +1 -1
  439. package/dist/src/integrations/streaming/pty-shell.d.ts +169 -0
  440. package/dist/src/integrations/streaming/pty-shell.d.ts.map +1 -0
  441. package/dist/src/integrations/streaming/pty-shell.js +367 -0
  442. package/dist/src/integrations/streaming/pty-shell.js.map +1 -0
  443. package/dist/src/integrations/streaming/streaming.d.ts +102 -0
  444. package/dist/src/integrations/streaming/streaming.d.ts.map +1 -0
  445. package/dist/src/integrations/streaming/streaming.js +362 -0
  446. package/dist/src/integrations/streaming/streaming.js.map +1 -0
  447. package/dist/src/integrations/swarm/failure-classifier.d.ts +11 -0
  448. package/dist/src/integrations/swarm/failure-classifier.d.ts.map +1 -0
  449. package/dist/src/integrations/swarm/failure-classifier.js +95 -0
  450. package/dist/src/integrations/swarm/failure-classifier.js.map +1 -0
  451. package/dist/src/integrations/swarm/index.d.ts +2 -1
  452. package/dist/src/integrations/swarm/index.d.ts.map +1 -1
  453. package/dist/src/integrations/swarm/index.js +2 -0
  454. package/dist/src/integrations/swarm/index.js.map +1 -1
  455. package/dist/src/integrations/swarm/model-selector.d.ts.map +1 -1
  456. package/dist/src/integrations/swarm/model-selector.js +2 -1
  457. package/dist/src/integrations/swarm/model-selector.js.map +1 -1
  458. package/dist/src/integrations/swarm/swarm-budget.d.ts +1 -1
  459. package/dist/src/integrations/swarm/swarm-budget.d.ts.map +1 -1
  460. package/dist/src/integrations/swarm/swarm-budget.js +1 -1
  461. package/dist/src/integrations/swarm/swarm-budget.js.map +1 -1
  462. package/dist/src/integrations/swarm/swarm-config-loader.d.ts +8 -0
  463. package/dist/src/integrations/swarm/swarm-config-loader.d.ts.map +1 -1
  464. package/dist/src/integrations/swarm/swarm-config-loader.js +102 -0
  465. package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -1
  466. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts +74 -0
  467. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts.map +1 -1
  468. package/dist/src/integrations/swarm/swarm-event-bridge.js +37 -0
  469. package/dist/src/integrations/swarm/swarm-event-bridge.js.map +1 -1
  470. package/dist/src/integrations/swarm/swarm-events.d.ts +4 -1
  471. package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -1
  472. package/dist/src/integrations/swarm/swarm-events.js +1 -1
  473. package/dist/src/integrations/swarm/swarm-events.js.map +1 -1
  474. package/dist/src/integrations/swarm/swarm-execution.d.ts +27 -0
  475. package/dist/src/integrations/swarm/swarm-execution.d.ts.map +1 -0
  476. package/dist/src/integrations/swarm/swarm-execution.js +1021 -0
  477. package/dist/src/integrations/swarm/swarm-execution.js.map +1 -0
  478. package/dist/src/integrations/swarm/swarm-helpers.d.ts +26 -0
  479. package/dist/src/integrations/swarm/swarm-helpers.d.ts.map +1 -0
  480. package/dist/src/integrations/swarm/swarm-helpers.js +95 -0
  481. package/dist/src/integrations/swarm/swarm-helpers.js.map +1 -0
  482. package/dist/src/integrations/swarm/swarm-lifecycle.d.ts +100 -0
  483. package/dist/src/integrations/swarm/swarm-lifecycle.d.ts.map +1 -0
  484. package/dist/src/integrations/swarm/swarm-lifecycle.js +922 -0
  485. package/dist/src/integrations/swarm/swarm-lifecycle.js.map +1 -0
  486. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +96 -192
  487. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -1
  488. package/dist/src/integrations/swarm/swarm-orchestrator.js +384 -2528
  489. package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -1
  490. package/dist/src/integrations/swarm/swarm-quality-gate.js +1 -1
  491. package/dist/src/integrations/swarm/swarm-quality-gate.js.map +1 -1
  492. package/dist/src/integrations/swarm/swarm-recovery.d.ts +75 -0
  493. package/dist/src/integrations/swarm/swarm-recovery.d.ts.map +1 -0
  494. package/dist/src/integrations/swarm/swarm-recovery.js +550 -0
  495. package/dist/src/integrations/swarm/swarm-recovery.js.map +1 -0
  496. package/dist/src/integrations/swarm/swarm-state-store.d.ts +4 -1
  497. package/dist/src/integrations/swarm/swarm-state-store.d.ts.map +1 -1
  498. package/dist/src/integrations/swarm/swarm-state-store.js +14 -1
  499. package/dist/src/integrations/swarm/swarm-state-store.js.map +1 -1
  500. package/dist/src/integrations/swarm/task-queue.d.ts +11 -1
  501. package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -1
  502. package/dist/src/integrations/swarm/task-queue.js +64 -2
  503. package/dist/src/integrations/swarm/task-queue.js.map +1 -1
  504. package/dist/src/integrations/swarm/types.d.ts +57 -4
  505. package/dist/src/integrations/swarm/types.d.ts.map +1 -1
  506. package/dist/src/integrations/swarm/types.js +9 -0
  507. package/dist/src/integrations/swarm/types.js.map +1 -1
  508. package/dist/src/integrations/swarm/worker-pool.d.ts +13 -3
  509. package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -1
  510. package/dist/src/integrations/swarm/worker-pool.js +66 -13
  511. package/dist/src/integrations/swarm/worker-pool.js.map +1 -1
  512. package/dist/src/integrations/task-manager.d.ts +33 -1
  513. package/dist/src/integrations/task-manager.d.ts.map +1 -1
  514. package/dist/src/integrations/task-manager.js +78 -4
  515. package/dist/src/integrations/task-manager.js.map +1 -1
  516. package/dist/src/integrations/tasks/dependency-analyzer.d.ts +34 -0
  517. package/dist/src/integrations/tasks/dependency-analyzer.d.ts.map +1 -0
  518. package/dist/src/integrations/tasks/dependency-analyzer.js +232 -0
  519. package/dist/src/integrations/tasks/dependency-analyzer.js.map +1 -0
  520. package/dist/src/integrations/tasks/interactive-planning.d.ts +322 -0
  521. package/dist/src/integrations/tasks/interactive-planning.d.ts.map +1 -0
  522. package/dist/src/integrations/tasks/interactive-planning.js +655 -0
  523. package/dist/src/integrations/tasks/interactive-planning.js.map +1 -0
  524. package/dist/src/integrations/tasks/pending-plan.d.ts +196 -0
  525. package/dist/src/integrations/tasks/pending-plan.d.ts.map +1 -0
  526. package/dist/src/integrations/tasks/pending-plan.js +431 -0
  527. package/dist/src/integrations/tasks/pending-plan.js.map +1 -0
  528. package/dist/src/integrations/tasks/planning.d.ts +115 -0
  529. package/dist/src/integrations/tasks/planning.d.ts.map +1 -0
  530. package/dist/src/integrations/tasks/planning.js +413 -0
  531. package/dist/src/integrations/tasks/planning.js.map +1 -0
  532. package/dist/src/integrations/tasks/smart-decomposer.d.ts +316 -0
  533. package/dist/src/integrations/tasks/smart-decomposer.d.ts.map +1 -0
  534. package/dist/src/integrations/tasks/smart-decomposer.js +661 -0
  535. package/dist/src/integrations/tasks/smart-decomposer.js.map +1 -0
  536. package/dist/src/integrations/tasks/task-manager.d.ts +164 -0
  537. package/dist/src/integrations/tasks/task-manager.d.ts.map +1 -0
  538. package/dist/src/integrations/tasks/task-manager.js +383 -0
  539. package/dist/src/integrations/tasks/task-manager.js.map +1 -0
  540. package/dist/src/integrations/tasks/task-splitter.d.ts +56 -0
  541. package/dist/src/integrations/tasks/task-splitter.d.ts.map +1 -0
  542. package/dist/src/integrations/tasks/task-splitter.js +537 -0
  543. package/dist/src/integrations/tasks/task-splitter.js.map +1 -0
  544. package/dist/src/integrations/tasks/verification-gate.d.ts +103 -0
  545. package/dist/src/integrations/tasks/verification-gate.d.ts.map +1 -0
  546. package/dist/src/integrations/tasks/verification-gate.js +193 -0
  547. package/dist/src/integrations/tasks/verification-gate.js.map +1 -0
  548. package/dist/src/integrations/tasks/work-log.d.ts +87 -0
  549. package/dist/src/integrations/tasks/work-log.d.ts.map +1 -0
  550. package/dist/src/integrations/tasks/work-log.js +275 -0
  551. package/dist/src/integrations/tasks/work-log.js.map +1 -0
  552. package/dist/src/integrations/utilities/capabilities.d.ts +160 -0
  553. package/dist/src/integrations/utilities/capabilities.d.ts.map +1 -0
  554. package/dist/src/integrations/utilities/capabilities.js +426 -0
  555. package/dist/src/integrations/utilities/capabilities.js.map +1 -0
  556. package/dist/src/integrations/utilities/diff-utils.d.ts +105 -0
  557. package/dist/src/integrations/utilities/diff-utils.d.ts.map +1 -0
  558. package/dist/src/integrations/utilities/diff-utils.js +497 -0
  559. package/dist/src/integrations/utilities/diff-utils.js.map +1 -0
  560. package/dist/src/integrations/utilities/environment-facts.d.ts +52 -0
  561. package/dist/src/integrations/utilities/environment-facts.d.ts.map +1 -0
  562. package/dist/src/integrations/utilities/environment-facts.js +84 -0
  563. package/dist/src/integrations/utilities/environment-facts.js.map +1 -0
  564. package/dist/src/integrations/utilities/file-change-tracker.d.ts +162 -0
  565. package/dist/src/integrations/utilities/file-change-tracker.d.ts.map +1 -0
  566. package/dist/src/integrations/utilities/file-change-tracker.js +538 -0
  567. package/dist/src/integrations/utilities/file-change-tracker.js.map +1 -0
  568. package/dist/src/integrations/utilities/graph-visualization.d.ts +72 -0
  569. package/dist/src/integrations/utilities/graph-visualization.d.ts.map +1 -0
  570. package/dist/src/integrations/utilities/graph-visualization.js +383 -0
  571. package/dist/src/integrations/utilities/graph-visualization.js.map +1 -0
  572. package/dist/src/integrations/utilities/hierarchical-config.d.ts +215 -0
  573. package/dist/src/integrations/utilities/hierarchical-config.d.ts.map +1 -0
  574. package/dist/src/integrations/utilities/hierarchical-config.js +504 -0
  575. package/dist/src/integrations/utilities/hierarchical-config.js.map +1 -0
  576. package/dist/src/integrations/utilities/hooks.d.ts +116 -0
  577. package/dist/src/integrations/utilities/hooks.d.ts.map +1 -0
  578. package/dist/src/integrations/utilities/hooks.js +410 -0
  579. package/dist/src/integrations/utilities/hooks.js.map +1 -0
  580. package/dist/src/integrations/utilities/ignore.d.ts +143 -0
  581. package/dist/src/integrations/utilities/ignore.d.ts.map +1 -0
  582. package/dist/src/integrations/utilities/ignore.js +417 -0
  583. package/dist/src/integrations/utilities/ignore.js.map +1 -0
  584. package/dist/src/integrations/utilities/image-renderer.d.ts +119 -0
  585. package/dist/src/integrations/utilities/image-renderer.d.ts.map +1 -0
  586. package/dist/src/integrations/utilities/image-renderer.js +306 -0
  587. package/dist/src/integrations/utilities/image-renderer.js.map +1 -0
  588. package/dist/src/integrations/utilities/logger.d.ts +104 -0
  589. package/dist/src/integrations/utilities/logger.d.ts.map +1 -0
  590. package/dist/src/integrations/utilities/logger.js +219 -0
  591. package/dist/src/integrations/utilities/logger.js.map +1 -0
  592. package/dist/src/integrations/utilities/memory.d.ts +116 -0
  593. package/dist/src/integrations/utilities/memory.d.ts.map +1 -0
  594. package/dist/src/integrations/utilities/memory.js +311 -0
  595. package/dist/src/integrations/utilities/memory.js.map +1 -0
  596. package/dist/src/integrations/utilities/observability.d.ts +162 -0
  597. package/dist/src/integrations/utilities/observability.d.ts.map +1 -0
  598. package/dist/src/integrations/utilities/observability.js +407 -0
  599. package/dist/src/integrations/utilities/observability.js.map +1 -0
  600. package/dist/src/integrations/utilities/openrouter-pricing.d.ts +67 -0
  601. package/dist/src/integrations/utilities/openrouter-pricing.d.ts.map +1 -0
  602. package/dist/src/integrations/utilities/openrouter-pricing.js +166 -0
  603. package/dist/src/integrations/utilities/openrouter-pricing.js.map +1 -0
  604. package/dist/src/integrations/utilities/react.d.ts +139 -0
  605. package/dist/src/integrations/utilities/react.d.ts.map +1 -0
  606. package/dist/src/integrations/utilities/react.js +273 -0
  607. package/dist/src/integrations/utilities/react.js.map +1 -0
  608. package/dist/src/integrations/utilities/retry.d.ts +132 -0
  609. package/dist/src/integrations/utilities/retry.d.ts.map +1 -0
  610. package/dist/src/integrations/utilities/retry.js +233 -0
  611. package/dist/src/integrations/utilities/retry.js.map +1 -0
  612. package/dist/src/integrations/utilities/routing.d.ts +118 -0
  613. package/dist/src/integrations/utilities/routing.d.ts.map +1 -0
  614. package/dist/src/integrations/utilities/routing.js +348 -0
  615. package/dist/src/integrations/utilities/routing.js.map +1 -0
  616. package/dist/src/integrations/utilities/rules.d.ts +131 -0
  617. package/dist/src/integrations/utilities/rules.d.ts.map +1 -0
  618. package/dist/src/integrations/utilities/rules.js +284 -0
  619. package/dist/src/integrations/utilities/rules.js.map +1 -0
  620. package/dist/src/integrations/utilities/sourcegraph.d.ts +169 -0
  621. package/dist/src/integrations/utilities/sourcegraph.d.ts.map +1 -0
  622. package/dist/src/integrations/utilities/sourcegraph.js +379 -0
  623. package/dist/src/integrations/utilities/sourcegraph.js.map +1 -0
  624. package/dist/src/integrations/utilities/thinking-strategy.d.ts +52 -0
  625. package/dist/src/integrations/utilities/thinking-strategy.d.ts.map +1 -0
  626. package/dist/src/integrations/utilities/thinking-strategy.js +129 -0
  627. package/dist/src/integrations/utilities/thinking-strategy.js.map +1 -0
  628. package/dist/src/integrations/utilities/thread-manager.d.ts +199 -0
  629. package/dist/src/integrations/utilities/thread-manager.d.ts.map +1 -0
  630. package/dist/src/integrations/utilities/thread-manager.js +357 -0
  631. package/dist/src/integrations/utilities/thread-manager.js.map +1 -0
  632. package/dist/src/integrations/utilities/token-estimate.d.ts +11 -0
  633. package/dist/src/integrations/utilities/token-estimate.d.ts.map +1 -0
  634. package/dist/src/integrations/utilities/token-estimate.js +14 -0
  635. package/dist/src/integrations/utilities/token-estimate.js.map +1 -0
  636. package/dist/src/main.js +92 -35
  637. package/dist/src/main.js.map +1 -1
  638. package/dist/src/modes/repl.d.ts.map +1 -1
  639. package/dist/src/modes/repl.js +60 -11
  640. package/dist/src/modes/repl.js.map +1 -1
  641. package/dist/src/modes/tui.d.ts.map +1 -1
  642. package/dist/src/modes/tui.js +57 -10
  643. package/dist/src/modes/tui.js.map +1 -1
  644. package/dist/src/modes.js +1 -1
  645. package/dist/src/modes.js.map +1 -1
  646. package/dist/src/observability/tracer.d.ts.map +1 -1
  647. package/dist/src/observability/tracer.js +2 -1
  648. package/dist/src/observability/tracer.js.map +1 -1
  649. package/dist/src/persistence/schema.d.ts +2 -0
  650. package/dist/src/persistence/schema.d.ts.map +1 -1
  651. package/dist/src/persistence/schema.js +42 -0
  652. package/dist/src/persistence/schema.js.map +1 -1
  653. package/dist/src/providers/adapters/anthropic.d.ts +6 -0
  654. package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
  655. package/dist/src/providers/adapters/anthropic.js +101 -16
  656. package/dist/src/providers/adapters/anthropic.js.map +1 -1
  657. package/dist/src/providers/adapters/azure.d.ts +74 -0
  658. package/dist/src/providers/adapters/azure.d.ts.map +1 -0
  659. package/dist/src/providers/adapters/azure.js +354 -0
  660. package/dist/src/providers/adapters/azure.js.map +1 -0
  661. package/dist/src/providers/adapters/mock.d.ts +16 -2
  662. package/dist/src/providers/adapters/mock.d.ts.map +1 -1
  663. package/dist/src/providers/adapters/mock.js +44 -3
  664. package/dist/src/providers/adapters/mock.js.map +1 -1
  665. package/dist/src/providers/adapters/openai.d.ts +6 -1
  666. package/dist/src/providers/adapters/openai.d.ts.map +1 -1
  667. package/dist/src/providers/adapters/openai.js +41 -9
  668. package/dist/src/providers/adapters/openai.js.map +1 -1
  669. package/dist/src/providers/adapters/openrouter.d.ts +6 -0
  670. package/dist/src/providers/adapters/openrouter.d.ts.map +1 -1
  671. package/dist/src/providers/adapters/openrouter.js +83 -13
  672. package/dist/src/providers/adapters/openrouter.js.map +1 -1
  673. package/dist/src/providers/circuit-breaker.d.ts +1 -0
  674. package/dist/src/providers/circuit-breaker.d.ts.map +1 -1
  675. package/dist/src/providers/circuit-breaker.js.map +1 -1
  676. package/dist/src/providers/provider.d.ts.map +1 -1
  677. package/dist/src/providers/provider.js +2 -1
  678. package/dist/src/providers/provider.js.map +1 -1
  679. package/dist/src/providers/resilient-provider.d.ts.map +1 -1
  680. package/dist/src/providers/resilient-provider.js +2 -1
  681. package/dist/src/providers/resilient-provider.js.map +1 -1
  682. package/dist/src/providers/types.d.ts +23 -2
  683. package/dist/src/providers/types.d.ts.map +1 -1
  684. package/dist/src/session-picker.d.ts +1 -1
  685. package/dist/src/session-picker.d.ts.map +1 -1
  686. package/dist/src/session-picker.js +40 -5
  687. package/dist/src/session-picker.js.map +1 -1
  688. package/dist/src/shared/budget-tracker.d.ts +65 -0
  689. package/dist/src/shared/budget-tracker.d.ts.map +1 -0
  690. package/dist/src/shared/budget-tracker.js +128 -0
  691. package/dist/src/shared/budget-tracker.js.map +1 -0
  692. package/dist/src/shared/context-engine.d.ts +64 -0
  693. package/dist/src/shared/context-engine.d.ts.map +1 -0
  694. package/dist/src/shared/context-engine.js +117 -0
  695. package/dist/src/shared/context-engine.js.map +1 -0
  696. package/dist/src/shared/index.d.ts +12 -0
  697. package/dist/src/shared/index.d.ts.map +1 -0
  698. package/dist/src/shared/index.js +12 -0
  699. package/dist/src/shared/index.js.map +1 -0
  700. package/dist/src/shared/persistence.d.ts +57 -0
  701. package/dist/src/shared/persistence.d.ts.map +1 -0
  702. package/dist/src/shared/persistence.js +168 -0
  703. package/dist/src/shared/persistence.js.map +1 -0
  704. package/dist/src/shared/shared-context-state.d.ts +89 -0
  705. package/dist/src/shared/shared-context-state.d.ts.map +1 -0
  706. package/dist/src/shared/shared-context-state.js +175 -0
  707. package/dist/src/shared/shared-context-state.js.map +1 -0
  708. package/dist/src/shared/shared-economics-state.d.ts +61 -0
  709. package/dist/src/shared/shared-economics-state.d.ts.map +1 -0
  710. package/dist/src/shared/shared-economics-state.js +100 -0
  711. package/dist/src/shared/shared-economics-state.js.map +1 -0
  712. package/dist/src/tools/agent.d.ts +1 -1
  713. package/dist/src/tools/agent.d.ts.map +1 -1
  714. package/dist/src/tools/bash.d.ts +3 -3
  715. package/dist/src/tools/bash.d.ts.map +1 -1
  716. package/dist/src/tools/bash.js +2 -1
  717. package/dist/src/tools/bash.js.map +1 -1
  718. package/dist/src/tools/file.d.ts +3 -3
  719. package/dist/src/tools/file.js +1 -1
  720. package/dist/src/tools/file.js.map +1 -1
  721. package/dist/src/tools/permission.d.ts.map +1 -1
  722. package/dist/src/tools/permission.js +7 -6
  723. package/dist/src/tools/permission.js.map +1 -1
  724. package/dist/src/tools/registry.d.ts +1 -1
  725. package/dist/src/tools/registry.d.ts.map +1 -1
  726. package/dist/src/tools/registry.js +1 -1
  727. package/dist/src/tools/registry.js.map +1 -1
  728. package/dist/src/tools/tasks.d.ts +1 -1
  729. package/dist/src/tools/tasks.d.ts.map +1 -1
  730. package/dist/src/tools/types.d.ts +1 -0
  731. package/dist/src/tools/types.d.ts.map +1 -1
  732. package/dist/src/tools/types.js.map +1 -1
  733. package/dist/src/tools/undo.d.ts +1 -1
  734. package/dist/src/tools/undo.d.ts.map +1 -1
  735. package/dist/src/tracing/cache-boundary-tracker.d.ts.map +1 -1
  736. package/dist/src/tracing/cache-boundary-tracker.js +2 -2
  737. package/dist/src/tracing/cache-boundary-tracker.js.map +1 -1
  738. package/dist/src/tracing/trace-collector.d.ts +147 -0
  739. package/dist/src/tracing/trace-collector.d.ts.map +1 -1
  740. package/dist/src/tracing/trace-collector.js +138 -7
  741. package/dist/src/tracing/trace-collector.js.map +1 -1
  742. package/dist/src/tracing/types.d.ts +112 -1
  743. package/dist/src/tracing/types.d.ts.map +1 -1
  744. package/dist/src/tracing/types.js.map +1 -1
  745. package/dist/src/tricks/failure-evidence.d.ts.map +1 -1
  746. package/dist/src/tricks/failure-evidence.js +2 -1
  747. package/dist/src/tricks/failure-evidence.js.map +1 -1
  748. package/dist/src/tricks/recitation.d.ts.map +1 -1
  749. package/dist/src/tricks/recitation.js +2 -1
  750. package/dist/src/tricks/recitation.js.map +1 -1
  751. package/dist/src/tricks/recursive-context.d.ts.map +1 -1
  752. package/dist/src/tricks/recursive-context.js +2 -2
  753. package/dist/src/tricks/recursive-context.js.map +1 -1
  754. package/dist/src/tricks/reversible-compaction.d.ts.map +1 -1
  755. package/dist/src/tricks/reversible-compaction.js +6 -2
  756. package/dist/src/tricks/reversible-compaction.js.map +1 -1
  757. package/dist/src/tui/app.d.ts +16 -3
  758. package/dist/src/tui/app.d.ts.map +1 -1
  759. package/dist/src/tui/app.js +211 -25
  760. package/dist/src/tui/app.js.map +1 -1
  761. package/dist/src/tui/components/CollapsibleDiffView.d.ts +1 -1
  762. package/dist/src/tui/components/CollapsibleDiffView.d.ts.map +1 -1
  763. package/dist/src/tui/components/DiagnosticsPanel.d.ts +24 -0
  764. package/dist/src/tui/components/DiagnosticsPanel.d.ts.map +1 -0
  765. package/dist/src/tui/components/DiagnosticsPanel.js +47 -0
  766. package/dist/src/tui/components/DiagnosticsPanel.js.map +1 -0
  767. package/dist/src/tui/components/DiffView.d.ts +1 -1
  768. package/dist/src/tui/components/DiffView.d.ts.map +1 -1
  769. package/dist/src/tui/components/ErrorBoundary.d.ts.map +1 -1
  770. package/dist/src/tui/components/ErrorBoundary.js +3 -2
  771. package/dist/src/tui/components/ErrorBoundary.js.map +1 -1
  772. package/dist/src/tui/components/TasksPanel.d.ts +1 -1
  773. package/dist/src/tui/components/TasksPanel.d.ts.map +1 -1
  774. package/dist/src/tui/event-display.d.ts.map +1 -1
  775. package/dist/src/tui/event-display.js +36 -62
  776. package/dist/src/tui/event-display.js.map +1 -1
  777. package/dist/src/tui/index.d.ts +4 -0
  778. package/dist/src/tui/index.d.ts.map +1 -1
  779. package/dist/src/tui/index.js +17 -0
  780. package/dist/src/tui/index.js.map +1 -1
  781. package/dist/src/tui/transparency-aggregator.d.ts +13 -0
  782. package/dist/src/tui/transparency-aggregator.d.ts.map +1 -1
  783. package/dist/src/tui/transparency-aggregator.js +21 -0
  784. package/dist/src/tui/transparency-aggregator.js.map +1 -1
  785. package/dist/src/types.d.ts +170 -3
  786. package/dist/src/types.d.ts.map +1 -1
  787. package/package.json +18 -3
@@ -0,0 +1,1007 @@
1
+ /**
2
+ * Lesson 25: Execution Economics System
3
+ *
4
+ * Replaces hard-coded iteration limits with intelligent budget management:
5
+ * - Token budgets (primary constraint)
6
+ * - Cost budgets (maps to real API costs)
7
+ * - Time budgets (wall-clock limits)
8
+ * - Progress detection (stuck vs productive)
9
+ * - Adaptive limits with extension requests
10
+ *
11
+ * Phase 3b: Core manager + presets. Loop detection and phase tracking
12
+ * are extracted into loop-detector.ts and phase-tracker.ts respectively.
13
+ */
14
+ import { stableStringify } from '../context/context-engineering.js';
15
+ import { calculateCost } from '../utilities/openrouter-pricing.js';
16
+ // Re-export from extracted modules for backward compatibility
17
+ export { computeToolFingerprint, extractBashResult, extractBashFileTarget, LoopDetector, } from './loop-detector.js';
18
+ export { PhaseTracker } from './phase-tracker.js';
19
+ // Import from extracted modules for internal use
20
+ import { computeToolFingerprint, extractBashResult, LoopDetector, DOOM_LOOP_PROMPT, GLOBAL_DOOM_LOOP_PROMPT, TEST_FIX_RETHINK_PROMPT, BASH_FAILURE_CASCADE_PROMPT, SUMMARY_LOOP_PROMPT, } from './loop-detector.js';
21
+ import { PhaseTracker, EXPLORATION_NUDGE_PROMPT, EXPLORATION_BUDGET_EXCEEDED_PROMPT, VERIFICATION_RESERVE_PROMPT, } from './phase-tracker.js';
22
+ // =============================================================================
23
+ // PROMPT CONSTANTS (kept in manager for budget-level prompts)
24
+ // =============================================================================
25
+ /**
26
+ * Max steps prompt - injected when iteration limit reached.
27
+ * Forces a summary response instead of more tool calls.
28
+ */
29
+ const MAX_STEPS_PROMPT = `[System] Maximum steps reached. You must now:
30
+ 1. Summarize what you've accomplished
31
+ 2. List any remaining work
32
+ 3. Explain any blockers encountered
33
+
34
+ Do NOT call any more tools. Respond with text only.`;
35
+ /**
36
+ * Timeout wrapup prompt - injected when a subagent is about to be stopped due to timeout.
37
+ * Forces a structured JSON summary so the parent agent can make intelligent follow-up decisions.
38
+ */
39
+ export const TIMEOUT_WRAPUP_PROMPT = `[System] You are about to be stopped due to timeout. You MUST respond with a structured summary NOW.
40
+
41
+ Respond with ONLY this JSON (no tool calls):
42
+ {
43
+ "findings": ["what you discovered or accomplished"],
44
+ "actionsTaken": ["files read, modifications made, commands run"],
45
+ "failures": ["what failed or was blocked"],
46
+ "remainingWork": ["what you didn't finish"],
47
+ "suggestedNextSteps": ["what the parent agent should do next"]
48
+ }`;
49
+ const BUDGET_ADVISORY_PROMPT = (reason) => `[System] Budget advisory (${reason}) detected. Continue execution and focus on concrete tool actions to complete the task.`;
50
+ // =============================================================================
51
+ // ECONOMICS MANAGER
52
+ // =============================================================================
53
+ /**
54
+ * ExecutionEconomicsManager handles budget tracking and progress detection.
55
+ *
56
+ * Delegates loop detection to LoopDetector and phase tracking to PhaseTracker.
57
+ */
58
+ export class ExecutionEconomicsManager {
59
+ budget;
60
+ usage;
61
+ progress;
62
+ loopDetector;
63
+ phaseTracker;
64
+ phaseBudget = null;
65
+ startTime;
66
+ pausedDuration = 0;
67
+ pauseStart = null;
68
+ listeners = [];
69
+ extensionHandler;
70
+ // Shared economics state for cross-worker doom loop aggregation
71
+ sharedEconomics;
72
+ workerId;
73
+ // Adaptive budget: stores original maxIterations for reversible reduction
74
+ originalMaxIterations = null;
75
+ // Incremental token accounting
76
+ baseline = 0;
77
+ lastInputTokens = 0;
78
+ constructor(budget, sharedEconomics, workerId) {
79
+ this.sharedEconomics = sharedEconomics ?? null;
80
+ this.workerId = workerId ?? 'root';
81
+ const tuning = budget?.tuning;
82
+ this.budget = {
83
+ enforcementMode: budget?.enforcementMode ?? 'strict',
84
+ // Hard limits
85
+ maxTokens: budget?.maxTokens ?? 200000,
86
+ maxCost: budget?.maxCost ?? 1.00,
87
+ maxDuration: budget?.maxDuration ?? 900000, // 15 minutes (up from 5min to support subagent tasks)
88
+ // Soft limits (80% of hard limits)
89
+ softTokenLimit: budget?.softTokenLimit ?? 150000,
90
+ softCostLimit: budget?.softCostLimit ?? 0.75,
91
+ softDurationLimit: budget?.softDurationLimit ?? 720000, // 12 minutes
92
+ // Iteration guidance
93
+ targetIterations: budget?.targetIterations ?? 20,
94
+ maxIterations: budget?.maxIterations ?? 100,
95
+ // Tuning
96
+ tuning,
97
+ };
98
+ this.usage = {
99
+ tokens: 0,
100
+ inputTokens: 0,
101
+ outputTokens: 0,
102
+ cost: 0,
103
+ duration: 0,
104
+ iterations: 0,
105
+ toolCalls: 0,
106
+ llmCalls: 0,
107
+ baselineContextTokens: 0,
108
+ cumulativeInputTokens: 0,
109
+ };
110
+ this.progress = {
111
+ filesRead: new Set(),
112
+ filesModified: new Set(),
113
+ commandsRun: [],
114
+ recentToolCalls: [],
115
+ lastMeaningfulProgress: Date.now(),
116
+ stuckCount: 0,
117
+ };
118
+ // Initialize extracted modules
119
+ this.loopDetector = new LoopDetector(tuning);
120
+ this.phaseTracker = new PhaseTracker(tuning, (event) => this.emit(event));
121
+ this.startTime = Date.now();
122
+ }
123
+ /**
124
+ * Pause duration tracking (e.g., while subagents are running).
125
+ * Prevents the parent agent's wall-clock timer from advancing
126
+ * during subagent execution.
127
+ */
128
+ pauseDuration() {
129
+ if (this.pauseStart === null) {
130
+ this.pauseStart = Date.now();
131
+ }
132
+ }
133
+ /**
134
+ * Resume duration tracking after subagent completes.
135
+ */
136
+ resumeDuration() {
137
+ if (this.pauseStart !== null) {
138
+ this.pausedDuration += Date.now() - this.pauseStart;
139
+ this.pauseStart = null;
140
+ }
141
+ }
142
+ /**
143
+ * Get the effective duration accounting for paused time.
144
+ */
145
+ getEffectiveDuration() {
146
+ const currentPaused = this.pauseStart !== null ? Date.now() - this.pauseStart : 0;
147
+ return Date.now() - this.startTime - this.pausedDuration - currentPaused;
148
+ }
149
+ /**
150
+ * Configure phase-aware budget allocation.
151
+ * Only active when enabled=true (eval mode). TUI mode leaves it off.
152
+ */
153
+ setPhaseBudget(config) {
154
+ this.phaseBudget = config;
155
+ }
156
+ /**
157
+ * Set baseline context tokens for incremental accounting.
158
+ * Tokens up to this baseline are not counted toward the budget.
159
+ */
160
+ setBaseline(tokens) {
161
+ this.baseline = tokens;
162
+ this.usage.baselineContextTokens = tokens;
163
+ }
164
+ /**
165
+ * Get current baseline context tokens.
166
+ */
167
+ getBaseline() {
168
+ return this.baseline;
169
+ }
170
+ /**
171
+ * Update baseline after compaction reduces context size.
172
+ */
173
+ updateBaseline(tokens) {
174
+ this.baseline = tokens;
175
+ this.usage.baselineContextTokens = tokens;
176
+ }
177
+ /**
178
+ * Estimate the incremental cost of the next LLM call.
179
+ * Subtracts baseline from input tokens to give incremental cost.
180
+ */
181
+ estimateNextCallCost(inputTokens, outputTokens) {
182
+ const incrementalInput = Math.max(0, inputTokens - this.baseline);
183
+ return incrementalInput + outputTokens;
184
+ }
185
+ /**
186
+ * Set the extension request handler.
187
+ */
188
+ setExtensionHandler(handler) {
189
+ this.extensionHandler = handler;
190
+ }
191
+ /**
192
+ * Record token usage from an LLM call.
193
+ * When a baseline is set, uses incremental accounting: only tokens beyond what
194
+ * was seen in the previous call are counted toward the budget.
195
+ * @param inputTokens - Number of input tokens
196
+ * @param outputTokens - Number of output tokens
197
+ * @param model - Model name (for fallback pricing calculation)
198
+ * @param actualCost - Actual cost from provider (e.g., OpenRouter returns this directly)
199
+ * @param cacheReadTokens - Tokens served from cache (deducted from incremental input)
200
+ */
201
+ recordLLMUsage(inputTokens, outputTokens, model, actualCost, cacheReadTokens) {
202
+ // Track cumulative input for debugging (always the full input)
203
+ this.usage.cumulativeInputTokens += inputTokens;
204
+ // On the very first LLM call, refine the baseline from the actual
205
+ // API-reported input tokens. The initial estimate (from systemPrompt
206
+ // char count) may miss tool definitions, rules, etc. Using the real
207
+ // value makes the first call "free" (all context is baseline) and
208
+ // subsequent calls only pay the marginal token growth.
209
+ if (this.baseline > 0 && this.usage.llmCalls === 0) {
210
+ this.baseline = inputTokens;
211
+ this.usage.baselineContextTokens = inputTokens;
212
+ }
213
+ // Incremental accounting: only count new tokens since last call
214
+ let effectiveInput;
215
+ if (this.baseline > 0) {
216
+ const incrementalInput = Math.max(0, inputTokens - this.lastInputTokens);
217
+ effectiveInput = Math.max(0, incrementalInput - (cacheReadTokens ?? 0));
218
+ }
219
+ else {
220
+ // No baseline: cumulative mode (backward compat)
221
+ effectiveInput = cacheReadTokens ? Math.max(0, inputTokens - cacheReadTokens) : inputTokens;
222
+ }
223
+ this.lastInputTokens = inputTokens;
224
+ this.usage.inputTokens += effectiveInput;
225
+ this.usage.outputTokens += outputTokens;
226
+ this.usage.tokens += effectiveInput + outputTokens;
227
+ this.usage.llmCalls++;
228
+ // Use actual cost from provider if available, otherwise calculate
229
+ if (actualCost !== undefined && actualCost !== null) {
230
+ this.usage.cost += actualCost;
231
+ }
232
+ else {
233
+ // Fallback: Calculate cost using model pricing (less accurate for unknown models)
234
+ this.usage.cost += calculateCost(model || '', inputTokens, outputTokens);
235
+ }
236
+ // Update duration
237
+ this.usage.duration = this.getEffectiveDuration();
238
+ }
239
+ /**
240
+ * Record a text-only turn (LLM response with no tool calls).
241
+ * Increments the consecutive text-only turn counter for summary-loop detection.
242
+ */
243
+ recordTextOnlyTurn() {
244
+ this.phaseTracker.recordTextOnlyTurn();
245
+ }
246
+ /**
247
+ * Record a tool call for progress tracking and loop detection.
248
+ */
249
+ recordToolCall(toolName, args, _result) {
250
+ this.usage.toolCalls++;
251
+ this.usage.iterations++;
252
+ const now = Date.now();
253
+ // Track for loop detection (stableStringify ensures consistent ordering for comparison)
254
+ const argsStr = stableStringify(args);
255
+ this.progress.recentToolCalls.push({ tool: toolName, args: argsStr, timestamp: now });
256
+ // Keep only last 10 for loop detection
257
+ if (this.progress.recentToolCalls.length > 10) {
258
+ this.progress.recentToolCalls.shift();
259
+ }
260
+ // =========================================================================
261
+ // DOOM LOOP DETECTION (delegated to LoopDetector)
262
+ // =========================================================================
263
+ const newDoomLoop = this.loopDetector.updateDoomLoopState(toolName, argsStr, this.progress.recentToolCalls);
264
+ if (newDoomLoop) {
265
+ this.emit({
266
+ type: 'doom_loop.detected',
267
+ tool: toolName,
268
+ consecutiveCount: this.loopDetector.consecutiveCount,
269
+ });
270
+ }
271
+ // Report to shared economics for cross-worker doom loop aggregation
272
+ if (this.sharedEconomics) {
273
+ const fingerprint = computeToolFingerprint(toolName, argsStr);
274
+ this.sharedEconomics.recordToolCall(this.workerId, fingerprint);
275
+ }
276
+ // =========================================================================
277
+ // PHASE TRACKING (delegated to PhaseTracker)
278
+ // =========================================================================
279
+ this.phaseTracker.onToolCall();
280
+ // Track file operations
281
+ if (toolName === 'read_file' && args.path) {
282
+ const path = String(args.path);
283
+ const isNewFile = !this.progress.filesRead.has(path);
284
+ this.progress.filesRead.add(path);
285
+ this.phaseTracker.trackFileRead(path);
286
+ // Only count reads as progress during initial exploration (first 5 iterations)
287
+ if (this.usage.iterations <= 5) {
288
+ this.progress.lastMeaningfulProgress = now;
289
+ this.progress.stuckCount = 0;
290
+ }
291
+ }
292
+ // Track search operations
293
+ if (['grep', 'search', 'glob', 'find_files', 'search_files'].includes(toolName)) {
294
+ const query = String(args.pattern || args.query || args.path || '');
295
+ this.phaseTracker.trackSearch(query);
296
+ }
297
+ if (['write_file', 'edit_file'].includes(toolName) && args.path) {
298
+ this.progress.filesModified.add(String(args.path));
299
+ this.phaseTracker.trackFileModified(String(args.path));
300
+ this.progress.lastMeaningfulProgress = now;
301
+ this.progress.stuckCount = 0;
302
+ }
303
+ if (toolName === 'bash' && args.command) {
304
+ const command = String(args.command);
305
+ this.progress.commandsRun.push(command);
306
+ this.progress.lastMeaningfulProgress = now;
307
+ this.progress.stuckCount = 0;
308
+ // Extract result from bash tool output (object or string)
309
+ const bashResult = extractBashResult(_result);
310
+ // Track bash result in phase tracker (handles failures, test outcomes)
311
+ if (_result !== undefined) {
312
+ this.phaseTracker.trackBashResult(command, bashResult.success, bashResult.output);
313
+ }
314
+ else {
315
+ // Detect test runs even without result (for phase transition)
316
+ if (command.includes('test') || command.includes('pytest') || command.includes('npm test') || command.includes('jest')) {
317
+ this.phaseTracker.trackBashResult(command, true, '');
318
+ }
319
+ }
320
+ }
321
+ // Update exploration saturation check
322
+ this.phaseTracker.checkExplorationSaturation();
323
+ // Check for stuck state
324
+ if (this.isStuck()) {
325
+ this.progress.stuckCount++;
326
+ this.emit({ type: 'progress.stuck', stuckCount: this.progress.stuckCount, lastProgress: this.progress.lastMeaningfulProgress });
327
+ }
328
+ else {
329
+ this.emit({
330
+ type: 'progress.made',
331
+ filesRead: this.progress.filesRead.size,
332
+ filesModified: this.progress.filesModified.size,
333
+ });
334
+ }
335
+ }
336
+ /**
337
+ * Check if execution can continue.
338
+ */
339
+ checkBudget() {
340
+ this.usage.duration = this.getEffectiveDuration();
341
+ const strictBudgetEnforcement = (this.budget.enforcementMode ?? 'strict') === 'strict';
342
+ const phaseState = this.phaseTracker.rawState;
343
+ // Check hard limits first
344
+ if (this.usage.tokens >= this.budget.maxTokens) {
345
+ this.emit({ type: 'budget.exceeded', budgetType: 'tokens', limit: this.budget.maxTokens, actual: this.usage.tokens });
346
+ if (!strictBudgetEnforcement) {
347
+ return {
348
+ canContinue: true,
349
+ reason: `Token budget exceeded (${this.usage.tokens.toLocaleString()} / ${this.budget.maxTokens.toLocaleString()})`,
350
+ budgetType: 'tokens',
351
+ isHardLimit: false,
352
+ isSoftLimit: true,
353
+ percentUsed: (this.usage.tokens / this.budget.maxTokens) * 100,
354
+ suggestedAction: 'warn',
355
+ injectedPrompt: BUDGET_ADVISORY_PROMPT('tokens'),
356
+ budgetMode: 'warn',
357
+ allowTaskContinuation: true,
358
+ };
359
+ }
360
+ return {
361
+ canContinue: false,
362
+ reason: `Token budget exceeded (${this.usage.tokens.toLocaleString()} / ${this.budget.maxTokens.toLocaleString()})`,
363
+ budgetType: 'tokens',
364
+ isHardLimit: true,
365
+ isSoftLimit: false,
366
+ percentUsed: (this.usage.tokens / this.budget.maxTokens) * 100,
367
+ suggestedAction: 'stop',
368
+ budgetMode: 'hard',
369
+ allowTaskContinuation: false,
370
+ };
371
+ }
372
+ if (this.usage.cost >= this.budget.maxCost) {
373
+ this.emit({ type: 'budget.exceeded', budgetType: 'cost', limit: this.budget.maxCost, actual: this.usage.cost });
374
+ if (!strictBudgetEnforcement) {
375
+ return {
376
+ canContinue: true,
377
+ reason: `Cost budget exceeded ($${this.usage.cost.toFixed(2)} / $${this.budget.maxCost.toFixed(2)})`,
378
+ budgetType: 'cost',
379
+ isHardLimit: false,
380
+ isSoftLimit: true,
381
+ percentUsed: (this.usage.cost / this.budget.maxCost) * 100,
382
+ suggestedAction: 'warn',
383
+ injectedPrompt: BUDGET_ADVISORY_PROMPT('cost'),
384
+ budgetMode: 'warn',
385
+ allowTaskContinuation: true,
386
+ };
387
+ }
388
+ return {
389
+ canContinue: false,
390
+ reason: `Cost budget exceeded ($${this.usage.cost.toFixed(2)} / $${this.budget.maxCost.toFixed(2)})`,
391
+ budgetType: 'cost',
392
+ isHardLimit: true,
393
+ isSoftLimit: false,
394
+ percentUsed: (this.usage.cost / this.budget.maxCost) * 100,
395
+ suggestedAction: 'stop',
396
+ budgetMode: 'hard',
397
+ allowTaskContinuation: false,
398
+ };
399
+ }
400
+ if (this.usage.duration >= this.budget.maxDuration) {
401
+ this.emit({ type: 'budget.exceeded', budgetType: 'duration', limit: this.budget.maxDuration, actual: this.usage.duration });
402
+ if (!strictBudgetEnforcement) {
403
+ return {
404
+ canContinue: true,
405
+ reason: `Duration limit exceeded (${Math.round(this.usage.duration / 1000)}s / ${Math.round(this.budget.maxDuration / 1000)}s)`,
406
+ budgetType: 'duration',
407
+ isHardLimit: false,
408
+ isSoftLimit: true,
409
+ percentUsed: (this.usage.duration / this.budget.maxDuration) * 100,
410
+ suggestedAction: 'warn',
411
+ injectedPrompt: BUDGET_ADVISORY_PROMPT('duration'),
412
+ budgetMode: 'warn',
413
+ allowTaskContinuation: true,
414
+ };
415
+ }
416
+ return {
417
+ canContinue: false,
418
+ reason: `Duration limit exceeded (${Math.round(this.usage.duration / 1000)}s / ${Math.round(this.budget.maxDuration / 1000)}s)`,
419
+ budgetType: 'duration',
420
+ isHardLimit: true,
421
+ isSoftLimit: false,
422
+ percentUsed: (this.usage.duration / this.budget.maxDuration) * 100,
423
+ suggestedAction: 'stop',
424
+ budgetMode: 'hard',
425
+ allowTaskContinuation: false,
426
+ };
427
+ }
428
+ // Max iterations reached -- allow exactly ONE more turn for summary, then terminate.
429
+ if (this.usage.iterations >= this.budget.maxIterations) {
430
+ const isFirstOverage = this.usage.iterations === this.budget.maxIterations;
431
+ return {
432
+ canContinue: isFirstOverage, // Only allow one summary turn
433
+ reason: `Maximum iterations reached (${this.usage.iterations} / ${this.budget.maxIterations})`,
434
+ budgetType: 'iterations',
435
+ isHardLimit: true,
436
+ isSoftLimit: false,
437
+ percentUsed: 100,
438
+ suggestedAction: 'stop',
439
+ forceTextOnly: true, // No more tool calls
440
+ injectedPrompt: MAX_STEPS_PROMPT,
441
+ budgetMode: 'hard',
442
+ allowTaskContinuation: false,
443
+ };
444
+ }
445
+ // =========================================================================
446
+ // ZERO PROGRESS DETECTION (D1)
447
+ // =========================================================================
448
+ const zeroProgressThreshold = this.budget.tuning?.zeroProgressThreshold ?? 10;
449
+ if (this.usage.iterations >= zeroProgressThreshold && this.usage.toolCalls === 0) {
450
+ const isCompleteStall = this.usage.iterations >= zeroProgressThreshold * 2;
451
+ return {
452
+ canContinue: true,
453
+ reason: `Zero tool calls in ${this.usage.iterations} iterations`,
454
+ budgetType: 'iterations',
455
+ isHardLimit: false,
456
+ isSoftLimit: true,
457
+ percentUsed: (this.usage.iterations / this.budget.maxIterations) * 100,
458
+ suggestedAction: isCompleteStall ? 'stop' : 'warn',
459
+ forceTextOnly: isCompleteStall,
460
+ injectedPrompt: `[System] WARNING: You have completed ${this.usage.iterations} iterations without making a single tool call. ` +
461
+ `You MUST use your tools (read_file, write_file, grep, bash, etc.) to accomplish your task. ` +
462
+ `Start by reading a relevant file or running a command NOW.` +
463
+ (isCompleteStall ? ` This is your LAST chance — respond with a summary if you cannot proceed.` : ''),
464
+ };
465
+ }
466
+ // =========================================================================
467
+ // ADAPTIVE ITERATION BUDGET (D4)
468
+ // =========================================================================
469
+ const checkpoint = this.budget.tuning?.progressCheckpoint ?? 10;
470
+ if (this.usage.iterations === checkpoint && this.usage.toolCalls === 0) {
471
+ if (!this.originalMaxIterations) {
472
+ this.originalMaxIterations = this.budget.maxIterations;
473
+ }
474
+ const reducedMax = checkpoint + 5;
475
+ if (this.budget.maxIterations > reducedMax) {
476
+ this.budget.maxIterations = reducedMax;
477
+ }
478
+ }
479
+ // Restore original maxIterations if tools start being used after reduction
480
+ if (this.originalMaxIterations && this.usage.toolCalls > 0 && this.budget.maxIterations < this.originalMaxIterations) {
481
+ this.budget.maxIterations = this.originalMaxIterations;
482
+ this.originalMaxIterations = null;
483
+ }
484
+ // =========================================================================
485
+ // DOOM LOOP DETECTION - Strong intervention (delegated to LoopDetector)
486
+ // =========================================================================
487
+ if (this.loopDetector.isDoomLoop) {
488
+ return {
489
+ canContinue: true,
490
+ reason: `Doom loop detected: ${this.loopDetector.lastTool} called ${this.loopDetector.consecutiveCount} times`,
491
+ budgetType: 'iterations',
492
+ isHardLimit: false,
493
+ isSoftLimit: true,
494
+ percentUsed: (this.usage.iterations / this.budget.targetIterations) * 100,
495
+ suggestedAction: 'warn',
496
+ injectedPrompt: DOOM_LOOP_PROMPT(this.loopDetector.lastTool || 'unknown', this.loopDetector.consecutiveCount),
497
+ budgetMode: 'warn',
498
+ allowTaskContinuation: true,
499
+ };
500
+ }
501
+ // =========================================================================
502
+ // GLOBAL DOOM LOOP DETECTION - Cross-worker stuck pattern
503
+ // =========================================================================
504
+ if (this.sharedEconomics && this.progress.recentToolCalls.length > 0) {
505
+ const lastCall = this.progress.recentToolCalls[this.progress.recentToolCalls.length - 1];
506
+ const fingerprint = computeToolFingerprint(lastCall.tool, lastCall.args);
507
+ if (this.sharedEconomics.isGlobalDoomLoop(fingerprint)) {
508
+ const info = this.sharedEconomics.getGlobalLoopInfo(fingerprint);
509
+ return {
510
+ canContinue: true,
511
+ reason: `Global doom loop: ${lastCall.tool} repeated across ${info?.workerCount ?? 0} workers`,
512
+ budgetType: 'iterations',
513
+ isHardLimit: false,
514
+ isSoftLimit: true,
515
+ percentUsed: (this.usage.iterations / this.budget.targetIterations) * 100,
516
+ suggestedAction: 'warn',
517
+ injectedPrompt: GLOBAL_DOOM_LOOP_PROMPT(lastCall.tool, info?.workerCount ?? 0, info?.count ?? 0),
518
+ };
519
+ }
520
+ }
521
+ // =========================================================================
522
+ // EXPLORATION SATURATION - Gentle nudge (delegated to PhaseTracker)
523
+ // =========================================================================
524
+ if (phaseState.shouldTransition) {
525
+ return {
526
+ canContinue: true,
527
+ reason: `Exploration saturation: ${phaseState.uniqueFilesRead.size} files read`,
528
+ budgetType: 'iterations',
529
+ isHardLimit: false,
530
+ isSoftLimit: true,
531
+ percentUsed: (this.usage.iterations / this.budget.targetIterations) * 100,
532
+ suggestedAction: 'warn',
533
+ injectedPrompt: EXPLORATION_NUDGE_PROMPT(phaseState.uniqueFilesRead.size, phaseState.iterationsInPhase),
534
+ };
535
+ }
536
+ // =========================================================================
537
+ // TEST-FIX CYCLE - Nudge to rethink after 3+ consecutive failures
538
+ // =========================================================================
539
+ if (phaseState.consecutiveTestFailures >= 3) {
540
+ return {
541
+ canContinue: true,
542
+ reason: `${phaseState.consecutiveTestFailures} consecutive test failures`,
543
+ budgetType: 'iterations',
544
+ isHardLimit: false,
545
+ isSoftLimit: true,
546
+ percentUsed: (this.usage.iterations / this.budget.targetIterations) * 100,
547
+ suggestedAction: 'warn',
548
+ injectedPrompt: TEST_FIX_RETHINK_PROMPT(phaseState.consecutiveTestFailures),
549
+ };
550
+ }
551
+ // =========================================================================
552
+ // BASH FAILURE CASCADE - Strong intervention after 3+ consecutive failures
553
+ // =========================================================================
554
+ if (phaseState.consecutiveBashFailures >= 3) {
555
+ const lastBashCommand = this.loopDetector.extractLastBashCommand(this.progress.recentToolCalls);
556
+ return {
557
+ canContinue: true,
558
+ reason: `${phaseState.consecutiveBashFailures} consecutive bash failures`,
559
+ budgetType: 'iterations',
560
+ isHardLimit: false,
561
+ isSoftLimit: true,
562
+ percentUsed: (this.usage.iterations / this.budget.targetIterations) * 100,
563
+ suggestedAction: 'warn',
564
+ injectedPrompt: BASH_FAILURE_CASCADE_PROMPT(phaseState.consecutiveBashFailures, lastBashCommand),
565
+ };
566
+ }
567
+ // =========================================================================
568
+ // SUMMARY LOOP DETECTION - Nudge after 2+ consecutive text-only turns
569
+ // =========================================================================
570
+ if (phaseState.consecutiveTextOnlyTurns >= 2) {
571
+ const nearBudgetLimit = this.usage.iterations >= this.budget.maxIterations - 1;
572
+ if (!nearBudgetLimit) {
573
+ return {
574
+ canContinue: true,
575
+ reason: `${phaseState.consecutiveTextOnlyTurns} consecutive text-only turns (summary loop)`,
576
+ budgetType: 'iterations',
577
+ isHardLimit: false,
578
+ isSoftLimit: true,
579
+ percentUsed: (this.usage.iterations / this.budget.targetIterations) * 100,
580
+ suggestedAction: 'warn',
581
+ injectedPrompt: SUMMARY_LOOP_PROMPT,
582
+ };
583
+ }
584
+ // Near budget limit: skip nudge, let MAX_STEPS_PROMPT handle it next turn
585
+ }
586
+ // =========================================================================
587
+ // PHASE-AWARE BUDGET ALLOCATION (opt-in, used in eval mode)
588
+ // =========================================================================
589
+ if (this.phaseBudget?.enabled) {
590
+ const iterPct = (this.usage.iterations / this.budget.maxIterations) * 100;
591
+ const explorationPct = phaseState.phase === 'exploring'
592
+ ? (phaseState.iterationsInPhase / this.budget.maxIterations) * 100
593
+ : 0;
594
+ // Too much time in exploration
595
+ if (explorationPct > this.phaseBudget.maxExplorationPercent && phaseState.filesModified.size === 0) {
596
+ return {
597
+ canContinue: true,
598
+ reason: `Exploration exceeds ${this.phaseBudget.maxExplorationPercent}% of budget`,
599
+ budgetType: 'iterations',
600
+ isHardLimit: false,
601
+ isSoftLimit: true,
602
+ percentUsed: iterPct,
603
+ suggestedAction: 'warn',
604
+ injectedPrompt: EXPLORATION_BUDGET_EXCEEDED_PROMPT(Math.round(explorationPct)),
605
+ };
606
+ }
607
+ // Only verification-reserve iterations remain
608
+ const remainingPct = 100 - iterPct;
609
+ if (remainingPct <= this.phaseBudget.reservedVerificationPercent
610
+ && phaseState.phase !== 'verifying'
611
+ && phaseState.filesModified.size > 0
612
+ && phaseState.testsRun === 0) {
613
+ return {
614
+ canContinue: true,
615
+ reason: `Only ${Math.round(remainingPct)}% budget remaining, verification needed`,
616
+ budgetType: 'iterations',
617
+ isHardLimit: false,
618
+ isSoftLimit: true,
619
+ percentUsed: iterPct,
620
+ suggestedAction: 'warn',
621
+ injectedPrompt: VERIFICATION_RESERVE_PROMPT,
622
+ };
623
+ }
624
+ }
625
+ // Check soft limits (warnings)
626
+ if (this.usage.tokens >= this.budget.softTokenLimit) {
627
+ const remaining = this.budget.maxTokens - this.usage.tokens;
628
+ const percentUsed = Math.round((this.usage.tokens / this.budget.maxTokens) * 100);
629
+ this.emit({ type: 'budget.warning', budgetType: 'tokens', percentUsed, remaining });
630
+ // Only force text-only in strict mode. In doomloop_only mode,
631
+ // soft limits warn but do not kill the agent.
632
+ const forceTextOnly = strictBudgetEnforcement && percentUsed >= 80;
633
+ return {
634
+ canContinue: true,
635
+ reason: `Token budget at ${percentUsed}%`,
636
+ budgetType: 'tokens',
637
+ isHardLimit: false,
638
+ isSoftLimit: true,
639
+ percentUsed,
640
+ suggestedAction: forceTextOnly ? 'stop' : 'request_extension',
641
+ forceTextOnly,
642
+ budgetMode: forceTextOnly ? 'restricted' : 'warn',
643
+ allowTaskContinuation: true,
644
+ injectedPrompt: forceTextOnly
645
+ ? `\u26a0\ufe0f **BUDGET CRITICAL**: ${percentUsed}% used (${this.usage.tokens.toLocaleString()}/${this.budget.maxTokens.toLocaleString()}). ` +
646
+ `WRAP UP IMMEDIATELY. Return a concise summary. Do NOT call any tools.`
647
+ : `\u26a0\ufe0f **BUDGET WARNING**: You have used ${percentUsed}% of your token budget (${this.usage.tokens.toLocaleString()}/${this.budget.maxTokens.toLocaleString()} tokens). ` +
648
+ `Only ~${remaining.toLocaleString()} tokens remaining. Focus on completing current work. ` +
649
+ `Do not start new explorations.`,
650
+ };
651
+ }
652
+ if (this.usage.cost >= this.budget.softCostLimit) {
653
+ const remaining = this.budget.maxCost - this.usage.cost;
654
+ this.emit({ type: 'budget.warning', budgetType: 'cost', percentUsed: (this.usage.cost / this.budget.maxCost) * 100, remaining });
655
+ return {
656
+ canContinue: true,
657
+ reason: `Cost budget at ${Math.round((this.usage.cost / this.budget.maxCost) * 100)}%`,
658
+ budgetType: 'cost',
659
+ isHardLimit: false,
660
+ isSoftLimit: true,
661
+ percentUsed: (this.usage.cost / this.budget.maxCost) * 100,
662
+ suggestedAction: 'warn',
663
+ };
664
+ }
665
+ // Check if stuck
666
+ if (this.progress.stuckCount >= 3) {
667
+ return {
668
+ canContinue: true,
669
+ reason: `Agent appears stuck (${this.progress.stuckCount} iterations without progress)`,
670
+ budgetType: 'iterations',
671
+ isHardLimit: false,
672
+ isSoftLimit: true,
673
+ percentUsed: (this.usage.iterations / this.budget.targetIterations) * 100,
674
+ suggestedAction: 'request_extension',
675
+ };
676
+ }
677
+ // All good
678
+ return {
679
+ canContinue: true,
680
+ isHardLimit: false,
681
+ isSoftLimit: false,
682
+ percentUsed: Math.max((this.usage.tokens / this.budget.maxTokens) * 100, (this.usage.cost / this.budget.maxCost) * 100, (this.usage.duration / this.budget.maxDuration) * 100),
683
+ budgetMode: 'none',
684
+ allowTaskContinuation: true,
685
+ suggestedAction: 'continue',
686
+ };
687
+ }
688
+ /**
689
+ * Request a budget extension.
690
+ */
691
+ async requestExtension(reason) {
692
+ if (!this.extensionHandler) {
693
+ return false;
694
+ }
695
+ const request = {
696
+ currentUsage: { ...this.usage },
697
+ budget: { ...this.budget },
698
+ reason,
699
+ suggestedExtension: {
700
+ maxTokens: Math.round(this.budget.maxTokens * 1.5),
701
+ maxCost: this.budget.maxCost * 1.5,
702
+ maxDuration: this.budget.maxDuration * 1.5,
703
+ maxIterations: Math.round(this.budget.maxIterations * 1.5),
704
+ },
705
+ };
706
+ this.emit({ type: 'extension.requested', request });
707
+ try {
708
+ const extension = await this.extensionHandler(request);
709
+ if (extension) {
710
+ this.extendBudget(extension);
711
+ this.emit({ type: 'extension.granted', extension });
712
+ return true;
713
+ }
714
+ else {
715
+ this.emit({ type: 'extension.denied', reason: 'User declined' });
716
+ return false;
717
+ }
718
+ }
719
+ catch (err) {
720
+ this.emit({ type: 'extension.denied', reason: String(err) });
721
+ return false;
722
+ }
723
+ }
724
+ /**
725
+ * Extend the budget.
726
+ */
727
+ extendBudget(extension) {
728
+ if (extension.maxTokens)
729
+ this.budget.maxTokens = extension.maxTokens;
730
+ if (extension.maxCost)
731
+ this.budget.maxCost = extension.maxCost;
732
+ if (extension.maxDuration)
733
+ this.budget.maxDuration = extension.maxDuration;
734
+ if (extension.maxIterations)
735
+ this.budget.maxIterations = extension.maxIterations;
736
+ if (extension.softTokenLimit)
737
+ this.budget.softTokenLimit = extension.softTokenLimit;
738
+ if (extension.softCostLimit)
739
+ this.budget.softCostLimit = extension.softCostLimit;
740
+ if (extension.softDurationLimit)
741
+ this.budget.softDurationLimit = extension.softDurationLimit;
742
+ if (extension.targetIterations)
743
+ this.budget.targetIterations = extension.targetIterations;
744
+ }
745
+ /**
746
+ * Get current usage.
747
+ */
748
+ getUsage() {
749
+ this.usage.duration = this.getEffectiveDuration();
750
+ return { ...this.usage };
751
+ }
752
+ /**
753
+ * Get current budget.
754
+ */
755
+ getBudget() {
756
+ return { ...this.budget };
757
+ }
758
+ /**
759
+ * Get a formatted budget status string for context awareness.
760
+ * Used by subagents to understand their remaining resources.
761
+ */
762
+ getBudgetStatusString() {
763
+ const usage = this.getUsage();
764
+ const budget = this.budget;
765
+ const tokenPct = Math.round((usage.tokens / budget.maxTokens) * 100);
766
+ const remainingTokens = budget.maxTokens - usage.tokens;
767
+ const remainingSec = budget.maxDuration === Infinity
768
+ ? Infinity
769
+ : Math.max(0, Math.round((budget.maxDuration - usage.duration) / 1000));
770
+ // Determine urgency level
771
+ let urgency = '';
772
+ if (tokenPct >= 90) {
773
+ urgency = '\u26a0\ufe0f CRITICAL: ';
774
+ }
775
+ else if (tokenPct >= 70) {
776
+ urgency = '\u26a1 WARNING: ';
777
+ }
778
+ const timeStr = remainingSec === Infinity ? 'no time limit' : `~${remainingSec}s remaining`;
779
+ return `${urgency}Budget: ${usage.tokens.toLocaleString()}/${budget.maxTokens.toLocaleString()} tokens (${tokenPct}%), ${timeStr}. ${tokenPct >= 70 ? 'Wrap up soon!' : ''}`.trim();
780
+ }
781
+ /**
782
+ * Check if approaching budget limit (for proactive warnings).
783
+ */
784
+ isApproachingLimit() {
785
+ const usage = this.getUsage();
786
+ const budget = this.budget;
787
+ const tokenPct = (usage.tokens / budget.maxTokens) * 100;
788
+ const durationPct = (usage.duration / budget.maxDuration) * 100;
789
+ if (tokenPct >= 80) {
790
+ return { approaching: true, metric: 'tokens', percentUsed: tokenPct };
791
+ }
792
+ if (durationPct >= 80) {
793
+ return { approaching: true, metric: 'duration', percentUsed: durationPct };
794
+ }
795
+ return { approaching: false, metric: '', percentUsed: Math.max(tokenPct, durationPct) };
796
+ }
797
+ /**
798
+ * Get progress state.
799
+ */
800
+ getProgress() {
801
+ return {
802
+ filesRead: this.progress.filesRead.size,
803
+ filesModified: this.progress.filesModified.size,
804
+ commandsRun: this.progress.commandsRun.length,
805
+ isStuck: this.isStuck(),
806
+ stuckCount: this.progress.stuckCount,
807
+ };
808
+ }
809
+ /**
810
+ * Get actual file paths modified during this session.
811
+ */
812
+ getModifiedFilePaths() {
813
+ return [...this.progress.filesModified];
814
+ }
815
+ /**
816
+ * Get doom loop detection state.
817
+ */
818
+ getLoopState() {
819
+ return this.loopDetector.getState();
820
+ }
821
+ /**
822
+ * Get exploration phase state.
823
+ */
824
+ getPhaseState() {
825
+ return this.phaseTracker.getSnapshot();
826
+ }
827
+ /**
828
+ * Subscribe to events.
829
+ */
830
+ on(listener) {
831
+ this.listeners.push(listener);
832
+ return () => {
833
+ const idx = this.listeners.indexOf(listener);
834
+ if (idx >= 0)
835
+ this.listeners.splice(idx, 1);
836
+ };
837
+ }
838
+ /**
839
+ * Reset usage (start new task).
840
+ */
841
+ reset() {
842
+ this.baseline = 0;
843
+ this.lastInputTokens = 0;
844
+ this.usage = {
845
+ tokens: 0,
846
+ inputTokens: 0,
847
+ outputTokens: 0,
848
+ cost: 0,
849
+ duration: 0,
850
+ iterations: 0,
851
+ toolCalls: 0,
852
+ llmCalls: 0,
853
+ baselineContextTokens: 0,
854
+ cumulativeInputTokens: 0,
855
+ };
856
+ this.progress = {
857
+ filesRead: new Set(),
858
+ filesModified: new Set(),
859
+ commandsRun: [],
860
+ recentToolCalls: [],
861
+ lastMeaningfulProgress: Date.now(),
862
+ stuckCount: 0,
863
+ };
864
+ // Reset extracted modules (preserve tuning thresholds)
865
+ this.loopDetector.reset(this.budget.tuning);
866
+ this.phaseTracker.reset();
867
+ this.startTime = Date.now();
868
+ this.pausedDuration = 0;
869
+ this.pauseStart = null;
870
+ this.originalMaxIterations = null;
871
+ }
872
+ // -------------------------------------------------------------------------
873
+ // PRIVATE METHODS
874
+ // -------------------------------------------------------------------------
875
+ emit(event) {
876
+ for (const listener of this.listeners) {
877
+ try {
878
+ listener(event);
879
+ }
880
+ catch {
881
+ // Ignore listener errors
882
+ }
883
+ }
884
+ }
885
+ isStuck() {
886
+ // Delegate repetition check to loop detector
887
+ if (this.loopDetector.isStuckByRepetition(this.progress.recentToolCalls)) {
888
+ return true;
889
+ }
890
+ // Check for no progress in time
891
+ const timeSinceProgress = Date.now() - this.progress.lastMeaningfulProgress;
892
+ if (timeSinceProgress > 60000 && this.usage.iterations > 5) {
893
+ return true; // No progress for 1 minute with 5+ iterations
894
+ }
895
+ return false;
896
+ }
897
+ }
898
+ // =============================================================================
899
+ // FACTORY
900
+ // =============================================================================
901
+ /**
902
+ * Create an economics manager with optional budget configuration.
903
+ */
904
+ export function createEconomicsManager(budget) {
905
+ return new ExecutionEconomicsManager(budget);
906
+ }
907
+ // =============================================================================
908
+ // PRESET BUDGETS
909
+ // =============================================================================
910
+ /**
911
+ * Quick task budget - for simple queries.
912
+ */
913
+ export const QUICK_BUDGET = {
914
+ maxTokens: 50000,
915
+ maxCost: 0.10,
916
+ maxDuration: 60000, // 1 minute
917
+ targetIterations: 5,
918
+ maxIterations: 20,
919
+ };
920
+ /**
921
+ * Standard task budget - for typical development tasks.
922
+ */
923
+ export const STANDARD_BUDGET = {
924
+ maxTokens: 200000,
925
+ maxCost: 0.50,
926
+ maxDuration: 600000, // 10 minutes (supports subagent workflows)
927
+ targetIterations: 20,
928
+ maxIterations: 50,
929
+ };
930
+ /**
931
+ * Subagent budget - constrained budget for spawned subagents.
932
+ * Smaller than STANDARD to ensure subagents don't consume all parent's resources.
933
+ * The 100k token limit gives subagents room to work while leaving budget for the parent
934
+ * and other parallel subagents.
935
+ */
936
+ export const SUBAGENT_BUDGET = {
937
+ maxTokens: 250000, // 250k tokens -- coders need room for explore + code
938
+ softTokenLimit: 180000, // Warn at 180k
939
+ maxCost: 0.75, // Increased ceiling for heavier workloads
940
+ maxDuration: 480000, // 8 minutes
941
+ softDurationLimit: 420000, // Warn at 7 minutes
942
+ targetIterations: 30,
943
+ maxIterations: 60,
944
+ };
945
+ /**
946
+ * Large task budget - for complex multi-step tasks.
947
+ */
948
+ export const LARGE_BUDGET = {
949
+ maxTokens: 500000,
950
+ maxCost: 2.00,
951
+ maxDuration: 900000, // 15 minutes
952
+ targetIterations: 50,
953
+ maxIterations: 200,
954
+ };
955
+ /**
956
+ * TUI root agent budget - no time limit, high iteration cap.
957
+ * The TUI root agent must be able to run as long as needed (swarm tasks,
958
+ * multi-step workflows). Duration is effectively unlimited; token/cost
959
+ * limits still apply as a safety net.
960
+ */
961
+ export const TUI_ROOT_BUDGET = {
962
+ enforcementMode: 'doomloop_only',
963
+ maxTokens: 500000,
964
+ softTokenLimit: 400000,
965
+ maxCost: 5.00,
966
+ softCostLimit: 4.00,
967
+ maxDuration: Infinity, // No time limit -- run as long as tasks remain
968
+ softDurationLimit: Infinity,
969
+ targetIterations: 100,
970
+ maxIterations: 500,
971
+ };
972
+ /**
973
+ * Unlimited budget - no limits (use with caution).
974
+ */
975
+ export const UNLIMITED_BUDGET = {
976
+ maxTokens: Infinity,
977
+ maxCost: Infinity,
978
+ maxDuration: Infinity,
979
+ targetIterations: Infinity,
980
+ maxIterations: Infinity,
981
+ };
982
+ /**
983
+ * Swarm worker budget - tight constraints for small specialist models.
984
+ * Each worker gets a small slice of the total swarm budget.
985
+ */
986
+ export const SWARM_WORKER_BUDGET = {
987
+ maxTokens: 30000,
988
+ softTokenLimit: 25000,
989
+ maxCost: 0.08,
990
+ maxDuration: 180000, // 3 minutes
991
+ softDurationLimit: 150000, // Warn at 2.5 min
992
+ targetIterations: 15,
993
+ maxIterations: 25,
994
+ };
995
+ /**
996
+ * Swarm orchestrator budget - moderate budget for decomposition and quality gates.
997
+ */
998
+ export const SWARM_ORCHESTRATOR_BUDGET = {
999
+ maxTokens: 100000,
1000
+ softTokenLimit: 80000,
1001
+ maxCost: 0.25,
1002
+ maxDuration: 300000, // 5 minutes
1003
+ softDurationLimit: 240000,
1004
+ targetIterations: 30,
1005
+ maxIterations: 50,
1006
+ };
1007
+ //# sourceMappingURL=economics.js.map