attocode 0.2.2 → 0.2.4

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 (382) hide show
  1. package/CHANGELOG.md +169 -3
  2. package/README.md +65 -5
  3. package/dist/src/adapters.d.ts.map +1 -1
  4. package/dist/src/adapters.js +15 -11
  5. package/dist/src/adapters.js.map +1 -1
  6. package/dist/src/agent.d.ts +44 -98
  7. package/dist/src/agent.d.ts.map +1 -1
  8. package/dist/src/agent.js +716 -2648
  9. package/dist/src/agent.js.map +1 -1
  10. package/dist/src/cli.d.ts.map +1 -1
  11. package/dist/src/cli.js +25 -3
  12. package/dist/src/cli.js.map +1 -1
  13. package/dist/src/commands/handler.d.ts.map +1 -1
  14. package/dist/src/commands/handler.js +11 -3
  15. package/dist/src/commands/handler.js.map +1 -1
  16. package/dist/src/commands/init-commands.d.ts.map +1 -1
  17. package/dist/src/commands/init-commands.js +16 -1
  18. package/dist/src/commands/init-commands.js.map +1 -1
  19. package/dist/src/commands/init.d.ts.map +1 -1
  20. package/dist/src/commands/init.js +31 -0
  21. package/dist/src/commands/init.js.map +1 -1
  22. package/dist/src/config/base-types.d.ts +45 -0
  23. package/dist/src/config/base-types.d.ts.map +1 -0
  24. package/dist/src/config/base-types.js +9 -0
  25. package/dist/src/config/base-types.js.map +1 -0
  26. package/dist/src/config/config-manager.d.ts +35 -0
  27. package/dist/src/config/config-manager.d.ts.map +1 -0
  28. package/dist/src/config/config-manager.js +108 -0
  29. package/dist/src/config/config-manager.js.map +1 -0
  30. package/dist/src/config/index.d.ts +4 -0
  31. package/dist/src/config/index.d.ts.map +1 -0
  32. package/dist/src/config/index.js +3 -0
  33. package/dist/src/config/index.js.map +1 -0
  34. package/dist/src/config/schema.d.ts +1546 -0
  35. package/dist/src/config/schema.d.ts.map +1 -0
  36. package/dist/src/config/schema.js +268 -0
  37. package/dist/src/config/schema.js.map +1 -0
  38. package/dist/src/config.d.ts +4 -1
  39. package/dist/src/config.d.ts.map +1 -1
  40. package/dist/src/config.js +8 -12
  41. package/dist/src/config.js.map +1 -1
  42. package/dist/src/core/agent-state-machine.d.ts +131 -0
  43. package/dist/src/core/agent-state-machine.d.ts.map +1 -0
  44. package/dist/src/core/agent-state-machine.js +302 -0
  45. package/dist/src/core/agent-state-machine.js.map +1 -0
  46. package/dist/src/core/base-manager.d.ts +79 -0
  47. package/dist/src/core/base-manager.d.ts.map +1 -0
  48. package/dist/src/core/base-manager.js +170 -0
  49. package/dist/src/core/base-manager.js.map +1 -0
  50. package/dist/src/core/completion-analyzer.d.ts +15 -0
  51. package/dist/src/core/completion-analyzer.d.ts.map +1 -0
  52. package/dist/src/core/completion-analyzer.js +53 -0
  53. package/dist/src/core/completion-analyzer.js.map +1 -0
  54. package/dist/src/core/execution-loop.d.ts +46 -0
  55. package/dist/src/core/execution-loop.d.ts.map +1 -0
  56. package/dist/src/core/execution-loop.js +1258 -0
  57. package/dist/src/core/execution-loop.js.map +1 -0
  58. package/dist/src/core/index.d.ts +7 -0
  59. package/dist/src/core/index.d.ts.map +1 -1
  60. package/dist/src/core/index.js +9 -0
  61. package/dist/src/core/index.js.map +1 -1
  62. package/dist/src/core/process-handlers.d.ts.map +1 -1
  63. package/dist/src/core/process-handlers.js +14 -0
  64. package/dist/src/core/process-handlers.js.map +1 -1
  65. package/dist/src/core/protocol/types.d.ts +4 -4
  66. package/dist/src/core/response-handler.d.ts +16 -0
  67. package/dist/src/core/response-handler.d.ts.map +1 -0
  68. package/dist/src/core/response-handler.js +234 -0
  69. package/dist/src/core/response-handler.js.map +1 -0
  70. package/dist/src/core/subagent-spawner.d.ts +43 -0
  71. package/dist/src/core/subagent-spawner.d.ts.map +1 -0
  72. package/dist/src/core/subagent-spawner.js +966 -0
  73. package/dist/src/core/subagent-spawner.js.map +1 -0
  74. package/dist/src/core/tool-executor.d.ts +59 -0
  75. package/dist/src/core/tool-executor.d.ts.map +1 -0
  76. package/dist/src/core/tool-executor.js +677 -0
  77. package/dist/src/core/tool-executor.js.map +1 -0
  78. package/dist/src/core/types.d.ts +133 -0
  79. package/dist/src/core/types.d.ts.map +1 -0
  80. package/dist/src/core/types.js +12 -0
  81. package/dist/src/core/types.js.map +1 -0
  82. package/dist/src/defaults.d.ts +8 -3
  83. package/dist/src/defaults.d.ts.map +1 -1
  84. package/dist/src/defaults.js +65 -3
  85. package/dist/src/defaults.js.map +1 -1
  86. package/dist/src/integrations/agent-registry.d.ts +11 -0
  87. package/dist/src/integrations/agent-registry.d.ts.map +1 -1
  88. package/dist/src/integrations/agent-registry.js.map +1 -1
  89. package/dist/src/integrations/auto-compaction.d.ts.map +1 -1
  90. package/dist/src/integrations/auto-compaction.js +8 -3
  91. package/dist/src/integrations/auto-compaction.js.map +1 -1
  92. package/dist/src/integrations/bash-policy.d.ts +33 -0
  93. package/dist/src/integrations/bash-policy.d.ts.map +1 -0
  94. package/dist/src/integrations/bash-policy.js +142 -0
  95. package/dist/src/integrations/bash-policy.js.map +1 -0
  96. package/dist/src/integrations/budget-pool.d.ts +7 -0
  97. package/dist/src/integrations/budget-pool.d.ts.map +1 -1
  98. package/dist/src/integrations/budget-pool.js +43 -0
  99. package/dist/src/integrations/budget-pool.js.map +1 -1
  100. package/dist/src/integrations/codebase-ast.d.ts +52 -0
  101. package/dist/src/integrations/codebase-ast.d.ts.map +1 -0
  102. package/dist/src/integrations/codebase-ast.js +457 -0
  103. package/dist/src/integrations/codebase-ast.js.map +1 -0
  104. package/dist/src/integrations/codebase-context.d.ts +23 -0
  105. package/dist/src/integrations/codebase-context.d.ts.map +1 -1
  106. package/dist/src/integrations/codebase-context.js +230 -17
  107. package/dist/src/integrations/codebase-context.js.map +1 -1
  108. package/dist/src/integrations/compaction.d.ts.map +1 -1
  109. package/dist/src/integrations/compaction.js +14 -6
  110. package/dist/src/integrations/compaction.js.map +1 -1
  111. package/dist/src/integrations/context-engineering.d.ts +8 -0
  112. package/dist/src/integrations/context-engineering.d.ts.map +1 -1
  113. package/dist/src/integrations/context-engineering.js +19 -0
  114. package/dist/src/integrations/context-engineering.js.map +1 -1
  115. package/dist/src/integrations/delegation-protocol.js +2 -2
  116. package/dist/src/integrations/delegation-protocol.js.map +1 -1
  117. package/dist/src/integrations/economics.d.ts +67 -1
  118. package/dist/src/integrations/economics.d.ts.map +1 -1
  119. package/dist/src/integrations/economics.js +328 -33
  120. package/dist/src/integrations/economics.js.map +1 -1
  121. package/dist/src/integrations/edit-validator.d.ts +30 -0
  122. package/dist/src/integrations/edit-validator.d.ts.map +1 -0
  123. package/dist/src/integrations/edit-validator.js +85 -0
  124. package/dist/src/integrations/edit-validator.js.map +1 -0
  125. package/dist/src/integrations/file-cache.d.ts +7 -0
  126. package/dist/src/integrations/file-cache.d.ts.map +1 -1
  127. package/dist/src/integrations/file-cache.js +54 -0
  128. package/dist/src/integrations/file-cache.js.map +1 -1
  129. package/dist/src/integrations/health-check.d.ts.map +1 -1
  130. package/dist/src/integrations/health-check.js +3 -2
  131. package/dist/src/integrations/health-check.js.map +1 -1
  132. package/dist/src/integrations/hierarchical-config.d.ts +3 -0
  133. package/dist/src/integrations/hierarchical-config.d.ts.map +1 -1
  134. package/dist/src/integrations/hierarchical-config.js +20 -0
  135. package/dist/src/integrations/hierarchical-config.js.map +1 -1
  136. package/dist/src/integrations/hooks.d.ts +2 -0
  137. package/dist/src/integrations/hooks.d.ts.map +1 -1
  138. package/dist/src/integrations/hooks.js +99 -15
  139. package/dist/src/integrations/hooks.js.map +1 -1
  140. package/dist/src/integrations/index.d.ts +10 -1
  141. package/dist/src/integrations/index.d.ts.map +1 -1
  142. package/dist/src/integrations/index.js +12 -2
  143. package/dist/src/integrations/index.js.map +1 -1
  144. package/dist/src/integrations/logger.d.ts +104 -0
  145. package/dist/src/integrations/logger.d.ts.map +1 -0
  146. package/dist/src/integrations/logger.js +219 -0
  147. package/dist/src/integrations/logger.js.map +1 -0
  148. package/dist/src/integrations/lsp.d.ts.map +1 -1
  149. package/dist/src/integrations/lsp.js +5 -4
  150. package/dist/src/integrations/lsp.js.map +1 -1
  151. package/dist/src/integrations/mcp-client.d.ts.map +1 -1
  152. package/dist/src/integrations/mcp-client.js +8 -7
  153. package/dist/src/integrations/mcp-client.js.map +1 -1
  154. package/dist/src/integrations/observability.d.ts.map +1 -1
  155. package/dist/src/integrations/observability.js +5 -4
  156. package/dist/src/integrations/observability.js.map +1 -1
  157. package/dist/src/integrations/openrouter-pricing.d.ts.map +1 -1
  158. package/dist/src/integrations/openrouter-pricing.js +4 -3
  159. package/dist/src/integrations/openrouter-pricing.js.map +1 -1
  160. package/dist/src/integrations/persistence.d.ts.map +1 -1
  161. package/dist/src/integrations/persistence.js +5 -4
  162. package/dist/src/integrations/persistence.js.map +1 -1
  163. package/dist/src/integrations/planning.d.ts.map +1 -1
  164. package/dist/src/integrations/planning.js +5 -4
  165. package/dist/src/integrations/planning.js.map +1 -1
  166. package/dist/src/integrations/policy-engine.d.ts +55 -0
  167. package/dist/src/integrations/policy-engine.d.ts.map +1 -0
  168. package/dist/src/integrations/policy-engine.js +247 -0
  169. package/dist/src/integrations/policy-engine.js.map +1 -0
  170. package/dist/src/integrations/retry.d.ts +1 -0
  171. package/dist/src/integrations/retry.d.ts.map +1 -1
  172. package/dist/src/integrations/retry.js.map +1 -1
  173. package/dist/src/integrations/routing.d.ts.map +1 -1
  174. package/dist/src/integrations/routing.js +2 -1
  175. package/dist/src/integrations/routing.js.map +1 -1
  176. package/dist/src/integrations/safety.d.ts +5 -4
  177. package/dist/src/integrations/safety.d.ts.map +1 -1
  178. package/dist/src/integrations/safety.js +45 -20
  179. package/dist/src/integrations/safety.js.map +1 -1
  180. package/dist/src/integrations/sandbox/basic.d.ts +7 -0
  181. package/dist/src/integrations/sandbox/basic.d.ts.map +1 -1
  182. package/dist/src/integrations/sandbox/basic.js +27 -2
  183. package/dist/src/integrations/sandbox/basic.js.map +1 -1
  184. package/dist/src/integrations/sandbox/docker.d.ts.map +1 -1
  185. package/dist/src/integrations/sandbox/docker.js +2 -1
  186. package/dist/src/integrations/sandbox/docker.js.map +1 -1
  187. package/dist/src/integrations/sandbox/index.d.ts +6 -0
  188. package/dist/src/integrations/sandbox/index.d.ts.map +1 -1
  189. package/dist/src/integrations/sandbox/index.js +8 -4
  190. package/dist/src/integrations/sandbox/index.js.map +1 -1
  191. package/dist/src/integrations/sandbox/landlock.d.ts.map +1 -1
  192. package/dist/src/integrations/sandbox/landlock.js +3 -0
  193. package/dist/src/integrations/sandbox/landlock.js.map +1 -1
  194. package/dist/src/integrations/self-improvement.d.ts.map +1 -1
  195. package/dist/src/integrations/self-improvement.js +12 -0
  196. package/dist/src/integrations/self-improvement.js.map +1 -1
  197. package/dist/src/integrations/session-store.d.ts +1 -0
  198. package/dist/src/integrations/session-store.d.ts.map +1 -1
  199. package/dist/src/integrations/session-store.js +1 -0
  200. package/dist/src/integrations/session-store.js.map +1 -1
  201. package/dist/src/integrations/shared-blackboard.d.ts +3 -0
  202. package/dist/src/integrations/shared-blackboard.d.ts.map +1 -1
  203. package/dist/src/integrations/shared-blackboard.js +47 -0
  204. package/dist/src/integrations/shared-blackboard.js.map +1 -1
  205. package/dist/src/integrations/smart-decomposer.d.ts +45 -1
  206. package/dist/src/integrations/smart-decomposer.d.ts.map +1 -1
  207. package/dist/src/integrations/smart-decomposer.js +486 -30
  208. package/dist/src/integrations/smart-decomposer.js.map +1 -1
  209. package/dist/src/integrations/sqlite-store.d.ts +2 -0
  210. package/dist/src/integrations/sqlite-store.d.ts.map +1 -1
  211. package/dist/src/integrations/sqlite-store.js +18 -6
  212. package/dist/src/integrations/sqlite-store.js.map +1 -1
  213. package/dist/src/integrations/swarm/failure-classifier.d.ts +11 -0
  214. package/dist/src/integrations/swarm/failure-classifier.d.ts.map +1 -0
  215. package/dist/src/integrations/swarm/failure-classifier.js +95 -0
  216. package/dist/src/integrations/swarm/failure-classifier.js.map +1 -0
  217. package/dist/src/integrations/swarm/index.d.ts +1 -1
  218. package/dist/src/integrations/swarm/index.d.ts.map +1 -1
  219. package/dist/src/integrations/swarm/index.js.map +1 -1
  220. package/dist/src/integrations/swarm/model-selector.d.ts +15 -0
  221. package/dist/src/integrations/swarm/model-selector.d.ts.map +1 -1
  222. package/dist/src/integrations/swarm/model-selector.js +100 -20
  223. package/dist/src/integrations/swarm/model-selector.js.map +1 -1
  224. package/dist/src/integrations/swarm/swarm-budget.d.ts +4 -0
  225. package/dist/src/integrations/swarm/swarm-budget.d.ts.map +1 -1
  226. package/dist/src/integrations/swarm/swarm-budget.js +6 -0
  227. package/dist/src/integrations/swarm/swarm-budget.js.map +1 -1
  228. package/dist/src/integrations/swarm/swarm-config-loader.d.ts +8 -0
  229. package/dist/src/integrations/swarm/swarm-config-loader.d.ts.map +1 -1
  230. package/dist/src/integrations/swarm/swarm-config-loader.js +249 -7
  231. package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -1
  232. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts +86 -1
  233. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts.map +1 -1
  234. package/dist/src/integrations/swarm/swarm-event-bridge.js +207 -23
  235. package/dist/src/integrations/swarm/swarm-event-bridge.js.map +1 -1
  236. package/dist/src/integrations/swarm/swarm-events.d.ts +58 -1
  237. package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -1
  238. package/dist/src/integrations/swarm/swarm-events.js +22 -5
  239. package/dist/src/integrations/swarm/swarm-events.js.map +1 -1
  240. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +147 -8
  241. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -1
  242. package/dist/src/integrations/swarm/swarm-orchestrator.js +2179 -132
  243. package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -1
  244. package/dist/src/integrations/swarm/swarm-quality-gate.d.ts +83 -2
  245. package/dist/src/integrations/swarm/swarm-quality-gate.d.ts.map +1 -1
  246. package/dist/src/integrations/swarm/swarm-quality-gate.js +278 -19
  247. package/dist/src/integrations/swarm/swarm-quality-gate.js.map +1 -1
  248. package/dist/src/integrations/swarm/swarm-state-store.d.ts +4 -1
  249. package/dist/src/integrations/swarm/swarm-state-store.d.ts.map +1 -1
  250. package/dist/src/integrations/swarm/swarm-state-store.js +8 -1
  251. package/dist/src/integrations/swarm/swarm-state-store.js.map +1 -1
  252. package/dist/src/integrations/swarm/task-queue.d.ts +54 -0
  253. package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -1
  254. package/dist/src/integrations/swarm/task-queue.js +310 -12
  255. package/dist/src/integrations/swarm/task-queue.js.map +1 -1
  256. package/dist/src/integrations/swarm/types.d.ts +251 -13
  257. package/dist/src/integrations/swarm/types.d.ts.map +1 -1
  258. package/dist/src/integrations/swarm/types.js +70 -8
  259. package/dist/src/integrations/swarm/types.js.map +1 -1
  260. package/dist/src/integrations/swarm/worker-pool.d.ts +21 -4
  261. package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -1
  262. package/dist/src/integrations/swarm/worker-pool.js +223 -44
  263. package/dist/src/integrations/swarm/worker-pool.js.map +1 -1
  264. package/dist/src/integrations/task-manager.d.ts +33 -1
  265. package/dist/src/integrations/task-manager.d.ts.map +1 -1
  266. package/dist/src/integrations/task-manager.js +78 -4
  267. package/dist/src/integrations/task-manager.js.map +1 -1
  268. package/dist/src/integrations/tool-recommendation.d.ts +7 -4
  269. package/dist/src/integrations/tool-recommendation.d.ts.map +1 -1
  270. package/dist/src/integrations/tool-recommendation.js +58 -5
  271. package/dist/src/integrations/tool-recommendation.js.map +1 -1
  272. package/dist/src/integrations/work-log.js +4 -4
  273. package/dist/src/integrations/work-log.js.map +1 -1
  274. package/dist/src/main.js +106 -30
  275. package/dist/src/main.js.map +1 -1
  276. package/dist/src/modes/repl.d.ts.map +1 -1
  277. package/dist/src/modes/repl.js +50 -12
  278. package/dist/src/modes/repl.js.map +1 -1
  279. package/dist/src/modes/tui.d.ts.map +1 -1
  280. package/dist/src/modes/tui.js +41 -6
  281. package/dist/src/modes/tui.js.map +1 -1
  282. package/dist/src/modes.d.ts.map +1 -1
  283. package/dist/src/modes.js +4 -27
  284. package/dist/src/modes.js.map +1 -1
  285. package/dist/src/observability/tracer.d.ts.map +1 -1
  286. package/dist/src/observability/tracer.js +2 -1
  287. package/dist/src/observability/tracer.js.map +1 -1
  288. package/dist/src/persistence/schema.d.ts.map +1 -1
  289. package/dist/src/persistence/schema.js +11 -0
  290. package/dist/src/persistence/schema.js.map +1 -1
  291. package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
  292. package/dist/src/providers/adapters/anthropic.js +3 -2
  293. package/dist/src/providers/adapters/anthropic.js.map +1 -1
  294. package/dist/src/providers/adapters/openai.d.ts.map +1 -1
  295. package/dist/src/providers/adapters/openai.js +3 -2
  296. package/dist/src/providers/adapters/openai.js.map +1 -1
  297. package/dist/src/providers/adapters/openrouter.d.ts.map +1 -1
  298. package/dist/src/providers/adapters/openrouter.js +11 -11
  299. package/dist/src/providers/adapters/openrouter.js.map +1 -1
  300. package/dist/src/providers/circuit-breaker.d.ts +1 -0
  301. package/dist/src/providers/circuit-breaker.d.ts.map +1 -1
  302. package/dist/src/providers/circuit-breaker.js.map +1 -1
  303. package/dist/src/providers/provider.d.ts.map +1 -1
  304. package/dist/src/providers/provider.js +2 -1
  305. package/dist/src/providers/provider.js.map +1 -1
  306. package/dist/src/providers/resilient-provider.d.ts.map +1 -1
  307. package/dist/src/providers/resilient-provider.js +2 -1
  308. package/dist/src/providers/resilient-provider.js.map +1 -1
  309. package/dist/src/session-picker.d.ts.map +1 -1
  310. package/dist/src/session-picker.js +40 -5
  311. package/dist/src/session-picker.js.map +1 -1
  312. package/dist/src/shared/budget-tracker.d.ts +65 -0
  313. package/dist/src/shared/budget-tracker.d.ts.map +1 -0
  314. package/dist/src/shared/budget-tracker.js +128 -0
  315. package/dist/src/shared/budget-tracker.js.map +1 -0
  316. package/dist/src/shared/context-engine.d.ts +64 -0
  317. package/dist/src/shared/context-engine.d.ts.map +1 -0
  318. package/dist/src/shared/context-engine.js +117 -0
  319. package/dist/src/shared/context-engine.js.map +1 -0
  320. package/dist/src/shared/index.d.ts +12 -0
  321. package/dist/src/shared/index.d.ts.map +1 -0
  322. package/dist/src/shared/index.js +12 -0
  323. package/dist/src/shared/index.js.map +1 -0
  324. package/dist/src/shared/persistence.d.ts +57 -0
  325. package/dist/src/shared/persistence.d.ts.map +1 -0
  326. package/dist/src/shared/persistence.js +168 -0
  327. package/dist/src/shared/persistence.js.map +1 -0
  328. package/dist/src/shared/shared-context-state.d.ts +89 -0
  329. package/dist/src/shared/shared-context-state.d.ts.map +1 -0
  330. package/dist/src/shared/shared-context-state.js +175 -0
  331. package/dist/src/shared/shared-context-state.js.map +1 -0
  332. package/dist/src/shared/shared-economics-state.d.ts +61 -0
  333. package/dist/src/shared/shared-economics-state.d.ts.map +1 -0
  334. package/dist/src/shared/shared-economics-state.js +100 -0
  335. package/dist/src/shared/shared-economics-state.js.map +1 -0
  336. package/dist/src/tools/agent.d.ts.map +1 -1
  337. package/dist/src/tools/agent.js +11 -2
  338. package/dist/src/tools/agent.js.map +1 -1
  339. package/dist/src/tools/bash.d.ts +1 -1
  340. package/dist/src/tools/bash.d.ts.map +1 -1
  341. package/dist/src/tools/bash.js +2 -1
  342. package/dist/src/tools/bash.js.map +1 -1
  343. package/dist/src/tools/coercion.d.ts +6 -0
  344. package/dist/src/tools/coercion.d.ts.map +1 -1
  345. package/dist/src/tools/coercion.js +13 -0
  346. package/dist/src/tools/coercion.js.map +1 -1
  347. package/dist/src/tools/file.d.ts +5 -5
  348. package/dist/src/tools/file.js +2 -2
  349. package/dist/src/tools/file.js.map +1 -1
  350. package/dist/src/tools/permission.d.ts.map +1 -1
  351. package/dist/src/tools/permission.js +10 -116
  352. package/dist/src/tools/permission.js.map +1 -1
  353. package/dist/src/tools/types.d.ts +1 -0
  354. package/dist/src/tools/types.d.ts.map +1 -1
  355. package/dist/src/tools/types.js.map +1 -1
  356. package/dist/src/tracing/trace-collector.d.ts +292 -0
  357. package/dist/src/tracing/trace-collector.d.ts.map +1 -1
  358. package/dist/src/tracing/trace-collector.js +249 -5
  359. package/dist/src/tracing/trace-collector.js.map +1 -1
  360. package/dist/src/tracing/types.d.ts +200 -1
  361. package/dist/src/tracing/types.d.ts.map +1 -1
  362. package/dist/src/tracing/types.js.map +1 -1
  363. package/dist/src/tricks/failure-evidence.d.ts.map +1 -1
  364. package/dist/src/tricks/failure-evidence.js +2 -1
  365. package/dist/src/tricks/failure-evidence.js.map +1 -1
  366. package/dist/src/tui/app.d.ts +13 -0
  367. package/dist/src/tui/app.d.ts.map +1 -1
  368. package/dist/src/tui/app.js +162 -19
  369. package/dist/src/tui/app.js.map +1 -1
  370. package/dist/src/tui/components/ErrorBoundary.d.ts.map +1 -1
  371. package/dist/src/tui/components/ErrorBoundary.js +3 -2
  372. package/dist/src/tui/components/ErrorBoundary.js.map +1 -1
  373. package/dist/src/tui/event-display.d.ts.map +1 -1
  374. package/dist/src/tui/event-display.js +36 -62
  375. package/dist/src/tui/event-display.js.map +1 -1
  376. package/dist/src/tui/index.d.ts +4 -0
  377. package/dist/src/tui/index.d.ts.map +1 -1
  378. package/dist/src/tui/index.js +17 -0
  379. package/dist/src/tui/index.js.map +1 -1
  380. package/dist/src/types.d.ts +214 -1
  381. package/dist/src/types.d.ts.map +1 -1
  382. package/package.json +18 -3
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Phase 2.2: Agent State Machine
3
+ *
4
+ * Formalizes the phase tracking that previously lived in economics.ts into a
5
+ * proper state machine with typed transitions, event emission, and per-phase
6
+ * metrics. Testable independently of the economics system.
7
+ *
8
+ * Phases:
9
+ * - exploring: Reading files, searching code, understanding the problem
10
+ * - planning: Creating or editing a plan
11
+ * - acting: Writing/editing files, running commands
12
+ * - verifying: Running tests, checking results
13
+ *
14
+ * Valid transitions:
15
+ * exploring → planning | acting
16
+ * planning → acting | exploring
17
+ * acting → verifying | exploring
18
+ * verifying → acting | exploring
19
+ */
20
+ // =============================================================================
21
+ // VALID TRANSITIONS
22
+ // =============================================================================
23
+ /**
24
+ * Allowed phase transitions. Each phase lists the phases it can transition to.
25
+ * Invalid transitions are rejected with a warning.
26
+ */
27
+ const VALID_TRANSITIONS = {
28
+ exploring: new Set(['planning', 'acting']),
29
+ planning: new Set(['acting', 'exploring']),
30
+ acting: new Set(['verifying', 'exploring']),
31
+ verifying: new Set(['acting', 'exploring']),
32
+ };
33
+ // =============================================================================
34
+ // AGENT STATE MACHINE
35
+ // =============================================================================
36
+ export class AgentStateMachine {
37
+ currentPhase;
38
+ phaseEnteredAt;
39
+ phaseIterations = 0;
40
+ phaseToolCalls = 0;
41
+ listeners = [];
42
+ transitions = [];
43
+ // Per-phase tracking (mirrors economics PhaseState for backward compat)
44
+ uniqueFilesRead = new Set();
45
+ uniqueSearches = new Set();
46
+ filesModified = new Set();
47
+ testsRun = 0;
48
+ shouldTransition = false;
49
+ recentNewFiles = 0;
50
+ lastTestPassed = null;
51
+ consecutiveTestFailures = 0;
52
+ inTestFixCycle = false;
53
+ consecutiveBashFailures = 0;
54
+ // Accumulated metrics per phase (for history)
55
+ phaseHistory = [];
56
+ // Tuning thresholds
57
+ explorationFileThreshold;
58
+ explorationIterThreshold;
59
+ constructor(options) {
60
+ this.currentPhase = options?.initialPhase ?? 'exploring';
61
+ this.phaseEnteredAt = Date.now();
62
+ this.explorationFileThreshold = options?.explorationFileThreshold ?? 10;
63
+ this.explorationIterThreshold = options?.explorationIterThreshold ?? 5;
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // PUBLIC API
67
+ // ---------------------------------------------------------------------------
68
+ /** Get the current phase */
69
+ getPhase() {
70
+ return this.currentPhase;
71
+ }
72
+ /** Get a snapshot of the current phase state (backward-compatible with economics) */
73
+ getPhaseSnapshot() {
74
+ return {
75
+ phase: this.currentPhase,
76
+ iterationsInPhase: this.phaseIterations,
77
+ uniqueFilesRead: new Set(this.uniqueFilesRead),
78
+ uniqueSearches: new Set(this.uniqueSearches),
79
+ filesModified: new Set(this.filesModified),
80
+ testsRun: this.testsRun,
81
+ shouldTransition: this.shouldTransition,
82
+ recentNewFiles: this.recentNewFiles,
83
+ lastTestPassed: this.lastTestPassed,
84
+ consecutiveTestFailures: this.consecutiveTestFailures,
85
+ inTestFixCycle: this.inTestFixCycle,
86
+ consecutiveBashFailures: this.consecutiveBashFailures,
87
+ };
88
+ }
89
+ /** Get metrics for the current phase */
90
+ getCurrentPhaseMetrics() {
91
+ return {
92
+ phase: this.currentPhase,
93
+ iterations: this.phaseIterations,
94
+ enteredAt: this.phaseEnteredAt,
95
+ duration: Date.now() - this.phaseEnteredAt,
96
+ filesRead: this.uniqueFilesRead.size,
97
+ filesModified: this.filesModified.size,
98
+ toolCalls: this.phaseToolCalls,
99
+ };
100
+ }
101
+ /** Get all phase transition history */
102
+ getTransitions() {
103
+ return this.transitions;
104
+ }
105
+ /** Get accumulated phase history */
106
+ getPhaseHistory() {
107
+ return this.phaseHistory;
108
+ }
109
+ /**
110
+ * Attempt a phase transition.
111
+ * Returns true if transition was valid and executed, false if rejected.
112
+ */
113
+ transition(to, reason) {
114
+ if (to === this.currentPhase)
115
+ return false;
116
+ const validTargets = VALID_TRANSITIONS[this.currentPhase];
117
+ if (!validTargets.has(to)) {
118
+ return false;
119
+ }
120
+ const fromMetrics = this.getCurrentPhaseMetrics();
121
+ fromMetrics.duration = Date.now() - this.phaseEnteredAt;
122
+ const transition = {
123
+ from: this.currentPhase,
124
+ to,
125
+ reason,
126
+ timestamp: Date.now(),
127
+ fromMetrics,
128
+ };
129
+ // Record history
130
+ this.phaseHistory.push({ ...fromMetrics });
131
+ this.transitions.push(transition);
132
+ // Reset phase-local counters
133
+ this.currentPhase = to;
134
+ this.phaseEnteredAt = Date.now();
135
+ this.phaseIterations = 0;
136
+ this.phaseToolCalls = 0;
137
+ this.recentNewFiles = 0;
138
+ this.shouldTransition = false;
139
+ // Emit event
140
+ this.emit({ type: 'phase.changed', transition });
141
+ return true;
142
+ }
143
+ /**
144
+ * Record a tool call and update phase state.
145
+ * This is the primary input signal for the state machine.
146
+ */
147
+ recordToolCall(toolName, args, result) {
148
+ this.phaseIterations++;
149
+ this.phaseToolCalls++;
150
+ // Reset recentNewFiles counter every 3 iterations
151
+ if (this.phaseIterations % 3 === 0) {
152
+ this.recentNewFiles = 0;
153
+ }
154
+ // Track file reads
155
+ if (toolName === 'read_file' && args.path) {
156
+ const path = String(args.path);
157
+ const isNew = !this.uniqueFilesRead.has(path);
158
+ this.uniqueFilesRead.add(path);
159
+ if (isNew)
160
+ this.recentNewFiles++;
161
+ }
162
+ // Track searches
163
+ if (['grep', 'search', 'glob', 'find_files', 'search_files'].includes(toolName)) {
164
+ const query = String(args.pattern || args.query || args.path || '');
165
+ this.uniqueSearches.add(query);
166
+ }
167
+ // Track file modifications → auto-transition to acting
168
+ if (['write_file', 'edit_file'].includes(toolName) && args.path) {
169
+ this.filesModified.add(String(args.path));
170
+ if (this.currentPhase === 'exploring' || this.currentPhase === 'planning') {
171
+ this.transition('acting', 'First file edit made');
172
+ }
173
+ }
174
+ // Track bash commands
175
+ if (toolName === 'bash' && args.command) {
176
+ const command = String(args.command);
177
+ const bashResult = extractBashSuccess(result);
178
+ // Track consecutive bash failures
179
+ if (result !== undefined) {
180
+ if (!bashResult) {
181
+ this.consecutiveBashFailures++;
182
+ }
183
+ else {
184
+ this.consecutiveBashFailures = 0;
185
+ }
186
+ }
187
+ // Detect test runs
188
+ if (isTestCommand(command)) {
189
+ this.testsRun++;
190
+ // Auto-transition to verifying when tests run after edits
191
+ if (this.currentPhase === 'acting' && this.filesModified.size > 0) {
192
+ this.transition('verifying', 'Tests run after edits');
193
+ }
194
+ // Track test outcomes
195
+ if (result !== undefined) {
196
+ if (bashResult) {
197
+ this.lastTestPassed = true;
198
+ this.consecutiveTestFailures = 0;
199
+ this.inTestFixCycle = false;
200
+ }
201
+ else {
202
+ this.lastTestPassed = false;
203
+ this.consecutiveTestFailures++;
204
+ // Enter test-fix cycle after 2+ failures
205
+ if (this.consecutiveTestFailures >= 2) {
206
+ this.inTestFixCycle = true;
207
+ // Go back to acting to fix
208
+ if (this.currentPhase === 'verifying') {
209
+ this.transition('acting', `Test failed ${this.consecutiveTestFailures} times, fixing`);
210
+ }
211
+ }
212
+ }
213
+ }
214
+ }
215
+ }
216
+ // Check exploration saturation
217
+ this.checkExplorationSaturation();
218
+ }
219
+ /** Subscribe to state machine events */
220
+ subscribe(listener) {
221
+ this.listeners.push(listener);
222
+ return () => {
223
+ const idx = this.listeners.indexOf(listener);
224
+ if (idx >= 0)
225
+ this.listeners.splice(idx, 1);
226
+ };
227
+ }
228
+ /** Reset state machine to initial state */
229
+ reset(phase) {
230
+ this.currentPhase = phase ?? 'exploring';
231
+ this.phaseEnteredAt = Date.now();
232
+ this.phaseIterations = 0;
233
+ this.phaseToolCalls = 0;
234
+ this.uniqueFilesRead.clear();
235
+ this.uniqueSearches.clear();
236
+ this.filesModified.clear();
237
+ this.testsRun = 0;
238
+ this.shouldTransition = false;
239
+ this.recentNewFiles = 0;
240
+ this.lastTestPassed = null;
241
+ this.consecutiveTestFailures = 0;
242
+ this.inTestFixCycle = false;
243
+ this.consecutiveBashFailures = 0;
244
+ this.transitions = [];
245
+ this.phaseHistory = [];
246
+ }
247
+ // ---------------------------------------------------------------------------
248
+ // PRIVATE
249
+ // ---------------------------------------------------------------------------
250
+ /** Check for exploration saturation (too many reads without action) */
251
+ checkExplorationSaturation() {
252
+ if (this.currentPhase !== 'exploring') {
253
+ this.shouldTransition = false;
254
+ return;
255
+ }
256
+ // After N+ unique files without edits
257
+ if (this.uniqueFilesRead.size >= this.explorationFileThreshold && this.filesModified.size === 0) {
258
+ this.shouldTransition = true;
259
+ return;
260
+ }
261
+ // After N+ iterations with diminishing returns
262
+ if (this.phaseIterations >= this.explorationIterThreshold && this.recentNewFiles < 2 && this.filesModified.size === 0) {
263
+ this.shouldTransition = true;
264
+ return;
265
+ }
266
+ this.shouldTransition = false;
267
+ }
268
+ emit(event) {
269
+ for (const listener of this.listeners) {
270
+ try {
271
+ listener(event);
272
+ }
273
+ catch {
274
+ // Don't let listener errors break the state machine
275
+ }
276
+ }
277
+ }
278
+ }
279
+ // =============================================================================
280
+ // HELPERS
281
+ // =============================================================================
282
+ /** Check if a bash command is a test command */
283
+ function isTestCommand(command) {
284
+ return (command.includes('test') ||
285
+ command.includes('pytest') ||
286
+ command.includes('npm test') ||
287
+ command.includes('jest'));
288
+ }
289
+ /** Extract success from a bash result (object or string) */
290
+ function extractBashSuccess(result) {
291
+ if (result && typeof result === 'object') {
292
+ return result.success !== false;
293
+ }
294
+ return true; // strings and undefined are treated as success
295
+ }
296
+ // =============================================================================
297
+ // FACTORY
298
+ // =============================================================================
299
+ export function createAgentStateMachine(options) {
300
+ return new AgentStateMachine(options);
301
+ }
302
+ //# sourceMappingURL=agent-state-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-state-machine.js","sourceRoot":"","sources":["../../../src/core/agent-state-machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Phase 2.3: Base Manager Pattern
3
+ *
4
+ * Provides a common base class for managers with consistent lifecycle
5
+ * (init/cleanup/reset), event emission, and subscription management.
6
+ *
7
+ * Usage:
8
+ * ```ts
9
+ * interface MyEvent { type: 'my.event'; data: string }
10
+ *
11
+ * class MyManager extends BaseManager<MyEvent> {
12
+ * protected managerName = 'MyManager';
13
+ *
14
+ * async onInit(): Promise<void> { ... }
15
+ * async onCleanup(): Promise<void> { ... }
16
+ * onReset(): void { ... }
17
+ * }
18
+ * ```
19
+ */
20
+ /** Standard lifecycle states for managers */
21
+ export type ManagerState = 'created' | 'initializing' | 'ready' | 'cleaning_up' | 'disposed';
22
+ /** Base event type — all manager events must have a `type` field */
23
+ export interface BaseEvent {
24
+ type: string;
25
+ }
26
+ /** Lifecycle events emitted by all managers */
27
+ export interface ManagerLifecycleEvent extends BaseEvent {
28
+ type: 'manager.initialized' | 'manager.cleanup' | 'manager.reset' | 'manager.error';
29
+ manager: string;
30
+ error?: string;
31
+ }
32
+ export declare abstract class BaseManager<TEvent extends BaseEvent = BaseEvent> {
33
+ /** Name for logging and events */
34
+ protected abstract readonly managerName: string;
35
+ private _state;
36
+ private _listeners;
37
+ private _unsubscribers;
38
+ private _initPromise;
39
+ /** Current lifecycle state */
40
+ get state(): ManagerState;
41
+ /** Whether the manager is ready to use */
42
+ get isReady(): boolean;
43
+ /**
44
+ * Initialize the manager. Idempotent — calling multiple times returns the
45
+ * same promise. Override `onInit()` for custom initialization.
46
+ */
47
+ init(): Promise<void>;
48
+ /**
49
+ * Clean up resources. Override `onCleanup()` for custom cleanup.
50
+ * Automatically unsubscribes all tracked subscriptions.
51
+ */
52
+ cleanup(): Promise<void>;
53
+ /**
54
+ * Reset manager to initial state without disposing.
55
+ * Override `onReset()` for custom reset logic.
56
+ */
57
+ reset(): void;
58
+ /**
59
+ * Subscribe to manager events.
60
+ * Returns an unsubscribe function.
61
+ */
62
+ subscribe(listener: (event: TEvent | ManagerLifecycleEvent) => void): () => void;
63
+ /**
64
+ * Track an external unsubscription function.
65
+ * All tracked subscriptions are cleaned up on `cleanup()`.
66
+ */
67
+ protected trackSubscription(unsub: () => void): void;
68
+ /** Emit a typed event to all listeners */
69
+ protected emit(event: TEvent): void;
70
+ /** Called during init(). Override for custom initialization. */
71
+ protected onInit(): Promise<void>;
72
+ /** Called during cleanup(). Override for custom resource release. */
73
+ protected onCleanup(): Promise<void>;
74
+ /** Called during reset(). Override to clear state without disposing. */
75
+ protected onReset(): void;
76
+ private _doInit;
77
+ private emitLifecycle;
78
+ }
79
+ //# sourceMappingURL=base-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-manager.d.ts","sourceRoot":"","sources":["../../../src/core/base-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,6CAA6C;AAC7C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,cAAc,GAAG,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC;AAE7F,oEAAoE;AACpE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,+CAA+C;AAC/C,MAAM,WAAW,qBAAsB,SAAQ,SAAS;IACtD,IAAI,EAAE,qBAAqB,GAAG,iBAAiB,GAAG,eAAe,GAAG,eAAe,CAAC;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,8BAAsB,WAAW,CAAC,MAAM,SAAS,SAAS,GAAG,SAAS;IACpE,kCAAkC;IAClC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAEhD,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAA8D;IAChF,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,YAAY,CAA8B;IAMlD,8BAA8B;IAC9B,IAAI,KAAK,IAAI,YAAY,CAExB;IAED,0CAA0C;IAC1C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9B;;;OAGG;IACH,KAAK,IAAI,IAAI;IAWb;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI;IAShF;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI;IAIpD,0CAA0C;IAC1C,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAcnC,gEAAgE;cAChD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvC,qEAAqE;cACrD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1C,wEAAwE;IACxE,SAAS,CAAC,OAAO,IAAI,IAAI;YAQX,OAAO;IAarB,OAAO,CAAC,aAAa;CAWtB"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Phase 2.3: Base Manager Pattern
3
+ *
4
+ * Provides a common base class for managers with consistent lifecycle
5
+ * (init/cleanup/reset), event emission, and subscription management.
6
+ *
7
+ * Usage:
8
+ * ```ts
9
+ * interface MyEvent { type: 'my.event'; data: string }
10
+ *
11
+ * class MyManager extends BaseManager<MyEvent> {
12
+ * protected managerName = 'MyManager';
13
+ *
14
+ * async onInit(): Promise<void> { ... }
15
+ * async onCleanup(): Promise<void> { ... }
16
+ * onReset(): void { ... }
17
+ * }
18
+ * ```
19
+ */
20
+ // =============================================================================
21
+ // BASE MANAGER
22
+ // =============================================================================
23
+ export class BaseManager {
24
+ _state = 'created';
25
+ _listeners = [];
26
+ _unsubscribers = [];
27
+ _initPromise = null;
28
+ // ---------------------------------------------------------------------------
29
+ // LIFECYCLE
30
+ // ---------------------------------------------------------------------------
31
+ /** Current lifecycle state */
32
+ get state() {
33
+ return this._state;
34
+ }
35
+ /** Whether the manager is ready to use */
36
+ get isReady() {
37
+ return this._state === 'ready';
38
+ }
39
+ /**
40
+ * Initialize the manager. Idempotent — calling multiple times returns the
41
+ * same promise. Override `onInit()` for custom initialization.
42
+ */
43
+ async init() {
44
+ if (this._state === 'ready')
45
+ return;
46
+ if (this._initPromise)
47
+ return this._initPromise;
48
+ this._state = 'initializing';
49
+ this._initPromise = this._doInit();
50
+ return this._initPromise;
51
+ }
52
+ /**
53
+ * Clean up resources. Override `onCleanup()` for custom cleanup.
54
+ * Automatically unsubscribes all tracked subscriptions.
55
+ */
56
+ async cleanup() {
57
+ if (this._state === 'disposed')
58
+ return;
59
+ this._state = 'cleaning_up';
60
+ // Unsubscribe all tracked subscriptions
61
+ for (const unsub of this._unsubscribers) {
62
+ try {
63
+ unsub();
64
+ }
65
+ catch {
66
+ // Ignore errors during cleanup
67
+ }
68
+ }
69
+ this._unsubscribers = [];
70
+ try {
71
+ await this.onCleanup();
72
+ }
73
+ catch (err) {
74
+ this.emitLifecycle('manager.error', String(err));
75
+ }
76
+ this._state = 'disposed';
77
+ this._initPromise = null;
78
+ this.emitLifecycle('manager.cleanup');
79
+ this._listeners = [];
80
+ }
81
+ /**
82
+ * Reset manager to initial state without disposing.
83
+ * Override `onReset()` for custom reset logic.
84
+ */
85
+ reset() {
86
+ this.onReset();
87
+ this._state = 'ready';
88
+ this._initPromise = null;
89
+ this.emitLifecycle('manager.reset');
90
+ }
91
+ // ---------------------------------------------------------------------------
92
+ // EVENT SYSTEM
93
+ // ---------------------------------------------------------------------------
94
+ /**
95
+ * Subscribe to manager events.
96
+ * Returns an unsubscribe function.
97
+ */
98
+ subscribe(listener) {
99
+ this._listeners.push(listener);
100
+ const unsub = () => {
101
+ const idx = this._listeners.indexOf(listener);
102
+ if (idx >= 0)
103
+ this._listeners.splice(idx, 1);
104
+ };
105
+ return unsub;
106
+ }
107
+ /**
108
+ * Track an external unsubscription function.
109
+ * All tracked subscriptions are cleaned up on `cleanup()`.
110
+ */
111
+ trackSubscription(unsub) {
112
+ this._unsubscribers.push(unsub);
113
+ }
114
+ /** Emit a typed event to all listeners */
115
+ emit(event) {
116
+ for (const listener of this._listeners) {
117
+ try {
118
+ listener(event);
119
+ }
120
+ catch {
121
+ // Don't let listener errors break the manager
122
+ }
123
+ }
124
+ }
125
+ // ---------------------------------------------------------------------------
126
+ // HOOKS (override in subclasses)
127
+ // ---------------------------------------------------------------------------
128
+ /** Called during init(). Override for custom initialization. */
129
+ async onInit() {
130
+ // Default: no-op
131
+ }
132
+ /** Called during cleanup(). Override for custom resource release. */
133
+ async onCleanup() {
134
+ // Default: no-op
135
+ }
136
+ /** Called during reset(). Override to clear state without disposing. */
137
+ onReset() {
138
+ // Default: no-op
139
+ }
140
+ // ---------------------------------------------------------------------------
141
+ // PRIVATE
142
+ // ---------------------------------------------------------------------------
143
+ async _doInit() {
144
+ try {
145
+ await this.onInit();
146
+ this._state = 'ready';
147
+ this.emitLifecycle('manager.initialized');
148
+ }
149
+ catch (err) {
150
+ this._state = 'created';
151
+ this._initPromise = null;
152
+ this.emitLifecycle('manager.error', String(err));
153
+ throw err;
154
+ }
155
+ }
156
+ emitLifecycle(type, error) {
157
+ const event = { type, manager: this.managerName };
158
+ if (error)
159
+ event.error = error;
160
+ for (const listener of this._listeners) {
161
+ try {
162
+ listener(event);
163
+ }
164
+ catch {
165
+ // Ignore
166
+ }
167
+ }
168
+ }
169
+ }
170
+ //# sourceMappingURL=base-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-manager.js","sourceRoot":"","sources":["../../../src/core/base-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Completion Analyzer
3
+ *
4
+ * Shared logic for identifying responses that describe future intent
5
+ * ("I'll do X") instead of completed work. This must stay centralized so
6
+ * execution-loop and final run guardrails classify consistently.
7
+ */
8
+ export interface CompletionIntentAnalysis {
9
+ isIncompleteAction: boolean;
10
+ reason: 'none' | 'future_intent' | 'failure_admission' | 'narrative_action';
11
+ confidence: number;
12
+ }
13
+ export declare function analyzeCompletionIntent(content: string): CompletionIntentAnalysis;
14
+ export declare function detectIncompleteActionResponse(content: string): boolean;
15
+ //# sourceMappingURL=completion-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-analyzer.d.ts","sourceRoot":"","sources":["../../../src/core/completion-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;IAC5E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,CA+CjF;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvE"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Completion Analyzer
3
+ *
4
+ * Shared logic for identifying responses that describe future intent
5
+ * ("I'll do X") instead of completed work. This must stay centralized so
6
+ * execution-loop and final run guardrails classify consistently.
7
+ */
8
+ export function analyzeCompletionIntent(content) {
9
+ const trimmed = content.trim();
10
+ if (!trimmed) {
11
+ return { isIncompleteAction: false, reason: 'none', confidence: 0 };
12
+ }
13
+ const lower = trimmed.toLowerCase();
14
+ // Positive completion signals should override weaker future-intent cues.
15
+ const completionSignals = /\b(done|completed|finished|here is the (final|complete)|created successfully|saved|wrote|all (changes|tasks) (are )?complete)\b/;
16
+ if (completionSignals.test(lower)) {
17
+ return { isIncompleteAction: false, reason: 'none', confidence: 0.9 };
18
+ }
19
+ const futureIntentPatterns = [
20
+ /\b(i\s+will|i'll|let me)\s+(create|write|save|update|modify|fix|add|edit|implement|change|run|execute|build|set up|start)\b/,
21
+ /\b(i\s+need to|i\s+should|i\s+can)\s+(create|write|update|modify|fix|add|edit|implement)\b/,
22
+ /\b(the next step|first[, ]+i|now i)\b/,
23
+ /\b(i am going to|i'm going to)\b/,
24
+ ];
25
+ if (futureIntentPatterns.some(pattern => pattern.test(lower))) {
26
+ return { isIncompleteAction: true, reason: 'future_intent', confidence: 0.95 };
27
+ }
28
+ const failureAdmissionPatterns = [
29
+ /\bran out of budget\b/,
30
+ /\bbudget exhausted\b/,
31
+ /\bunable to complete\b/,
32
+ /\bcould not complete\b/,
33
+ /\bno changes were made\b/,
34
+ /\bno files were modified\b/,
35
+ ];
36
+ if (failureAdmissionPatterns.some(pattern => pattern.test(lower))) {
37
+ return { isIncompleteAction: true, reason: 'failure_admission', confidence: 0.9 };
38
+ }
39
+ // Heuristic: short narrative about "changing code" with no artifact.
40
+ const hasCodeBlock = /```/.test(trimmed);
41
+ const mentionsCodeConcepts = /\b(file|function|class|module|component|import|export|variable|method)\b/i.test(trimmed);
42
+ if (!hasCodeBlock && mentionsCodeConcepts && trimmed.length < 600) {
43
+ const actionWords = /\b(update|modify|create|add|change|fix|implement|refactor|write|edit)\b/i;
44
+ if (actionWords.test(lower)) {
45
+ return { isIncompleteAction: true, reason: 'narrative_action', confidence: 0.65 };
46
+ }
47
+ }
48
+ return { isIncompleteAction: false, reason: 'none', confidence: 0.3 };
49
+ }
50
+ export function detectIncompleteActionResponse(content) {
51
+ return analyzeCompletionIntent(content).isIncompleteAction;
52
+ }
53
+ //# sourceMappingURL=completion-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-analyzer.js","sourceRoot":"","sources":["../../../src/core/completion-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,yEAAyE;IACzE,MAAM,iBAAiB,GAAG,iIAAiI,CAAC;IAC5J,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,oBAAoB,GAAa;QACrC,6HAA6H;QAC7H,4FAA4F;QAC5F,uCAAuC;QACvC,kCAAkC;KACnC,CAAC;IACF,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACjF,CAAC;IAED,MAAM,wBAAwB,GAAa;QACzC,uBAAuB;QACvB,sBAAsB;QACtB,wBAAwB;QACxB,wBAAwB;QACxB,0BAA0B;QAC1B,4BAA4B;KAC7B,CAAC;IACF,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IACpF,CAAC;IAED,qEAAqE;IACrE,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,oBAAoB,GAAG,2EAA2E,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvH,IAAI,CAAC,YAAY,IAAI,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAClE,MAAM,WAAW,GAAG,0EAA0E,CAAC;QAC/F,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACpF,CAAC;IACH,CAAC;IAED,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAe;IAC5D,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC;AAC7D,CAAC"}