@hoilab/ada-cli 0.84.21 → 0.84.22

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 (344) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.es.md +163 -0
  3. package/README.md +99 -652
  4. package/dist/cli/args.d.ts +3 -0
  5. package/dist/cli/args.d.ts.map +1 -1
  6. package/dist/cli/args.js +11 -0
  7. package/dist/cli/args.js.map +1 -1
  8. package/dist/cli/file-processor.d.ts.map +1 -1
  9. package/dist/cli/file-processor.js +2 -1
  10. package/dist/cli/file-processor.js.map +1 -1
  11. package/dist/cli/home-screen.d.ts.map +1 -1
  12. package/dist/cli/home-screen.js +2 -2
  13. package/dist/cli/home-screen.js.map +1 -1
  14. package/dist/cli/startup-ui.d.ts.map +1 -1
  15. package/dist/cli/startup-ui.js +9 -3
  16. package/dist/cli/startup-ui.js.map +1 -1
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/config.js +2 -1
  19. package/dist/config.js.map +1 -1
  20. package/dist/core/agent-session.d.ts +57 -7
  21. package/dist/core/agent-session.d.ts.map +1 -1
  22. package/dist/core/agent-session.js +449 -73
  23. package/dist/core/agent-session.js.map +1 -1
  24. package/dist/core/auth-storage.d.ts.map +1 -1
  25. package/dist/core/auth-storage.js +4 -3
  26. package/dist/core/auth-storage.js.map +1 -1
  27. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  28. package/dist/core/compaction/branch-summarization.js +3 -0
  29. package/dist/core/compaction/branch-summarization.js.map +1 -1
  30. package/dist/core/compaction/compaction.d.ts +4 -3
  31. package/dist/core/compaction/compaction.d.ts.map +1 -1
  32. package/dist/core/compaction/compaction.js +41 -32
  33. package/dist/core/compaction/compaction.js.map +1 -1
  34. package/dist/core/defaults.d.ts +1 -0
  35. package/dist/core/defaults.d.ts.map +1 -1
  36. package/dist/core/defaults.js +9 -0
  37. package/dist/core/defaults.js.map +1 -1
  38. package/dist/core/engine-personality.d.ts +12 -0
  39. package/dist/core/engine-personality.d.ts.map +1 -0
  40. package/dist/core/engine-personality.js +53 -0
  41. package/dist/core/engine-personality.js.map +1 -0
  42. package/dist/core/extensions/index.d.ts +1 -1
  43. package/dist/core/extensions/index.d.ts.map +1 -1
  44. package/dist/core/extensions/index.js.map +1 -1
  45. package/dist/core/extensions/loader.d.ts.map +1 -1
  46. package/dist/core/extensions/loader.js +10 -5
  47. package/dist/core/extensions/loader.js.map +1 -1
  48. package/dist/core/extensions/types.d.ts +23 -4
  49. package/dist/core/extensions/types.d.ts.map +1 -1
  50. package/dist/core/extensions/types.js.map +1 -1
  51. package/dist/core/keybindings.d.ts.map +1 -1
  52. package/dist/core/keybindings.js +2 -1
  53. package/dist/core/keybindings.js.map +1 -1
  54. package/dist/core/memory-engine/audit-export.d.ts +54 -0
  55. package/dist/core/memory-engine/audit-export.d.ts.map +1 -0
  56. package/dist/core/memory-engine/audit-export.js +85 -0
  57. package/dist/core/memory-engine/audit-export.js.map +1 -0
  58. package/dist/core/memory-engine/audit.d.ts.map +1 -1
  59. package/dist/core/memory-engine/audit.js +7 -8
  60. package/dist/core/memory-engine/audit.js.map +1 -1
  61. package/dist/core/memory-engine/engine.d.ts +2 -3
  62. package/dist/core/memory-engine/engine.d.ts.map +1 -1
  63. package/dist/core/memory-engine/engine.js +148 -50
  64. package/dist/core/memory-engine/engine.js.map +1 -1
  65. package/dist/core/memory-engine/inverted-index.d.ts.map +1 -1
  66. package/dist/core/memory-engine/inverted-index.js +67 -10
  67. package/dist/core/memory-engine/inverted-index.js.map +1 -1
  68. package/dist/core/memory-engine/keychain.d.ts.map +1 -1
  69. package/dist/core/memory-engine/keychain.js +1 -6
  70. package/dist/core/memory-engine/keychain.js.map +1 -1
  71. package/dist/core/memory-engine/observation-store.d.ts +1 -0
  72. package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
  73. package/dist/core/memory-engine/observation-store.js +37 -8
  74. package/dist/core/memory-engine/observation-store.js.map +1 -1
  75. package/dist/core/memory-engine/scanner.d.ts.map +1 -1
  76. package/dist/core/memory-engine/scanner.js +25 -5
  77. package/dist/core/memory-engine/scanner.js.map +1 -1
  78. package/dist/core/memory-engine/security.d.ts.map +1 -1
  79. package/dist/core/memory-engine/security.js +131 -23
  80. package/dist/core/memory-engine/security.js.map +1 -1
  81. package/dist/core/memory-engine/session-indexer.d.ts.map +1 -1
  82. package/dist/core/memory-engine/session-indexer.js +8 -2
  83. package/dist/core/memory-engine/session-indexer.js.map +1 -1
  84. package/dist/core/memory-engine/tools.d.ts +2 -2
  85. package/dist/core/memory-engine/tools.d.ts.map +1 -1
  86. package/dist/core/memory-engine/tools.js +14 -7
  87. package/dist/core/memory-engine/tools.js.map +1 -1
  88. package/dist/core/memory-engine/vault.d.ts.map +1 -1
  89. package/dist/core/memory-engine/vault.js +2 -2
  90. package/dist/core/memory-engine/vault.js.map +1 -1
  91. package/dist/core/model-config.d.ts.map +1 -1
  92. package/dist/core/model-config.js +2 -1
  93. package/dist/core/model-config.js.map +1 -1
  94. package/dist/core/model-resolver.d.ts +1 -0
  95. package/dist/core/model-resolver.d.ts.map +1 -1
  96. package/dist/core/model-resolver.js +12 -6
  97. package/dist/core/model-resolver.js.map +1 -1
  98. package/dist/core/models-store.d.ts.map +1 -1
  99. package/dist/core/models-store.js +2 -1
  100. package/dist/core/models-store.js.map +1 -1
  101. package/dist/core/package-manager.d.ts.map +1 -1
  102. package/dist/core/package-manager.js +11 -6
  103. package/dist/core/package-manager.js.map +1 -1
  104. package/dist/core/pi-manifest.d.ts.map +1 -1
  105. package/dist/core/pi-manifest.js +2 -1
  106. package/dist/core/pi-manifest.js.map +1 -1
  107. package/dist/core/prompt-optimizer.d.ts +53 -0
  108. package/dist/core/prompt-optimizer.d.ts.map +1 -0
  109. package/dist/core/prompt-optimizer.js +138 -0
  110. package/dist/core/prompt-optimizer.js.map +1 -0
  111. package/dist/core/provider-attribution.d.ts.map +1 -1
  112. package/dist/core/provider-attribution.js +1 -1
  113. package/dist/core/provider-attribution.js.map +1 -1
  114. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  115. package/dist/core/remote-catalog-provider.js +2 -1
  116. package/dist/core/remote-catalog-provider.js.map +1 -1
  117. package/dist/core/resource-loader.d.ts +50 -0
  118. package/dist/core/resource-loader.d.ts.map +1 -1
  119. package/dist/core/resource-loader.js +233 -7
  120. package/dist/core/resource-loader.js.map +1 -1
  121. package/dist/core/sdk.d.ts +8 -0
  122. package/dist/core/sdk.d.ts.map +1 -1
  123. package/dist/core/sdk.js +11 -1
  124. package/dist/core/sdk.js.map +1 -1
  125. package/dist/core/session-manager.d.ts.map +1 -1
  126. package/dist/core/session-manager.js +2 -1
  127. package/dist/core/session-manager.js.map +1 -1
  128. package/dist/core/settings-diagnostics.d.ts +9 -0
  129. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  130. package/dist/core/settings-diagnostics.js +21 -0
  131. package/dist/core/settings-diagnostics.js.map +1 -0
  132. package/dist/core/settings-manager.d.ts +52 -0
  133. package/dist/core/settings-manager.d.ts.map +1 -1
  134. package/dist/core/settings-manager.js +204 -10
  135. package/dist/core/settings-manager.js.map +1 -1
  136. package/dist/core/skills.d.ts.map +1 -1
  137. package/dist/core/skills.js +51 -33
  138. package/dist/core/skills.js.map +1 -1
  139. package/dist/core/slash-commands.d.ts.map +1 -1
  140. package/dist/core/slash-commands.js +2 -1
  141. package/dist/core/slash-commands.js.map +1 -1
  142. package/dist/core/tools/edit-diff.d.ts +0 -5
  143. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  144. package/dist/core/tools/edit-diff.js +2 -5
  145. package/dist/core/tools/edit-diff.js.map +1 -1
  146. package/dist/core/tools/edit.d.ts.map +1 -1
  147. package/dist/core/tools/edit.js +20 -4
  148. package/dist/core/tools/edit.js.map +1 -1
  149. package/dist/core/tools/index.d.ts.map +1 -1
  150. package/dist/core/tools/index.js +2 -2
  151. package/dist/core/tools/index.js.map +1 -1
  152. package/dist/core/tools/project-memory-tool.d.ts.map +1 -1
  153. package/dist/core/tools/project-memory-tool.js +4 -1
  154. package/dist/core/tools/project-memory-tool.js.map +1 -1
  155. package/dist/core/trust-manager.d.ts.map +1 -1
  156. package/dist/core/trust-manager.js +2 -1
  157. package/dist/core/trust-manager.js.map +1 -1
  158. package/dist/core/workflows/agent-runner.d.ts +86 -0
  159. package/dist/core/workflows/agent-runner.d.ts.map +1 -0
  160. package/dist/core/workflows/agent-runner.js +225 -0
  161. package/dist/core/workflows/agent-runner.js.map +1 -0
  162. package/dist/core/workflows/builtins.d.ts +41 -0
  163. package/dist/core/workflows/builtins.d.ts.map +1 -0
  164. package/dist/core/workflows/builtins.js +282 -0
  165. package/dist/core/workflows/builtins.js.map +1 -0
  166. package/dist/core/workflows/goal-engine/engine.d.ts +134 -0
  167. package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -0
  168. package/dist/core/workflows/goal-engine/engine.js +462 -0
  169. package/dist/core/workflows/goal-engine/engine.js.map +1 -0
  170. package/dist/core/workflows/goal-engine/errors.d.ts +7 -0
  171. package/dist/core/workflows/goal-engine/errors.d.ts.map +1 -0
  172. package/dist/core/workflows/goal-engine/errors.js +9 -0
  173. package/dist/core/workflows/goal-engine/errors.js.map +1 -0
  174. package/dist/core/workflows/goal-engine/index.d.ts +13 -0
  175. package/dist/core/workflows/goal-engine/index.d.ts.map +1 -0
  176. package/dist/core/workflows/goal-engine/index.js +8 -0
  177. package/dist/core/workflows/goal-engine/index.js.map +1 -0
  178. package/dist/core/workflows/goal-engine/persistence.d.ts +31 -0
  179. package/dist/core/workflows/goal-engine/persistence.d.ts.map +1 -0
  180. package/dist/core/workflows/goal-engine/persistence.js +145 -0
  181. package/dist/core/workflows/goal-engine/persistence.js.map +1 -0
  182. package/dist/core/workflows/goal-engine/prompts.d.ts +37 -0
  183. package/dist/core/workflows/goal-engine/prompts.d.ts.map +1 -0
  184. package/dist/core/workflows/goal-engine/prompts.js +131 -0
  185. package/dist/core/workflows/goal-engine/prompts.js.map +1 -0
  186. package/dist/core/workflows/goal-engine/state.d.ts +41 -0
  187. package/dist/core/workflows/goal-engine/state.d.ts.map +1 -0
  188. package/dist/core/workflows/goal-engine/state.js +397 -0
  189. package/dist/core/workflows/goal-engine/state.js.map +1 -0
  190. package/dist/core/workflows/goal-engine/tools.d.ts +31 -0
  191. package/dist/core/workflows/goal-engine/tools.d.ts.map +1 -0
  192. package/dist/core/workflows/goal-engine/tools.js +211 -0
  193. package/dist/core/workflows/goal-engine/tools.js.map +1 -0
  194. package/dist/core/workflows/goal-engine/types.d.ts +286 -0
  195. package/dist/core/workflows/goal-engine/types.d.ts.map +1 -0
  196. package/dist/core/workflows/goal-engine/types.js +17 -0
  197. package/dist/core/workflows/goal-engine/types.js.map +1 -0
  198. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts +23 -0
  199. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts.map +1 -0
  200. package/dist/core/workflows/goal-engine/worktree-fingerprint.js +72 -0
  201. package/dist/core/workflows/goal-engine/worktree-fingerprint.js.map +1 -0
  202. package/dist/core/workflows/graph-sync.d.ts +67 -0
  203. package/dist/core/workflows/graph-sync.d.ts.map +1 -0
  204. package/dist/core/workflows/graph-sync.js +188 -0
  205. package/dist/core/workflows/graph-sync.js.map +1 -0
  206. package/dist/core/workflows/graph.d.ts +143 -0
  207. package/dist/core/workflows/graph.d.ts.map +1 -0
  208. package/dist/core/workflows/graph.js +319 -0
  209. package/dist/core/workflows/graph.js.map +1 -0
  210. package/dist/core/workflows/index.d.ts +18 -0
  211. package/dist/core/workflows/index.d.ts.map +1 -0
  212. package/dist/core/workflows/index.js +14 -0
  213. package/dist/core/workflows/index.js.map +1 -0
  214. package/dist/core/workflows/journal.d.ts +68 -0
  215. package/dist/core/workflows/journal.d.ts.map +1 -0
  216. package/dist/core/workflows/journal.js +83 -0
  217. package/dist/core/workflows/journal.js.map +1 -0
  218. package/dist/core/workflows/manager.d.ts +112 -0
  219. package/dist/core/workflows/manager.d.ts.map +1 -0
  220. package/dist/core/workflows/manager.js +327 -0
  221. package/dist/core/workflows/manager.js.map +1 -0
  222. package/dist/core/workflows/resolve-script.d.ts +35 -0
  223. package/dist/core/workflows/resolve-script.d.ts.map +1 -0
  224. package/dist/core/workflows/resolve-script.js +66 -0
  225. package/dist/core/workflows/resolve-script.js.map +1 -0
  226. package/dist/core/workflows/runtime.d.ts +49 -0
  227. package/dist/core/workflows/runtime.d.ts.map +1 -0
  228. package/dist/core/workflows/runtime.js +301 -0
  229. package/dist/core/workflows/runtime.js.map +1 -0
  230. package/dist/core/workflows/shared-store.d.ts +31 -0
  231. package/dist/core/workflows/shared-store.d.ts.map +1 -0
  232. package/dist/core/workflows/shared-store.js +80 -0
  233. package/dist/core/workflows/shared-store.js.map +1 -0
  234. package/dist/core/workflows/subagent-host.d.ts +50 -0
  235. package/dist/core/workflows/subagent-host.d.ts.map +1 -0
  236. package/dist/core/workflows/subagent-host.js +225 -0
  237. package/dist/core/workflows/subagent-host.js.map +1 -0
  238. package/dist/core/workflows/tool-workflow.d.ts +22 -0
  239. package/dist/core/workflows/tool-workflow.d.ts.map +1 -0
  240. package/dist/core/workflows/tool-workflow.js +120 -0
  241. package/dist/core/workflows/tool-workflow.js.map +1 -0
  242. package/dist/core/workflows/types.d.ts +142 -0
  243. package/dist/core/workflows/types.d.ts.map +1 -0
  244. package/dist/core/workflows/types.js +26 -0
  245. package/dist/core/workflows/types.js.map +1 -0
  246. package/dist/core/workflows/worktree.d.ts +42 -0
  247. package/dist/core/workflows/worktree.d.ts.map +1 -0
  248. package/dist/core/workflows/worktree.js +107 -0
  249. package/dist/core/workflows/worktree.js.map +1 -0
  250. package/dist/extensions/llama/index.d.ts.map +1 -1
  251. package/dist/extensions/llama/index.js +2 -0
  252. package/dist/extensions/llama/index.js.map +1 -1
  253. package/dist/extensions/llama/provider.d.ts.map +1 -1
  254. package/dist/extensions/llama/provider.js +6 -2
  255. package/dist/extensions/llama/provider.js.map +1 -1
  256. package/dist/index.d.ts +16 -12
  257. package/dist/index.d.ts.map +1 -1
  258. package/dist/index.js +14 -11
  259. package/dist/index.js.map +1 -1
  260. package/dist/main.d.ts +4 -0
  261. package/dist/main.d.ts.map +1 -1
  262. package/dist/main.js +20 -15
  263. package/dist/main.js.map +1 -1
  264. package/dist/migrations.d.ts.map +1 -1
  265. package/dist/migrations.js +4 -3
  266. package/dist/migrations.js.map +1 -1
  267. package/dist/modes/interactive/components/home-screen.d.ts.map +1 -1
  268. package/dist/modes/interactive/components/home-screen.js +2 -2
  269. package/dist/modes/interactive/components/home-screen.js.map +1 -1
  270. package/dist/modes/interactive/components/model-selector.d.ts +2 -3
  271. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  272. package/dist/modes/interactive/components/model-selector.js +16 -6
  273. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  274. package/dist/modes/interactive/components/prompt-optimization.d.ts +16 -0
  275. package/dist/modes/interactive/components/prompt-optimization.d.ts.map +1 -0
  276. package/dist/modes/interactive/components/prompt-optimization.js +46 -0
  277. package/dist/modes/interactive/components/prompt-optimization.js.map +1 -0
  278. package/dist/modes/interactive/components/settings-selector.d.ts +19 -1
  279. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  280. package/dist/modes/interactive/components/settings-selector.js +247 -46
  281. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  282. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  283. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  284. package/dist/modes/interactive/components/settings-submenu.js +165 -0
  285. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  286. package/dist/modes/interactive/components/thinking-selector.d.ts +8 -3
  287. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  288. package/dist/modes/interactive/components/thinking-selector.js +29 -3
  289. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  290. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  291. package/dist/modes/interactive/external-editor.js +2 -1
  292. package/dist/modes/interactive/external-editor.js.map +1 -1
  293. package/dist/modes/interactive/interactive-mode.d.ts +24 -0
  294. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  295. package/dist/modes/interactive/interactive-mode.js +677 -34
  296. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  297. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  298. package/dist/modes/interactive/theme/theme.js +4 -3
  299. package/dist/modes/interactive/theme/theme.js.map +1 -1
  300. package/dist/modes/json-event.d.ts +16 -13
  301. package/dist/modes/json-event.d.ts.map +1 -1
  302. package/dist/modes/json-event.js +20 -6
  303. package/dist/modes/json-event.js.map +1 -1
  304. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  305. package/dist/modes/rpc/rpc-mode.js +173 -0
  306. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  307. package/dist/modes/rpc/rpc-types.d.ts +29 -0
  308. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  309. package/dist/modes/rpc/rpc-types.js.map +1 -1
  310. package/dist/package-manager-cli.d.ts.map +1 -1
  311. package/dist/package-manager-cli.js +1 -1
  312. package/dist/package-manager-cli.js.map +1 -1
  313. package/dist/skills/ada-engine/SKILL.md +153 -0
  314. package/dist/utils/frontmatter.d.ts.map +1 -1
  315. package/dist/utils/frontmatter.js +2 -1
  316. package/dist/utils/frontmatter.js.map +1 -1
  317. package/dist/utils/management-http.d.ts +5 -3
  318. package/dist/utils/management-http.d.ts.map +1 -1
  319. package/dist/utils/management-http.js +14 -10
  320. package/dist/utils/management-http.js.map +1 -1
  321. package/dist/utils/text.d.ts +8 -0
  322. package/dist/utils/text.d.ts.map +1 -0
  323. package/dist/utils/text.js +9 -0
  324. package/dist/utils/text.js.map +1 -0
  325. package/docs/compaction.md +15 -0
  326. package/docs/custom-provider.md +5 -2
  327. package/docs/extensions.md +11 -2
  328. package/docs/json.md +7 -2
  329. package/docs/llama-cpp.md +2 -0
  330. package/docs/models.md +8 -2
  331. package/docs/rpc.md +9 -3
  332. package/docs/settings.md +2 -2
  333. package/docs/skills.md +4 -3
  334. package/examples/extensions/border-status-editor.ts +1 -1
  335. package/examples/extensions/git-checkpoint.ts +2 -2
  336. package/examples/extensions/notify.ts +3 -1
  337. package/examples/extensions/subagent/README.md +1 -1
  338. package/examples/extensions/subagent/index.ts +6 -1
  339. package/examples/extensions/titlebar-spinner.ts +1 -1
  340. package/examples/rpc-extension-ui.ts +1 -1
  341. package/examples/sdk/06-extensions.ts +1 -1
  342. package/examples/sdk/README.md +1 -1
  343. package/npm-shrinkwrap.json +2 -12
  344. package/package.json +3 -3
@@ -0,0 +1,9 @@
1
+ export class GoalError extends Error {
2
+ code;
3
+ constructor(message, code) {
4
+ super(message);
5
+ this.name = "GoalError";
6
+ this.code = code;
7
+ }
8
+ }
9
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/core/workflows/goal-engine/errors.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAC1B,IAAI,CAAgB;IAC7B,YAAY,OAAe,EAAE,IAAmB,EAAE;QACjD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAAA,CACjB;CACD","sourcesContent":["/** Errores tipados del Goal Engine. */\nexport type GoalErrorCode =\n\t| \"GOAL_NOT_FOUND\"\n\t| \"GOAL_INVALID_CONTRACT\"\n\t| \"GOAL_NO_JUDGE\"\n\t| \"GOAL_NO_EVIDENCE\"\n\t| \"GOAL_BRAKE\"\n\t| \"GOAL_PERSISTENCE\"\n\t| \"REPLAN_UNAVAILABLE\";\n\nexport class GoalError extends Error {\n\treadonly code: GoalErrorCode;\n\tconstructor(message: string, code: GoalErrorCode) {\n\t\tsuper(message);\n\t\tthis.name = \"GoalError\";\n\t\tthis.code = code;\n\t}\n}\n"]}
@@ -0,0 +1,13 @@
1
+ /** Ada Intelligence Engine — Goal Engine (Fase 4). */
2
+ export type { GoalEngineOptions } from "./engine.ts";
3
+ export { GoalEngine, isBrakeRelevant } from "./engine.ts";
4
+ export type { GoalErrorCode } from "./errors.ts";
5
+ export { GoalError } from "./errors.ts";
6
+ export { FileGoalPersistence, renderChecklist, writeAtomic } from "./persistence.ts";
7
+ export type { ReduceResult } from "./state.ts";
8
+ export { createGoalState, nextPhase, reduceGoal, TDD_PHASES } from "./state.ts";
9
+ export type { GoalToolContext } from "./tools.ts";
10
+ export { createGoalNewTool, goalSessionTools, goalTools, resolveActiveGoalId } from "./tools.ts";
11
+ export type { AskUserQuestion, EvidenceItem, GoalAction, GoalEventMap, GoalEventType, GoalFrenos, GoalJudgeFn, GoalPersistence, GoalPhase, GoalState, GoalStatus, GoalWorkFn, GoalWorkInput, GoalWorkResult, JudgeResult, JudgeVerdict, Task, TaskStatus, } from "./types.ts";
12
+ export { DEFAULT_GOAL_FRENOS } from "./types.ts";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/workflows/goal-engine/index.ts"],"names":[],"mappings":"AAAA,wDAAsD;AAEtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChF,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjG,YAAY,EACX,eAAe,EACf,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,UAAU,EACV,WAAW,EACX,eAAe,EACf,SAAS,EACT,SAAS,EACT,UAAU,EACV,UAAU,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,IAAI,EACJ,UAAU,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC","sourcesContent":["/** Ada Intelligence Engine — Goal Engine (Fase 4). */\n\nexport type { GoalEngineOptions } from \"./engine.ts\";\nexport { GoalEngine, isBrakeRelevant } from \"./engine.ts\";\nexport type { GoalErrorCode } from \"./errors.ts\";\nexport { GoalError } from \"./errors.ts\";\nexport { FileGoalPersistence, renderChecklist, writeAtomic } from \"./persistence.ts\";\nexport type { ReduceResult } from \"./state.ts\";\nexport { createGoalState, nextPhase, reduceGoal, TDD_PHASES } from \"./state.ts\";\nexport type { GoalToolContext } from \"./tools.ts\";\nexport { createGoalNewTool, goalSessionTools, goalTools, resolveActiveGoalId } from \"./tools.ts\";\nexport type {\n\tAskUserQuestion,\n\tEvidenceItem,\n\tGoalAction,\n\tGoalEventMap,\n\tGoalEventType,\n\tGoalFrenos,\n\tGoalJudgeFn,\n\tGoalPersistence,\n\tGoalPhase,\n\tGoalState,\n\tGoalStatus,\n\tGoalWorkFn,\n\tGoalWorkInput,\n\tGoalWorkResult,\n\tJudgeResult,\n\tJudgeVerdict,\n\tTask,\n\tTaskStatus,\n} from \"./types.ts\";\nexport { DEFAULT_GOAL_FRENOS } from \"./types.ts\";\n"]}
@@ -0,0 +1,8 @@
1
+ /** Ada Intelligence Engine — Goal Engine (Fase 4). */
2
+ export { GoalEngine, isBrakeRelevant } from "./engine.js";
3
+ export { GoalError } from "./errors.js";
4
+ export { FileGoalPersistence, renderChecklist, writeAtomic } from "./persistence.js";
5
+ export { createGoalState, nextPhase, reduceGoal, TDD_PHASES } from "./state.js";
6
+ export { createGoalNewTool, goalSessionTools, goalTools, resolveActiveGoalId } from "./tools.js";
7
+ export { DEFAULT_GOAL_FRENOS } from "./types.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/workflows/goal-engine/index.ts"],"names":[],"mappings":"AAAA,wDAAsD;AAGtD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEhF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAqBjG,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC","sourcesContent":["/** Ada Intelligence Engine — Goal Engine (Fase 4). */\n\nexport type { GoalEngineOptions } from \"./engine.ts\";\nexport { GoalEngine, isBrakeRelevant } from \"./engine.ts\";\nexport type { GoalErrorCode } from \"./errors.ts\";\nexport { GoalError } from \"./errors.ts\";\nexport { FileGoalPersistence, renderChecklist, writeAtomic } from \"./persistence.ts\";\nexport type { ReduceResult } from \"./state.ts\";\nexport { createGoalState, nextPhase, reduceGoal, TDD_PHASES } from \"./state.ts\";\nexport type { GoalToolContext } from \"./tools.ts\";\nexport { createGoalNewTool, goalSessionTools, goalTools, resolveActiveGoalId } from \"./tools.ts\";\nexport type {\n\tAskUserQuestion,\n\tEvidenceItem,\n\tGoalAction,\n\tGoalEventMap,\n\tGoalEventType,\n\tGoalFrenos,\n\tGoalJudgeFn,\n\tGoalPersistence,\n\tGoalPhase,\n\tGoalState,\n\tGoalStatus,\n\tGoalWorkFn,\n\tGoalWorkInput,\n\tGoalWorkResult,\n\tJudgeResult,\n\tJudgeVerdict,\n\tTask,\n\tTaskStatus,\n} from \"./types.ts\";\nexport { DEFAULT_GOAL_FRENOS } from \"./types.ts\";\n"]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Ada Intelligence Engine — persistencia del Goal Engine.
3
+ *
4
+ * Checklist persistente en `<dir>/goals/<id>.md` (ralph-wiggum + rpiv-todo)
5
+ * + snapshot JSON versionado en `<dir>/goals/<id>.json`. Sobrevive a /reload,
6
+ * compactación y resume. Escrituras atómicas (tmp + rename).
7
+ */
8
+ import type { GoalPersistence, GoalState } from "./types.ts";
9
+ export declare class FileGoalPersistence implements GoalPersistence {
10
+ private dir;
11
+ constructor(dir: string);
12
+ save(state: GoalState): Promise<void>;
13
+ load(id: string): Promise<GoalState | null>;
14
+ list(): Promise<Array<{
15
+ id: string;
16
+ goal: string;
17
+ status: GoalState["status"];
18
+ phase: GoalState["phase"];
19
+ updatedAt: string;
20
+ }>>;
21
+ remove(id: string): Promise<void>;
22
+ /** cache opcional para quitar del listado. */
23
+ private cache?;
24
+ setCache(cache: Map<string, GoalState>): void;
25
+ private path;
26
+ }
27
+ /** Checklist en markdown — visible y editable por el usuario. */
28
+ export declare function renderChecklist(state: GoalState): string;
29
+ /** Escritura atómica (tmp + rename). */
30
+ export declare function writeAtomic(path: string, content: string): void;
31
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../../src/core/workflows/goal-engine/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI7D,qBAAa,mBAAoB,YAAW,eAAe;IAC1D,OAAO,CAAC,GAAG,CAAS;IAEpB,YAAY,GAAG,EAAE,MAAM,EAGtB;IAEK,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1C;IAEK,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAQhD;IAEK,IAAI,IAAI,OAAO,CACpB,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAC9G,CA4BA;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtC;IAED,8CAA8C;IAC9C,OAAO,CAAC,KAAK,CAAC,CAAyB;IACvC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAE5C;IAED,OAAO,CAAC,IAAI;CAGZ;AAED,mEAAiE;AACjE,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAmDxD;AAED,yCAAwC;AACxC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI/D","sourcesContent":["/**\n * Ada Intelligence Engine — persistencia del Goal Engine.\n *\n * Checklist persistente en `<dir>/goals/<id>.md` (ralph-wiggum + rpiv-todo)\n * + snapshot JSON versionado en `<dir>/goals/<id>.json`. Sobrevive a /reload,\n * compactación y resume. Escrituras atómicas (tmp + rename).\n */\n\nimport { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { GoalPersistence, GoalState } from \"./types.ts\";\n\nconst GOAL_STATE_VERSION = 1;\n\nexport class FileGoalPersistence implements GoalPersistence {\n\tprivate dir: string;\n\n\tconstructor(dir: string) {\n\t\tthis.dir = dir;\n\t\tmkdirSync(this.dir, { recursive: true });\n\t}\n\n\tasync save(state: GoalState): Promise<void> {\n\t\tconst snapshot = { version: GOAL_STATE_VERSION, state };\n\t\tconst json = JSON.stringify(snapshot, null, 2);\n\t\tconst md = renderChecklist(state);\n\n\t\tconst jsonPath = this.path(`${state.id}.json`);\n\t\tconst mdPath = this.path(`${state.id}.md`);\n\t\twriteAtomic(jsonPath, json);\n\t\twriteAtomic(mdPath, md);\n\t}\n\n\tasync load(id: string): Promise<GoalState | null> {\n\t\ttry {\n\t\t\tconst raw = readFileSync(this.path(`${id}.json`), \"utf8\");\n\t\t\tconst parsed = JSON.parse(raw) as { version?: number; state: GoalState };\n\t\t\treturn parsed.state;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync list(): Promise<\n\t\tArray<{ id: string; goal: string; status: GoalState[\"status\"]; phase: GoalState[\"phase\"]; updatedAt: string }>\n\t> {\n\t\tconst { readdirSync } = await import(\"node:fs\");\n\t\ttry {\n\t\t\tconst files = readdirSync(this.dir).filter((f) => f.endsWith(\".json\"));\n\t\t\tconst out: Array<{\n\t\t\t\tid: string;\n\t\t\t\tgoal: string;\n\t\t\t\tstatus: GoalState[\"status\"];\n\t\t\t\tphase: GoalState[\"phase\"];\n\t\t\t\tupdatedAt: string;\n\t\t\t}> = [];\n\t\t\tfor (const f of files) {\n\t\t\t\tconst state = await this.load(f.replace(/\\.json$/, \"\"));\n\t\t\t\tif (state) {\n\t\t\t\t\tout.push({\n\t\t\t\t\t\tid: state.id,\n\t\t\t\t\t\tgoal: state.goal,\n\t\t\t\t\t\tstatus: state.status,\n\t\t\t\t\t\tphase: state.phase,\n\t\t\t\t\t\tupdatedAt: state.updatedAt,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tout.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n\t\t\treturn out;\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync remove(id: string): Promise<void> {\n\t\ttry {\n\t\t\trmSync(this.path(`${id}.json`), { force: true });\n\t\t} catch {\n\t\t\t// best-effort\n\t\t}\n\t\ttry {\n\t\t\trmSync(this.path(`${id}.md`), { force: true });\n\t\t} catch {\n\t\t\t// best-effort\n\t\t}\n\t\tthis.cache?.delete(id);\n\t}\n\n\t/** cache opcional para quitar del listado. */\n\tprivate cache?: Map<string, GoalState>;\n\tsetCache(cache: Map<string, GoalState>): void {\n\t\tthis.cache = cache;\n\t}\n\n\tprivate path(name: string): string {\n\t\treturn join(this.dir, name);\n\t}\n}\n\n/** Checklist en markdown — visible y editable por el usuario. */\nexport function renderChecklist(state: GoalState): string {\n\tconst lines: string[] = [];\n\tlines.push(`# Goal: ${state.goal}`);\n\tlines.push(\"\");\n\tlines.push(`- **id**: \\`${state.id}\\``);\n\tlines.push(`- **estado**: ${state.status}`);\n\tlines.push(`- **fase**: ${state.phase}`);\n\tlines.push(`- **turnos**: ${state.turnsUsed}`);\n\tlines.push(`- **creado**: ${state.createdAt}`);\n\tlines.push(\"\");\n\tlines.push(`## Contrato (pi-until-done)`);\n\tlines.push(\"\");\n\tlines.push(`**Hecho cuando:**`);\n\tstate.doneCriteria.forEach((c) => {\n\t\tlines.push(`- [ ] ${c}`);\n\t});\n\tlines.push(\"\");\n\tlines.push(`**Verificar con:** \\`${state.verifyCommand}\\``);\n\tlines.push(\"\");\n\tlines.push(\"## Tareas\");\n\tlines.push(\"\");\n\tif (state.tasks.length === 0) {\n\t\tlines.push(\"_sin plan todavía_\");\n\t} else {\n\t\tfor (const t of state.tasks) {\n\t\t\tconst mark = t.status === \"done\" ? \"x\" : t.status === \"active\" ? \"~\" : \" \";\n\t\t\tlines.push(`- [${mark}] ${t.title}${t.detail ? ` — ${t.detail}` : \"\"}`);\n\t\t}\n\t}\n\tlines.push(\"\");\n\tlines.push(\"## Evidencia\");\n\tlines.push(\"\");\n\tif (state.evidence.length === 0) {\n\t\tlines.push(\"_sin evidencia citada_\");\n\t} else {\n\t\tfor (const e of state.evidence) {\n\t\t\tlines.push(`- **${e.claim}** — ${e.source} (citado por ${e.citedBy})`);\n\t\t}\n\t}\n\tlines.push(\"\");\n\tif (state.judge.lastVerdict) {\n\t\tlines.push(`## Juez: ${state.judge.lastVerdict} — ${state.judge.lastReason ?? \"\"} (${state.judge.model})`);\n\t\tlines.push(\"\");\n\t}\n\tif (state.waiting) {\n\t\tlines.push(`## Esperando: ${state.waiting.reason}`);\n\t\tlines.push(\"\");\n\t}\n\tlines.push(\"---\");\n\tlines.push(`_Actualizado: ${state.updatedAt}_`);\n\treturn lines.join(\"\\n\");\n}\n\n/** Escritura atómica (tmp + rename). */\nexport function writeAtomic(path: string, content: string): void {\n\tconst tmp = `${path}.tmp`;\n\twriteFileSync(tmp, content, \"utf8\");\n\trenameSync(tmp, path);\n}\n"]}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Ada Intelligence Engine — persistencia del Goal Engine.
3
+ *
4
+ * Checklist persistente en `<dir>/goals/<id>.md` (ralph-wiggum + rpiv-todo)
5
+ * + snapshot JSON versionado en `<dir>/goals/<id>.json`. Sobrevive a /reload,
6
+ * compactación y resume. Escrituras atómicas (tmp + rename).
7
+ */
8
+ import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ const GOAL_STATE_VERSION = 1;
11
+ export class FileGoalPersistence {
12
+ dir;
13
+ constructor(dir) {
14
+ this.dir = dir;
15
+ mkdirSync(this.dir, { recursive: true });
16
+ }
17
+ async save(state) {
18
+ const snapshot = { version: GOAL_STATE_VERSION, state };
19
+ const json = JSON.stringify(snapshot, null, 2);
20
+ const md = renderChecklist(state);
21
+ const jsonPath = this.path(`${state.id}.json`);
22
+ const mdPath = this.path(`${state.id}.md`);
23
+ writeAtomic(jsonPath, json);
24
+ writeAtomic(mdPath, md);
25
+ }
26
+ async load(id) {
27
+ try {
28
+ const raw = readFileSync(this.path(`${id}.json`), "utf8");
29
+ const parsed = JSON.parse(raw);
30
+ return parsed.state;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ async list() {
37
+ const { readdirSync } = await import("node:fs");
38
+ try {
39
+ const files = readdirSync(this.dir).filter((f) => f.endsWith(".json"));
40
+ const out = [];
41
+ for (const f of files) {
42
+ const state = await this.load(f.replace(/\.json$/, ""));
43
+ if (state) {
44
+ out.push({
45
+ id: state.id,
46
+ goal: state.goal,
47
+ status: state.status,
48
+ phase: state.phase,
49
+ updatedAt: state.updatedAt,
50
+ });
51
+ }
52
+ }
53
+ out.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
54
+ return out;
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ }
60
+ async remove(id) {
61
+ try {
62
+ rmSync(this.path(`${id}.json`), { force: true });
63
+ }
64
+ catch {
65
+ // best-effort
66
+ }
67
+ try {
68
+ rmSync(this.path(`${id}.md`), { force: true });
69
+ }
70
+ catch {
71
+ // best-effort
72
+ }
73
+ this.cache?.delete(id);
74
+ }
75
+ /** cache opcional para quitar del listado. */
76
+ cache;
77
+ setCache(cache) {
78
+ this.cache = cache;
79
+ }
80
+ path(name) {
81
+ return join(this.dir, name);
82
+ }
83
+ }
84
+ /** Checklist en markdown — visible y editable por el usuario. */
85
+ export function renderChecklist(state) {
86
+ const lines = [];
87
+ lines.push(`# Goal: ${state.goal}`);
88
+ lines.push("");
89
+ lines.push(`- **id**: \`${state.id}\``);
90
+ lines.push(`- **estado**: ${state.status}`);
91
+ lines.push(`- **fase**: ${state.phase}`);
92
+ lines.push(`- **turnos**: ${state.turnsUsed}`);
93
+ lines.push(`- **creado**: ${state.createdAt}`);
94
+ lines.push("");
95
+ lines.push(`## Contrato (pi-until-done)`);
96
+ lines.push("");
97
+ lines.push(`**Hecho cuando:**`);
98
+ state.doneCriteria.forEach((c) => {
99
+ lines.push(`- [ ] ${c}`);
100
+ });
101
+ lines.push("");
102
+ lines.push(`**Verificar con:** \`${state.verifyCommand}\``);
103
+ lines.push("");
104
+ lines.push("## Tareas");
105
+ lines.push("");
106
+ if (state.tasks.length === 0) {
107
+ lines.push("_sin plan todavía_");
108
+ }
109
+ else {
110
+ for (const t of state.tasks) {
111
+ const mark = t.status === "done" ? "x" : t.status === "active" ? "~" : " ";
112
+ lines.push(`- [${mark}] ${t.title}${t.detail ? ` — ${t.detail}` : ""}`);
113
+ }
114
+ }
115
+ lines.push("");
116
+ lines.push("## Evidencia");
117
+ lines.push("");
118
+ if (state.evidence.length === 0) {
119
+ lines.push("_sin evidencia citada_");
120
+ }
121
+ else {
122
+ for (const e of state.evidence) {
123
+ lines.push(`- **${e.claim}** — ${e.source} (citado por ${e.citedBy})`);
124
+ }
125
+ }
126
+ lines.push("");
127
+ if (state.judge.lastVerdict) {
128
+ lines.push(`## Juez: ${state.judge.lastVerdict} — ${state.judge.lastReason ?? ""} (${state.judge.model})`);
129
+ lines.push("");
130
+ }
131
+ if (state.waiting) {
132
+ lines.push(`## Esperando: ${state.waiting.reason}`);
133
+ lines.push("");
134
+ }
135
+ lines.push("---");
136
+ lines.push(`_Actualizado: ${state.updatedAt}_`);
137
+ return lines.join("\n");
138
+ }
139
+ /** Escritura atómica (tmp + rename). */
140
+ export function writeAtomic(path, content) {
141
+ const tmp = `${path}.tmp`;
142
+ writeFileSync(tmp, content, "utf8");
143
+ renameSync(tmp, path);
144
+ }
145
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../../src/core/workflows/goal-engine/persistence.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Ada Intelligence Engine — persistencia del Goal Engine.\n *\n * Checklist persistente en `<dir>/goals/<id>.md` (ralph-wiggum + rpiv-todo)\n * + snapshot JSON versionado en `<dir>/goals/<id>.json`. Sobrevive a /reload,\n * compactación y resume. Escrituras atómicas (tmp + rename).\n */\n\nimport { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { GoalPersistence, GoalState } from \"./types.ts\";\n\nconst GOAL_STATE_VERSION = 1;\n\nexport class FileGoalPersistence implements GoalPersistence {\n\tprivate dir: string;\n\n\tconstructor(dir: string) {\n\t\tthis.dir = dir;\n\t\tmkdirSync(this.dir, { recursive: true });\n\t}\n\n\tasync save(state: GoalState): Promise<void> {\n\t\tconst snapshot = { version: GOAL_STATE_VERSION, state };\n\t\tconst json = JSON.stringify(snapshot, null, 2);\n\t\tconst md = renderChecklist(state);\n\n\t\tconst jsonPath = this.path(`${state.id}.json`);\n\t\tconst mdPath = this.path(`${state.id}.md`);\n\t\twriteAtomic(jsonPath, json);\n\t\twriteAtomic(mdPath, md);\n\t}\n\n\tasync load(id: string): Promise<GoalState | null> {\n\t\ttry {\n\t\t\tconst raw = readFileSync(this.path(`${id}.json`), \"utf8\");\n\t\t\tconst parsed = JSON.parse(raw) as { version?: number; state: GoalState };\n\t\t\treturn parsed.state;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync list(): Promise<\n\t\tArray<{ id: string; goal: string; status: GoalState[\"status\"]; phase: GoalState[\"phase\"]; updatedAt: string }>\n\t> {\n\t\tconst { readdirSync } = await import(\"node:fs\");\n\t\ttry {\n\t\t\tconst files = readdirSync(this.dir).filter((f) => f.endsWith(\".json\"));\n\t\t\tconst out: Array<{\n\t\t\t\tid: string;\n\t\t\t\tgoal: string;\n\t\t\t\tstatus: GoalState[\"status\"];\n\t\t\t\tphase: GoalState[\"phase\"];\n\t\t\t\tupdatedAt: string;\n\t\t\t}> = [];\n\t\t\tfor (const f of files) {\n\t\t\t\tconst state = await this.load(f.replace(/\\.json$/, \"\"));\n\t\t\t\tif (state) {\n\t\t\t\t\tout.push({\n\t\t\t\t\t\tid: state.id,\n\t\t\t\t\t\tgoal: state.goal,\n\t\t\t\t\t\tstatus: state.status,\n\t\t\t\t\t\tphase: state.phase,\n\t\t\t\t\t\tupdatedAt: state.updatedAt,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tout.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n\t\t\treturn out;\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync remove(id: string): Promise<void> {\n\t\ttry {\n\t\t\trmSync(this.path(`${id}.json`), { force: true });\n\t\t} catch {\n\t\t\t// best-effort\n\t\t}\n\t\ttry {\n\t\t\trmSync(this.path(`${id}.md`), { force: true });\n\t\t} catch {\n\t\t\t// best-effort\n\t\t}\n\t\tthis.cache?.delete(id);\n\t}\n\n\t/** cache opcional para quitar del listado. */\n\tprivate cache?: Map<string, GoalState>;\n\tsetCache(cache: Map<string, GoalState>): void {\n\t\tthis.cache = cache;\n\t}\n\n\tprivate path(name: string): string {\n\t\treturn join(this.dir, name);\n\t}\n}\n\n/** Checklist en markdown — visible y editable por el usuario. */\nexport function renderChecklist(state: GoalState): string {\n\tconst lines: string[] = [];\n\tlines.push(`# Goal: ${state.goal}`);\n\tlines.push(\"\");\n\tlines.push(`- **id**: \\`${state.id}\\``);\n\tlines.push(`- **estado**: ${state.status}`);\n\tlines.push(`- **fase**: ${state.phase}`);\n\tlines.push(`- **turnos**: ${state.turnsUsed}`);\n\tlines.push(`- **creado**: ${state.createdAt}`);\n\tlines.push(\"\");\n\tlines.push(`## Contrato (pi-until-done)`);\n\tlines.push(\"\");\n\tlines.push(`**Hecho cuando:**`);\n\tstate.doneCriteria.forEach((c) => {\n\t\tlines.push(`- [ ] ${c}`);\n\t});\n\tlines.push(\"\");\n\tlines.push(`**Verificar con:** \\`${state.verifyCommand}\\``);\n\tlines.push(\"\");\n\tlines.push(\"## Tareas\");\n\tlines.push(\"\");\n\tif (state.tasks.length === 0) {\n\t\tlines.push(\"_sin plan todavía_\");\n\t} else {\n\t\tfor (const t of state.tasks) {\n\t\t\tconst mark = t.status === \"done\" ? \"x\" : t.status === \"active\" ? \"~\" : \" \";\n\t\t\tlines.push(`- [${mark}] ${t.title}${t.detail ? ` — ${t.detail}` : \"\"}`);\n\t\t}\n\t}\n\tlines.push(\"\");\n\tlines.push(\"## Evidencia\");\n\tlines.push(\"\");\n\tif (state.evidence.length === 0) {\n\t\tlines.push(\"_sin evidencia citada_\");\n\t} else {\n\t\tfor (const e of state.evidence) {\n\t\t\tlines.push(`- **${e.claim}** — ${e.source} (citado por ${e.citedBy})`);\n\t\t}\n\t}\n\tlines.push(\"\");\n\tif (state.judge.lastVerdict) {\n\t\tlines.push(`## Juez: ${state.judge.lastVerdict} — ${state.judge.lastReason ?? \"\"} (${state.judge.model})`);\n\t\tlines.push(\"\");\n\t}\n\tif (state.waiting) {\n\t\tlines.push(`## Esperando: ${state.waiting.reason}`);\n\t\tlines.push(\"\");\n\t}\n\tlines.push(\"---\");\n\tlines.push(`_Actualizado: ${state.updatedAt}_`);\n\treturn lines.join(\"\\n\");\n}\n\n/** Escritura atómica (tmp + rename). */\nexport function writeAtomic(path: string, content: string): void {\n\tconst tmp = `${path}.tmp`;\n\twriteFileSync(tmp, content, \"utf8\");\n\trenameSync(tmp, path);\n}\n"]}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Ada Intelligence Engine — prompts del Goal Engine.
3
+ *
4
+ * buildGoalWorkPrompt: el agente que trabaja en una fase TDD concreta.
5
+ * buildGoalJudgePrompt: el JUEZ (cross-model recomendado) — revisa SOLO
6
+ * goal + criteria + evidencia citada → {verdict: done|continue, reason}.
7
+ * Sin herramientas: no puede tocar archivos ni afirmar nada que no esté
8
+ * citado en la evidencia (pi-until-done: "criteria LITERALLY satisfied").
9
+ */
10
+ import type { GoalWorkInput } from "./types.ts";
11
+ export declare function buildGoalWorkPrompt(input: GoalWorkInput): string;
12
+ export interface JudgePromptInput {
13
+ goal: string;
14
+ doneCriteria: string[];
15
+ verifyCommand: string;
16
+ evidence: Array<{
17
+ claim: string;
18
+ source: string;
19
+ citedBy: string;
20
+ }>;
21
+ phase: string;
22
+ }
23
+ export declare function buildGoalJudgePrompt(input: JudgePromptInput): string;
24
+ export type { GoalJudgeFn, GoalReplanFn } from "./types.ts";
25
+ /** Prompt de re-planificación (P1): nuevo plan completo tras continue. */
26
+ export declare function buildGoalReplanPrompt(input: {
27
+ goal: string;
28
+ doneCriteria: string[];
29
+ verifyCommand: string;
30
+ evidence: {
31
+ claim: string;
32
+ source: string;
33
+ }[];
34
+ currentTasks: string[];
35
+ lastReason?: string;
36
+ }): string;
37
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../../src/core/workflows/goal-engine/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAyChE;AAqBD,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,KAAK,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CA6BpE;AAGD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,2EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAmCT","sourcesContent":["/**\n * Ada Intelligence Engine — prompts del Goal Engine.\n *\n * buildGoalWorkPrompt: el agente que trabaja en una fase TDD concreta.\n * buildGoalJudgePrompt: el JUEZ (cross-model recomendado) — revisa SOLO\n * goal + criteria + evidencia citada → {verdict: done|continue, reason}.\n * Sin herramientas: no puede tocar archivos ni afirmar nada que no esté\n * citado en la evidencia (pi-until-done: \"criteria LITERALLY satisfied\").\n */\n\nimport type { GoalWorkInput } from \"./types.ts\";\n\nexport function buildGoalWorkPrompt(input: GoalWorkInput): string {\n\tconst tasks = input.tasks\n\t\t.map(\n\t\t\t(t) =>\n\t\t\t\t`- [${t.status === \"done\" ? \"x\" : t.status === \"active\" ? \"~\" : \" \"}] ${t.title}${t.detail ? ` — ${t.detail}` : \"\"}`,\n\t\t)\n\t\t.join(\"\\n\");\n\tconst evidence =\n\t\tinput.evidence.map((e) => `- ${e.claim} — ${e.source} (citado por ${e.citedBy})`).join(\"\\n\") ||\n\t\t\"_sin evidencia todavía_\";\n\n\treturn [\n\t\t`Estás trabajando en un goal dentro del Ada Intelligence Engine.`,\n\t\t``,\n\t\t`## Goal (verbatim)`,\n\t\tinput.goal,\n\t\t``,\n\t\t`## Fase actual (orden TDD fijo — no puedes saltarte fases)`,\n\t\tinput.phase,\n\t\t``,\n\t\t`## Contrato — Hecho cuando:`,\n\t\tinput.doneCriteria.map((c, i) => `${i + 1}. ${c}`).join(\"\\n\"),\n\t\t``,\n\t\t`## Verificación (comando re-ejecutable)`,\n\t\t`\\`${input.verifyCommand}\\``,\n\t\t``,\n\t\t`## Checklist`,\n\t\ttasks || \"_sin plan todavía_\",\n\t\t``,\n\t\t`## Evidencia citada hasta ahora`,\n\t\tevidence,\n\t\t``,\n\t\t`## Tu tarea en esta fase`,\n\t\tfaseInstruction(input.phase),\n\t\t``,\n\t\t`Turno ${input.turn}/${input.maxTurns}. Trabaja de forma incremental:`,\n\t\t`- Ejecuta los comandos reales (npx, npm, git) para verificar lo que haces.`,\n\t\t`- Cita evidencia con archivo:línea exacta o URL cuando afirmes algo.`,\n\t\t`- No marques nada como hecho sin verificarlo.`,\n\t\t`- Termina con un resumen de 1-3 frases de lo que hiciste en ESTE turno (no del goal completo).`,\n\t].join(\"\\n\");\n}\n\nfunction faseInstruction(phase: string): string {\n\tswitch (phase) {\n\t\tcase \"analysis\":\n\t\t\treturn \"Analiza el estado actual: lee los archivos relevantes, identifica lo que hay que hacer y propón el plan de tareas. No edites todavía.\";\n\t\tcase \"bootstrap\":\n\t\t\treturn \"Prepara el andamiaje: configuración inicial, estructura, dependencias. No escribas tests que fallan ni implementación todavía.\";\n\t\tcase \"red\":\n\t\t\treturn \"Escribe UN test que falle (RED) para el comportamiento más importante del contrato. Ejecútalo y confirma que falla por la razón correcta.\";\n\t\tcase \"green\":\n\t\t\treturn \"Implementa el mínimo necesario para que el test pase (GREEN). Ejecuta el test y confirma que pasa.\";\n\t\tcase \"refactor\":\n\t\t\treturn \"Refactoriza sin cambiar comportamiento: todos los tests deben seguir pasando. Elimina duplicación.\";\n\t\tcase \"verify\":\n\t\t\treturn \"Verificación final: ejecuta el comando de verificación del contrato y todos los tests. Reúne la evidencia para el juez.\";\n\t\tdefault:\n\t\t\treturn \"Continúa el trabajo según el contrato.\";\n\t}\n}\n\nexport interface JudgePromptInput {\n\tgoal: string;\n\tdoneCriteria: string[];\n\tverifyCommand: string;\n\tevidence: Array<{ claim: string; source: string; citedBy: string }>;\n\tphase: string;\n}\n\nexport function buildGoalJudgePrompt(input: JudgePromptInput): string {\n\tconst criteria = input.doneCriteria.map((c, i) => `${i + 1}. ${c}`).join(\"\\n\");\n\tconst evidence =\n\t\tinput.evidence.map((e) => `- ${e.claim} — ${e.source} (citado por ${e.citedBy})`).join(\"\\n\") ||\n\t\t\"_NO HAY EVIDENCIA_\";\n\treturn [\n\t\t`Eres el JUEZ de un goal. Tu única tarea: decidir si el goal está COMPLETO.`,\n\t\t``,\n\t\t`## Goal`,\n\t\tinput.goal,\n\t\t``,\n\t\t`## Criterios de hechura (deben cumplirse LITERALMENTE)`,\n\t\tcriteria,\n\t\t``,\n\t\t`## Comando de verificación`,\n\t\t`\\`${input.verifyCommand}\\``,\n\t\t``,\n\t\t`## Evidencia citada (la ÚNICA fuente de verdad — no puedes suponer nada)`,\n\t\tevidence,\n\t\t``,\n\t\t`## Reglas`,\n\t\t`1. Solo puedes evaluar lo que la evidencia demuestra. Un \"hecho\" sin cita archivo:línea o URL NO cuenta.`,\n\t\t`2. Rechaza señales proxy: decir \"se ha completado\" sin prueba no es suficiente.`,\n\t\t`3. Si TODOS los criterios están satisfechos con evidencia citada → verdict \"done\".`,\n\t\t`4. Si falta alguno o la evidencia no es concluyente → verdict \"continue\" y explica EXACTAMENTE qué falta.`,\n\t\t`5. Nunca des \"done\" por cortesía: los criterios se cumplen literalmente o no.`,\n\t\t``,\n\t\t`Responde SOLO con JSON: {\"verdict\": \"done\" | \"continue\", \"reason\": \"explicación concisa\"}`,\n\t].join(\"\\n\");\n}\n\n// Re-export para el wiring del resource-loader.\nexport type { GoalJudgeFn, GoalReplanFn } from \"./types.ts\";\n\n/** Prompt de re-planificación (P1): nuevo plan completo tras continue. */\nexport function buildGoalReplanPrompt(input: {\n\tgoal: string;\n\tdoneCriteria: string[];\n\tverifyCommand: string;\n\tevidence: { claim: string; source: string }[];\n\tcurrentTasks: string[];\n\tlastReason?: string;\n}): string {\n\tconst criteria = input.doneCriteria.map((c, i) => `${i + 1}. ${c}`).join(\"\\n\");\n\tconst evidence = input.evidence.map((e) => `- ${e.claim} — ${e.source}`).join(\"\\n\") || \"_NO HAY EVIDENCIA_\";\n\tconst current = input.currentTasks.length\n\t\t? input.currentTasks.map((t, i) => `${i + 1}. ${t}`).join(\"\\n\")\n\t\t: \"_SIN PLAN_\";\n\treturn [\n\t\t`Eres el PLANIFICADOR de un goal. Debes generar un NUEVO plan de sub-tareas completo para lograr el goal, aprendiendo de la iteración anterior.`,\n\t\t``,\n\t\t`## Goal`,\n\t\tinput.goal,\n\t\t``,\n\t\t`## Criterios de hechura (contrato literal)`,\n\t\tcriteria,\n\t\t``,\n\t\t`## Comando de verificación`,\n\t\t`\\`${input.verifyCommand}\\``,\n\t\t``,\n\t\t`## Plan actual (que NO logró el goal)`,\n\t\tcurrent,\n\t\t``,\n\t\t`## Por qué falló según el juez`,\n\t\tinput.lastReason ?? \"_sin razón_\",\n\t\t``,\n\t\t`## Evidencia acumulada (lo que ya se sabe)`,\n\t\tevidence,\n\t\t``,\n\t\t`## Reglas`,\n\t\t`1. Genera un plan DIFERENTE al actual: ataca la causa raíz del fallo (ver por qué falló). No repitas las mismas sub-tareas con otros nombres.`,\n\t\t`2. Máximo 6 sub-tareas, cada una verificable e independiente en lo posible.`,\n\t\t`3. No pidas permisos ni aprobaciones inline: el plan se aprueba fuera.`,\n\t\t`4. Si el plan actual coincide con el nuevo, el juez no debería volver a fallar por lo mismo.`,\n\t\t``,\n\t\t`Responde SOLO con JSON: {\"tasks\": [{\"title\": \"sub-tarea 1\"}, ...], \"rationale\": \"por qué este plan nuevo sí logra el goal\"}`,\n\t].join(\"\\n\");\n}\n"]}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Ada Intelligence Engine — prompts del Goal Engine.
3
+ *
4
+ * buildGoalWorkPrompt: el agente que trabaja en una fase TDD concreta.
5
+ * buildGoalJudgePrompt: el JUEZ (cross-model recomendado) — revisa SOLO
6
+ * goal + criteria + evidencia citada → {verdict: done|continue, reason}.
7
+ * Sin herramientas: no puede tocar archivos ni afirmar nada que no esté
8
+ * citado en la evidencia (pi-until-done: "criteria LITERALLY satisfied").
9
+ */
10
+ export function buildGoalWorkPrompt(input) {
11
+ const tasks = input.tasks
12
+ .map((t) => `- [${t.status === "done" ? "x" : t.status === "active" ? "~" : " "}] ${t.title}${t.detail ? ` — ${t.detail}` : ""}`)
13
+ .join("\n");
14
+ const evidence = input.evidence.map((e) => `- ${e.claim} — ${e.source} (citado por ${e.citedBy})`).join("\n") ||
15
+ "_sin evidencia todavía_";
16
+ return [
17
+ `Estás trabajando en un goal dentro del Ada Intelligence Engine.`,
18
+ ``,
19
+ `## Goal (verbatim)`,
20
+ input.goal,
21
+ ``,
22
+ `## Fase actual (orden TDD fijo — no puedes saltarte fases)`,
23
+ input.phase,
24
+ ``,
25
+ `## Contrato — Hecho cuando:`,
26
+ input.doneCriteria.map((c, i) => `${i + 1}. ${c}`).join("\n"),
27
+ ``,
28
+ `## Verificación (comando re-ejecutable)`,
29
+ `\`${input.verifyCommand}\``,
30
+ ``,
31
+ `## Checklist`,
32
+ tasks || "_sin plan todavía_",
33
+ ``,
34
+ `## Evidencia citada hasta ahora`,
35
+ evidence,
36
+ ``,
37
+ `## Tu tarea en esta fase`,
38
+ faseInstruction(input.phase),
39
+ ``,
40
+ `Turno ${input.turn}/${input.maxTurns}. Trabaja de forma incremental:`,
41
+ `- Ejecuta los comandos reales (npx, npm, git) para verificar lo que haces.`,
42
+ `- Cita evidencia con archivo:línea exacta o URL cuando afirmes algo.`,
43
+ `- No marques nada como hecho sin verificarlo.`,
44
+ `- Termina con un resumen de 1-3 frases de lo que hiciste en ESTE turno (no del goal completo).`,
45
+ ].join("\n");
46
+ }
47
+ function faseInstruction(phase) {
48
+ switch (phase) {
49
+ case "analysis":
50
+ return "Analiza el estado actual: lee los archivos relevantes, identifica lo que hay que hacer y propón el plan de tareas. No edites todavía.";
51
+ case "bootstrap":
52
+ return "Prepara el andamiaje: configuración inicial, estructura, dependencias. No escribas tests que fallan ni implementación todavía.";
53
+ case "red":
54
+ return "Escribe UN test que falle (RED) para el comportamiento más importante del contrato. Ejecútalo y confirma que falla por la razón correcta.";
55
+ case "green":
56
+ return "Implementa el mínimo necesario para que el test pase (GREEN). Ejecuta el test y confirma que pasa.";
57
+ case "refactor":
58
+ return "Refactoriza sin cambiar comportamiento: todos los tests deben seguir pasando. Elimina duplicación.";
59
+ case "verify":
60
+ return "Verificación final: ejecuta el comando de verificación del contrato y todos los tests. Reúne la evidencia para el juez.";
61
+ default:
62
+ return "Continúa el trabajo según el contrato.";
63
+ }
64
+ }
65
+ export function buildGoalJudgePrompt(input) {
66
+ const criteria = input.doneCriteria.map((c, i) => `${i + 1}. ${c}`).join("\n");
67
+ const evidence = input.evidence.map((e) => `- ${e.claim} — ${e.source} (citado por ${e.citedBy})`).join("\n") ||
68
+ "_NO HAY EVIDENCIA_";
69
+ return [
70
+ `Eres el JUEZ de un goal. Tu única tarea: decidir si el goal está COMPLETO.`,
71
+ ``,
72
+ `## Goal`,
73
+ input.goal,
74
+ ``,
75
+ `## Criterios de hechura (deben cumplirse LITERALMENTE)`,
76
+ criteria,
77
+ ``,
78
+ `## Comando de verificación`,
79
+ `\`${input.verifyCommand}\``,
80
+ ``,
81
+ `## Evidencia citada (la ÚNICA fuente de verdad — no puedes suponer nada)`,
82
+ evidence,
83
+ ``,
84
+ `## Reglas`,
85
+ `1. Solo puedes evaluar lo que la evidencia demuestra. Un "hecho" sin cita archivo:línea o URL NO cuenta.`,
86
+ `2. Rechaza señales proxy: decir "se ha completado" sin prueba no es suficiente.`,
87
+ `3. Si TODOS los criterios están satisfechos con evidencia citada → verdict "done".`,
88
+ `4. Si falta alguno o la evidencia no es concluyente → verdict "continue" y explica EXACTAMENTE qué falta.`,
89
+ `5. Nunca des "done" por cortesía: los criterios se cumplen literalmente o no.`,
90
+ ``,
91
+ `Responde SOLO con JSON: {"verdict": "done" | "continue", "reason": "explicación concisa"}`,
92
+ ].join("\n");
93
+ }
94
+ /** Prompt de re-planificación (P1): nuevo plan completo tras continue. */
95
+ export function buildGoalReplanPrompt(input) {
96
+ const criteria = input.doneCriteria.map((c, i) => `${i + 1}. ${c}`).join("\n");
97
+ const evidence = input.evidence.map((e) => `- ${e.claim} — ${e.source}`).join("\n") || "_NO HAY EVIDENCIA_";
98
+ const current = input.currentTasks.length
99
+ ? input.currentTasks.map((t, i) => `${i + 1}. ${t}`).join("\n")
100
+ : "_SIN PLAN_";
101
+ return [
102
+ `Eres el PLANIFICADOR de un goal. Debes generar un NUEVO plan de sub-tareas completo para lograr el goal, aprendiendo de la iteración anterior.`,
103
+ ``,
104
+ `## Goal`,
105
+ input.goal,
106
+ ``,
107
+ `## Criterios de hechura (contrato literal)`,
108
+ criteria,
109
+ ``,
110
+ `## Comando de verificación`,
111
+ `\`${input.verifyCommand}\``,
112
+ ``,
113
+ `## Plan actual (que NO logró el goal)`,
114
+ current,
115
+ ``,
116
+ `## Por qué falló según el juez`,
117
+ input.lastReason ?? "_sin razón_",
118
+ ``,
119
+ `## Evidencia acumulada (lo que ya se sabe)`,
120
+ evidence,
121
+ ``,
122
+ `## Reglas`,
123
+ `1. Genera un plan DIFERENTE al actual: ataca la causa raíz del fallo (ver por qué falló). No repitas las mismas sub-tareas con otros nombres.`,
124
+ `2. Máximo 6 sub-tareas, cada una verificable e independiente en lo posible.`,
125
+ `3. No pidas permisos ni aprobaciones inline: el plan se aprueba fuera.`,
126
+ `4. Si el plan actual coincide con el nuevo, el juez no debería volver a fallar por lo mismo.`,
127
+ ``,
128
+ `Responde SOLO con JSON: {"tasks": [{"title": "sub-tarea 1"}, ...], "rationale": "por qué este plan nuevo sí logra el goal"}`,
129
+ ].join("\n");
130
+ }
131
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../src/core/workflows/goal-engine/prompts.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Ada Intelligence Engine — prompts del Goal Engine.\n *\n * buildGoalWorkPrompt: el agente que trabaja en una fase TDD concreta.\n * buildGoalJudgePrompt: el JUEZ (cross-model recomendado) — revisa SOLO\n * goal + criteria + evidencia citada → {verdict: done|continue, reason}.\n * Sin herramientas: no puede tocar archivos ni afirmar nada que no esté\n * citado en la evidencia (pi-until-done: \"criteria LITERALLY satisfied\").\n */\n\nimport type { GoalWorkInput } from \"./types.ts\";\n\nexport function buildGoalWorkPrompt(input: GoalWorkInput): string {\n\tconst tasks = input.tasks\n\t\t.map(\n\t\t\t(t) =>\n\t\t\t\t`- [${t.status === \"done\" ? \"x\" : t.status === \"active\" ? \"~\" : \" \"}] ${t.title}${t.detail ? ` — ${t.detail}` : \"\"}`,\n\t\t)\n\t\t.join(\"\\n\");\n\tconst evidence =\n\t\tinput.evidence.map((e) => `- ${e.claim} — ${e.source} (citado por ${e.citedBy})`).join(\"\\n\") ||\n\t\t\"_sin evidencia todavía_\";\n\n\treturn [\n\t\t`Estás trabajando en un goal dentro del Ada Intelligence Engine.`,\n\t\t``,\n\t\t`## Goal (verbatim)`,\n\t\tinput.goal,\n\t\t``,\n\t\t`## Fase actual (orden TDD fijo — no puedes saltarte fases)`,\n\t\tinput.phase,\n\t\t``,\n\t\t`## Contrato — Hecho cuando:`,\n\t\tinput.doneCriteria.map((c, i) => `${i + 1}. ${c}`).join(\"\\n\"),\n\t\t``,\n\t\t`## Verificación (comando re-ejecutable)`,\n\t\t`\\`${input.verifyCommand}\\``,\n\t\t``,\n\t\t`## Checklist`,\n\t\ttasks || \"_sin plan todavía_\",\n\t\t``,\n\t\t`## Evidencia citada hasta ahora`,\n\t\tevidence,\n\t\t``,\n\t\t`## Tu tarea en esta fase`,\n\t\tfaseInstruction(input.phase),\n\t\t``,\n\t\t`Turno ${input.turn}/${input.maxTurns}. Trabaja de forma incremental:`,\n\t\t`- Ejecuta los comandos reales (npx, npm, git) para verificar lo que haces.`,\n\t\t`- Cita evidencia con archivo:línea exacta o URL cuando afirmes algo.`,\n\t\t`- No marques nada como hecho sin verificarlo.`,\n\t\t`- Termina con un resumen de 1-3 frases de lo que hiciste en ESTE turno (no del goal completo).`,\n\t].join(\"\\n\");\n}\n\nfunction faseInstruction(phase: string): string {\n\tswitch (phase) {\n\t\tcase \"analysis\":\n\t\t\treturn \"Analiza el estado actual: lee los archivos relevantes, identifica lo que hay que hacer y propón el plan de tareas. No edites todavía.\";\n\t\tcase \"bootstrap\":\n\t\t\treturn \"Prepara el andamiaje: configuración inicial, estructura, dependencias. No escribas tests que fallan ni implementación todavía.\";\n\t\tcase \"red\":\n\t\t\treturn \"Escribe UN test que falle (RED) para el comportamiento más importante del contrato. Ejecútalo y confirma que falla por la razón correcta.\";\n\t\tcase \"green\":\n\t\t\treturn \"Implementa el mínimo necesario para que el test pase (GREEN). Ejecuta el test y confirma que pasa.\";\n\t\tcase \"refactor\":\n\t\t\treturn \"Refactoriza sin cambiar comportamiento: todos los tests deben seguir pasando. Elimina duplicación.\";\n\t\tcase \"verify\":\n\t\t\treturn \"Verificación final: ejecuta el comando de verificación del contrato y todos los tests. Reúne la evidencia para el juez.\";\n\t\tdefault:\n\t\t\treturn \"Continúa el trabajo según el contrato.\";\n\t}\n}\n\nexport interface JudgePromptInput {\n\tgoal: string;\n\tdoneCriteria: string[];\n\tverifyCommand: string;\n\tevidence: Array<{ claim: string; source: string; citedBy: string }>;\n\tphase: string;\n}\n\nexport function buildGoalJudgePrompt(input: JudgePromptInput): string {\n\tconst criteria = input.doneCriteria.map((c, i) => `${i + 1}. ${c}`).join(\"\\n\");\n\tconst evidence =\n\t\tinput.evidence.map((e) => `- ${e.claim} — ${e.source} (citado por ${e.citedBy})`).join(\"\\n\") ||\n\t\t\"_NO HAY EVIDENCIA_\";\n\treturn [\n\t\t`Eres el JUEZ de un goal. Tu única tarea: decidir si el goal está COMPLETO.`,\n\t\t``,\n\t\t`## Goal`,\n\t\tinput.goal,\n\t\t``,\n\t\t`## Criterios de hechura (deben cumplirse LITERALMENTE)`,\n\t\tcriteria,\n\t\t``,\n\t\t`## Comando de verificación`,\n\t\t`\\`${input.verifyCommand}\\``,\n\t\t``,\n\t\t`## Evidencia citada (la ÚNICA fuente de verdad — no puedes suponer nada)`,\n\t\tevidence,\n\t\t``,\n\t\t`## Reglas`,\n\t\t`1. Solo puedes evaluar lo que la evidencia demuestra. Un \"hecho\" sin cita archivo:línea o URL NO cuenta.`,\n\t\t`2. Rechaza señales proxy: decir \"se ha completado\" sin prueba no es suficiente.`,\n\t\t`3. Si TODOS los criterios están satisfechos con evidencia citada → verdict \"done\".`,\n\t\t`4. Si falta alguno o la evidencia no es concluyente → verdict \"continue\" y explica EXACTAMENTE qué falta.`,\n\t\t`5. Nunca des \"done\" por cortesía: los criterios se cumplen literalmente o no.`,\n\t\t``,\n\t\t`Responde SOLO con JSON: {\"verdict\": \"done\" | \"continue\", \"reason\": \"explicación concisa\"}`,\n\t].join(\"\\n\");\n}\n\n// Re-export para el wiring del resource-loader.\nexport type { GoalJudgeFn, GoalReplanFn } from \"./types.ts\";\n\n/** Prompt de re-planificación (P1): nuevo plan completo tras continue. */\nexport function buildGoalReplanPrompt(input: {\n\tgoal: string;\n\tdoneCriteria: string[];\n\tverifyCommand: string;\n\tevidence: { claim: string; source: string }[];\n\tcurrentTasks: string[];\n\tlastReason?: string;\n}): string {\n\tconst criteria = input.doneCriteria.map((c, i) => `${i + 1}. ${c}`).join(\"\\n\");\n\tconst evidence = input.evidence.map((e) => `- ${e.claim} — ${e.source}`).join(\"\\n\") || \"_NO HAY EVIDENCIA_\";\n\tconst current = input.currentTasks.length\n\t\t? input.currentTasks.map((t, i) => `${i + 1}. ${t}`).join(\"\\n\")\n\t\t: \"_SIN PLAN_\";\n\treturn [\n\t\t`Eres el PLANIFICADOR de un goal. Debes generar un NUEVO plan de sub-tareas completo para lograr el goal, aprendiendo de la iteración anterior.`,\n\t\t``,\n\t\t`## Goal`,\n\t\tinput.goal,\n\t\t``,\n\t\t`## Criterios de hechura (contrato literal)`,\n\t\tcriteria,\n\t\t``,\n\t\t`## Comando de verificación`,\n\t\t`\\`${input.verifyCommand}\\``,\n\t\t``,\n\t\t`## Plan actual (que NO logró el goal)`,\n\t\tcurrent,\n\t\t``,\n\t\t`## Por qué falló según el juez`,\n\t\tinput.lastReason ?? \"_sin razón_\",\n\t\t``,\n\t\t`## Evidencia acumulada (lo que ya se sabe)`,\n\t\tevidence,\n\t\t``,\n\t\t`## Reglas`,\n\t\t`1. Genera un plan DIFERENTE al actual: ataca la causa raíz del fallo (ver por qué falló). No repitas las mismas sub-tareas con otros nombres.`,\n\t\t`2. Máximo 6 sub-tareas, cada una verificable e independiente en lo posible.`,\n\t\t`3. No pidas permisos ni aprobaciones inline: el plan se aprueba fuera.`,\n\t\t`4. Si el plan actual coincide con el nuevo, el juez no debería volver a fallar por lo mismo.`,\n\t\t``,\n\t\t`Responde SOLO con JSON: {\"tasks\": [{\"title\": \"sub-tarea 1\"}, ...], \"rationale\": \"por qué este plan nuevo sí logra el goal\"}`,\n\t].join(\"\\n\");\n}\n"]}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Ada Intelligence Engine — Goal Engine reducer (puro).
3
+ *
4
+ * Reducer determinista: todas las transiciones de estado pasan por aquí.
5
+ * Reglas de seguridad integradas:
6
+ * - El goal se rota (nuevo id) al editar/reanudar → un turno viejo (id viejo)
7
+ * no puede completar el goal nuevo (guards anti-duplicados).
8
+ * - Las fases TDD son un orden FIJO (código, no elección del modelo).
9
+ * - `goal_complete` exige evidencia citada y juez con verdict done.
10
+ * - Un turno vacío/idéntico incrementa repeatedTurns → pause a la tolerancia.
11
+ */
12
+ import type { GoalAction, GoalFrenos, GoalPhase, GoalState } from "./types.ts";
13
+ export declare const TDD_PHASES: GoalPhase[];
14
+ export declare function nextPhase(phase: GoalPhase): GoalPhase;
15
+ /** Crea un goal en estado setup (contrato primero, sin trabajo). */
16
+ export declare function createGoalState(input: {
17
+ goal: string;
18
+ doneCriteria: string[];
19
+ verifyCommand: string;
20
+ id?: string;
21
+ now?: string;
22
+ sessionId?: string;
23
+ }): GoalState;
24
+ export interface ReduceResult {
25
+ state: GoalState;
26
+ /** Transiciones que la UI debe conocer. */
27
+ events: Array<{
28
+ phase?: GoalPhase;
29
+ paused?: boolean;
30
+ replan?: {
31
+ iteration: number;
32
+ tasks: unknown[];
33
+ };
34
+ tasksChanged?: unknown[];
35
+ }>;
36
+ /** true si el bucle debe detenerse tras esta acción. */
37
+ stopLoop: boolean;
38
+ }
39
+ /** Reduce una acción sobre el estado. Devuelve nuevo estado + eventos derivados. */
40
+ export declare function reduceGoal(state: GoalState, action: GoalAction, _frenos?: GoalFrenos): ReduceResult;
41
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../src/core/workflows/goal-engine/state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAgB,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAoB,MAAM,YAAY,CAAC;AAE/G,eAAO,MAAM,UAAU,EAAE,SAAS,EAA4E,CAAC;AAE/G,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAGrD;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,SAAS,CAsBZ;AAMD,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,2CAA2C;IAC3C,MAAM,EAAE,KAAK,CAAC;QACb,KAAK,CAAC,EAAE,SAAS,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,EAAE,CAAA;SAAE,CAAC;QACjD,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;KACzB,CAAC,CAAC;IACH,yDAAwD;IACxD,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,qFAAoF;AACpF,wBAAgB,UAAU,CACzB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,UAOR,GACC,YAAY,CAmWd","sourcesContent":["/**\n * Ada Intelligence Engine — Goal Engine reducer (puro).\n *\n * Reducer determinista: todas las transiciones de estado pasan por aquí.\n * Reglas de seguridad integradas:\n * - El goal se rota (nuevo id) al editar/reanudar → un turno viejo (id viejo)\n * no puede completar el goal nuevo (guards anti-duplicados).\n * - Las fases TDD son un orden FIJO (código, no elección del modelo).\n * - `goal_complete` exige evidencia citada y juez con verdict done.\n * - Un turno vacío/idéntico incrementa repeatedTurns → pause a la tolerancia.\n */\n\nimport type { EvidenceItem, GoalAction, GoalFrenos, GoalPhase, GoalState, Task, TaskStatus } from \"./types.ts\";\n\nexport const TDD_PHASES: GoalPhase[] = [\"analysis\", \"bootstrap\", \"red\", \"green\", \"refactor\", \"verify\", \"done\"];\n\nexport function nextPhase(phase: GoalPhase): GoalPhase {\n\tconst i = TDD_PHASES.indexOf(phase);\n\treturn i >= 0 && i < TDD_PHASES.length - 1 ? TDD_PHASES[i + 1] : phase;\n}\n\n/** Crea un goal en estado setup (contrato primero, sin trabajo). */\nexport function createGoalState(input: {\n\tgoal: string;\n\tdoneCriteria: string[];\n\tverifyCommand: string;\n\tid?: string;\n\tnow?: string;\n\tsessionId?: string;\n}): GoalState {\n\treturn {\n\t\tid: input.id ?? `goal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`,\n\t\tgoal: input.goal,\n\t\tsessionId: input.sessionId,\n\t\tphase: \"analysis\",\n\t\tstatus: \"setup\",\n\t\tdoneCriteria: input.doneCriteria,\n\t\tverifyCommand: input.verifyCommand,\n\t\ttasks: [],\n\t\titeration: 1,\n\t\titerations: [],\n\t\tevidence: [],\n\t\tjudge: { model: null },\n\t\tturnsUsed: 0,\n\t\ttokensUsed: 0,\n\t\tcostUsed: 0,\n\t\trepeatedTurns: 0,\n\t\tlastAgentSummary: \"\",\n\t\tcreatedAt: input.now ?? new Date().toISOString(),\n\t\tupdatedAt: input.now ?? new Date().toISOString(),\n\t};\n}\n\nfunction taskFrom(action: { taskId: string; status: TaskStatus }, tasks: Task[]): Task | undefined {\n\treturn tasks.find((t) => t.id === action.taskId);\n}\n\nexport interface ReduceResult {\n\tstate: GoalState;\n\t/** Transiciones que la UI debe conocer. */\n\tevents: Array<{\n\t\tphase?: GoalPhase;\n\t\tpaused?: boolean;\n\t\treplan?: { iteration: number; tasks: unknown[] };\n\t\ttasksChanged?: unknown[];\n\t}>;\n\t/** true si el bucle debe detenerse tras esta acción. */\n\tstopLoop: boolean;\n}\n\n/** Reduce una acción sobre el estado. Devuelve nuevo estado + eventos derivados. */\nexport function reduceGoal(\n\tstate: GoalState,\n\taction: GoalAction,\n\t_frenos: GoalFrenos = {\n\t\tmaxTurns: 25,\n\t\trepeatTolerance: 3,\n\t\tstopFile: null,\n\t\ttokenBudget: null,\n\t\tcostBudget: null,\n\t\taskBefore: [],\n\t},\n): ReduceResult {\n\tconst events: ReduceResult[\"events\"] = [];\n\tconst stopLoop = false;\n\n\tswitch (action.type) {\n\t\tcase \"goal_approve\": {\n\t\t\tif (state.status !== \"setup\") return { state, events, stopLoop };\n\t\t\treturn {\n\t\t\t\tstate: { ...state, status: \"active\", updatedAt: now() },\n\t\t\t\tevents: [{ phase: \"analysis\" }],\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_task_add\": {\n\t\t\t// TODO personalizado: añade una tarea sin reemplazar el plan.\n\t\t\tconst title = action.title.trim();\n\t\t\tif (!title) return { state, events, stopLoop };\n\t\t\tconst newTask: Task = {\n\t\t\t\tid: `task-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`,\n\t\t\t\ttitle,\n\t\t\t\tstatus: \"pending\",\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tstate: { ...state, tasks: [...state.tasks, newTask], updatedAt: now() },\n\t\t\t\tevents,\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_tasks\": {\n\t\t\t// Solo planificar en planning/active; reemplaza el plan.\n\t\t\tif (state.status !== \"active\" && state.status !== \"planning\") return { state, events, stopLoop };\n\t\t\treturn {\n\t\t\t\tstate: { ...state, tasks: action.tasks, status: \"active\", updatedAt: now() },\n\t\t\t\tevents,\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_task_launched\": {\n\t\t\t// El workflow dinámico de la sub-tarea está en marcha (un turno gastado).\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\t...state,\n\t\t\t\t\ttasks: state.tasks.map((t) =>\n\t\t\t\t\t\tt.id === action.taskId\n\t\t\t\t\t\t\t? { ...t, status: \"running\" as TaskStatus, workflowRunId: action.workflowRunId }\n\t\t\t\t\t\t\t: t,\n\t\t\t\t\t),\n\t\t\t\t\tturnsUsed: state.turnsUsed + 1,\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t},\n\t\t\t\tevents,\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_task_result\": {\n\t\t\t// El workflow de la sub-tarea terminó (done/failed) con resumen.\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\t...state,\n\t\t\t\t\ttasks: state.tasks.map((t) =>\n\t\t\t\t\t\tt.id === action.taskId\n\t\t\t\t\t\t\t? { ...t, status: action.status, resultSummary: action.summary ?? t.resultSummary }\n\t\t\t\t\t\t\t: t,\n\t\t\t\t\t),\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t},\n\t\t\t\tevents,\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_replan\": {\n\t\t\t// P1: re-planificación completa. Nueva iteración, nuevo plan,\n\t\t\t// historial anexado. Solo si el contrato está aprobado y el plan\n\t\t\t// cambia materialmente (o no hay plan).\n\t\t\tconst clean = action.tasks\n\t\t\t\t.filter((t) => t.title?.trim())\n\t\t\t\t.map((t, i) => ({\n\t\t\t\t\tid: `task-${Date.now().toString(36)}-${i}-${Math.random().toString(36).slice(2, 5)}`,\n\t\t\t\t\ttitle: t.title.trim(),\n\t\t\t\t\tstatus: \"pending\" as TaskStatus,\n\t\t\t\t}));\n\t\t\tconst samePlan =\n\t\t\t\tstate.tasks.length === clean.length &&\n\t\t\t\tstate.tasks.length > 0 &&\n\t\t\t\tstate.tasks.every((t, i) => t.title.trim() === clean[i]?.title);\n\t\t\t// Sin cambio real del plan → no iterar (evita loops vacíos).\n\t\t\tif (samePlan) return { state, events, stopLoop: true };\n\t\t\tconst record = {\n\t\t\t\titeration: state.iteration,\n\t\t\t\tplan: state.tasks.map((t) => ({ ...t })),\n\t\t\t\tverdict: state.judge.lastVerdict,\n\t\t\t\treason: state.judge.lastReason ?? state.replanRationale,\n\t\t\t\treplanRationale: action.rationale,\n\t\t\t\ttokensUsed: state.tokensUsed,\n\t\t\t\tcostUsed: state.costUsed,\n\t\t\t\ttimestamp: now(),\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\t...state,\n\t\t\t\t\ttasks: clean,\n\t\t\t\t\titeration: state.iteration + 1,\n\t\t\t\t\titerations: [...state.iterations, record],\n\t\t\t\t\treplanRationale: action.rationale,\n\t\t\t\t\trepeatedTurns: 0, // plan nuevo → reset del repeat detector\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t},\n\t\t\t\tevents: [{ replan: { iteration: state.iteration + 1, tasks: clean } }],\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_task_remove\": {\n\t\t\t// P2: quitar una sub-tarea (no ejecutada).\n\t\t\tconst target = state.tasks.find((t) => t.id === action.taskId);\n\t\t\t// No se puede quitar una sub-tarea con workflow en marcha aquí\n\t\t\t// (el manager la aborta primero vía goal_task_result).\n\t\t\tif (!target || target.status === \"running\") return { state, events, stopLoop };\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\t...state,\n\t\t\t\t\ttasks: state.tasks.filter((t) => t.id !== action.taskId),\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t},\n\t\t\t\tevents: [{ tasksChanged: state.tasks.filter((t) => t.id !== action.taskId) }],\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_task_move\": {\n\t\t\t// P2: reordenar (arriba/abajo) en cualquier fase.\n\t\t\tconst idx = state.tasks.findIndex((t) => t.id === action.taskId);\n\t\t\tif (idx === -1) return { state, events, stopLoop };\n\t\t\tconst target = idx + (action.dir === \"up\" ? -1 : 1);\n\t\t\tif (target < 0 || target >= state.tasks.length) return { state, events, stopLoop };\n\t\t\tconst tasks = [...state.tasks];\n\t\t\t[tasks[idx], tasks[target]] = [tasks[target], tasks[idx]];\n\t\t\treturn {\n\t\t\t\tstate: { ...state, tasks, updatedAt: now() },\n\t\t\t\tevents: [{ tasksChanged: tasks }],\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_task_update\": {\n\t\t\tconst task = taskFrom(action, state.tasks);\n\t\t\tif (!task) return { state, events, stopLoop };\n\t\t\tconst tasks = state.tasks.map((t) => (t.id === action.taskId ? { ...t, status: action.status } : t));\n\t\t\treturn {\n\t\t\t\tstate: { ...state, tasks, updatedAt: now() },\n\t\t\t\tevents,\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_phase\": {\n\t\t\t// Orden fijo TDD: solo avanzar a la siguiente fase.\n\t\t\tif (action.phase !== nextPhase(state.phase)) return { state, events, stopLoop };\n\t\t\treturn {\n\t\t\t\tstate: { ...state, phase: action.phase, updatedAt: now() },\n\t\t\t\tevents: [{ phase: action.phase }],\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_agent_turn\": {\n\t\t\t// El turno del agente: incrementa contadores, detecta repetición.\n\t\t\tconst summary = action.summary ?? \"\";\n\t\t\tconst repeated = summary.trim().length === 0 || summary === state.lastAgentSummary;\n\t\t\tconst repeatedTurns = repeated ? state.repeatedTurns + 1 : 0;\n\t\t\tconst turnsUsed = state.turnsUsed + 1;\n\t\t\tlet next: GoalState = {\n\t\t\t\t...state,\n\t\t\t\tturnsUsed,\n\t\t\t\trepeatedTurns,\n\t\t\t\tlastAgentSummary: summary,\n\t\t\t\ttokensUsed: state.tokensUsed + (action.tokens ?? 0),\n\t\t\t\tcostUsed: state.costUsed + (action.cost ?? 0),\n\t\t\t\tupdatedAt: now(),\n\t\t\t};\n\t\t\tif (action.evidence?.length) {\n\t\t\t\t// No duplicar evidencia idéntica.\n\t\t\t\tconst existing = new Set(state.evidence.map((e) => `${e.claim}|${e.source}`));\n\t\t\t\tconst fresh = action.evidence.filter((e) => !existing.has(`${e.claim}|${e.source}`));\n\t\t\t\tnext = { ...next, evidence: [...state.evidence, ...fresh] };\n\t\t\t}\n\t\t\tif (action.tasks?.length) {\n\t\t\t\tconst tasks = next.tasks.map((t) => {\n\t\t\t\t\tconst u = action.tasks!.find((x) => x.taskId === t.id);\n\t\t\t\t\treturn u ? { ...t, status: u.status } : t;\n\t\t\t\t});\n\t\t\t\tnext = { ...next, tasks };\n\t\t\t}\n\t\t\treturn { state: next, events, stopLoop };\n\t\t}\n\n\t\tcase \"goal_pause\": {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\t...state,\n\t\t\t\t\tstatus: \"paused\",\n\t\t\t\t\twaiting: { reason: action.reason ?? \"pausado por el usuario\" },\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t},\n\t\t\t\tevents,\n\t\t\t\tstopLoop: true,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_resume\": {\n\t\t\tif (state.status !== \"paused\") return { state, events, stopLoop };\n\t\t\treturn {\n\t\t\t\tstate: { ...state, status: \"active\", waiting: undefined, repeatedTurns: 0, updatedAt: now() },\n\t\t\t\tevents,\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_blocked\": {\n\t\t\treturn {\n\t\t\t\tstate: { ...state, status: \"blocked\", waiting: { reason: action.reason }, updatedAt: now() },\n\t\t\t\tevents,\n\t\t\t\tstopLoop: true,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_wait\": {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\t...state,\n\t\t\t\t\tstatus: \"paused\",\n\t\t\t\t\twaiting: { reason: action.reason, resumeAfterMs: action.resumeAfterMs },\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t},\n\t\t\t\tevents,\n\t\t\t\tstopLoop: true,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_questions\": {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\t...state,\n\t\t\t\t\tstatus: \"blocked\",\n\t\t\t\t\tpendingQuestions: action.questions,\n\t\t\t\t\twaiting: { reason: action.reason },\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t},\n\t\t\t\tevents,\n\t\t\t\tstopLoop: true,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_answers\": {\n\t\t\t// Las respuestas limpian el bloqueo y reactivan.\n\t\t\treturn {\n\t\t\t\tstate: { ...state, status: \"active\", pendingQuestions: undefined, waiting: undefined, updatedAt: now() },\n\t\t\t\tevents,\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_usage_limited\": {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\t...state,\n\t\t\t\t\tstatus: \"usage_limited\",\n\t\t\t\t\twaiting: { reason: \"Presupuesto de tokens agotado\" },\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t},\n\t\t\t\tevents,\n\t\t\t\tstopLoop: true,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_budget_limited\": {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\t...state,\n\t\t\t\t\tstatus: \"budget_limited\",\n\t\t\t\t\twaiting: { reason: \"Presupuesto de coste agotado\" },\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t},\n\t\t\t\tevents,\n\t\t\t\tstopLoop: true,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_judge\": {\n\t\t\t// Al veredictar se anexa la iteración actual al historial (P3):\n\t\t\t// veredicto + razón en el registro de la iteración en curso.\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\t...state,\n\t\t\t\t\tjudge: {\n\t\t\t\t\t\tmodel: action.crossModel ? \"cross\" : \"same\",\n\t\t\t\t\t\tlastVerdict: action.verdict,\n\t\t\t\t\t\tlastReason: action.reason,\n\t\t\t\t\t},\n\t\t\t\t\titerations: state.iterations.map((it) =>\n\t\t\t\t\t\tit.iteration === state.iteration ? { ...it, verdict: action.verdict, reason: action.reason } : it,\n\t\t\t\t\t),\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t},\n\t\t\t\tevents,\n\t\t\t\tstopLoop,\n\t\t\t};\n\t\t}\n\n\t\tcase \"goal_complete\": {\n\t\t\t// JUEZ OBLIGATORIO (pi-until-done): sin veredicto done NO hay\n\t\t\t// completación — continue bloquea done; nunca bypass.\n\t\t\tif (state.status === \"complete\") return { state, events, stopLoop: true };\n\t\t\tif (state.judge.lastVerdict !== \"done\") {\n\t\t\t\treturn {\n\t\t\t\t\tstate: {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\twaiting: { reason: \"goal_complete requiere veredicto done del juez (sin bypass)\" },\n\t\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t\t},\n\t\t\t\t\tevents,\n\t\t\t\t\tstopLoop: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Evidencia citada obligatoria (archivo:línea / URL).\n\t\t\tif (action.evidence.length === 0 && state.evidence.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tstate: { ...state, waiting: { reason: \"goal_complete exige evidencia citada\" }, updatedAt: now() },\n\t\t\t\t\tevents,\n\t\t\t\t\tstopLoop: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst merged: EvidenceItem[] = mergeEvidence(state.evidence, action.evidence);\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\t...state,\n\t\t\t\t\tstatus: \"complete\",\n\t\t\t\t\tphase: \"done\",\n\t\t\t\t\tevidence: merged,\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t\twaiting: undefined,\n\t\t\t\t},\n\t\t\t\tevents: [{ phase: \"done\" }],\n\t\t\t\tstopLoop: true,\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn { state, events, stopLoop };\n\t}\n}\n\nfunction mergeEvidence(a: EvidenceItem[], b: EvidenceItem[]): EvidenceItem[] {\n\tconst seen = new Set(a.map((e) => `${e.claim}|${e.source}`));\n\treturn [...a, ...b.filter((e) => !seen.has(`${e.claim}|${e.source}`))];\n}\n\nfunction now(): string {\n\treturn new Date().toISOString();\n}\n"]}