@hoilab/ada-cli 0.84.22 → 0.85.0

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 (1114) hide show
  1. package/CHANGELOG.md +29 -2
  2. package/README.es.md +17 -6
  3. package/README.md +109 -11
  4. package/dist/ada-publico.d.ts +35 -0
  5. package/dist/ada-publico.d.ts.map +1 -0
  6. package/dist/ada-publico.js +40 -0
  7. package/dist/ada-publico.js.map +1 -0
  8. package/dist/cli/audit-command.d.ts +15 -0
  9. package/dist/cli/audit-command.d.ts.map +1 -0
  10. package/dist/cli/audit-command.js +280 -0
  11. package/dist/cli/audit-command.js.map +1 -0
  12. package/dist/cli/banco-command.d.ts +15 -0
  13. package/dist/cli/banco-command.d.ts.map +1 -0
  14. package/dist/cli/banco-command.js +213 -0
  15. package/dist/cli/banco-command.js.map +1 -0
  16. package/dist/cli/cleanse-command.d.ts +11 -0
  17. package/dist/cli/cleanse-command.d.ts.map +1 -0
  18. package/dist/cli/cleanse-command.js +101 -0
  19. package/dist/cli/cleanse-command.js.map +1 -0
  20. package/dist/cli/commit-command.d.ts +31 -0
  21. package/dist/cli/commit-command.d.ts.map +1 -0
  22. package/dist/cli/commit-command.js +158 -0
  23. package/dist/cli/commit-command.js.map +1 -0
  24. package/dist/cli/computer-command.d.ts +12 -0
  25. package/dist/cli/computer-command.d.ts.map +1 -0
  26. package/dist/cli/computer-command.js +141 -0
  27. package/dist/cli/computer-command.js.map +1 -0
  28. package/dist/cli/discover-command.d.ts +18 -0
  29. package/dist/cli/discover-command.d.ts.map +1 -0
  30. package/dist/cli/discover-command.js +108 -0
  31. package/dist/cli/discover-command.js.map +1 -0
  32. package/dist/cli/hashline-command.d.ts +11 -0
  33. package/dist/cli/hashline-command.d.ts.map +1 -0
  34. package/dist/cli/hashline-command.js +106 -0
  35. package/dist/cli/hashline-command.js.map +1 -0
  36. package/dist/cli/import-command.d.ts +35 -0
  37. package/dist/cli/import-command.d.ts.map +1 -0
  38. package/dist/cli/import-command.js +164 -0
  39. package/dist/cli/import-command.js.map +1 -0
  40. package/dist/cli/politica-command.d.ts +20 -0
  41. package/dist/cli/politica-command.d.ts.map +1 -0
  42. package/dist/cli/politica-command.js +93 -0
  43. package/dist/cli/politica-command.js.map +1 -0
  44. package/dist/cli/refine-command.d.ts +18 -0
  45. package/dist/cli/refine-command.d.ts.map +1 -0
  46. package/dist/cli/refine-command.js +101 -0
  47. package/dist/cli/refine-command.js.map +1 -0
  48. package/dist/cli/review-command.d.ts +24 -0
  49. package/dist/cli/review-command.d.ts.map +1 -0
  50. package/dist/cli/review-command.js +168 -0
  51. package/dist/cli/review-command.js.map +1 -0
  52. package/dist/cli/schedule-command.d.ts +17 -0
  53. package/dist/cli/schedule-command.d.ts.map +1 -0
  54. package/dist/cli/schedule-command.js +117 -0
  55. package/dist/cli/schedule-command.js.map +1 -0
  56. package/dist/cli/serve-command.d.ts +72 -0
  57. package/dist/cli/serve-command.d.ts.map +1 -0
  58. package/dist/cli/serve-command.js +568 -0
  59. package/dist/cli/serve-command.js.map +1 -0
  60. package/dist/cli/telegram-command.d.ts +18 -0
  61. package/dist/cli/telegram-command.d.ts.map +1 -0
  62. package/dist/cli/telegram-command.js +137 -0
  63. package/dist/cli/telegram-command.js.map +1 -0
  64. package/dist/cli/telemetria-command.d.ts +22 -0
  65. package/dist/cli/telemetria-command.d.ts.map +1 -0
  66. package/dist/cli/telemetria-command.js +127 -0
  67. package/dist/cli/telemetria-command.js.map +1 -0
  68. package/dist/cli/undo-command.d.ts +9 -0
  69. package/dist/cli/undo-command.d.ts.map +1 -0
  70. package/dist/cli/undo-command.js +56 -0
  71. package/dist/cli/undo-command.js.map +1 -0
  72. package/dist/cli/usage-command.d.ts +10 -0
  73. package/dist/cli/usage-command.d.ts.map +1 -0
  74. package/dist/cli/usage-command.js +209 -0
  75. package/dist/cli/usage-command.js.map +1 -0
  76. package/dist/cli/wiki-command.d.ts +9 -0
  77. package/dist/cli/wiki-command.d.ts.map +1 -0
  78. package/dist/cli/wiki-command.js +76 -0
  79. package/dist/cli/wiki-command.js.map +1 -0
  80. package/dist/cli.d.ts +6 -0
  81. package/dist/cli.d.ts.map +1 -1
  82. package/dist/cli.js +10 -11
  83. package/dist/cli.js.map +1 -1
  84. package/dist/config.d.ts +1 -1
  85. package/dist/config.d.ts.map +1 -1
  86. package/dist/config.js +1 -1
  87. package/dist/config.js.map +1 -1
  88. package/dist/core/ada.d.ts +58 -0
  89. package/dist/core/ada.d.ts.map +1 -0
  90. package/dist/core/ada.js +61 -0
  91. package/dist/core/ada.js.map +1 -0
  92. package/dist/core/advisor/guarda.d.ts +66 -0
  93. package/dist/core/advisor/guarda.d.ts.map +1 -0
  94. package/dist/core/advisor/guarda.js +191 -0
  95. package/dist/core/advisor/guarda.js.map +1 -0
  96. package/dist/core/advisor/runtime.d.ts +66 -0
  97. package/dist/core/advisor/runtime.d.ts.map +1 -0
  98. package/dist/core/advisor/runtime.js +121 -0
  99. package/dist/core/advisor/runtime.js.map +1 -0
  100. package/dist/core/advisor/sesion.d.ts +109 -0
  101. package/dist/core/advisor/sesion.d.ts.map +1 -0
  102. package/dist/core/advisor/sesion.js +139 -0
  103. package/dist/core/advisor/sesion.js.map +1 -0
  104. package/dist/core/agent-session.d.ts +30 -2
  105. package/dist/core/agent-session.d.ts.map +1 -1
  106. package/dist/core/agent-session.js +430 -22
  107. package/dist/core/agent-session.js.map +1 -1
  108. package/dist/core/agents/loader.d.ts +77 -0
  109. package/dist/core/agents/loader.d.ts.map +1 -0
  110. package/dist/core/agents/loader.js +154 -0
  111. package/dist/core/agents/loader.js.map +1 -0
  112. package/dist/core/aprobacion/generados.d.ts +37 -0
  113. package/dist/core/aprobacion/generados.d.ts.map +1 -0
  114. package/dist/core/aprobacion/generados.js +85 -0
  115. package/dist/core/aprobacion/generados.js.map +1 -0
  116. package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
  117. package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
  118. package/dist/core/aprobacion/politica-de-maquina.js +212 -0
  119. package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
  120. package/dist/core/aprobacion/politica.d.ts +90 -0
  121. package/dist/core/aprobacion/politica.d.ts.map +1 -0
  122. package/dist/core/aprobacion/politica.js +375 -0
  123. package/dist/core/aprobacion/politica.js.map +1 -0
  124. package/dist/core/arranque/atajos.d.ts +46 -0
  125. package/dist/core/arranque/atajos.d.ts.map +1 -0
  126. package/dist/core/arranque/atajos.js +113 -0
  127. package/dist/core/arranque/atajos.js.map +1 -0
  128. package/dist/core/audit/exportacion.d.ts +54 -0
  129. package/dist/core/audit/exportacion.d.ts.map +1 -0
  130. package/dist/core/audit/exportacion.js +265 -0
  131. package/dist/core/audit/exportacion.js.map +1 -0
  132. package/dist/core/audit/libro.d.ts +318 -0
  133. package/dist/core/audit/libro.d.ts.map +1 -0
  134. package/dist/core/audit/libro.js +508 -0
  135. package/dist/core/audit/libro.js.map +1 -0
  136. package/dist/core/audit/registro-sesion.d.ts +78 -0
  137. package/dist/core/audit/registro-sesion.d.ts.map +1 -0
  138. package/dist/core/audit/registro-sesion.js +202 -0
  139. package/dist/core/audit/registro-sesion.js.map +1 -0
  140. package/dist/core/audit/retencion.d.ts +82 -0
  141. package/dist/core/audit/retencion.d.ts.map +1 -0
  142. package/dist/core/audit/retencion.js +152 -0
  143. package/dist/core/audit/retencion.js.map +1 -0
  144. package/dist/core/audit/rutas.d.ts +23 -0
  145. package/dist/core/audit/rutas.d.ts.map +1 -0
  146. package/dist/core/audit/rutas.js +23 -0
  147. package/dist/core/audit/rutas.js.map +1 -0
  148. package/dist/core/auth-storage.d.ts +0 -3
  149. package/dist/core/auth-storage.d.ts.map +1 -1
  150. package/dist/core/auth-storage.js +17 -5
  151. package/dist/core/auth-storage.js.map +1 -1
  152. package/dist/core/banco/almacenamiento.d.ts +18 -0
  153. package/dist/core/banco/almacenamiento.d.ts.map +1 -0
  154. package/dist/core/banco/almacenamiento.js +50 -0
  155. package/dist/core/banco/almacenamiento.js.map +1 -0
  156. package/dist/core/banco/analisis.d.ts +37 -0
  157. package/dist/core/banco/analisis.d.ts.map +1 -0
  158. package/dist/core/banco/analisis.js +164 -0
  159. package/dist/core/banco/analisis.js.map +1 -0
  160. package/dist/core/banco/bloques.d.ts +39 -0
  161. package/dist/core/banco/bloques.d.ts.map +1 -0
  162. package/dist/core/banco/bloques.js +84 -0
  163. package/dist/core/banco/bloques.js.map +1 -0
  164. package/dist/core/banco/cargas.d.ts +84 -0
  165. package/dist/core/banco/cargas.d.ts.map +1 -0
  166. package/dist/core/banco/cargas.js +520 -0
  167. package/dist/core/banco/cargas.js.map +1 -0
  168. package/dist/core/banco/comparar.d.ts +29 -0
  169. package/dist/core/banco/comparar.d.ts.map +1 -0
  170. package/dist/core/banco/comparar.js +28 -0
  171. package/dist/core/banco/comparar.js.map +1 -0
  172. package/dist/core/banco/ejecutar.d.ts +44 -0
  173. package/dist/core/banco/ejecutar.d.ts.map +1 -0
  174. package/dist/core/banco/ejecutar.js +183 -0
  175. package/dist/core/banco/ejecutar.js.map +1 -0
  176. package/dist/core/banco/generar.d.ts +24 -0
  177. package/dist/core/banco/generar.d.ts.map +1 -0
  178. package/dist/core/banco/generar.js +159 -0
  179. package/dist/core/banco/generar.js.map +1 -0
  180. package/dist/core/banco/mutaciones.d.ts +25 -0
  181. package/dist/core/banco/mutaciones.d.ts.map +1 -0
  182. package/dist/core/banco/mutaciones.js +215 -0
  183. package/dist/core/banco/mutaciones.js.map +1 -0
  184. package/dist/core/banco/tipos.d.ts +121 -0
  185. package/dist/core/banco/tipos.d.ts.map +1 -0
  186. package/dist/core/banco/tipos.js +16 -0
  187. package/dist/core/banco/tipos.js.map +1 -0
  188. package/dist/core/blobs/almacen.d.ts +81 -0
  189. package/dist/core/blobs/almacen.d.ts.map +1 -0
  190. package/dist/core/blobs/almacen.js +198 -0
  191. package/dist/core/blobs/almacen.js.map +1 -0
  192. package/dist/core/blobs/broker.d.ts +103 -0
  193. package/dist/core/blobs/broker.d.ts.map +1 -0
  194. package/dist/core/blobs/broker.js +204 -0
  195. package/dist/core/blobs/broker.js.map +1 -0
  196. package/dist/core/blobs/index.d.ts +70 -0
  197. package/dist/core/blobs/index.d.ts.map +1 -0
  198. package/dist/core/blobs/index.js +232 -0
  199. package/dist/core/blobs/index.js.map +1 -0
  200. package/dist/core/blobs/payload.d.ts +55 -0
  201. package/dist/core/blobs/payload.d.ts.map +1 -0
  202. package/dist/core/blobs/payload.js +255 -0
  203. package/dist/core/blobs/payload.js.map +1 -0
  204. package/dist/core/blobs/proveedor.d.ts +85 -0
  205. package/dist/core/blobs/proveedor.d.ts.map +1 -0
  206. package/dist/core/blobs/proveedor.js +196 -0
  207. package/dist/core/blobs/proveedor.js.map +1 -0
  208. package/dist/core/browser/cdp.d.ts +41 -0
  209. package/dist/core/browser/cdp.d.ts.map +1 -0
  210. package/dist/core/browser/cdp.js +119 -0
  211. package/dist/core/browser/cdp.js.map +1 -0
  212. package/dist/core/browser/politica.d.ts +51 -0
  213. package/dist/core/browser/politica.d.ts.map +1 -0
  214. package/dist/core/browser/politica.js +123 -0
  215. package/dist/core/browser/politica.js.map +1 -0
  216. package/dist/core/browser/sesion.d.ts +52 -0
  217. package/dist/core/browser/sesion.d.ts.map +1 -0
  218. package/dist/core/browser/sesion.js +176 -0
  219. package/dist/core/browser/sesion.js.map +1 -0
  220. package/dist/core/browser/tools.d.ts +16 -0
  221. package/dist/core/browser/tools.d.ts.map +1 -0
  222. package/dist/core/browser/tools.js +279 -0
  223. package/dist/core/browser/tools.js.map +1 -0
  224. package/dist/core/commit/diff.d.ts +56 -0
  225. package/dist/core/commit/diff.d.ts.map +1 -0
  226. package/dist/core/commit/diff.js +145 -0
  227. package/dist/core/commit/diff.js.map +1 -0
  228. package/dist/core/commit/mensaje.d.ts +80 -0
  229. package/dist/core/commit/mensaje.d.ts.map +1 -0
  230. package/dist/core/commit/mensaje.js +207 -0
  231. package/dist/core/commit/mensaje.js.map +1 -0
  232. package/dist/core/compactar/index.d.ts +52 -0
  233. package/dist/core/compactar/index.d.ts.map +1 -0
  234. package/dist/core/compactar/index.js +91 -0
  235. package/dist/core/compactar/index.js.map +1 -0
  236. package/dist/core/compactar/registro-denso.d.ts +160 -0
  237. package/dist/core/compactar/registro-denso.d.ts.map +1 -0
  238. package/dist/core/compactar/registro-denso.js +620 -0
  239. package/dist/core/compactar/registro-denso.js.map +1 -0
  240. package/dist/core/computer/captura.d.ts +35 -0
  241. package/dist/core/computer/captura.d.ts.map +1 -0
  242. package/dist/core/computer/captura.js +140 -0
  243. package/dist/core/computer/captura.js.map +1 -0
  244. package/dist/core/computer/driver.d.ts +130 -0
  245. package/dist/core/computer/driver.d.ts.map +1 -0
  246. package/dist/core/computer/driver.js +206 -0
  247. package/dist/core/computer/driver.js.map +1 -0
  248. package/dist/core/computer/motor/actions.d.ts +109 -0
  249. package/dist/core/computer/motor/actions.d.ts.map +1 -0
  250. package/dist/core/computer/motor/actions.js +157 -0
  251. package/dist/core/computer/motor/actions.js.map +1 -0
  252. package/dist/core/computer/motor/bridge.d.ts +232 -0
  253. package/dist/core/computer/motor/bridge.d.ts.map +1 -0
  254. package/dist/core/computer/motor/bridge.js +2335 -0
  255. package/dist/core/computer/motor/bridge.js.map +1 -0
  256. package/dist/core/computer/motor/cdp.d.ts +107 -0
  257. package/dist/core/computer/motor/cdp.d.ts.map +1 -0
  258. package/dist/core/computer/motor/cdp.js +659 -0
  259. package/dist/core/computer/motor/cdp.js.map +1 -0
  260. package/dist/core/computer/motor/config.d.ts +23 -0
  261. package/dist/core/computer/motor/config.d.ts.map +1 -0
  262. package/dist/core/computer/motor/config.js +100 -0
  263. package/dist/core/computer/motor/config.js.map +1 -0
  264. package/dist/core/computer/motor/contract.d.ts +81 -0
  265. package/dist/core/computer/motor/contract.d.ts.map +1 -0
  266. package/dist/core/computer/motor/contract.js +14 -0
  267. package/dist/core/computer/motor/contract.js.map +1 -0
  268. package/dist/core/computer/motor/note.d.ts +37 -0
  269. package/dist/core/computer/motor/note.d.ts.map +1 -0
  270. package/dist/core/computer/motor/note.js +162 -0
  271. package/dist/core/computer/motor/note.js.map +1 -0
  272. package/dist/core/computer/motor/outline.d.ts +155 -0
  273. package/dist/core/computer/motor/outline.d.ts.map +1 -0
  274. package/dist/core/computer/motor/outline.js +590 -0
  275. package/dist/core/computer/motor/outline.js.map +1 -0
  276. package/dist/core/computer/motor/output.d.ts +18 -0
  277. package/dist/core/computer/motor/output.d.ts.map +1 -0
  278. package/dist/core/computer/motor/output.js +148 -0
  279. package/dist/core/computer/motor/output.js.map +1 -0
  280. package/dist/core/computer/motor/permissions.d.ts +41 -0
  281. package/dist/core/computer/motor/permissions.d.ts.map +1 -0
  282. package/dist/core/computer/motor/permissions.js +51 -0
  283. package/dist/core/computer/motor/permissions.js.map +1 -0
  284. package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
  285. package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
  286. package/dist/core/computer/motor/platform/architecture.js +21 -0
  287. package/dist/core/computer/motor/platform/architecture.js.map +1 -0
  288. package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
  289. package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
  290. package/dist/core/computer/motor/platform/coerce.js +17 -0
  291. package/dist/core/computer/motor/platform/coerce.js.map +1 -0
  292. package/dist/core/computer/motor/platform/index.d.ts +4 -0
  293. package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
  294. package/dist/core/computer/motor/platform/index.js +79 -0
  295. package/dist/core/computer/motor/platform/index.js.map +1 -0
  296. package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
  297. package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
  298. package/dist/core/computer/motor/platform/linux/backend.js +173 -0
  299. package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
  300. package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
  301. package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
  302. package/dist/core/computer/motor/platform/linux/helper.js +261 -0
  303. package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
  304. package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
  305. package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
  306. package/dist/core/computer/motor/platform/macos/backend.js +124 -0
  307. package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
  308. package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
  309. package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
  310. package/dist/core/computer/motor/platform/macos/browser.js +101 -0
  311. package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
  312. package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
  313. package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
  314. package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
  315. package/dist/core/computer/motor/platform/macos/helper.js +277 -0
  316. package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
  317. package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
  318. package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
  319. package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
  320. package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
  321. package/dist/core/computer/motor/platform/types.d.ts +263 -0
  322. package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
  323. package/dist/core/computer/motor/platform/types.js +2 -0
  324. package/dist/core/computer/motor/platform/types.js.map +1 -0
  325. package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
  326. package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
  327. package/dist/core/computer/motor/platform/windows/backend.js +163 -0
  328. package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
  329. package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
  330. package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
  331. package/dist/core/computer/motor/platform/windows/helper.js +174 -0
  332. package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
  333. package/dist/core/computer/motor/root-selection.d.ts +6 -0
  334. package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
  335. package/dist/core/computer/motor/root-selection.js +28 -0
  336. package/dist/core/computer/motor/root-selection.js.map +1 -0
  337. package/dist/core/computer/motor/runtime.d.ts +50 -0
  338. package/dist/core/computer/motor/runtime.d.ts.map +1 -0
  339. package/dist/core/computer/motor/runtime.js +119 -0
  340. package/dist/core/computer/motor/runtime.js.map +1 -0
  341. package/dist/core/computer/motor/state.d.ts +68 -0
  342. package/dist/core/computer/motor/state.d.ts.map +1 -0
  343. package/dist/core/computer/motor/state.js +100 -0
  344. package/dist/core/computer/motor/state.js.map +1 -0
  345. package/dist/core/computer/motor/view.d.ts +6 -0
  346. package/dist/core/computer/motor/view.d.ts.map +1 -0
  347. package/dist/core/computer/motor/view.js +185 -0
  348. package/dist/core/computer/motor/view.js.map +1 -0
  349. package/dist/core/computer/motor-ada.d.ts +159 -0
  350. package/dist/core/computer/motor-ada.d.ts.map +1 -0
  351. package/dist/core/computer/motor-ada.js +412 -0
  352. package/dist/core/computer/motor-ada.js.map +1 -0
  353. package/dist/core/computer/politica.d.ts +56 -0
  354. package/dist/core/computer/politica.d.ts.map +1 -0
  355. package/dist/core/computer/politica.js +163 -0
  356. package/dist/core/computer/politica.js.map +1 -0
  357. package/dist/core/computer/tools.d.ts +26 -0
  358. package/dist/core/computer/tools.d.ts.map +1 -0
  359. package/dist/core/computer/tools.js +399 -0
  360. package/dist/core/computer/tools.js.map +1 -0
  361. package/dist/core/context-breakdown.d.ts +80 -0
  362. package/dist/core/context-breakdown.d.ts.map +1 -0
  363. package/dist/core/context-breakdown.js +87 -0
  364. package/dist/core/context-breakdown.js.map +1 -0
  365. package/dist/core/credenciales/cliente.d.ts +60 -0
  366. package/dist/core/credenciales/cliente.d.ts.map +1 -0
  367. package/dist/core/credenciales/cliente.js +81 -0
  368. package/dist/core/credenciales/cliente.js.map +1 -0
  369. package/dist/core/credenciales/pool.d.ts +96 -0
  370. package/dist/core/credenciales/pool.d.ts.map +1 -0
  371. package/dist/core/credenciales/pool.js +128 -0
  372. package/dist/core/credenciales/pool.js.map +1 -0
  373. package/dist/core/credenciales/reposo.d.ts +93 -0
  374. package/dist/core/credenciales/reposo.d.ts.map +1 -0
  375. package/dist/core/credenciales/reposo.js +489 -0
  376. package/dist/core/credenciales/reposo.js.map +1 -0
  377. package/dist/core/credenciales/servidor.d.ts +55 -0
  378. package/dist/core/credenciales/servidor.d.ts.map +1 -0
  379. package/dist/core/credenciales/servidor.js +205 -0
  380. package/dist/core/credenciales/servidor.js.map +1 -0
  381. package/dist/core/descubrimiento/comandos.d.ts +30 -0
  382. package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
  383. package/dist/core/descubrimiento/comandos.js +76 -0
  384. package/dist/core/descubrimiento/comandos.js.map +1 -0
  385. package/dist/core/descubrimiento/mcp.d.ts +42 -0
  386. package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
  387. package/dist/core/descubrimiento/mcp.js +130 -0
  388. package/dist/core/descubrimiento/mcp.js.map +1 -0
  389. package/dist/core/descubrimiento/reglas.d.ts +61 -0
  390. package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
  391. package/dist/core/descubrimiento/reglas.js +134 -0
  392. package/dist/core/descubrimiento/reglas.js.map +1 -0
  393. package/dist/core/descubrimiento/skills.d.ts +57 -0
  394. package/dist/core/descubrimiento/skills.d.ts.map +1 -0
  395. package/dist/core/descubrimiento/skills.js +113 -0
  396. package/dist/core/descubrimiento/skills.js.map +1 -0
  397. package/dist/core/dificultad/clasificador.d.ts +133 -0
  398. package/dist/core/dificultad/clasificador.d.ts.map +1 -0
  399. package/dist/core/dificultad/clasificador.js +288 -0
  400. package/dist/core/dificultad/clasificador.js.map +1 -0
  401. package/dist/core/edicion/diario.d.ts +37 -0
  402. package/dist/core/edicion/diario.d.ts.map +1 -0
  403. package/dist/core/edicion/diario.js +51 -0
  404. package/dist/core/edicion/diario.js.map +1 -0
  405. package/dist/core/edicion/hashline.d.ts +71 -0
  406. package/dist/core/edicion/hashline.d.ts.map +1 -0
  407. package/dist/core/edicion/hashline.js +111 -0
  408. package/dist/core/edicion/hashline.js.map +1 -0
  409. package/dist/core/edicion/hueco.d.ts +64 -0
  410. package/dist/core/edicion/hueco.d.ts.map +1 -0
  411. package/dist/core/edicion/hueco.js +162 -0
  412. package/dist/core/edicion/hueco.js.map +1 -0
  413. package/dist/core/edicion/limpiar-carga.d.ts +39 -0
  414. package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
  415. package/dist/core/edicion/limpiar-carga.js +121 -0
  416. package/dist/core/edicion/limpiar-carga.js.map +1 -0
  417. package/dist/core/edicion/observador.d.ts +80 -0
  418. package/dist/core/edicion/observador.d.ts.map +1 -0
  419. package/dist/core/edicion/observador.js +183 -0
  420. package/dist/core/edicion/observador.js.map +1 -0
  421. package/dist/core/edicion/parecido.d.ts +53 -0
  422. package/dist/core/edicion/parecido.d.ts.map +1 -0
  423. package/dist/core/edicion/parecido.js +145 -0
  424. package/dist/core/edicion/parecido.js.map +1 -0
  425. package/dist/core/edicion/parseo.d.ts +58 -0
  426. package/dist/core/edicion/parseo.d.ts.map +1 -0
  427. package/dist/core/edicion/parseo.js +124 -0
  428. package/dist/core/edicion/parseo.js.map +1 -0
  429. package/dist/core/edicion/reparacion.d.ts +67 -0
  430. package/dist/core/edicion/reparacion.d.ts.map +1 -0
  431. package/dist/core/edicion/reparacion.js +202 -0
  432. package/dist/core/edicion/reparacion.js.map +1 -0
  433. package/dist/core/edicion/sangria.d.ts +121 -0
  434. package/dist/core/edicion/sangria.d.ts.map +1 -0
  435. package/dist/core/edicion/sangria.js +341 -0
  436. package/dist/core/edicion/sangria.js.map +1 -0
  437. package/dist/core/edicion/tipos.d.ts +58 -0
  438. package/dist/core/edicion/tipos.d.ts.map +1 -0
  439. package/dist/core/edicion/tipos.js +160 -0
  440. package/dist/core/edicion/tipos.js.map +1 -0
  441. package/dist/core/errores/proveedor.d.ts +53 -0
  442. package/dist/core/errores/proveedor.d.ts.map +1 -0
  443. package/dist/core/errores/proveedor.js +191 -0
  444. package/dist/core/errores/proveedor.js.map +1 -0
  445. package/dist/core/estructural/buscar.d.ts +61 -0
  446. package/dist/core/estructural/buscar.d.ts.map +1 -0
  447. package/dist/core/estructural/buscar.js +261 -0
  448. package/dist/core/estructural/buscar.js.map +1 -0
  449. package/dist/core/estructural/editar.d.ts +36 -0
  450. package/dist/core/estructural/editar.d.ts.map +1 -0
  451. package/dist/core/estructural/editar.js +123 -0
  452. package/dist/core/estructural/editar.js.map +1 -0
  453. package/dist/core/estructural/tools.d.ts +11 -0
  454. package/dist/core/estructural/tools.d.ts.map +1 -0
  455. package/dist/core/estructural/tools.js +100 -0
  456. package/dist/core/estructural/tools.js.map +1 -0
  457. package/dist/core/experimental.d.ts.map +1 -1
  458. package/dist/core/experimental.js +10 -1
  459. package/dist/core/experimental.js.map +1 -1
  460. package/dist/core/extensiones/suplantacion.d.ts +49 -0
  461. package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
  462. package/dist/core/extensiones/suplantacion.js +61 -0
  463. package/dist/core/extensiones/suplantacion.js.map +1 -0
  464. package/dist/core/extensiones/vigilancia.d.ts +54 -0
  465. package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
  466. package/dist/core/extensiones/vigilancia.js +217 -0
  467. package/dist/core/extensiones/vigilancia.js.map +1 -0
  468. package/dist/core/extensions/loader.d.ts.map +1 -1
  469. package/dist/core/extensions/loader.js +11 -1
  470. package/dist/core/extensions/loader.js.map +1 -1
  471. package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
  472. package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
  473. package/dist/core/harness/fuentes-de-contexto.js +44 -0
  474. package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
  475. package/dist/core/harness/refine.d.ts +40 -0
  476. package/dist/core/harness/refine.d.ts.map +1 -0
  477. package/dist/core/harness/refine.js +109 -0
  478. package/dist/core/harness/refine.js.map +1 -0
  479. package/dist/core/harness/store.d.ts +75 -0
  480. package/dist/core/harness/store.d.ts.map +1 -0
  481. package/dist/core/harness/store.js +149 -0
  482. package/dist/core/harness/store.js.map +1 -0
  483. package/dist/core/hooks/contract.d.ts +85 -0
  484. package/dist/core/hooks/contract.d.ts.map +1 -0
  485. package/dist/core/hooks/contract.js +140 -0
  486. package/dist/core/hooks/contract.js.map +1 -0
  487. package/dist/core/hooks/runner.d.ts +42 -0
  488. package/dist/core/hooks/runner.d.ts.map +1 -0
  489. package/dist/core/hooks/runner.js +85 -0
  490. package/dist/core/hooks/runner.js.map +1 -0
  491. package/dist/core/hooks/session-hooks.d.ts +62 -0
  492. package/dist/core/hooks/session-hooks.d.ts.map +1 -0
  493. package/dist/core/hooks/session-hooks.js +84 -0
  494. package/dist/core/hooks/session-hooks.js.map +1 -0
  495. package/dist/core/importar/formatos.d.ts +69 -0
  496. package/dist/core/importar/formatos.d.ts.map +1 -0
  497. package/dist/core/importar/formatos.js +235 -0
  498. package/dist/core/importar/formatos.js.map +1 -0
  499. package/dist/core/interactivo/deteccion.d.ts +44 -0
  500. package/dist/core/interactivo/deteccion.d.ts.map +1 -0
  501. package/dist/core/interactivo/deteccion.js +82 -0
  502. package/dist/core/interactivo/deteccion.js.map +1 -0
  503. package/dist/core/interactivo/sesion.d.ts +50 -0
  504. package/dist/core/interactivo/sesion.d.ts.map +1 -0
  505. package/dist/core/interactivo/sesion.js +156 -0
  506. package/dist/core/interactivo/sesion.js.map +1 -0
  507. package/dist/core/interactivo/tools.d.ts +21 -0
  508. package/dist/core/interactivo/tools.d.ts.map +1 -0
  509. package/dist/core/interactivo/tools.js +122 -0
  510. package/dist/core/interactivo/tools.js.map +1 -0
  511. package/dist/core/lectura/mapa.d.ts +70 -0
  512. package/dist/core/lectura/mapa.d.ts.map +1 -0
  513. package/dist/core/lectura/mapa.js +177 -0
  514. package/dist/core/lectura/mapa.js.map +1 -0
  515. package/dist/core/lectura/pdf.d.ts +49 -0
  516. package/dist/core/lectura/pdf.d.ts.map +1 -0
  517. package/dist/core/lectura/pdf.js +337 -0
  518. package/dist/core/lectura/pdf.js.map +1 -0
  519. package/dist/core/limpieza/comprobadores.d.ts +28 -0
  520. package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
  521. package/dist/core/limpieza/comprobadores.js +311 -0
  522. package/dist/core/limpieza/comprobadores.js.map +1 -0
  523. package/dist/core/limpieza/parseo.d.ts +19 -0
  524. package/dist/core/limpieza/parseo.d.ts.map +1 -0
  525. package/dist/core/limpieza/parseo.js +124 -0
  526. package/dist/core/limpieza/parseo.js.map +1 -0
  527. package/dist/core/limpieza/reparacion.d.ts +77 -0
  528. package/dist/core/limpieza/reparacion.d.ts.map +1 -0
  529. package/dist/core/limpieza/reparacion.js +254 -0
  530. package/dist/core/limpieza/reparacion.js.map +1 -0
  531. package/dist/core/limpieza/tipos.d.ts +56 -0
  532. package/dist/core/limpieza/tipos.d.ts.map +1 -0
  533. package/dist/core/limpieza/tipos.js +9 -0
  534. package/dist/core/limpieza/tipos.js.map +1 -0
  535. package/dist/core/lsp/cliente.d.ts +52 -0
  536. package/dist/core/lsp/cliente.d.ts.map +1 -0
  537. package/dist/core/lsp/cliente.js +232 -0
  538. package/dist/core/lsp/cliente.js.map +1 -0
  539. package/dist/core/lsp/descubrimiento.d.ts +62 -0
  540. package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
  541. package/dist/core/lsp/descubrimiento.js +152 -0
  542. package/dist/core/lsp/descubrimiento.js.map +1 -0
  543. package/dist/core/lsp/ediciones.d.ts +59 -0
  544. package/dist/core/lsp/ediciones.d.ts.map +1 -0
  545. package/dist/core/lsp/ediciones.js +89 -0
  546. package/dist/core/lsp/ediciones.js.map +1 -0
  547. package/dist/core/lsp/extension.d.ts +28 -0
  548. package/dist/core/lsp/extension.d.ts.map +1 -0
  549. package/dist/core/lsp/extension.js +34 -0
  550. package/dist/core/lsp/extension.js.map +1 -0
  551. package/dist/core/lsp/tools.d.ts +45 -0
  552. package/dist/core/lsp/tools.d.ts.map +1 -0
  553. package/dist/core/lsp/tools.js +265 -0
  554. package/dist/core/lsp/tools.js.map +1 -0
  555. package/dist/core/mcp/client.d.ts +60 -0
  556. package/dist/core/mcp/client.d.ts.map +1 -0
  557. package/dist/core/mcp/client.js +139 -0
  558. package/dist/core/mcp/client.js.map +1 -0
  559. package/dist/core/mcp/manager.d.ts +86 -0
  560. package/dist/core/mcp/manager.d.ts.map +1 -0
  561. package/dist/core/mcp/manager.js +124 -0
  562. package/dist/core/mcp/manager.js.map +1 -0
  563. package/dist/core/mcp/tools.d.ts +15 -0
  564. package/dist/core/mcp/tools.d.ts.map +1 -0
  565. package/dist/core/mcp/tools.js +84 -0
  566. package/dist/core/mcp/tools.js.map +1 -0
  567. package/dist/core/memory-engine/audit-export.d.ts +12 -10
  568. package/dist/core/memory-engine/audit-export.d.ts.map +1 -1
  569. package/dist/core/memory-engine/audit-export.js +15 -0
  570. package/dist/core/memory-engine/audit-export.js.map +1 -1
  571. package/dist/core/memory-engine/audit-indice.d.ts +153 -0
  572. package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
  573. package/dist/core/memory-engine/audit-indice.js +271 -0
  574. package/dist/core/memory-engine/audit-indice.js.map +1 -0
  575. package/dist/core/memory-engine/audit.d.ts +18 -6
  576. package/dist/core/memory-engine/audit.d.ts.map +1 -1
  577. package/dist/core/memory-engine/audit.js +25 -42
  578. package/dist/core/memory-engine/audit.js.map +1 -1
  579. package/dist/core/memory-engine/engine.d.ts +19 -1
  580. package/dist/core/memory-engine/engine.d.ts.map +1 -1
  581. package/dist/core/memory-engine/engine.js +71 -5
  582. package/dist/core/memory-engine/engine.js.map +1 -1
  583. package/dist/core/memory-engine/observation-store.d.ts +0 -2
  584. package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
  585. package/dist/core/memory-engine/observation-store.js +4 -5
  586. package/dist/core/memory-engine/observation-store.js.map +1 -1
  587. package/dist/core/memory-engine/refinements.d.ts +51 -0
  588. package/dist/core/memory-engine/refinements.d.ts.map +1 -0
  589. package/dist/core/memory-engine/refinements.js +99 -0
  590. package/dist/core/memory-engine/refinements.js.map +1 -0
  591. package/dist/core/memory-engine/tools.d.ts.map +1 -1
  592. package/dist/core/memory-engine/tools.js +27 -1
  593. package/dist/core/memory-engine/tools.js.map +1 -1
  594. package/dist/core/memory-engine/types.d.ts +2 -0
  595. package/dist/core/memory-engine/types.d.ts.map +1 -1
  596. package/dist/core/memory-engine/types.js.map +1 -1
  597. package/dist/core/model-resolver.d.ts.map +1 -1
  598. package/dist/core/model-resolver.js +7 -1
  599. package/dist/core/model-resolver.js.map +1 -1
  600. package/dist/core/muestreo-restringido.d.ts +49 -0
  601. package/dist/core/muestreo-restringido.d.ts.map +1 -0
  602. package/dist/core/muestreo-restringido.js +65 -0
  603. package/dist/core/muestreo-restringido.js.map +1 -0
  604. package/dist/core/orphan-process-journal.d.ts +48 -0
  605. package/dist/core/orphan-process-journal.d.ts.map +1 -0
  606. package/dist/core/orphan-process-journal.js +116 -0
  607. package/dist/core/orphan-process-journal.js.map +1 -0
  608. package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
  609. package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
  610. package/dist/core/privacidad/categorias-especiales.js +745 -0
  611. package/dist/core/privacidad/categorias-especiales.js.map +1 -0
  612. package/dist/core/privacidad/tapar.d.ts +48 -0
  613. package/dist/core/privacidad/tapar.d.ts.map +1 -0
  614. package/dist/core/privacidad/tapar.js +66 -0
  615. package/dist/core/privacidad/tapar.js.map +1 -0
  616. package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
  617. package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
  618. package/dist/core/prompt-cache/diagnostics.js +100 -0
  619. package/dist/core/prompt-cache/diagnostics.js.map +1 -0
  620. package/dist/core/prompt-cache/index.d.ts +33 -0
  621. package/dist/core/prompt-cache/index.d.ts.map +1 -0
  622. package/dist/core/prompt-cache/index.js +189 -0
  623. package/dist/core/prompt-cache/index.js.map +1 -0
  624. package/dist/core/prompt-cache/payload.d.ts +58 -0
  625. package/dist/core/prompt-cache/payload.d.ts.map +1 -0
  626. package/dist/core/prompt-cache/payload.js +122 -0
  627. package/dist/core/prompt-cache/payload.js.map +1 -0
  628. package/dist/core/prompt-cache/stabilize.d.ts +65 -0
  629. package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
  630. package/dist/core/prompt-cache/stabilize.js +137 -0
  631. package/dist/core/prompt-cache/stabilize.js.map +1 -0
  632. package/dist/core/prompt-cache/stats.d.ts +55 -0
  633. package/dist/core/prompt-cache/stats.d.ts.map +1 -0
  634. package/dist/core/prompt-cache/stats.js +158 -0
  635. package/dist/core/prompt-cache/stats.js.map +1 -0
  636. package/dist/core/prompt-eleccion.d.ts +38 -0
  637. package/dist/core/prompt-eleccion.d.ts.map +1 -0
  638. package/dist/core/prompt-eleccion.js +46 -0
  639. package/dist/core/prompt-eleccion.js.map +1 -0
  640. package/dist/core/prompts/montar.d.ts +75 -0
  641. package/dist/core/prompts/montar.d.ts.map +1 -0
  642. package/dist/core/prompts/montar.js +146 -0
  643. package/dist/core/prompts/montar.js.map +1 -0
  644. package/dist/core/prompts/plantilla.d.ts +54 -0
  645. package/dist/core/prompts/plantilla.d.ts.map +1 -0
  646. package/dist/core/prompts/plantilla.js +153 -0
  647. package/dist/core/prompts/plantilla.js.map +1 -0
  648. package/dist/core/prompts/sistema.md +134 -0
  649. package/dist/core/provider-attribution.d.ts +24 -2
  650. package/dist/core/provider-attribution.d.ts.map +1 -1
  651. package/dist/core/provider-attribution.js +24 -42
  652. package/dist/core/provider-attribution.js.map +1 -1
  653. package/dist/core/remoto/destino.d.ts +38 -0
  654. package/dist/core/remoto/destino.d.ts.map +1 -0
  655. package/dist/core/remoto/destino.js +105 -0
  656. package/dist/core/remoto/destino.js.map +1 -0
  657. package/dist/core/remoto/ejecutor.d.ts +59 -0
  658. package/dist/core/remoto/ejecutor.d.ts.map +1 -0
  659. package/dist/core/remoto/ejecutor.js +225 -0
  660. package/dist/core/remoto/ejecutor.js.map +1 -0
  661. package/dist/core/remoto/ficheros.d.ts +29 -0
  662. package/dist/core/remoto/ficheros.d.ts.map +1 -0
  663. package/dist/core/remoto/ficheros.js +90 -0
  664. package/dist/core/remoto/ficheros.js.map +1 -0
  665. package/dist/core/remoto/registro-extension.d.ts +15 -0
  666. package/dist/core/remoto/registro-extension.d.ts.map +1 -0
  667. package/dist/core/remoto/registro-extension.js +17 -0
  668. package/dist/core/remoto/registro-extension.js.map +1 -0
  669. package/dist/core/remoto/tools.d.ts +28 -0
  670. package/dist/core/remoto/tools.d.ts.map +1 -0
  671. package/dist/core/remoto/tools.js +31 -0
  672. package/dist/core/remoto/tools.js.map +1 -0
  673. package/dist/core/resource-loader.d.ts +8 -0
  674. package/dist/core/resource-loader.d.ts.map +1 -1
  675. package/dist/core/resource-loader.js +93 -1
  676. package/dist/core/resource-loader.js.map +1 -1
  677. package/dist/core/revision/hallazgo.d.ts +51 -0
  678. package/dist/core/revision/hallazgo.d.ts.map +1 -0
  679. package/dist/core/revision/hallazgo.js +73 -0
  680. package/dist/core/revision/hallazgo.js.map +1 -0
  681. package/dist/core/revision/revisor.d.ts +81 -0
  682. package/dist/core/revision/revisor.d.ts.map +1 -0
  683. package/dist/core/revision/revisor.js +132 -0
  684. package/dist/core/revision/revisor.js.map +1 -0
  685. package/dist/core/revision/sarif.d.ts +30 -0
  686. package/dist/core/revision/sarif.d.ts.map +1 -0
  687. package/dist/core/revision/sarif.js +83 -0
  688. package/dist/core/revision/sarif.js.map +1 -0
  689. package/dist/core/scheduler/scheduler.d.ts +87 -0
  690. package/dist/core/scheduler/scheduler.d.ts.map +1 -0
  691. package/dist/core/scheduler/scheduler.js +178 -0
  692. package/dist/core/scheduler/scheduler.js.map +1 -0
  693. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
  694. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
  695. package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
  696. package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
  697. package/dist/core/settings-manager.d.ts +110 -6
  698. package/dist/core/settings-manager.d.ts.map +1 -1
  699. package/dist/core/settings-manager.js +53 -2
  700. package/dist/core/settings-manager.js.map +1 -1
  701. package/dist/core/slash-commands.d.ts.map +1 -1
  702. package/dist/core/slash-commands.js +3 -3
  703. package/dist/core/slash-commands.js.map +1 -1
  704. package/dist/core/system-prompt.d.ts +17 -0
  705. package/dist/core/system-prompt.d.ts.map +1 -1
  706. package/dist/core/system-prompt.js +13 -5
  707. package/dist/core/system-prompt.js.map +1 -1
  708. package/dist/core/telemetria/otlp.d.ts +122 -0
  709. package/dist/core/telemetria/otlp.d.ts.map +1 -0
  710. package/dist/core/telemetria/otlp.js +373 -0
  711. package/dist/core/telemetria/otlp.js.map +1 -0
  712. package/dist/core/tools/coercion-argumentos.d.ts +48 -0
  713. package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
  714. package/dist/core/tools/coercion-argumentos.js +99 -0
  715. package/dist/core/tools/coercion-argumentos.js.map +1 -0
  716. package/dist/core/tools/edit-diff.d.ts +0 -7
  717. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  718. package/dist/core/tools/edit-diff.js +232 -7
  719. package/dist/core/tools/edit-diff.js.map +1 -1
  720. package/dist/core/tools/edit.d.ts.map +1 -1
  721. package/dist/core/tools/edit.js +8 -1
  722. package/dist/core/tools/edit.js.map +1 -1
  723. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  724. package/dist/core/tools/file-mutation-queue.js +5 -0
  725. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  726. package/dist/core/tools/json-tolerante.d.ts +30 -0
  727. package/dist/core/tools/json-tolerante.d.ts.map +1 -0
  728. package/dist/core/tools/json-tolerante.js +70 -0
  729. package/dist/core/tools/json-tolerante.js.map +1 -0
  730. package/dist/core/tools/read.d.ts.map +1 -1
  731. package/dist/core/tools/read.js +17 -0
  732. package/dist/core/tools/read.js.map +1 -1
  733. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
  734. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  735. package/dist/core/tools/tool-definition-wrapper.js +17 -1
  736. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  737. package/dist/core/turno-vacio/detectar.d.ts +38 -0
  738. package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
  739. package/dist/core/turno-vacio/detectar.js +66 -0
  740. package/dist/core/turno-vacio/detectar.js.map +1 -0
  741. package/dist/core/undo/journal.d.ts +57 -0
  742. package/dist/core/undo/journal.d.ts.map +1 -0
  743. package/dist/core/undo/journal.js +178 -0
  744. package/dist/core/undo/journal.js.map +1 -0
  745. package/dist/core/urls-internas/auditoria.d.ts +10 -0
  746. package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
  747. package/dist/core/urls-internas/auditoria.js +42 -0
  748. package/dist/core/urls-internas/auditoria.js.map +1 -0
  749. package/dist/core/urls-internas/boveda.d.ts +13 -0
  750. package/dist/core/urls-internas/boveda.d.ts.map +1 -0
  751. package/dist/core/urls-internas/boveda.js +40 -0
  752. package/dist/core/urls-internas/boveda.js.map +1 -0
  753. package/dist/core/urls-internas/lector.d.ts +30 -0
  754. package/dist/core/urls-internas/lector.d.ts.map +1 -0
  755. package/dist/core/urls-internas/lector.js +56 -0
  756. package/dist/core/urls-internas/lector.js.map +1 -0
  757. package/dist/core/urls-internas/memoria.d.ts +11 -0
  758. package/dist/core/urls-internas/memoria.d.ts.map +1 -0
  759. package/dist/core/urls-internas/memoria.js +25 -0
  760. package/dist/core/urls-internas/memoria.js.map +1 -0
  761. package/dist/core/urls-internas/parse.d.ts +28 -0
  762. package/dist/core/urls-internas/parse.d.ts.map +1 -0
  763. package/dist/core/urls-internas/parse.js +32 -0
  764. package/dist/core/urls-internas/parse.js.map +1 -0
  765. package/dist/core/urls-internas/reglas.d.ts +10 -0
  766. package/dist/core/urls-internas/reglas.d.ts.map +1 -0
  767. package/dist/core/urls-internas/reglas.js +31 -0
  768. package/dist/core/urls-internas/reglas.js.map +1 -0
  769. package/dist/core/usage/aggregate.d.ts +68 -0
  770. package/dist/core/usage/aggregate.d.ts.map +1 -0
  771. package/dist/core/usage/aggregate.js +93 -0
  772. package/dist/core/usage/aggregate.js.map +1 -0
  773. package/dist/core/usage/cuota/anthropic.d.ts +10 -0
  774. package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
  775. package/dist/core/usage/cuota/anthropic.js +63 -0
  776. package/dist/core/usage/cuota/anthropic.js.map +1 -0
  777. package/dist/core/usage/cuota/cache.d.ts +20 -0
  778. package/dist/core/usage/cuota/cache.d.ts.map +1 -0
  779. package/dist/core/usage/cuota/cache.js +36 -0
  780. package/dist/core/usage/cuota/cache.js.map +1 -0
  781. package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
  782. package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
  783. package/dist/core/usage/cuota/github-copilot.js +67 -0
  784. package/dist/core/usage/cuota/github-copilot.js.map +1 -0
  785. package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
  786. package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
  787. package/dist/core/usage/cuota/google-gemini.js +72 -0
  788. package/dist/core/usage/cuota/google-gemini.js.map +1 -0
  789. package/dist/core/usage/cuota/index.d.ts +25 -0
  790. package/dist/core/usage/cuota/index.d.ts.map +1 -0
  791. package/dist/core/usage/cuota/index.js +50 -0
  792. package/dist/core/usage/cuota/index.js.map +1 -0
  793. package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
  794. package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
  795. package/dist/core/usage/cuota/openai-codex.js +59 -0
  796. package/dist/core/usage/cuota/openai-codex.js.map +1 -0
  797. package/dist/core/usage/cuota/openrouter.d.ts +10 -0
  798. package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
  799. package/dist/core/usage/cuota/openrouter.js +47 -0
  800. package/dist/core/usage/cuota/openrouter.js.map +1 -0
  801. package/dist/core/usage/cuota/tipos.d.ts +50 -0
  802. package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
  803. package/dist/core/usage/cuota/tipos.js +25 -0
  804. package/dist/core/usage/cuota/tipos.js.map +1 -0
  805. package/dist/core/web/busqueda-nativa.d.ts +82 -0
  806. package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
  807. package/dist/core/web/busqueda-nativa.js +163 -0
  808. package/dist/core/web/busqueda-nativa.js.map +1 -0
  809. package/dist/core/web/destino.d.ts +58 -0
  810. package/dist/core/web/destino.d.ts.map +1 -0
  811. package/dist/core/web/destino.js +127 -0
  812. package/dist/core/web/destino.js.map +1 -0
  813. package/dist/core/web/proveedores/brave.d.ts +6 -0
  814. package/dist/core/web/proveedores/brave.d.ts.map +1 -0
  815. package/dist/core/web/proveedores/brave.js +20 -0
  816. package/dist/core/web/proveedores/brave.js.map +1 -0
  817. package/dist/core/web/proveedores/claves.d.ts +19 -0
  818. package/dist/core/web/proveedores/claves.d.ts.map +1 -0
  819. package/dist/core/web/proveedores/claves.js +36 -0
  820. package/dist/core/web/proveedores/claves.js.map +1 -0
  821. package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
  822. package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
  823. package/dist/core/web/proveedores/duckduckgo.js +109 -0
  824. package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
  825. package/dist/core/web/proveedores/ecosia.d.ts +3 -0
  826. package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
  827. package/dist/core/web/proveedores/ecosia.js +72 -0
  828. package/dist/core/web/proveedores/ecosia.js.map +1 -0
  829. package/dist/core/web/proveedores/exa.d.ts +6 -0
  830. package/dist/core/web/proveedores/exa.d.ts.map +1 -0
  831. package/dist/core/web/proveedores/exa.js +24 -0
  832. package/dist/core/web/proveedores/exa.js.map +1 -0
  833. package/dist/core/web/proveedores/mojeek.d.ts +3 -0
  834. package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
  835. package/dist/core/web/proveedores/mojeek.js +65 -0
  836. package/dist/core/web/proveedores/mojeek.js.map +1 -0
  837. package/dist/core/web/proveedores/navegador.d.ts +10 -0
  838. package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
  839. package/dist/core/web/proveedores/navegador.js +13 -0
  840. package/dist/core/web/proveedores/navegador.js.map +1 -0
  841. package/dist/core/web/proveedores/registro.d.ts +43 -0
  842. package/dist/core/web/proveedores/registro.d.ts.map +1 -0
  843. package/dist/core/web/proveedores/registro.js +49 -0
  844. package/dist/core/web/proveedores/registro.js.map +1 -0
  845. package/dist/core/web/proveedores/searxng.d.ts +9 -0
  846. package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
  847. package/dist/core/web/proveedores/searxng.js +17 -0
  848. package/dist/core/web/proveedores/searxng.js.map +1 -0
  849. package/dist/core/web/proveedores/serper.d.ts +9 -0
  850. package/dist/core/web/proveedores/serper.d.ts.map +1 -0
  851. package/dist/core/web/proveedores/serper.js +19 -0
  852. package/dist/core/web/proveedores/serper.js.map +1 -0
  853. package/dist/core/web/proveedores/tavily.d.ts +6 -0
  854. package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
  855. package/dist/core/web/proveedores/tavily.js +19 -0
  856. package/dist/core/web/proveedores/tavily.js.map +1 -0
  857. package/dist/core/web/proveedores/tipos.d.ts +36 -0
  858. package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
  859. package/dist/core/web/proveedores/tipos.js +10 -0
  860. package/dist/core/web/proveedores/tipos.js.map +1 -0
  861. package/dist/core/web/registro-red.d.ts +43 -0
  862. package/dist/core/web/registro-red.d.ts.map +1 -0
  863. package/dist/core/web/registro-red.js +86 -0
  864. package/dist/core/web/registro-red.js.map +1 -0
  865. package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
  866. package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
  867. package/dist/core/web/scrapers/cisa-kev.js +38 -0
  868. package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
  869. package/dist/core/web/scrapers/crates-io.d.ts +11 -0
  870. package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
  871. package/dist/core/web/scrapers/crates-io.js +29 -0
  872. package/dist/core/web/scrapers/crates-io.js.map +1 -0
  873. package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
  874. package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
  875. package/dist/core/web/scrapers/docs-rs.js +35 -0
  876. package/dist/core/web/scrapers/docs-rs.js.map +1 -0
  877. package/dist/core/web/scrapers/github.d.ts +3 -0
  878. package/dist/core/web/scrapers/github.d.ts.map +1 -0
  879. package/dist/core/web/scrapers/github.js +72 -0
  880. package/dist/core/web/scrapers/github.js.map +1 -0
  881. package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
  882. package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
  883. package/dist/core/web/scrapers/go-pkg.js +30 -0
  884. package/dist/core/web/scrapers/go-pkg.js.map +1 -0
  885. package/dist/core/web/scrapers/hex.d.ts +6 -0
  886. package/dist/core/web/scrapers/hex.d.ts.map +1 -0
  887. package/dist/core/web/scrapers/hex.js +27 -0
  888. package/dist/core/web/scrapers/hex.js.map +1 -0
  889. package/dist/core/web/scrapers/maven.d.ts +8 -0
  890. package/dist/core/web/scrapers/maven.d.ts.map +1 -0
  891. package/dist/core/web/scrapers/maven.js +41 -0
  892. package/dist/core/web/scrapers/maven.js.map +1 -0
  893. package/dist/core/web/scrapers/mdn.d.ts +6 -0
  894. package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
  895. package/dist/core/web/scrapers/mdn.js +28 -0
  896. package/dist/core/web/scrapers/mdn.js.map +1 -0
  897. package/dist/core/web/scrapers/npm.d.ts +11 -0
  898. package/dist/core/web/scrapers/npm.d.ts.map +1 -0
  899. package/dist/core/web/scrapers/npm.js +57 -0
  900. package/dist/core/web/scrapers/npm.js.map +1 -0
  901. package/dist/core/web/scrapers/nuget.d.ts +8 -0
  902. package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
  903. package/dist/core/web/scrapers/nuget.js +22 -0
  904. package/dist/core/web/scrapers/nuget.js.map +1 -0
  905. package/dist/core/web/scrapers/nvd.d.ts +7 -0
  906. package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
  907. package/dist/core/web/scrapers/nvd.js +37 -0
  908. package/dist/core/web/scrapers/nvd.js.map +1 -0
  909. package/dist/core/web/scrapers/pypi.d.ts +6 -0
  910. package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
  911. package/dist/core/web/scrapers/pypi.js +31 -0
  912. package/dist/core/web/scrapers/pypi.js.map +1 -0
  913. package/dist/core/web/scrapers/registro.d.ts +13 -0
  914. package/dist/core/web/scrapers/registro.d.ts.map +1 -0
  915. package/dist/core/web/scrapers/registro.js +65 -0
  916. package/dist/core/web/scrapers/registro.js.map +1 -0
  917. package/dist/core/web/scrapers/rubygems.d.ts +6 -0
  918. package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
  919. package/dist/core/web/scrapers/rubygems.js +23 -0
  920. package/dist/core/web/scrapers/rubygems.js.map +1 -0
  921. package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
  922. package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
  923. package/dist/core/web/scrapers/stackoverflow.js +46 -0
  924. package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
  925. package/dist/core/web/scrapers/tipos.d.ts +42 -0
  926. package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
  927. package/dist/core/web/scrapers/tipos.js +23 -0
  928. package/dist/core/web/scrapers/tipos.js.map +1 -0
  929. package/dist/core/web/texto.d.ts +10 -0
  930. package/dist/core/web/texto.d.ts.map +1 -0
  931. package/dist/core/web/texto.js +26 -0
  932. package/dist/core/web/texto.js.map +1 -0
  933. package/dist/core/web/tools.d.ts +91 -0
  934. package/dist/core/web/tools.d.ts.map +1 -0
  935. package/dist/core/web/tools.js +304 -0
  936. package/dist/core/web/tools.js.map +1 -0
  937. package/dist/core/wiki/almacen.d.ts +33 -0
  938. package/dist/core/wiki/almacen.d.ts.map +1 -0
  939. package/dist/core/wiki/almacen.js +93 -0
  940. package/dist/core/wiki/almacen.js.map +1 -0
  941. package/dist/core/wiki/citas.d.ts +111 -0
  942. package/dist/core/wiki/citas.d.ts.map +1 -0
  943. package/dist/core/wiki/citas.js +146 -0
  944. package/dist/core/wiki/citas.js.map +1 -0
  945. package/dist/core/workflows/agent-runner.d.ts +2 -0
  946. package/dist/core/workflows/agent-runner.d.ts.map +1 -1
  947. package/dist/core/workflows/agent-runner.js +131 -44
  948. package/dist/core/workflows/agent-runner.js.map +1 -1
  949. package/dist/core/workflows/builtins.d.ts.map +1 -1
  950. package/dist/core/workflows/builtins.js +1 -0
  951. package/dist/core/workflows/builtins.js.map +1 -1
  952. package/dist/core/workflows/contrato/esquema.d.ts +32 -0
  953. package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
  954. package/dist/core/workflows/contrato/esquema.js +25 -0
  955. package/dist/core/workflows/contrato/esquema.js.map +1 -0
  956. package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
  957. package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
  958. package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
  959. package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
  960. package/dist/core/workflows/contrato/validador.d.ts +30 -0
  961. package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
  962. package/dist/core/workflows/contrato/validador.js +56 -0
  963. package/dist/core/workflows/contrato/validador.js.map +1 -0
  964. package/dist/core/workflows/contrato/yield.d.ts +65 -0
  965. package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
  966. package/dist/core/workflows/contrato/yield.js +80 -0
  967. package/dist/core/workflows/contrato/yield.js.map +1 -0
  968. package/dist/core/workflows/goal-engine/engine.d.ts +17 -0
  969. package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -1
  970. package/dist/core/workflows/goal-engine/engine.js +41 -0
  971. package/dist/core/workflows/goal-engine/engine.js.map +1 -1
  972. package/dist/core/workflows/index.d.ts +8 -0
  973. package/dist/core/workflows/index.d.ts.map +1 -1
  974. package/dist/core/workflows/index.js +4 -0
  975. package/dist/core/workflows/index.js.map +1 -1
  976. package/dist/core/workflows/manager.d.ts +10 -0
  977. package/dist/core/workflows/manager.d.ts.map +1 -1
  978. package/dist/core/workflows/manager.js +35 -11
  979. package/dist/core/workflows/manager.js.map +1 -1
  980. package/dist/core/workflows/runtime.d.ts +13 -0
  981. package/dist/core/workflows/runtime.d.ts.map +1 -1
  982. package/dist/core/workflows/runtime.js +80 -1
  983. package/dist/core/workflows/runtime.js.map +1 -1
  984. package/dist/core/workflows/save-as-skill.d.ts +27 -0
  985. package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
  986. package/dist/core/workflows/save-as-skill.js +54 -0
  987. package/dist/core/workflows/save-as-skill.js.map +1 -0
  988. package/dist/core/workflows/types.d.ts +49 -0
  989. package/dist/core/workflows/types.d.ts.map +1 -1
  990. package/dist/core/workflows/types.js.map +1 -1
  991. package/dist/extensions/remoto/index.d.ts +22 -0
  992. package/dist/extensions/remoto/index.d.ts.map +1 -0
  993. package/dist/extensions/remoto/index.js +54 -0
  994. package/dist/extensions/remoto/index.js.map +1 -0
  995. package/dist/index.d.ts +1 -17
  996. package/dist/index.d.ts.map +1 -1
  997. package/dist/index.js +7 -16
  998. package/dist/index.js.map +1 -1
  999. package/dist/main.d.ts.map +1 -1
  1000. package/dist/main.js +6 -0
  1001. package/dist/main.js.map +1 -1
  1002. package/dist/modes/acp/acp-mode.d.ts +42 -0
  1003. package/dist/modes/acp/acp-mode.d.ts.map +1 -0
  1004. package/dist/modes/acp/acp-mode.js +190 -0
  1005. package/dist/modes/acp/acp-mode.js.map +1 -0
  1006. package/dist/modes/acp/events.d.ts +74 -0
  1007. package/dist/modes/acp/events.d.ts.map +1 -0
  1008. package/dist/modes/acp/events.js +116 -0
  1009. package/dist/modes/acp/events.js.map +1 -0
  1010. package/dist/modes/interactive/components/model-selector.d.ts +8 -1
  1011. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  1012. package/dist/modes/interactive/components/model-selector.js +41 -7
  1013. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  1014. package/dist/modes/interactive/components/settings-selector.d.ts +1 -2
  1015. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1016. package/dist/modes/interactive/components/settings-selector.js +9 -86
  1017. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1018. package/dist/modes/interactive/components/thinking-selector.d.ts +8 -1
  1019. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  1020. package/dist/modes/interactive/components/thinking-selector.js +48 -17
  1021. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  1022. package/dist/modes/interactive/interactive-mode.d.ts +3 -7
  1023. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1024. package/dist/modes/interactive/interactive-mode.js +137 -146
  1025. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1026. package/dist/modes/print-mode.d.ts.map +1 -1
  1027. package/dist/modes/print-mode.js +11 -0
  1028. package/dist/modes/print-mode.js.map +1 -1
  1029. package/dist/package-manager-cli.d.ts.map +1 -1
  1030. package/dist/package-manager-cli.js +27 -5
  1031. package/dist/package-manager-cli.js.map +1 -1
  1032. package/dist/server/attach.d.ts +56 -0
  1033. package/dist/server/attach.d.ts.map +1 -0
  1034. package/dist/server/attach.js +130 -0
  1035. package/dist/server/attach.js.map +1 -0
  1036. package/dist/server/extension-ops.d.ts +40 -0
  1037. package/dist/server/extension-ops.d.ts.map +1 -0
  1038. package/dist/server/extension-ops.js +146 -0
  1039. package/dist/server/extension-ops.js.map +1 -0
  1040. package/dist/server/pi-server-service.d.ts +85 -0
  1041. package/dist/server/pi-server-service.d.ts.map +1 -0
  1042. package/dist/server/pi-server-service.js +213 -0
  1043. package/dist/server/pi-server-service.js.map +1 -0
  1044. package/dist/server/scheduler-tick.d.ts +32 -0
  1045. package/dist/server/scheduler-tick.d.ts.map +1 -0
  1046. package/dist/server/scheduler-tick.js +47 -0
  1047. package/dist/server/scheduler-tick.js.map +1 -0
  1048. package/dist/server/serve.d.ts +25 -0
  1049. package/dist/server/serve.d.ts.map +1 -0
  1050. package/dist/server/serve.js +83 -0
  1051. package/dist/server/serve.js.map +1 -0
  1052. package/dist/server/transcript.d.ts +38 -0
  1053. package/dist/server/transcript.d.ts.map +1 -0
  1054. package/dist/server/transcript.js +176 -0
  1055. package/dist/server/transcript.js.map +1 -0
  1056. package/dist/skills/skill-creator/SKILL.md +90 -0
  1057. package/dist/telegram/api.d.ts +75 -0
  1058. package/dist/telegram/api.d.ts.map +1 -0
  1059. package/dist/telegram/api.js +104 -0
  1060. package/dist/telegram/api.js.map +1 -0
  1061. package/dist/telegram/bridge.d.ts +85 -0
  1062. package/dist/telegram/bridge.d.ts.map +1 -0
  1063. package/dist/telegram/bridge.js +182 -0
  1064. package/dist/telegram/bridge.js.map +1 -0
  1065. package/dist/telegram/journal.d.ts +67 -0
  1066. package/dist/telegram/journal.d.ts.map +1 -0
  1067. package/dist/telegram/journal.js +119 -0
  1068. package/dist/telegram/journal.js.map +1 -0
  1069. package/dist/telegram/servidor.d.ts +15 -0
  1070. package/dist/telegram/servidor.d.ts.map +1 -0
  1071. package/dist/telegram/servidor.js +74 -0
  1072. package/dist/telegram/servidor.js.map +1 -0
  1073. package/dist/utils/shell.d.ts +11 -0
  1074. package/dist/utils/shell.d.ts.map +1 -1
  1075. package/dist/utils/shell.js +11 -0
  1076. package/dist/utils/shell.js.map +1 -1
  1077. package/dist/utils/version-check.d.ts.map +1 -1
  1078. package/dist/utils/version-check.js +29 -1
  1079. package/dist/utils/version-check.js.map +1 -1
  1080. package/docs/compaction.md +10 -10
  1081. package/docs/compliance.md +241 -0
  1082. package/docs/containerization.md +24 -24
  1083. package/docs/custom-provider.md +10 -10
  1084. package/docs/development.md +47 -10
  1085. package/docs/docs.json +14 -2
  1086. package/docs/environment-variables.md +20 -17
  1087. package/docs/extensions.md +51 -49
  1088. package/docs/index.md +15 -21
  1089. package/docs/json.md +3 -3
  1090. package/docs/keybindings.md +5 -5
  1091. package/docs/llama-cpp.md +7 -7
  1092. package/docs/models.md +12 -12
  1093. package/docs/packages.md +45 -45
  1094. package/docs/prompt-templates.md +5 -5
  1095. package/docs/providers.md +12 -12
  1096. package/docs/quickstart.md +39 -39
  1097. package/docs/rpc.md +12 -12
  1098. package/docs/sdk.md +38 -38
  1099. package/docs/security.md +26 -21
  1100. package/docs/session-format.md +7 -7
  1101. package/docs/sessions.md +14 -14
  1102. package/docs/settings.md +45 -20
  1103. package/docs/shell-aliases.md +2 -2
  1104. package/docs/skills.md +11 -11
  1105. package/docs/terminal-setup.md +14 -14
  1106. package/docs/termux.md +7 -7
  1107. package/docs/themes.md +11 -11
  1108. package/docs/tmux.md +4 -4
  1109. package/docs/tui.md +3 -3
  1110. package/docs/usage.md +54 -54
  1111. package/docs/windows.md +2 -2
  1112. package/examples/sdk/12-full-control.ts +9 -0
  1113. package/npm-shrinkwrap.json +35 -251
  1114. package/package.json +10 -4
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/workflows/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAA0B,UAAU,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,WAAW,EAA+B,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA4C3C,MAAM,OAAO,eAAe;IACnB,OAAO,CAAa;IACpB,OAAO,CAAS;IAChB,aAAa,CAA0C;IACvD,MAAM,CAAmC;IACzC,OAAO,CAAqC;IAC5C,OAAO,CAAqC;IAC5C,gBAAgB,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE9D,YAAY,OAA+B,EAAE;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAAA,CAC/B;IAED,IAAI,UAAU,GAAe;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC;IAAA,CACpB;IAED,KAAK,CAAC,IAAI,GAER;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAAA,CAC3B;IAED,KAAK,CAAC,KAAK,CAAC,KAAa,EAAqC;QAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAAA,CAChC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,SAAS,CAAC,OAAO,GAA8B,EAAE,EAAqB;QAC3E,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,IAA6C,CAAC;QAClD,IAAI,CAAC;YACJ,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,SAAS,CAAC,CAAC,uBAAsB;QACzC,CAAC;QACD,MAAM,KAAK,GAAG,uCAAuC,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,SAAS;YACvE,mEAAmE;YACnE,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrD,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,YAAY;gBAAE,SAAS;YACtD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,OAAO,GAAsB;gBAClC,GAAG,KAAK;gBACR,MAAM,EAAE,SAAS;gBACjB,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACnC,CAAC;YACF,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,OAAO,EAAE,CAAC,uBAAuB,EAAE;gBACvC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK;gBAC9B,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI;gBAC3B,KAAK;aACL,CAAC,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC;IAAA,CACjB;IAED,0EAA0E;IAC1E,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAO,GAA2B,EAAE,EAAgD;QACjH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;QACtG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAE7C,MAAM,YAAY,GAAsB;YACvC,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,EAAE;YACV,KAAK;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM;YACN,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;YACxB,IAAI;YACJ,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;YACnF,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACnC,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC,sBAAsB,EAAE;YACtC,KAAK;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;SAC/C,CAAC,CAAC;QAEH,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,+DAA+D;QAC/D,IAAI,YAAY,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACzC,gEAAgE;QAChE,uEAAuE;QACvE,MAAM,IAAI,GAAsB,EAAE,GAAG,YAAY,EAAE,CAAC;QACpD,MAAM,UAAU,GAA6C,EAAE,CAAC;QAChE,qDAAqD;QACrD,MAAM,eAAe,GAAG,CAAC,OAAgB,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC;YAC1D,IAAI,CAAC,YAAY,CAAC,EAAE;gBAAE,OAAO;YAC7B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;YAC7D,IAAI,GAAG,EAAE,CAAC;gBACT,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC7C,GAAG,CAAC,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAClD,CAAC;YACD,KAAK,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;QAAA,CAC3C,CAAC;QACF,qEAAqE;QACrE,wCAAwC;QACxC,IAAI,SAAS,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,KAAiC,EAAE,EAAE,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACpE,SAAS,GAAG,SAAS;iBACnB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACJ,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACR,8CAA8C;gBAC/C,CAAC;YAAA,CACD,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAClB,OAAO,SAAS,CAAC;QAAA,CACjB,CAAC;QAEF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE;YACtC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE;YACpC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,CAAC;gBAC7C,4DAA4D;gBAC5D,oDAAmD;gBACnD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;gBAClE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oBACpD,IAAI,CAAC;wBACJ,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;oBACtD,CAAC;4BAAS,CAAC;wBACV,IAAI,UAAU;4BAAE,eAAe,CAAC,IAAI,CAAC,CAAC;;4BACjC,eAAe,CAAC,KAAK,CAAC,CAAC;oBAC7B,CAAC;gBACF,CAAC;gBACD,qEAAmE;gBACnE,IAAK,iBAAuD,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACpF,MAAM,IAAI,aAAa,CACtB,kBAAkB,EAClB,eAAe,MAAM,2CAA2C,EAChE,EAAE,WAAW,EAAE,KAAK,EAAE,CACtB,CAAC;gBACH,CAAC;gBACD,OAAQ,iBAAuD,EAAE,OAAO,IAAI,IAAI,CAAC;YAAA,CACjF;YACD,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;YACxB,KAAK;YACL,aAAa,EAAE,IAAI,GAAG,EAAE;YACxB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBACnB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1D,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAClB,IAAI,CAAC,OAAO,EAAE,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAAA,CACnD;YACD,YAAY,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;gBACvC,WAAW,EAAE,CAAC;gBACd,YAAY,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC;gBACnD,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC/E,KAAK,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC3C,IAAI,CAAC,OAAO,EAAE,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAAA,CAC/F;YACD,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;gBACxC,UAAU,EAAE,CAAC;gBACb,YAAY,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;gBACrC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;gBAClE,IAAI,GAAG;oBAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC7B,KAAK,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC3C,IAAI,CAAC,OAAO,EAAE,CAAC,qBAAqB,EAAE;oBACrC,KAAK;oBACL,MAAM,EAAE,SAAS;oBACjB,UAAU;oBACV,WAAW;oBACX,MAAM,EAAE,CAAC;oBACT,IAAI,EAAE,CAAC;iBACP,CAAC,CAAC;YAAA,CACH;YACD,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,KAA0C,CAAC;gBACrD,KAAK,QAAQ,CAAC;oBACb,UAAU,EAAE;wBACX,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;wBAC/F,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK;wBACvC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI;qBACpC;iBACD,CAAC,CAAC;gBACH,IAAI,CAAC,OAAO,EAAE,CAAC,qBAAqB,EAAE;oBACrC,KAAK;oBACL,MAAM,EAAE,SAAS;oBACjB,UAAU;oBACV,WAAW;oBACX,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;oBACpB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;iBACjB,CAAC,CAAC;YAAA,CACH;SACD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;gBAChC,mEAAkE;gBAClE,4CAA4C;gBAC5C,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,UAAU,GAAsB;oBACrC,GAAG,YAAY;oBACf,MAAM,EAAE,WAAW;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,YAAY,EAAE,IAAI;oBAClB,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAe,EAAE,CAAC,CAAC;oBAClE,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,UAAU,EAAE;wBACX,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK;wBAC9B,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM;wBAChC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK;wBAC9B,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI;wBAC5B,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,IAAI,CAAC;wBAC3C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC;qBAC7C;oBACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACnC,CAAC;gBACF,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACpC,IAAI,CAAC,OAAO,EAAE,CAAC,uBAAuB,EAAE;oBACvC,KAAK;oBACL,MAAM,EAAE,WAAW;oBACnB,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK;oBAC/B,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI;iBAC5B,CAAC,CAAC;gBACH,OAAO,MAAM,CAAC;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,MAAM,GACV,KAAuB,EAAE,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC9E,MAAM,UAAU,GAAG;oBAClB,GAAG,YAAY;oBACf,MAAM;oBACN,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACnC,CAAC;gBACF,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACpC,IAAI,CAAC,OAAO,EAAE,CAAC,uBAAuB,EAAE;oBACvC,KAAK;oBACL,MAAM;oBACN,UAAU,EAAE,UAAU;oBACtB,MAAM,EAAE,CAAC;oBACT,IAAI,EAAE,CAAC;oBACP,KAAK,EAAE,UAAU,CAAC,KAAK;iBACvB,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC;YACb,CAAC;oBAAS,CAAC;gBACV,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;QAAA,CACD,CAAC;QAEF,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC7B,kEAAkE;YAClE,KAAK,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,CAAC;QAClB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAG,MAA+B,CAAC,MAAM,EAAE,CAAC;IAAA,CAClE;IAED,KAAK,CAAC,KAAa,EAAW;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IAAA,CACZ;IAEO,mBAAmB,GAAW;QACrC,qEAAiE;QACjE,sEAAoE;QACpE,mEAAgE;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvE,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAAA,CAC1C;CACD","sourcesContent":["/**\n * WorkflowManager — ejecución de workflows en background con estado durable.\n *\n * - execute(script, args): valida, persiste el estado (RunJournal), corre el\n * runtime, emite eventos (started/phase/agent/update/finished).\n * - pause/resume/abort: aborta con señal; el estado queda para reanudar\n * (resume con el mismo runId reutiliza el journal).\n * - El disco es la fuente de verdad (snapshot en cada evento).\n */\n\nimport { type PersistedRunState, RunJournal } from \"./journal.ts\";\nimport { runWorkflow, type WorkflowRuntimeOptions } from \"./runtime.ts\";\nimport { WorkflowError } from \"./types.ts\";\n\nexport interface WorkflowEventMap {\n\tworkflow_run_started: { runId: string; name: string; phases: string[] };\n\tworkflow_phase: { runId: string; phase: string };\n\tworkflow_agent: { runId: string; agent: { id: string; label: string; phase?: string } };\n\tworkflow_run_update: {\n\t\trunId: string;\n\t\tstatus: PersistedRunState[\"status\"];\n\t\tagentsDone: number;\n\t\tagentsTotal: number;\n\t\ttokens: number;\n\t\tcost: number;\n\t};\n\tworkflow_run_finished: {\n\t\trunId: string;\n\t\tstatus: PersistedRunState[\"status\"];\n\t\tresultPath?: string;\n\t\tagentCount: number;\n\t\ttokens: number;\n\t\tcost: number;\n\t\terror?: string;\n\t};\n}\n\nexport interface WorkflowManagerOptions {\n\trunsDir: string;\n\tcreateSession: WorkflowRuntimeOptions[\"createSession\"];\n\tlimits?: WorkflowRuntimeOptions[\"limits\"];\n\tonEvent?: <K extends keyof WorkflowEventMap>(type: K, payload: WorkflowEventMap[K]) => void;\n\tconfirm?: WorkflowRuntimeOptions[\"confirm\"];\n}\n\nexport interface ExecuteWorkflowOptions {\n\targs?: Record<string, unknown>;\n\trunId?: string;\n\t/** Sesión que lanza el run (filtro por conversación en el panel). */\n\tsessionId?: string;\n\t/** Nombre para mostrar en el panel (título de sub-tarea del goal, etc.). */\n\tdisplayName?: string;\n\t/** Esperar a que termine (default: true). */\n\tawait?: boolean;\n}\n\nexport class WorkflowManager {\n\tprivate journal: RunJournal;\n\tprivate runsDir: string;\n\tprivate createSession: WorkflowRuntimeOptions[\"createSession\"];\n\tprivate limits: WorkflowRuntimeOptions[\"limits\"];\n\tprivate onEvent?: WorkflowManagerOptions[\"onEvent\"];\n\tprivate confirm?: WorkflowRuntimeOptions[\"confirm\"];\n\tprivate abortControllers = new Map<string, AbortController>();\n\n\tconstructor(options: WorkflowManagerOptions) {\n\t\tthis.journal = new RunJournal({ runsDir: options.runsDir });\n\t\tthis.runsDir = options.runsDir;\n\t\tthis.createSession = options.createSession;\n\t\tthis.limits = options.limits;\n\t\tthis.onEvent = options.onEvent;\n\t\tthis.confirm = options.confirm;\n\t}\n\n\tget runJournal(): RunJournal {\n\t\treturn this.journal;\n\t}\n\n\tasync list(): Promise<\n\t\tArray<{ runId: string; name: string; status: PersistedRunState[\"status\"]; updatedAt: string }>\n\t> {\n\t\treturn this.journal.list();\n\t}\n\n\tasync state(runId: string): Promise<PersistedRunState | null> {\n\t\treturn this.journal.load(runId);\n\t}\n\n\t/**\n\t * Desatasca los runs que murieron con su proceso.\n\t *\n\t * `execute` siempre persiste `status: \"running\"` y nadie escaneaba `runsDir`\n\t * al arrancar, así que un Ctrl-C durante una sub-tarea dejaba el run en\n\t * `running` para siempre. Y `GoalEngine.tick` se niega a avanzar mientras\n\t * haya una task en `running` → el goal quedaba atascado sin salida.\n\t *\n\t * Marca esos runs como `aborted` y emite `workflow_run_finished(ok:false)`,\n\t * con lo que `onWorkflowFinished` libera la sub-tarea por el camino que ya\n\t * existe (y que ahora además auto-continúa).\n\t *\n\t * Deliberadamente NO reanuda el run desde el journal: eso exige confiar en el\n\t * hash de identidad y es otro item. Aquí solo hay que liberar el goal.\n\t *\n\t * ponytail: la propiedad del run se decide por antigüedad de `updatedAt`\n\t * porque no hay leases de sesión. Si algún día dos procesos comparten\n\t * `runsDir`, esto necesita un lease de verdad.\n\t */\n\tasync reconcile(options: { staleAfterMs?: number } = {}): Promise<string[]> {\n\t\tconst staleAfterMs = options.staleAfterMs ?? 5 * 60 * 1000;\n\t\tconst now = Date.now();\n\t\tconst reclaimed: string[] = [];\n\t\tlet runs: Awaited<ReturnType<RunJournal[\"list\"]>>;\n\t\ttry {\n\t\t\truns = await this.journal.list();\n\t\t} catch {\n\t\t\treturn reclaimed; // sin runsDir todavía\n\t\t}\n\t\tconst error = \"interrumpido por reinicio del proceso\";\n\t\tfor (const entry of runs) {\n\t\t\tif (entry.status !== \"running\" && entry.status !== \"pending\") continue;\n\t\t\t// Un run vivo de ESTE proceso tiene su AbortController registrado.\n\t\t\tif (this.abortControllers.has(entry.runId)) continue;\n\t\t\tconst age = now - Date.parse(entry.updatedAt);\n\t\t\tif (Number.isNaN(age) || age < staleAfterMs) continue;\n\t\t\tconst state = await this.journal.load(entry.runId);\n\t\t\tif (!state) continue;\n\t\t\tconst aborted: PersistedRunState = {\n\t\t\t\t...state,\n\t\t\t\tstatus: \"aborted\",\n\t\t\t\terror,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\tawait this.journal.save(aborted);\n\t\t\tthis.onEvent?.(\"workflow_run_finished\", {\n\t\t\t\trunId: entry.runId,\n\t\t\t\tstatus: \"aborted\",\n\t\t\t\tagentCount: state.agentCount,\n\t\t\t\ttokens: state.tokenUsage.total,\n\t\t\t\tcost: state.tokenUsage.cost,\n\t\t\t\terror,\n\t\t\t});\n\t\t\treclaimed.push(entry.runId);\n\t\t}\n\t\treturn reclaimed;\n\t}\n\n\t/** Ejecuta un workflow. Si await=true (default), resuelve al terminar. */\n\tasync execute(script: string, options: ExecuteWorkflowOptions = {}): Promise<{ runId: string; result?: unknown }> {\n\t\tconst { meta, body: _body } = await import(\"./runtime.ts\").then((m) => m.parseWorkflowScript(script));\n\t\tconst runId = options.runId ?? `wf-${Date.now().toString(36)}`;\n\t\tconst controller = new AbortController();\n\t\tthis.abortControllers.set(runId, controller);\n\n\t\tconst initialState: PersistedRunState = {\n\t\t\tversion: 1,\n\t\t\tphases: [],\n\t\t\trunId,\n\t\t\tname: meta.name,\n\t\t\tscript,\n\t\t\targs: options.args ?? {},\n\t\t\tmeta,\n\t\t\tstatus: \"running\",\n\t\t\tcurrentPhase: null,\n\t\t\tsessionId: options.sessionId,\n\t\t\tdisplayName: options.displayName,\n\t\t\tjournal: [],\n\t\t\tagentCount: 0,\n\t\t\ttokenUsage: { input: 0, output: 0, total: 0, cost: 0, cacheRead: 0, cacheWrite: 0 },\n\t\t\tstartedAt: new Date().toISOString(),\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t};\n\t\tawait this.journal.save(initialState);\n\t\tthis.onEvent?.(\"workflow_run_started\", {\n\t\t\trunId,\n\t\t\tname: meta.name,\n\t\t\tphases: (meta.phases ?? []).map((p) => p.title),\n\t\t});\n\n\t\tlet agentsDone = 0;\n\t\tlet agentsTotal = 0;\n\t\t// Agente en curso (para marcar blocked cuando espera confirm).\n\t\tlet currentAgent = { id: \"\", label: \"\" };\n\t\t// Estado vivo: se persiste en cada evento para que el panel del\n\t\t// desktop vea fases y agentes en tiempo real (polling de /api/engine).\n\t\tconst live: PersistedRunState = { ...initialState };\n\t\tconst liveAgents: NonNullable<PersistedRunState[\"agents\"]> = [];\n\t\t// Marcar/desmarcar blocked del agente en curso (P4).\n\t\tconst setAgentBlocked = (blocked: boolean, reason = \"\") => {\n\t\t\tif (!currentAgent.id) return;\n\t\t\tconst rec = liveAgents.find((a) => a.id === currentAgent.id);\n\t\t\tif (rec) {\n\t\t\t\trec.status = blocked ? \"blocked\" : \"running\";\n\t\t\t\trec.blockedReason = blocked ? reason : undefined;\n\t\t\t}\n\t\t\tvoid saveLive({ agents: [...liveAgents] });\n\t\t};\n\t\t// Saves serializados (cadena de promesas): preserva el orden y evita\n\t\t// que un snapshot viejo pise uno nuevo.\n\t\tlet saveChain: Promise<void> = Promise.resolve();\n\t\tconst saveLive = (patch: Partial<PersistedRunState>) => {\n\t\t\tObject.assign(live, patch, { updatedAt: new Date().toISOString() });\n\t\t\tsaveChain = saveChain\n\t\t\t\t.then(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.journal.save(live);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// best-effort: nunca rompe el run por un save\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\t\treturn saveChain;\n\t\t};\n\n\t\tconst runPromise = runWorkflow(script, {\n\t\t\tcwd: process.cwd(),\n\t\t\tagentDir: this.agentDirFromRunsDir(),\n\t\t\tcreateSession: this.createSession,\n\t\t\tlimits: this.limits,\n\t\t\tsignal: controller.signal,\n\t\t\tconfirm: async (prompt, checkpointOptions) => {\n\t\t\t\t// P4: mientras hay un checkpoint pendiente de input humano,\n\t\t\t\t// el agente en curso está BLOCKED (no procesando).\n\t\t\t\tconst wasBlocked = liveAgents.some((a) => a.status === \"blocked\");\n\t\t\t\tif (this.confirm) {\n\t\t\t\t\tsetAgentBlocked(true, String(prompt).slice(0, 120));\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn await this.confirm(prompt, checkpointOptions);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif (wasBlocked) setAgentBlocked(true);\n\t\t\t\t\t\telse setAgentBlocked(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Sin confirm del host: headless → abort (checkpoint no resuelto).\n\t\t\t\tif ((checkpointOptions as { headless?: string } | undefined)?.headless === \"abort\") {\n\t\t\t\t\tthrow new WorkflowError(\n\t\t\t\t\t\t\"WORKFLOW_ABORTED\",\n\t\t\t\t\t\t`checkpoint \"${prompt}\" needs human input but none is available`,\n\t\t\t\t\t\t{ recoverable: false },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn (checkpointOptions as { default?: unknown } | undefined)?.default ?? true;\n\t\t\t},\n\t\t\targs: options.args ?? {},\n\t\t\trunId,\n\t\t\tresumeJournal: new Map(),\n\t\t\tonPhase: (phase) => {\n\t\t\t\tlive.currentPhase = phase;\n\t\t\t\tif (!live.phases.includes(phase)) live.phases.push(phase);\n\t\t\t\tvoid saveLive({});\n\t\t\t\tthis.onEvent?.(\"workflow_phase\", { runId, phase });\n\t\t\t},\n\t\t\tonAgentStart: (_index, label, phase) => {\n\t\t\t\tagentsTotal++;\n\t\t\t\tcurrentAgent = { id: `${runId}:${_index}`, label };\n\t\t\t\tliveAgents.push({ id: `${runId}:${_index}`, label, phase, status: \"running\" });\n\t\t\t\tvoid saveLive({ agents: [...liveAgents] });\n\t\t\t\tthis.onEvent?.(\"workflow_agent\", { runId, agent: { id: `${runId}:${_index}`, label, phase } });\n\t\t\t},\n\t\t\tonAgentEnd: (_index, _label, _result) => {\n\t\t\t\tagentsDone++;\n\t\t\t\tcurrentAgent = { id: \"\", label: \"\" };\n\t\t\t\tconst rec = liveAgents.find((a) => a.id === `${runId}:${_index}`);\n\t\t\t\tif (rec) rec.status = \"done\";\n\t\t\t\tvoid saveLive({ agents: [...liveAgents] });\n\t\t\t\tthis.onEvent?.(\"workflow_run_update\", {\n\t\t\t\t\trunId,\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tagentsDone,\n\t\t\t\t\tagentsTotal,\n\t\t\t\t\ttokens: 0,\n\t\t\t\t\tcost: 0,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonTokenUsage: (usage) => {\n\t\t\t\tconst u = usage as { total?: number; cost?: number };\n\t\t\t\tvoid saveLive({\n\t\t\t\t\ttokenUsage: {\n\t\t\t\t\t\t...(live.tokenUsage ?? { input: 0, output: 0, total: 0, cost: 0, cacheRead: 0, cacheWrite: 0 }),\n\t\t\t\t\t\ttotal: u.total ?? live.tokenUsage.total,\n\t\t\t\t\t\tcost: u.cost ?? live.tokenUsage.cost,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tthis.onEvent?.(\"workflow_run_update\", {\n\t\t\t\t\trunId,\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tagentsDone,\n\t\t\t\t\tagentsTotal,\n\t\t\t\t\ttokens: u.total ?? 0,\n\t\t\t\t\tcost: u.cost ?? 0,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tconst settle = async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await runPromise;\n\t\t\t\t// Drenar saves en vivo ANTES del estado final: un saveLive tardío\n\t\t\t\t// no debe pisar el estado completed/failed.\n\t\t\t\tawait saveChain.catch(() => {});\n\t\t\t\tconst finalState: PersistedRunState = {\n\t\t\t\t\t...initialState,\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\tphases: result.phases,\n\t\t\t\t\tcurrentPhase: null,\n\t\t\t\t\tagents: liveAgents.map((a) => ({ ...a, status: \"done\" as const })),\n\t\t\t\t\tagentCount: result.agentCount,\n\t\t\t\t\ttokenUsage: {\n\t\t\t\t\t\tinput: result.tokenUsage.input,\n\t\t\t\t\t\toutput: result.tokenUsage.output,\n\t\t\t\t\t\ttotal: result.tokenUsage.total,\n\t\t\t\t\t\tcost: result.tokenUsage.cost,\n\t\t\t\t\t\tcacheRead: result.tokenUsage.cacheRead ?? 0,\n\t\t\t\t\t\tcacheWrite: result.tokenUsage.cacheWrite ?? 0,\n\t\t\t\t\t},\n\t\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t\t};\n\t\t\t\tawait this.journal.save(finalState);\n\t\t\t\tthis.onEvent?.(\"workflow_run_finished\", {\n\t\t\t\t\trunId,\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\tagentCount: result.agentCount,\n\t\t\t\t\ttokens: result.tokenUsage.total,\n\t\t\t\t\tcost: result.tokenUsage.cost,\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\tconst status: PersistedRunState[\"status\"] =\n\t\t\t\t\t(error as WorkflowError)?.code === \"WORKFLOW_ABORTED\" ? \"aborted\" : \"failed\";\n\t\t\t\tconst finalState = {\n\t\t\t\t\t...initialState,\n\t\t\t\t\tstatus,\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t\t};\n\t\t\t\tawait this.journal.save(finalState);\n\t\t\t\tthis.onEvent?.(\"workflow_run_finished\", {\n\t\t\t\t\trunId,\n\t\t\t\t\tstatus,\n\t\t\t\t\tagentCount: agentsDone,\n\t\t\t\t\ttokens: 0,\n\t\t\t\t\tcost: 0,\n\t\t\t\t\terror: finalState.error,\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tthis.abortControllers.delete(runId);\n\t\t\t}\n\t\t};\n\n\t\tif (options.await === false) {\n\t\t\t// El error ya se persiste en el estado; capturar evita unhandled.\n\t\t\tvoid settle().catch(() => {});\n\t\t\treturn { runId };\n\t\t}\n\t\tconst result = await settle();\n\t\treturn { runId, result: (result as { result?: unknown }).result };\n\t}\n\n\tabort(runId: string): boolean {\n\t\tconst controller = this.abortControllers.get(runId);\n\t\tif (!controller) return false;\n\t\tcontroller.abort();\n\t\treturn true;\n\t}\n\n\tprivate agentDirFromRunsDir(): string {\n\t\t// El agentDir es el padre de workflows/runs → workflows → agent.\n\t\t// OJO: preservar el / inicial (absoluto) — split+filter(Boolean) lo\n\t\t// elimina y producía una ruta RELATIVA → auth.json irresoluble.\n\t\tconst isAbsolute = this.runsDir.startsWith(\"/\");\n\t\tconst parts = this.runsDir.split(\"/\").filter(Boolean);\n\t\tconst parent = parts.slice(0, Math.max(0, parts.length - 2)).join(\"/\");\n\t\treturn isAbsolute ? `/${parent}` : parent;\n\t}\n}\n"]}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/workflows/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAA0B,UAAU,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,WAAW,EAA+B,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA8C3C,MAAM,OAAO,eAAe;IACnB,OAAO,CAAa;IACpB,OAAO,CAAS;IAChB,aAAa,CAA0C;IACvD,MAAM,CAAmC;IACzC,OAAO,CAAqC;IAC5C,OAAO,CAAqC;IAC5C,gBAAgB,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE9D,YAAY,OAA+B,EAAE;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAAA,CAC/B;IAED,IAAI,UAAU,GAAe;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC;IAAA,CACpB;IAED,KAAK,CAAC,IAAI,GAER;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAAA,CAC3B;IAED,KAAK,CAAC,KAAK,CAAC,KAAa,EAAqC;QAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAAA,CAChC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,SAAS,CAAC,OAAO,GAA8B,EAAE,EAAqB;QAC3E,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,IAA6C,CAAC;QAClD,IAAI,CAAC;YACJ,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,SAAS,CAAC,CAAC,uBAAsB;QACzC,CAAC;QACD,MAAM,KAAK,GAAG,uCAAuC,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,SAAS;YACvE,mEAAmE;YACnE,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrD,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,YAAY;gBAAE,SAAS;YACtD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,OAAO,GAAsB;gBAClC,GAAG,KAAK;gBACR,MAAM,EAAE,SAAS;gBACjB,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACnC,CAAC;YACF,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,OAAO,EAAE,CAAC,uBAAuB,EAAE;gBACvC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK;gBAC9B,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI;gBAC3B,KAAK;aACL,CAAC,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC;IAAA,CACjB;IAED,0EAA0E;IAC1E,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAO,GAA2B,EAAE,EAAgD;QACjH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;QACtG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAE7C,4EAA4E;QAC5E,6EAA2E;QAC3E,8DAA6D;QAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5E,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;QAC1C,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6C,CAAC;QAC3E,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YAClC,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,YAAY,GAAsB;YACvC,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,EAAE;YACV,KAAK;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM;YACN,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;YACxB,IAAI;YACJ,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO,EAAE,YAAY;YACrB,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,CAAC;YAClC,sDAAsD;YACtD,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;YACxG,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACnC,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC,sBAAsB,EAAE;YACtC,KAAK;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;SAC/C,CAAC,CAAC;QAEH,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,+DAA+D;QAC/D,IAAI,YAAY,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACzC,gEAAgE;QAChE,uEAAuE;QACvE,MAAM,IAAI,GAAsB,EAAE,GAAG,YAAY,EAAE,CAAC;QACpD,MAAM,UAAU,GAA6C,EAAE,CAAC;QAChE,qDAAqD;QACrD,MAAM,eAAe,GAAG,CAAC,OAAgB,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC;YAC1D,IAAI,CAAC,YAAY,CAAC,EAAE;gBAAE,OAAO;YAC7B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;YAC7D,IAAI,GAAG,EAAE,CAAC;gBACT,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC7C,GAAG,CAAC,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAClD,CAAC;YACD,KAAK,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;QAAA,CAC3C,CAAC;QACF,qEAAqE;QACrE,wCAAwC;QACxC,IAAI,SAAS,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,KAAiC,EAAE,EAAE,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACpE,SAAS,GAAG,SAAS;iBACnB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACJ,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACR,8CAA8C;gBAC/C,CAAC;YAAA,CACD,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAClB,OAAO,SAAS,CAAC;QAAA,CACjB,CAAC;QAEF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE;YACtC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE;YACpC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,CAAC;gBAC7C,4DAA4D;gBAC5D,oDAAmD;gBACnD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;gBAClE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oBACpD,IAAI,CAAC;wBACJ,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;oBACtD,CAAC;4BAAS,CAAC;wBACV,IAAI,UAAU;4BAAE,eAAe,CAAC,IAAI,CAAC,CAAC;;4BACjC,eAAe,CAAC,KAAK,CAAC,CAAC;oBAC7B,CAAC;gBACF,CAAC;gBACD,qEAAmE;gBACnE,IAAK,iBAAuD,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACpF,MAAM,IAAI,aAAa,CACtB,kBAAkB,EAClB,eAAe,MAAM,2CAA2C,EAChE,EAAE,WAAW,EAAE,KAAK,EAAE,CACtB,CAAC;gBACH,CAAC;gBACD,OAAQ,iBAAuD,EAAE,OAAO,IAAI,IAAI,CAAC;YAAA,CACjF;YACD,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;YACxB,KAAK;YACL,aAAa;YACb,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7F,KAAK,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAAA,CACzC;YACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBACnB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1D,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAClB,IAAI,CAAC,OAAO,EAAE,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAAA,CACnD;YACD,YAAY,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;gBACvC,WAAW,EAAE,CAAC;gBACd,YAAY,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC;gBACnD,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC/E,KAAK,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC3C,IAAI,CAAC,OAAO,EAAE,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAAA,CAC/F;YACD,YAAY,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;gBAC1C,IAAI,CAAC,OAAO,EAAE,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAAA,CACxG;YACD,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;gBACxC,UAAU,EAAE,CAAC;gBACb,YAAY,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;gBACrC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;gBAClE,IAAI,GAAG;oBAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC7B,KAAK,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC3C,IAAI,CAAC,OAAO,EAAE,CAAC,qBAAqB,EAAE;oBACrC,KAAK;oBACL,MAAM,EAAE,SAAS;oBACjB,UAAU;oBACV,WAAW;oBACX,MAAM,EAAE,CAAC;oBACT,IAAI,EAAE,CAAC;iBACP,CAAC,CAAC;YAAA,CACH;YACD,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,KAA0C,CAAC;gBACrD,KAAK,QAAQ,CAAC;oBACb,UAAU,EAAE;wBACX,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;wBAC/F,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK;wBACvC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI;qBACpC;iBACD,CAAC,CAAC;gBACH,IAAI,CAAC,OAAO,EAAE,CAAC,qBAAqB,EAAE;oBACrC,KAAK;oBACL,MAAM,EAAE,SAAS;oBACjB,UAAU;oBACV,WAAW;oBACX,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;oBACpB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;iBACjB,CAAC,CAAC;YAAA,CACH;SACD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;gBAChC,mEAAkE;gBAClE,4CAA4C;gBAC5C,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,UAAU,GAAsB;oBACrC,GAAG,YAAY;oBACf,qEAAoE;oBACpE,0DAAyD;oBACzD,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,WAAW;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,YAAY,EAAE,IAAI;oBAClB,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAe,EAAE,CAAC,CAAC;oBAClE,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,oEAAmE;oBACnE,kEAAkE;oBAClE,kEAAkE;oBAClE,UAAU,EAAE;wBACX,KAAK,EAAE,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK;wBAC9D,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM;wBACjE,KAAK,EAAE,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK;wBAC9D,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI;wBAC3D,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,IAAI,CAAC,CAAC;wBACjF,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,CAAC;qBACpF;oBACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACnC,CAAC;gBACF,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACpC,IAAI,CAAC,OAAO,EAAE,CAAC,uBAAuB,EAAE;oBACvC,KAAK;oBACL,MAAM,EAAE,WAAW;oBACnB,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK;oBAC/B,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI;iBAC5B,CAAC,CAAC;gBACH,OAAO,MAAM,CAAC;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,MAAM,GACV,KAAuB,EAAE,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC9E,MAAM,UAAU,GAAG;oBAClB,GAAG,YAAY;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM;oBACN,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACnC,CAAC;gBACF,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACpC,IAAI,CAAC,OAAO,EAAE,CAAC,uBAAuB,EAAE;oBACvC,KAAK;oBACL,MAAM;oBACN,UAAU,EAAE,UAAU;oBACtB,MAAM,EAAE,CAAC;oBACT,IAAI,EAAE,CAAC;oBACP,KAAK,EAAE,UAAU,CAAC,KAAK;iBACvB,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC;YACb,CAAC;oBAAS,CAAC;gBACV,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;QAAA,CACD,CAAC;QAEF,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC7B,kEAAkE;YAClE,KAAK,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,CAAC;QAClB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAG,MAA+B,CAAC,MAAM,EAAE,CAAC;IAAA,CAClE;IAED,KAAK,CAAC,KAAa,EAAW;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IAAA,CACZ;IAEO,mBAAmB,GAAW;QACrC,qEAAiE;QACjE,sEAAoE;QACpE,mEAAgE;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvE,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAAA,CAC1C;CACD","sourcesContent":["/**\n * WorkflowManager — ejecución de workflows en background con estado durable.\n *\n * - execute(script, args): valida, persiste el estado (RunJournal), corre el\n * runtime, emite eventos (started/phase/agent/update/finished).\n * - pause/resume/abort: aborta con señal; el estado queda para reanudar\n * (resume con el mismo runId reutiliza el journal).\n * - El disco es la fuente de verdad (snapshot en cada evento).\n */\n\nimport type { HallazgoParcial } from \"./contrato/yield.ts\";\nimport { type PersistedRunState, RunJournal } from \"./journal.ts\";\nimport { runWorkflow, type WorkflowRuntimeOptions } from \"./runtime.ts\";\nimport { WorkflowError } from \"./types.ts\";\n\nexport interface WorkflowEventMap {\n\tworkflow_run_started: { runId: string; name: string; phases: string[] };\n\tworkflow_phase: { runId: string; phase: string };\n\tworkflow_agent: { runId: string; agent: { id: string; label: string; phase?: string } };\n\t/** Un subagente entregó un hallazgo con `yield` — emitido EN CUANTO ocurre, no al terminar el run. */\n\tworkflow_agent_yield: { runId: string; agent: { id: string; label: string }; hallazgo: HallazgoParcial };\n\tworkflow_run_update: {\n\t\trunId: string;\n\t\tstatus: PersistedRunState[\"status\"];\n\t\tagentsDone: number;\n\t\tagentsTotal: number;\n\t\ttokens: number;\n\t\tcost: number;\n\t};\n\tworkflow_run_finished: {\n\t\trunId: string;\n\t\tstatus: PersistedRunState[\"status\"];\n\t\tresultPath?: string;\n\t\tagentCount: number;\n\t\ttokens: number;\n\t\tcost: number;\n\t\terror?: string;\n\t};\n}\n\nexport interface WorkflowManagerOptions {\n\trunsDir: string;\n\tcreateSession: WorkflowRuntimeOptions[\"createSession\"];\n\tlimits?: WorkflowRuntimeOptions[\"limits\"];\n\tonEvent?: <K extends keyof WorkflowEventMap>(type: K, payload: WorkflowEventMap[K]) => void;\n\tconfirm?: WorkflowRuntimeOptions[\"confirm\"];\n}\n\nexport interface ExecuteWorkflowOptions {\n\targs?: Record<string, unknown>;\n\trunId?: string;\n\t/** Sesión que lanza el run (filtro por conversación en el panel). */\n\tsessionId?: string;\n\t/** Nombre para mostrar en el panel (título de sub-tarea del goal, etc.). */\n\tdisplayName?: string;\n\t/** Esperar a que termine (default: true). */\n\tawait?: boolean;\n}\n\nexport class WorkflowManager {\n\tprivate journal: RunJournal;\n\tprivate runsDir: string;\n\tprivate createSession: WorkflowRuntimeOptions[\"createSession\"];\n\tprivate limits: WorkflowRuntimeOptions[\"limits\"];\n\tprivate onEvent?: WorkflowManagerOptions[\"onEvent\"];\n\tprivate confirm?: WorkflowRuntimeOptions[\"confirm\"];\n\tprivate abortControllers = new Map<string, AbortController>();\n\n\tconstructor(options: WorkflowManagerOptions) {\n\t\tthis.journal = new RunJournal({ runsDir: options.runsDir });\n\t\tthis.runsDir = options.runsDir;\n\t\tthis.createSession = options.createSession;\n\t\tthis.limits = options.limits;\n\t\tthis.onEvent = options.onEvent;\n\t\tthis.confirm = options.confirm;\n\t}\n\n\tget runJournal(): RunJournal {\n\t\treturn this.journal;\n\t}\n\n\tasync list(): Promise<\n\t\tArray<{ runId: string; name: string; status: PersistedRunState[\"status\"]; updatedAt: string }>\n\t> {\n\t\treturn this.journal.list();\n\t}\n\n\tasync state(runId: string): Promise<PersistedRunState | null> {\n\t\treturn this.journal.load(runId);\n\t}\n\n\t/**\n\t * Desatasca los runs que murieron con su proceso.\n\t *\n\t * `execute` siempre persiste `status: \"running\"` y nadie escaneaba `runsDir`\n\t * al arrancar, así que un Ctrl-C durante una sub-tarea dejaba el run en\n\t * `running` para siempre. Y `GoalEngine.tick` se niega a avanzar mientras\n\t * haya una task en `running` → el goal quedaba atascado sin salida.\n\t *\n\t * Marca esos runs como `aborted` y emite `workflow_run_finished(ok:false)`,\n\t * con lo que `onWorkflowFinished` libera la sub-tarea por el camino que ya\n\t * existe (y que ahora además auto-continúa).\n\t *\n\t * Deliberadamente NO reanuda el run desde el journal: eso exige confiar en el\n\t * hash de identidad y es otro item. Aquí solo hay que liberar el goal.\n\t *\n\t * ponytail: la propiedad del run se decide por antigüedad de `updatedAt`\n\t * porque no hay leases de sesión. Si algún día dos procesos comparten\n\t * `runsDir`, esto necesita un lease de verdad.\n\t */\n\tasync reconcile(options: { staleAfterMs?: number } = {}): Promise<string[]> {\n\t\tconst staleAfterMs = options.staleAfterMs ?? 5 * 60 * 1000;\n\t\tconst now = Date.now();\n\t\tconst reclaimed: string[] = [];\n\t\tlet runs: Awaited<ReturnType<RunJournal[\"list\"]>>;\n\t\ttry {\n\t\t\truns = await this.journal.list();\n\t\t} catch {\n\t\t\treturn reclaimed; // sin runsDir todavía\n\t\t}\n\t\tconst error = \"interrumpido por reinicio del proceso\";\n\t\tfor (const entry of runs) {\n\t\t\tif (entry.status !== \"running\" && entry.status !== \"pending\") continue;\n\t\t\t// Un run vivo de ESTE proceso tiene su AbortController registrado.\n\t\t\tif (this.abortControllers.has(entry.runId)) continue;\n\t\t\tconst age = now - Date.parse(entry.updatedAt);\n\t\t\tif (Number.isNaN(age) || age < staleAfterMs) continue;\n\t\t\tconst state = await this.journal.load(entry.runId);\n\t\t\tif (!state) continue;\n\t\t\tconst aborted: PersistedRunState = {\n\t\t\t\t...state,\n\t\t\t\tstatus: \"aborted\",\n\t\t\t\terror,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\tawait this.journal.save(aborted);\n\t\t\tthis.onEvent?.(\"workflow_run_finished\", {\n\t\t\t\trunId: entry.runId,\n\t\t\t\tstatus: \"aborted\",\n\t\t\t\tagentCount: state.agentCount,\n\t\t\t\ttokens: state.tokenUsage.total,\n\t\t\t\tcost: state.tokenUsage.cost,\n\t\t\t\terror,\n\t\t\t});\n\t\t\treclaimed.push(entry.runId);\n\t\t}\n\t\treturn reclaimed;\n\t}\n\n\t/** Ejecuta un workflow. Si await=true (default), resuelve al terminar. */\n\tasync execute(script: string, options: ExecuteWorkflowOptions = {}): Promise<{ runId: string; result?: unknown }> {\n\t\tconst { meta, body: _body } = await import(\"./runtime.ts\").then((m) => m.parseWorkflowScript(script));\n\t\tconst runId = options.runId ?? `wf-${Date.now().toString(36)}`;\n\t\tconst controller = new AbortController();\n\t\tthis.abortControllers.set(runId, controller);\n\n\t\t// Resume: si nos dan un runId que ya existe, arrancamos DESDE su journal en\n\t\t// vez de escribir estado en blanco. Antes se sobrescribía siempre, así que\n\t\t// pasar un runId destruía el journal en lugar de reanudarlo.\n\t\tconst prior = options.runId ? await this.journal.load(options.runId) : null;\n\t\tconst priorJournal = prior?.journal ?? [];\n\t\tconst resumeJournal = new Map<string, { hash: string; result: unknown }>();\n\t\tfor (const entry of priorJournal) {\n\t\t\tresumeJournal.set(`${runId}:${entry.index}`, { hash: entry.hash, result: entry.result });\n\t\t}\n\n\t\tconst initialState: PersistedRunState = {\n\t\t\tversion: 1,\n\t\t\tphases: [],\n\t\t\trunId,\n\t\t\tname: meta.name,\n\t\t\tscript,\n\t\t\targs: options.args ?? {},\n\t\t\tmeta,\n\t\t\tstatus: \"running\",\n\t\t\tcurrentPhase: null,\n\t\t\tsessionId: options.sessionId,\n\t\t\tdisplayName: options.displayName,\n\t\t\tjournal: priorJournal,\n\t\t\tagentCount: prior?.agentCount ?? 0,\n\t\t\t// El presupuesto ya gastado no se pierde al reanudar.\n\t\t\ttokenUsage: prior?.tokenUsage ?? { input: 0, output: 0, total: 0, cost: 0, cacheRead: 0, cacheWrite: 0 },\n\t\t\tstartedAt: prior?.startedAt ?? new Date().toISOString(),\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t};\n\t\tawait this.journal.save(initialState);\n\t\tthis.onEvent?.(\"workflow_run_started\", {\n\t\t\trunId,\n\t\t\tname: meta.name,\n\t\t\tphases: (meta.phases ?? []).map((p) => p.title),\n\t\t});\n\n\t\tlet agentsDone = 0;\n\t\tlet agentsTotal = 0;\n\t\t// Agente en curso (para marcar blocked cuando espera confirm).\n\t\tlet currentAgent = { id: \"\", label: \"\" };\n\t\t// Estado vivo: se persiste en cada evento para que el panel del\n\t\t// desktop vea fases y agentes en tiempo real (polling de /api/engine).\n\t\tconst live: PersistedRunState = { ...initialState };\n\t\tconst liveAgents: NonNullable<PersistedRunState[\"agents\"]> = [];\n\t\t// Marcar/desmarcar blocked del agente en curso (P4).\n\t\tconst setAgentBlocked = (blocked: boolean, reason = \"\") => {\n\t\t\tif (!currentAgent.id) return;\n\t\t\tconst rec = liveAgents.find((a) => a.id === currentAgent.id);\n\t\t\tif (rec) {\n\t\t\t\trec.status = blocked ? \"blocked\" : \"running\";\n\t\t\t\trec.blockedReason = blocked ? reason : undefined;\n\t\t\t}\n\t\t\tvoid saveLive({ agents: [...liveAgents] });\n\t\t};\n\t\t// Saves serializados (cadena de promesas): preserva el orden y evita\n\t\t// que un snapshot viejo pise uno nuevo.\n\t\tlet saveChain: Promise<void> = Promise.resolve();\n\t\tconst saveLive = (patch: Partial<PersistedRunState>) => {\n\t\t\tObject.assign(live, patch, { updatedAt: new Date().toISOString() });\n\t\t\tsaveChain = saveChain\n\t\t\t\t.then(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.journal.save(live);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// best-effort: nunca rompe el run por un save\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\t\treturn saveChain;\n\t\t};\n\n\t\tconst runPromise = runWorkflow(script, {\n\t\t\tcwd: process.cwd(),\n\t\t\tagentDir: this.agentDirFromRunsDir(),\n\t\t\tcreateSession: this.createSession,\n\t\t\tlimits: this.limits,\n\t\t\tsignal: controller.signal,\n\t\t\tconfirm: async (prompt, checkpointOptions) => {\n\t\t\t\t// P4: mientras hay un checkpoint pendiente de input humano,\n\t\t\t\t// el agente en curso está BLOCKED (no procesando).\n\t\t\t\tconst wasBlocked = liveAgents.some((a) => a.status === \"blocked\");\n\t\t\t\tif (this.confirm) {\n\t\t\t\t\tsetAgentBlocked(true, String(prompt).slice(0, 120));\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn await this.confirm(prompt, checkpointOptions);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif (wasBlocked) setAgentBlocked(true);\n\t\t\t\t\t\telse setAgentBlocked(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Sin confirm del host: headless → abort (checkpoint no resuelto).\n\t\t\t\tif ((checkpointOptions as { headless?: string } | undefined)?.headless === \"abort\") {\n\t\t\t\t\tthrow new WorkflowError(\n\t\t\t\t\t\t\"WORKFLOW_ABORTED\",\n\t\t\t\t\t\t`checkpoint \"${prompt}\" needs human input but none is available`,\n\t\t\t\t\t\t{ recoverable: false },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn (checkpointOptions as { default?: unknown } | undefined)?.default ?? true;\n\t\t\t},\n\t\t\targs: options.args ?? {},\n\t\t\trunId,\n\t\t\tresumeJournal,\n\t\t\tonJournalEntry: (entry) => {\n\t\t\t\tlive.journal = [...live.journal.filter((e) => e.index !== entry.index), { ...entry, runId }];\n\t\t\t\tvoid saveLive({ journal: live.journal });\n\t\t\t},\n\t\t\tonPhase: (phase) => {\n\t\t\t\tlive.currentPhase = phase;\n\t\t\t\tif (!live.phases.includes(phase)) live.phases.push(phase);\n\t\t\t\tvoid saveLive({});\n\t\t\t\tthis.onEvent?.(\"workflow_phase\", { runId, phase });\n\t\t\t},\n\t\t\tonAgentStart: (_index, label, phase) => {\n\t\t\t\tagentsTotal++;\n\t\t\t\tcurrentAgent = { id: `${runId}:${_index}`, label };\n\t\t\t\tliveAgents.push({ id: `${runId}:${_index}`, label, phase, status: \"running\" });\n\t\t\t\tvoid saveLive({ agents: [...liveAgents] });\n\t\t\t\tthis.onEvent?.(\"workflow_agent\", { runId, agent: { id: `${runId}:${_index}`, label, phase } });\n\t\t\t},\n\t\t\tonAgentYield: (_index, label, hallazgo) => {\n\t\t\t\tthis.onEvent?.(\"workflow_agent_yield\", { runId, agent: { id: `${runId}:${_index}`, label }, hallazgo });\n\t\t\t},\n\t\t\tonAgentEnd: (_index, _label, _result) => {\n\t\t\t\tagentsDone++;\n\t\t\t\tcurrentAgent = { id: \"\", label: \"\" };\n\t\t\t\tconst rec = liveAgents.find((a) => a.id === `${runId}:${_index}`);\n\t\t\t\tif (rec) rec.status = \"done\";\n\t\t\t\tvoid saveLive({ agents: [...liveAgents] });\n\t\t\t\tthis.onEvent?.(\"workflow_run_update\", {\n\t\t\t\t\trunId,\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tagentsDone,\n\t\t\t\t\tagentsTotal,\n\t\t\t\t\ttokens: 0,\n\t\t\t\t\tcost: 0,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonTokenUsage: (usage) => {\n\t\t\t\tconst u = usage as { total?: number; cost?: number };\n\t\t\t\tvoid saveLive({\n\t\t\t\t\ttokenUsage: {\n\t\t\t\t\t\t...(live.tokenUsage ?? { input: 0, output: 0, total: 0, cost: 0, cacheRead: 0, cacheWrite: 0 }),\n\t\t\t\t\t\ttotal: u.total ?? live.tokenUsage.total,\n\t\t\t\t\t\tcost: u.cost ?? live.tokenUsage.cost,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tthis.onEvent?.(\"workflow_run_update\", {\n\t\t\t\t\trunId,\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tagentsDone,\n\t\t\t\t\tagentsTotal,\n\t\t\t\t\ttokens: u.total ?? 0,\n\t\t\t\t\tcost: u.cost ?? 0,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tconst settle = async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await runPromise;\n\t\t\t\t// Drenar saves en vivo ANTES del estado final: un saveLive tardío\n\t\t\t\t// no debe pisar el estado completed/failed.\n\t\t\t\tawait saveChain.catch(() => {});\n\t\t\t\tconst finalState: PersistedRunState = {\n\t\t\t\t\t...initialState,\n\t\t\t\t\t// live.journal, no initialState.journal: initialState se creó antes\n\t\t\t\t\t// de ejecutar y pisaría las entradas acumuladas del run.\n\t\t\t\t\tjournal: live.journal,\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\tphases: result.phases,\n\t\t\t\t\tcurrentPhase: null,\n\t\t\t\t\tagents: liveAgents.map((a) => ({ ...a, status: \"done\" as const })),\n\t\t\t\t\tagentCount: result.agentCount,\n\t\t\t\t\t// Acumulado, no sustituido: al reanudar los agentes salen de caché\n\t\t\t\t\t// y el run reporta 0, pero el presupuesto ya gastado sigue siendo\n\t\t\t\t\t// real. `initialState.tokenUsage` es el previo (ceros si no hay).\n\t\t\t\t\ttokenUsage: {\n\t\t\t\t\t\tinput: initialState.tokenUsage.input + result.tokenUsage.input,\n\t\t\t\t\t\toutput: initialState.tokenUsage.output + result.tokenUsage.output,\n\t\t\t\t\t\ttotal: initialState.tokenUsage.total + result.tokenUsage.total,\n\t\t\t\t\t\tcost: initialState.tokenUsage.cost + result.tokenUsage.cost,\n\t\t\t\t\t\tcacheRead: initialState.tokenUsage.cacheRead + (result.tokenUsage.cacheRead ?? 0),\n\t\t\t\t\t\tcacheWrite: initialState.tokenUsage.cacheWrite + (result.tokenUsage.cacheWrite ?? 0),\n\t\t\t\t\t},\n\t\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t\t};\n\t\t\t\tawait this.journal.save(finalState);\n\t\t\t\tthis.onEvent?.(\"workflow_run_finished\", {\n\t\t\t\t\trunId,\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\tagentCount: result.agentCount,\n\t\t\t\t\ttokens: result.tokenUsage.total,\n\t\t\t\t\tcost: result.tokenUsage.cost,\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\tconst status: PersistedRunState[\"status\"] =\n\t\t\t\t\t(error as WorkflowError)?.code === \"WORKFLOW_ABORTED\" ? \"aborted\" : \"failed\";\n\t\t\t\tconst finalState = {\n\t\t\t\t\t...initialState,\n\t\t\t\t\tjournal: live.journal,\n\t\t\t\t\tstatus,\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t\t};\n\t\t\t\tawait this.journal.save(finalState);\n\t\t\t\tthis.onEvent?.(\"workflow_run_finished\", {\n\t\t\t\t\trunId,\n\t\t\t\t\tstatus,\n\t\t\t\t\tagentCount: agentsDone,\n\t\t\t\t\ttokens: 0,\n\t\t\t\t\tcost: 0,\n\t\t\t\t\terror: finalState.error,\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tthis.abortControllers.delete(runId);\n\t\t\t}\n\t\t};\n\n\t\tif (options.await === false) {\n\t\t\t// El error ya se persiste en el estado; capturar evita unhandled.\n\t\t\tvoid settle().catch(() => {});\n\t\t\treturn { runId };\n\t\t}\n\t\tconst result = await settle();\n\t\treturn { runId, result: (result as { result?: unknown }).result };\n\t}\n\n\tabort(runId: string): boolean {\n\t\tconst controller = this.abortControllers.get(runId);\n\t\tif (!controller) return false;\n\t\tcontroller.abort();\n\t\treturn true;\n\t}\n\n\tprivate agentDirFromRunsDir(): string {\n\t\t// El agentDir es el padre de workflows/runs → workflows → agent.\n\t\t// OJO: preservar el / inicial (absoluto) — split+filter(Boolean) lo\n\t\t// elimina y producía una ruta RELATIVA → auth.json irresoluble.\n\t\tconst isAbsolute = this.runsDir.startsWith(\"/\");\n\t\tconst parts = this.runsDir.split(\"/\").filter(Boolean);\n\t\tconst parent = parts.slice(0, Math.max(0, parts.length - 2)).join(\"/\");\n\t\treturn isAbsolute ? `/${parent}` : parent;\n\t}\n}\n"]}
@@ -9,6 +9,7 @@
9
9
  * built-ins (su .constructor sería el host Function — bypass del guard).
10
10
  */
11
11
  import { agentIdentityHash, type CreateSubagentSession } from "./agent-runner.ts";
12
+ import type { HallazgoParcial } from "./contrato/yield.ts";
12
13
  import { type WorkflowErrorCode, type WorkflowLimits, type WorkflowMeta, type WorkflowRunResult } from "./types.ts";
13
14
  export interface WorkflowRuntimeOptions {
14
15
  cwd: string;
@@ -16,8 +17,20 @@ export interface WorkflowRuntimeOptions {
16
17
  createSession: CreateSubagentSession;
17
18
  limits?: Partial<WorkflowLimits>;
18
19
  resumeJournal?: Map<string, JournalEntryLike>;
20
+ /**
21
+ * Se llama tras cada agente ejecutado (no tras un hit de caché). Sin esto el
22
+ * journal nunca se rellenaba: la ruta de resume estaba escrita y testeada del
23
+ * lado consumidor, pero nadie producía las entradas.
24
+ */
25
+ onJournalEntry?: (entry: {
26
+ index: number;
27
+ hash: string;
28
+ result: unknown;
29
+ }) => void;
19
30
  onAgentStart?: (index: number, label: string, phase: string | undefined) => void;
20
31
  onAgentEnd?: (index: number, label: string, result: unknown, usage: unknown) => void;
32
+ /** Se llama EN CUANTO un subagente entrega un hallazgo con `yield` — antes de que termine (contrato/yield.ts). */
33
+ onAgentYield?: (index: number, label: string, hallazgo: HallazgoParcial) => void;
21
34
  onPhase?: (title: string) => void;
22
35
  onLog?: (message: string) => void;
23
36
  onTokenUsage?: (usage: unknown) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/workflows/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAe,iBAAiB,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/F,OAAO,EAIN,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,MAAM,YAAY,CAAC;AAUpB,MAAM,WAAW,sBAAsB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,qBAAqB,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC9C,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACjF,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACrF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,kDAAiD;AACjD,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAe5F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA8DxF;AAED,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC5C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,sBAAsB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAoO/B;AAED,kDAAkD;AAClD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,YAAY,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["/**\n * Workflow runtime — ejecuta scripts de workflow en un sandbox vm.\n *\n * El script es un módulo ESM con `export const meta = {...}` y el cuerpo\n * (async). El vm recibe SOLO la API del workflow (agent/parallel/pipeline/\n * store/phase/checkpoint/args/cwd/runId/log) — sin process/require/fs/fetch\n * (sandbox; la red solo via tools de agente). Determinismo: Math.random y\n * Date.now se neutralizan en el realm (resume estable). No se inyectan host\n * built-ins (su .constructor sería el host Function — bypass del guard).\n */\n\nimport vm from \"node:vm\";\nimport type { TSchema } from \"typebox\";\nimport { AgentRunner, agentIdentityHash, type CreateSubagentSession } from \"./agent-runner.ts\";\nimport { SharedStore } from \"./shared-store.ts\";\nimport {\n\tDEFAULT_WORKFLOW_LIMITS,\n\ttype WorkflowApi,\n\tWorkflowError,\n\ttype WorkflowErrorCode,\n\ttype WorkflowLimits,\n\ttype WorkflowMeta,\n\ttype WorkflowRunResult,\n} from \"./types.ts\";\n\nconst _DETERMINISM_PRELUDE = `\n Math.random = () => { throw new Error(\"Math.random is disabled for workflow determinism\"); };\n Date.now = () => { throw new Error(\"Date.now is disabled for workflow determinism\"); };\n (globalThis as any).__adaWorkflowTime = 0;\n`;\n\nconst HOST_BUILTIN_BLOCKLIST = /require\\s*\\(|process\\s*\\.|global\\s*\\.\\s*process|import\\s*\\(/;\n\nexport interface WorkflowRuntimeOptions {\n\tcwd: string;\n\tagentDir: string;\n\tcreateSession: CreateSubagentSession;\n\tlimits?: Partial<WorkflowLimits>;\n\tresumeJournal?: Map<string, JournalEntryLike>;\n\tonAgentStart?: (index: number, label: string, phase: string | undefined) => void;\n\tonAgentEnd?: (index: number, label: string, result: unknown, usage: unknown) => void;\n\tonPhase?: (title: string) => void;\n\tonLog?: (message: string) => void;\n\tonTokenUsage?: (usage: unknown) => void;\n\tconfirm?: (prompt: string, options: unknown) => Promise<unknown>;\n\targs?: Record<string, unknown>;\n\tsignal?: AbortSignal;\n\t/** runId fijo para resume (mismo run). Default: generado. */\n\trunId?: string;\n}\n\nexport interface JournalEntryLike {\n\thash: string;\n\tresult: unknown;\n\tstoreDelta?: Record<string, unknown>;\n}\n\n/** Limiter de concurrencia (semáforo simple). */\nexport function createLimiter(maxConcurrent: number): <T>(fn: () => Promise<T>) => Promise<T> {\n\tlet active = 0;\n\tconst queue: Array<() => void> = [];\n\treturn async <T>(fn: () => Promise<T>): Promise<T> => {\n\t\tif (active >= maxConcurrent) {\n\t\t\tawait new Promise<void>((resolve) => queue.push(resolve));\n\t\t}\n\t\tactive++;\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} finally {\n\t\t\tactive--;\n\t\t\tqueue.shift()?.();\n\t\t}\n\t};\n}\n\n/**\n * Extrae `export const meta = {...}` del script: devuelve { meta, body }.\n * Fallo con WORKFLOW_INVALID_SCRIPT si no hay meta o el JS no balancea.\n */\nexport function parseWorkflowScript(script: string): { meta: WorkflowMeta; body: string } {\n\tif (HOST_BUILTIN_BLOCKLIST.test(script)) {\n\t\tthrow new WorkflowError(\n\t\t\t\"WORKFLOW_INVALID_SCRIPT\",\n\t\t\t\"Script contains forbidden host access (require/process/import) — workflows run sandboxed\",\n\t\t\t{ recoverable: false },\n\t\t);\n\t}\n\tconst match = /export\\s+const\\s+meta\\s*=\\s*({)/m.exec(script);\n\tif (!match) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"Script must export `const meta = {...}`\", {\n\t\t\trecoverable: false,\n\t\t});\n\t}\n\t// Extraer el objeto JSON con llaves balanceadas (el regex no-greedy falla con objetos anidados).\n\tconst start = match.index + match[0].length - 1;\n\tlet depth = 0;\n\tlet end = -1;\n\tlet inString = false;\n\tlet escaped = false;\n\tfor (let i = start; i < script.length; i++) {\n\t\tconst ch = script[i];\n\t\tif (inString) {\n\t\t\tif (escaped) escaped = false;\n\t\t\telse if (ch === \"\\\\\") escaped = true;\n\t\t\telse if (ch === '\"') inString = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === '\"') inString = true;\n\t\telse if (ch === \"{\") depth++;\n\t\telse if (ch === \"}\") {\n\t\t\tdepth--;\n\t\t\tif (depth === 0) {\n\t\t\t\tend = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (end === -1) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"meta object is not closed\", { recoverable: false });\n\t}\n\tconst metaSource = script.slice(start, end + 1);\n\tlet meta: WorkflowMeta;\n\ttry {\n\t\tmeta = JSON.parse(metaSource) as WorkflowMeta;\n\t} catch {\n\t\tthrow new WorkflowError(\n\t\t\t\"WORKFLOW_INVALID_SCRIPT\",\n\t\t\t\"meta is not valid JSON — use plain JSON (no functions/comments)\",\n\t\t\t{\n\t\t\t\trecoverable: false,\n\t\t\t},\n\t\t);\n\t}\n\tif (!meta.name || !meta.description) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"meta requires name and description\", { recoverable: false });\n\t}\n\tconst body = script.slice(end + 1).trim();\n\tif (!body) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"Script has no body\", { recoverable: false });\n\t}\n\treturn { meta, body };\n}\n\nexport async function runWorkflow<T = unknown>(\n\tscript: string,\n\toptions: WorkflowRuntimeOptions,\n): Promise<WorkflowRunResult<T>> {\n\tconst limits: WorkflowLimits = { ...DEFAULT_WORKFLOW_LIMITS, ...options.limits };\n\tconst { meta, body } = parseWorkflowScript(script);\n\n\tconst runId = options.runId ?? `wf-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n\tconst store = new SharedStore();\n\tconst agentCounter = { count: 0 };\n\tconst limiter = createLimiter(limits.maxConcurrency);\n\tconst runner = new AgentRunner({\n\t\tagentDir: options.agentDir,\n\t\tcreateSession: options.createSession,\n\t\tlimiter,\n\t\tagentCounter,\n\t\tmaxAgents: limits.maxAgentsPerRun,\n\t\tretries: limits.maxRetries,\n\t\tagentTimeoutMs: limits.agentTimeoutMs,\n\t});\n\n\tconst logs: string[] = [];\n\tconst phases: string[] = [];\n\tlet callIndex = 0;\n\tconst tokenUsage = { input: 0, output: 0, total: 0, cost: 0, cacheRead: 0, cacheWrite: 0 };\n\tconst started = Date.now();\n\n\tconst log = (message: string) => {\n\t\tlogs.push(message);\n\t\toptions.onLog?.(message);\n\t};\n\n\tconst agent = async <_TSchemaDef extends TSchema | undefined = undefined>(\n\t\tagentOptions: Parameters<WorkflowApi[\"agent\"]>[0],\n\t) => {\n\t\tconst index = callIndex++;\n\t\toptions.onAgentStart?.(index, agentOptions.label ?? `agent-${index}`, agentOptions.phase);\n\n\t\tconst journalKey = `${runId}:${index}`;\n\t\tconst identityHash = agentIdentityHash({\n\t\t\tprompt: agentOptions.prompt,\n\t\t\tmodel: agentOptions.model,\n\t\t\ttier: agentOptions.tier,\n\t\t\tphase: agentOptions.phase,\n\t\t\tstableKey: agentOptions.stableKey,\n\t\t\tschema: agentOptions.schema,\n\t\t});\n\t\tconst cached = options.resumeJournal?.get(journalKey);\n\t\tif (cached && cached.hash === identityHash) {\n\t\t\tif (cached.storeDelta) store.applyDelta(cached.storeDelta);\n\t\t\toptions.onAgentEnd?.(index, agentOptions.label ?? `agent-${index}`, cached.result, { cached: true });\n\t\t\treturn cached.result;\n\t\t}\n\n\t\tconst result = await runner.run({\n\t\t\t...agentOptions,\n\t\t\t// Determinista: un resume reencuentra el mismo worktree.\n\t\t\tisolationKey: journalKey.replace(\":\", \"-\"),\n\t\t\tcwd: agentOptions.cwd ?? options.cwd,\n\t\t});\n\t\tif (result === null) return null;\n\n\t\ttokenUsage.input += result.usage.input;\n\t\ttokenUsage.output += result.usage.output;\n\t\ttokenUsage.total += result.usage.total;\n\t\ttokenUsage.cost += result.usage.cost;\n\t\ttokenUsage.cacheRead += result.usage.cacheRead ?? 0;\n\t\ttokenUsage.cacheWrite += result.usage.cacheWrite ?? 0;\n\n\t\toptions.onAgentEnd?.(index, agentOptions.label ?? `agent-${index}`, result.result, result.usage);\n\t\treturn result.result;\n\t};\n\n\tconst parallel = async <R>(fns: Array<() => Promise<R>>): Promise<Array<Awaited<R>>> => {\n\t\treturn Promise.all(fns.map((fn) => fn()));\n\t};\n\n\tconst pipeline = async <R>(fns: Array<(prev?: Awaited<R>) => Promise<R>>): Promise<Awaited<R>> => {\n\t\tlet prev: Awaited<R> | undefined;\n\t\tfor (const fn of fns) {\n\t\t\tprev = await fn(prev);\n\t\t}\n\t\treturn prev as Awaited<R>;\n\t};\n\n\tconst phase = (title: string, detail?: string) => {\n\t\tphases.push(title);\n\t\toptions.onPhase?.(title);\n\t\tif (detail) log(`phase ${title}: ${detail}`);\n\t};\n\n\tconst checkpoint = async <T>(\n\t\tpromptText: string,\n\t\tcheckpointOptions?: {\n\t\t\tdefault?: unknown;\n\t\t\theadless?: \"default\" | \"abort\";\n\t\t\tkind?: \"confirm\" | \"input\" | \"select\";\n\t\t\tchoices?: string[];\n\t\t},\n\t) => {\n\t\tif (options.confirm) {\n\t\t\treturn (await options.confirm(promptText, checkpointOptions)) as T;\n\t\t}\n\t\tif (checkpointOptions?.headless === \"abort\") {\n\t\t\tthrow new WorkflowError(\n\t\t\t\t\"WORKFLOW_ABORTED\",\n\t\t\t\t`checkpoint \"${promptText}\" needs human input but none is available`,\n\t\t\t\t{\n\t\t\t\t\trecoverable: false,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn (checkpointOptions?.default ?? true) as T;\n\t};\n\n\tconst api: WorkflowApi = {\n\t\tagent,\n\t\tparallel,\n\t\tpipeline,\n\t\tphase,\n\t\tstore: {\n\t\t\tput: (k, v) => store.put(k, v),\n\t\t\tget: <U>(k: string) => store.get<U>(k),\n\t\t\thas: (k) => store.has(k),\n\t\t\tdelete: (k) => store.delete(k),\n\t\t\tentries: () => store.entries(),\n\t\t},\n\t\tcheckpoint,\n\t\targs: options.args ?? {},\n\t\tcwd: options.cwd ?? process.cwd(),\n\t\trunId,\n\t\tlog,\n\t};\n\n\tconst context = vm.createContext({\n\t\t...api,\n\t\tObject,\n\t\tArray,\n\t\tJSON,\n\t\tMath: {\n\t\t\t...Math,\n\t\t\trandom: () => {\n\t\t\t\tthrow new Error(\"Math.random disabled\");\n\t\t\t},\n\t\t},\n\t\tDate: { ...Date, now: () => started },\n\t\tPromise,\n\t\tSet,\n\t\tMap,\n\t\tError,\n\t\tString,\n\t\tNumber,\n\t\tBoolean,\n\t\tconsole: {\n\t\t\tlog,\n\t\t\tinfo: log,\n\t\t\twarn: (m: unknown) => log(`[warn] ${String(m)}`),\n\t\t\terror: (m: unknown) => log(`[error] ${String(m)}`),\n\t\t},\n\t\t// Timers: necesarios para esperas cooperativas en scripts (no son acceso\n\t\t// a host — solo programan la cola del event loop).\n\t\tsetTimeout,\n\t\tclearTimeout,\n\t\tsetInterval,\n\t\tclearInterval,\n\t});\n\n\tconst wrapped = `(async () => {\\n${body}\\n})()`;\n\n\tconst scriptTimeout = new Promise<never>((_resolve, reject) => {\n\t\tsetTimeout(() => {\n\t\t\treject(\n\t\t\t\tnew WorkflowError(\"WORKFLOW_SCRIPT_TIMEOUT\", \"Workflow script exceeded its timeout\", {\n\t\t\t\t\trecoverable: false,\n\t\t\t\t}),\n\t\t\t);\n\t\t}, limits.scriptTimeoutMs);\n\t});\n\n\tlet aborted = false;\n\tif (options.signal?.aborted) {\n\t\taborted = true;\n\t} else if (options.signal) {\n\t\toptions.signal.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\taborted = true;\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t}\n\n\t// Notificador de abort: interrumpe el race (≤25ms). El interval se limpia\n\t// SIEMPRE en el finally, así ninguna promesa queda viva tras el run.\n\t// Abort mediante sentinel (nunca rechazo → nunca unhandled).\n\t// El interval se limpia SIEMPRE en el finally.\n\tconst ABORT_SENTINEL = Symbol(\"abort\");\n\tlet abortTimer: ReturnType<typeof setInterval> | undefined;\n\tconst abortNotifier = new Promise<unknown>((resolve) => {\n\t\tabortTimer = setInterval(() => {\n\t\t\tif (aborted) {\n\t\t\t\tclearInterval(abortTimer);\n\t\t\t\tresolve(ABORT_SENTINEL);\n\t\t\t}\n\t\t}, 25);\n\t});\n\n\ttry {\n\t\tconst result = await Promise.race([\n\t\t\tnew vm.Script(wrapped, { filename: `${meta.name || \"workflow\"}.js` }).runInContext(context),\n\t\t\tscriptTimeout,\n\t\t\tabortNotifier,\n\t\t]);\n\t\tif (result === ABORT_SENTINEL) {\n\t\t\tthrow new WorkflowError(\"WORKFLOW_ABORTED\", \"Workflow aborted\", { recoverable: false });\n\t\t}\n\n\t\toptions.onTokenUsage?.(tokenUsage);\n\t\treturn {\n\t\t\tmeta,\n\t\t\tresult: result as T,\n\t\t\tlogs,\n\t\t\tphases,\n\t\t\tagentCount: agentCounter.count,\n\t\t\tdurationMs: Date.now() - started,\n\t\t\trunId,\n\t\t\ttokenUsage,\n\t\t};\n\t} finally {\n\t\tif (abortTimer) clearInterval(abortTimer);\n\t}\n}\n\n/** Re-export del hash para journaling externo. */\nexport { agentIdentityHash };\nexport type { WorkflowErrorCode };\n"]}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/workflows/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EAAe,iBAAiB,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAIN,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,MAAM,YAAY,CAAC;AAUpB,MAAM,WAAW,sBAAsB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,qBAAqB,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC9C;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACjF,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACrF,oHAAkH;IAClH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IACjF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,kDAAiD;AACjD,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAe5F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAuFxF;AAED,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC5C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,sBAAsB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CA4R/B;AAED,kDAAkD;AAClD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,YAAY,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["/**\n * Workflow runtime — ejecuta scripts de workflow en un sandbox vm.\n *\n * El script es un módulo ESM con `export const meta = {...}` y el cuerpo\n * (async). El vm recibe SOLO la API del workflow (agent/parallel/pipeline/\n * store/phase/checkpoint/args/cwd/runId/log) — sin process/require/fs/fetch\n * (sandbox; la red solo via tools de agente). Determinismo: Math.random y\n * Date.now se neutralizan en el realm (resume estable). No se inyectan host\n * built-ins (su .constructor sería el host Function — bypass del guard).\n */\n\nimport vm from \"node:vm\";\nimport type { TSchema } from \"typebox\";\nimport { CONFIG_DIR_NAME } from \"../../config.ts\";\nimport { aOpcionesDeAgente, cargarAgentes } from \"../agents/loader.ts\";\nimport { hasTrustRequiringProjectResources, ProjectTrustStore } from \"../trust-manager.ts\";\nimport { AgentRunner, agentIdentityHash, type CreateSubagentSession } from \"./agent-runner.ts\";\nimport type { HallazgoParcial } from \"./contrato/yield.ts\";\nimport { SharedStore } from \"./shared-store.ts\";\nimport {\n\tDEFAULT_WORKFLOW_LIMITS,\n\ttype WorkflowApi,\n\tWorkflowError,\n\ttype WorkflowErrorCode,\n\ttype WorkflowLimits,\n\ttype WorkflowMeta,\n\ttype WorkflowRunResult,\n} from \"./types.ts\";\n\nconst _DETERMINISM_PRELUDE = `\n Math.random = () => { throw new Error(\"Math.random is disabled for workflow determinism\"); };\n Date.now = () => { throw new Error(\"Date.now is disabled for workflow determinism\"); };\n (globalThis as any).__adaWorkflowTime = 0;\n`;\n\nconst HOST_BUILTIN_BLOCKLIST = /require\\s*\\(|process\\s*\\.|global\\s*\\.\\s*process|import\\s*\\(/;\n\nexport interface WorkflowRuntimeOptions {\n\tcwd: string;\n\tagentDir: string;\n\tcreateSession: CreateSubagentSession;\n\tlimits?: Partial<WorkflowLimits>;\n\tresumeJournal?: Map<string, JournalEntryLike>;\n\t/**\n\t * Se llama tras cada agente ejecutado (no tras un hit de caché). Sin esto el\n\t * journal nunca se rellenaba: la ruta de resume estaba escrita y testeada del\n\t * lado consumidor, pero nadie producía las entradas.\n\t */\n\tonJournalEntry?: (entry: { index: number; hash: string; result: unknown }) => void;\n\tonAgentStart?: (index: number, label: string, phase: string | undefined) => void;\n\tonAgentEnd?: (index: number, label: string, result: unknown, usage: unknown) => void;\n\t/** Se llama EN CUANTO un subagente entrega un hallazgo con `yield` — antes de que termine (contrato/yield.ts). */\n\tonAgentYield?: (index: number, label: string, hallazgo: HallazgoParcial) => void;\n\tonPhase?: (title: string) => void;\n\tonLog?: (message: string) => void;\n\tonTokenUsage?: (usage: unknown) => void;\n\tconfirm?: (prompt: string, options: unknown) => Promise<unknown>;\n\targs?: Record<string, unknown>;\n\tsignal?: AbortSignal;\n\t/** runId fijo para resume (mismo run). Default: generado. */\n\trunId?: string;\n}\n\nexport interface JournalEntryLike {\n\thash: string;\n\tresult: unknown;\n\tstoreDelta?: Record<string, unknown>;\n}\n\n/** Limiter de concurrencia (semáforo simple). */\nexport function createLimiter(maxConcurrent: number): <T>(fn: () => Promise<T>) => Promise<T> {\n\tlet active = 0;\n\tconst queue: Array<() => void> = [];\n\treturn async <T>(fn: () => Promise<T>): Promise<T> => {\n\t\tif (active >= maxConcurrent) {\n\t\t\tawait new Promise<void>((resolve) => queue.push(resolve));\n\t\t}\n\t\tactive++;\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} finally {\n\t\t\tactive--;\n\t\t\tqueue.shift()?.();\n\t\t}\n\t};\n}\n\n/**\n * Extrae `export const meta = {...}` del script: devuelve { meta, body }.\n * Fallo con WORKFLOW_INVALID_SCRIPT si no hay meta o el JS no balancea.\n */\nexport function parseWorkflowScript(script: string): { meta: WorkflowMeta; body: string } {\n\t// ESTO NO ES UNA FRONTERA DE SEGURIDAD, y decir lo contrario nos costaría la\n\t// credibilidad delante de un evaluador.\n\t//\n\t// La lista negra es una expresión regular sobre el TEXTO del guion, así que\n\t// solo para al que escribe `process.` o `require(` literalmente. El escape\n\t// clásico de `node:vm` por la cadena de constructores la atraviesa entera.\n\t// Medido ejecutándolo:\n\t//\n\t// const real = this.constructor.constructor(\"return process\")();\n\t// → {\"pid\":80212,\"envs\":67,\"cwd\":\"/Users/…/packages/coding-agent\"}\n\t//\n\t// El propio Node lo dice en su documentación: «The node:vm module is not a\n\t// security mechanism. Do not use it to run untrusted code.»\n\t//\n\t// Lo que SÍ hace esto, y es lo único que se puede prometer: atrapar el acceso\n\t// ingenuo al host —el guion que un modelo escribe sin mala intención porque\n\t// está acostumbrado a Node— y convertirlo en un error legible en vez de en un\n\t// comportamiento raro. Para código de orquestación NO CONFIABLE la respuesta\n\t// es un contenedor, no esto.\n\t//\n\t// La guarda de este límite está en `test/workflows-sandbox-limite.test.ts`: si\n\t// alguien sustituye `node:vm` por un aislador de verdad, esa prueba se pondrá\n\t// roja y habrá que reescribir esta advertencia. Es el orden correcto.\n\tif (HOST_BUILTIN_BLOCKLIST.test(script)) {\n\t\tthrow new WorkflowError(\n\t\t\t\"WORKFLOW_INVALID_SCRIPT\",\n\t\t\t\"El guion usa require/process/import, que no están disponibles en el intérprete de workflows. \" +\n\t\t\t\t\"Usa los enlaces del guion (agent, parallel, pipeline, log). Aviso: este filtro atrapa el acceso \" +\n\t\t\t\t\"ingenuo al host, NO es un aislamiento de seguridad — para código no confiable, contenedor.\",\n\t\t\t{ recoverable: false },\n\t\t);\n\t}\n\tconst match = /export\\s+const\\s+meta\\s*=\\s*({)/m.exec(script);\n\tif (!match) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"Script must export `const meta = {...}`\", {\n\t\t\trecoverable: false,\n\t\t});\n\t}\n\t// Extraer el objeto JSON con llaves balanceadas (el regex no-greedy falla con objetos anidados).\n\tconst start = match.index + match[0].length - 1;\n\tlet depth = 0;\n\tlet end = -1;\n\tlet inString = false;\n\tlet escaped = false;\n\tfor (let i = start; i < script.length; i++) {\n\t\tconst ch = script[i];\n\t\tif (inString) {\n\t\t\tif (escaped) escaped = false;\n\t\t\telse if (ch === \"\\\\\") escaped = true;\n\t\t\telse if (ch === '\"') inString = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === '\"') inString = true;\n\t\telse if (ch === \"{\") depth++;\n\t\telse if (ch === \"}\") {\n\t\t\tdepth--;\n\t\t\tif (depth === 0) {\n\t\t\t\tend = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (end === -1) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"meta object is not closed\", { recoverable: false });\n\t}\n\tconst metaSource = script.slice(start, end + 1);\n\tlet meta: WorkflowMeta;\n\ttry {\n\t\tmeta = JSON.parse(metaSource) as WorkflowMeta;\n\t} catch {\n\t\tthrow new WorkflowError(\n\t\t\t\"WORKFLOW_INVALID_SCRIPT\",\n\t\t\t\"meta is not valid JSON — use plain JSON (no functions/comments)\",\n\t\t\t{\n\t\t\t\trecoverable: false,\n\t\t\t},\n\t\t);\n\t}\n\tif (!meta.name || !meta.description) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"meta requires name and description\", { recoverable: false });\n\t}\n\tconst body = script.slice(end + 1).trim();\n\tif (!body) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"Script has no body\", { recoverable: false });\n\t}\n\treturn { meta, body };\n}\n\nexport async function runWorkflow<T = unknown>(\n\tscript: string,\n\toptions: WorkflowRuntimeOptions,\n): Promise<WorkflowRunResult<T>> {\n\tconst limits: WorkflowLimits = { ...DEFAULT_WORKFLOW_LIMITS, ...options.limits };\n\tconst { meta, body } = parseWorkflowScript(script);\n\n\tconst runId = options.runId ?? `wf-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n\tconst store = new SharedStore();\n\tconst agentCounter = { count: 0 };\n\tconst limiter = createLimiter(limits.maxConcurrency);\n\tconst runner = new AgentRunner({\n\t\tagentDir: options.agentDir,\n\t\tcreateSession: options.createSession,\n\t\tlimiter,\n\t\tagentCounter,\n\t\tmaxAgents: limits.maxAgentsPerRun,\n\t\tretries: limits.maxRetries,\n\t\tagentTimeoutMs: limits.agentTimeoutMs,\n\t});\n\n\tconst logs: string[] = [];\n\tconst phases: string[] = [];\n\tlet callIndex = 0;\n\tconst tokenUsage = { input: 0, output: 0, total: 0, cost: 0, cacheRead: 0, cacheWrite: 0 };\n\tconst started = Date.now();\n\n\tconst log = (message: string) => {\n\t\tlogs.push(message);\n\t\toptions.onLog?.(message);\n\t};\n\n\t// Se cargan una vez por run y se memoriza: un workflow con cien agentes no\n\t// puede leer el disco cien veces.\n\tlet agentesDefinidos: ReturnType<typeof cargarAgentes>[\"agentes\"] | null = null;\n\tconst resolverAgentesDefinidos = () => {\n\t\tif (agentesDefinidos) return agentesDefinidos;\n\t\t// Los de proyecto solo cuentan si el proyecto es de confianza: vienen del\n\t\t// repositorio, igual que una extensión.\n\t\tconst requiere = hasTrustRequiringProjectResources(options.cwd);\n\t\tconst carga = cargarAgentes({\n\t\t\tagentDir: options.agentDir,\n\t\t\tcwd: options.cwd,\n\t\t\tproyectoDeConfianza: !requiere || new ProjectTrustStore(options.agentDir).get(options.cwd) === true,\n\t\t\tconfigDirName: CONFIG_DIR_NAME,\n\t\t});\n\t\tfor (const problema of carga.problemas) {\n\t\t\toptions.onLog?.(`[agents] ${problema.ruta}: ${problema.motivo}`);\n\t\t}\n\t\tif (carga.bloqueadosSinConfianza > 0) {\n\t\t\toptions.onLog?.(\n\t\t\t\t`[agents] ${carga.bloqueadosSinConfianza} agente(s) del proyecto ignorados: el proyecto no es de confianza`,\n\t\t\t);\n\t\t}\n\t\tagentesDefinidos = carga.agentes;\n\t\treturn agentesDefinidos;\n\t};\n\n\tconst agent = async <_TSchemaDef extends TSchema | undefined = undefined>(\n\t\tagentOptions: Parameters<WorkflowApi[\"agent\"]>[0],\n\t) => {\n\t\tconst index = callIndex++;\n\t\toptions.onAgentStart?.(index, agentOptions.label ?? `agent-${index}`, agentOptions.phase);\n\n\t\t// Agentes definidos por el usuario en Markdown. Sus ajustes son la BASE:\n\t\t// lo que el script pase explícitamente gana, para que un workflow pueda\n\t\t// ajustar un agente prestado sin tener que copiarlo entero.\n\t\tif (agentOptions.agentType) {\n\t\t\tconst disponibles = resolverAgentesDefinidos();\n\t\t\tconst definido = disponibles.find((a) => a.nombre === agentOptions.agentType);\n\t\t\tif (!definido) {\n\t\t\t\t// Ignorarlo en silencio dejaría al workflow corriendo con un agente\n\t\t\t\t// genérico creyendo que usa el suyo.\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`agentType '${agentOptions.agentType}' no existe. Disponibles: ${disponibles.map((a) => a.nombre).join(\", \") || \"(ninguno)\"}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tagentOptions = { ...aOpcionesDeAgente(definido), ...agentOptions };\n\t\t}\n\n\t\tconst journalKey = `${runId}:${index}`;\n\t\tconst identityHash = agentIdentityHash({\n\t\t\tprompt: agentOptions.prompt,\n\t\t\tmodel: agentOptions.model,\n\t\t\ttier: agentOptions.tier,\n\t\t\tphase: agentOptions.phase,\n\t\t\tstableKey: agentOptions.stableKey,\n\t\t\tschema: agentOptions.schema,\n\t\t});\n\t\tconst cached = options.resumeJournal?.get(journalKey);\n\t\tif (cached && cached.hash === identityHash) {\n\t\t\tif (cached.storeDelta) store.applyDelta(cached.storeDelta);\n\t\t\toptions.onAgentEnd?.(index, agentOptions.label ?? `agent-${index}`, cached.result, { cached: true });\n\t\t\treturn cached.result;\n\t\t}\n\n\t\tconst label = agentOptions.label ?? `agent-${index}`;\n\t\tconst onYieldDelScript = agentOptions.onYield;\n\t\tconst result = await runner.run({\n\t\t\t...agentOptions,\n\t\t\t// Combina el onYield del propio script (si lo puso) con el del host: los\n\t\t\t// dos quieren enterarse del mismo hallazgo, en el mismo instante.\n\t\t\tonYield: (hallazgo) => {\n\t\t\t\toptions.onAgentYield?.(index, label, hallazgo);\n\t\t\t\tonYieldDelScript?.(hallazgo);\n\t\t\t},\n\t\t\t// Determinista: un resume reencuentra el mismo worktree.\n\t\t\tisolationKey: journalKey.replace(\":\", \"-\"),\n\t\t\tcwd: agentOptions.cwd ?? options.cwd,\n\t\t});\n\t\tif (result === null) return null;\n\n\t\ttokenUsage.input += result.usage.input;\n\t\ttokenUsage.output += result.usage.output;\n\t\ttokenUsage.total += result.usage.total;\n\t\ttokenUsage.cost += result.usage.cost;\n\t\ttokenUsage.cacheRead += result.usage.cacheRead ?? 0;\n\t\ttokenUsage.cacheWrite += result.usage.cacheWrite ?? 0;\n\n\t\t// Journal para el resume: identidad + resultado del agente. NO se guarda\n\t\t// storeDelta a propósito — en este DSL el store lo escribe el SCRIPT, no\n\t\t// los agentes, y al reanudar el script se re-ejecuta entero (con\n\t\t// Math.random/Date.now deshabilitados para que sea determinista), así que\n\t\t// el store se reconstruye solo. Guardar deltas sería estado duplicado.\n\t\toptions.onJournalEntry?.({ index, hash: identityHash, result: result.result });\n\t\toptions.onAgentEnd?.(index, agentOptions.label ?? `agent-${index}`, result.result, result.usage);\n\t\treturn result.result;\n\t};\n\n\tconst parallel = async <R>(fns: Array<() => Promise<R>>): Promise<Array<Awaited<R>>> => {\n\t\treturn Promise.all(fns.map((fn) => fn()));\n\t};\n\n\tconst pipeline = async <R>(fns: Array<(prev?: Awaited<R>) => Promise<R>>): Promise<Awaited<R>> => {\n\t\tlet prev: Awaited<R> | undefined;\n\t\tfor (const fn of fns) {\n\t\t\tprev = await fn(prev);\n\t\t}\n\t\treturn prev as Awaited<R>;\n\t};\n\n\tconst phase = (title: string, detail?: string) => {\n\t\tphases.push(title);\n\t\toptions.onPhase?.(title);\n\t\tif (detail) log(`phase ${title}: ${detail}`);\n\t};\n\n\tconst checkpoint = async <T>(\n\t\tpromptText: string,\n\t\tcheckpointOptions?: {\n\t\t\tdefault?: unknown;\n\t\t\theadless?: \"default\" | \"abort\";\n\t\t\tkind?: \"confirm\" | \"input\" | \"select\";\n\t\t\tchoices?: string[];\n\t\t},\n\t) => {\n\t\tif (options.confirm) {\n\t\t\treturn (await options.confirm(promptText, checkpointOptions)) as T;\n\t\t}\n\t\tif (checkpointOptions?.headless === \"abort\") {\n\t\t\tthrow new WorkflowError(\n\t\t\t\t\"WORKFLOW_ABORTED\",\n\t\t\t\t`checkpoint \"${promptText}\" needs human input but none is available`,\n\t\t\t\t{\n\t\t\t\t\trecoverable: false,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn (checkpointOptions?.default ?? true) as T;\n\t};\n\n\tconst api: WorkflowApi = {\n\t\tagent,\n\t\tparallel,\n\t\tpipeline,\n\t\tphase,\n\t\tstore: {\n\t\t\tput: (k, v) => store.put(k, v),\n\t\t\tget: <U>(k: string) => store.get<U>(k),\n\t\t\thas: (k) => store.has(k),\n\t\t\tdelete: (k) => store.delete(k),\n\t\t\tentries: () => store.entries(),\n\t\t},\n\t\tcheckpoint,\n\t\targs: options.args ?? {},\n\t\tcwd: options.cwd ?? process.cwd(),\n\t\trunId,\n\t\tlog,\n\t};\n\n\tconst context = vm.createContext({\n\t\t...api,\n\t\tObject,\n\t\tArray,\n\t\tJSON,\n\t\tMath: {\n\t\t\t...Math,\n\t\t\trandom: () => {\n\t\t\t\tthrow new Error(\"Math.random disabled\");\n\t\t\t},\n\t\t},\n\t\tDate: { ...Date, now: () => started },\n\t\tPromise,\n\t\tSet,\n\t\tMap,\n\t\tError,\n\t\tString,\n\t\tNumber,\n\t\tBoolean,\n\t\tconsole: {\n\t\t\tlog,\n\t\t\tinfo: log,\n\t\t\twarn: (m: unknown) => log(`[warn] ${String(m)}`),\n\t\t\terror: (m: unknown) => log(`[error] ${String(m)}`),\n\t\t},\n\t\t// Timers: necesarios para esperas cooperativas en scripts (no son acceso\n\t\t// a host — solo programan la cola del event loop).\n\t\tsetTimeout,\n\t\tclearTimeout,\n\t\tsetInterval,\n\t\tclearInterval,\n\t});\n\n\tconst wrapped = `(async () => {\\n${body}\\n})()`;\n\n\tconst scriptTimeout = new Promise<never>((_resolve, reject) => {\n\t\tsetTimeout(() => {\n\t\t\treject(\n\t\t\t\tnew WorkflowError(\"WORKFLOW_SCRIPT_TIMEOUT\", \"Workflow script exceeded its timeout\", {\n\t\t\t\t\trecoverable: false,\n\t\t\t\t}),\n\t\t\t);\n\t\t}, limits.scriptTimeoutMs);\n\t});\n\n\tlet aborted = false;\n\tif (options.signal?.aborted) {\n\t\taborted = true;\n\t} else if (options.signal) {\n\t\toptions.signal.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\taborted = true;\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t}\n\n\t// Notificador de abort: interrumpe el race (≤25ms). El interval se limpia\n\t// SIEMPRE en el finally, así ninguna promesa queda viva tras el run.\n\t// Abort mediante sentinel (nunca rechazo → nunca unhandled).\n\t// El interval se limpia SIEMPRE en el finally.\n\tconst ABORT_SENTINEL = Symbol(\"abort\");\n\tlet abortTimer: ReturnType<typeof setInterval> | undefined;\n\tconst abortNotifier = new Promise<unknown>((resolve) => {\n\t\tabortTimer = setInterval(() => {\n\t\t\tif (aborted) {\n\t\t\t\tclearInterval(abortTimer);\n\t\t\t\tresolve(ABORT_SENTINEL);\n\t\t\t}\n\t\t}, 25);\n\t});\n\n\ttry {\n\t\tconst result = await Promise.race([\n\t\t\tnew vm.Script(wrapped, { filename: `${meta.name || \"workflow\"}.js` }).runInContext(context),\n\t\t\tscriptTimeout,\n\t\t\tabortNotifier,\n\t\t]);\n\t\tif (result === ABORT_SENTINEL) {\n\t\t\tthrow new WorkflowError(\"WORKFLOW_ABORTED\", \"Workflow aborted\", { recoverable: false });\n\t\t}\n\n\t\toptions.onTokenUsage?.(tokenUsage);\n\t\treturn {\n\t\t\tmeta,\n\t\t\tresult: result as T,\n\t\t\tlogs,\n\t\t\tphases,\n\t\t\tagentCount: agentCounter.count,\n\t\t\tdurationMs: Date.now() - started,\n\t\t\trunId,\n\t\t\ttokenUsage,\n\t\t};\n\t} finally {\n\t\tif (abortTimer) clearInterval(abortTimer);\n\t}\n}\n\n/** Re-export del hash para journaling externo. */\nexport { agentIdentityHash };\nexport type { WorkflowErrorCode };\n"]}
@@ -9,6 +9,9 @@
9
9
  * built-ins (su .constructor sería el host Function — bypass del guard).
10
10
  */
11
11
  import vm from "node:vm";
12
+ import { CONFIG_DIR_NAME } from "../../config.js";
13
+ import { aOpcionesDeAgente, cargarAgentes } from "../agents/loader.js";
14
+ import { hasTrustRequiringProjectResources, ProjectTrustStore } from "../trust-manager.js";
12
15
  import { AgentRunner, agentIdentityHash } from "./agent-runner.js";
13
16
  import { SharedStore } from "./shared-store.js";
14
17
  import { DEFAULT_WORKFLOW_LIMITS, WorkflowError, } from "./types.js";
@@ -41,8 +44,33 @@ export function createLimiter(maxConcurrent) {
41
44
  * Fallo con WORKFLOW_INVALID_SCRIPT si no hay meta o el JS no balancea.
42
45
  */
43
46
  export function parseWorkflowScript(script) {
47
+ // ESTO NO ES UNA FRONTERA DE SEGURIDAD, y decir lo contrario nos costaría la
48
+ // credibilidad delante de un evaluador.
49
+ //
50
+ // La lista negra es una expresión regular sobre el TEXTO del guion, así que
51
+ // solo para al que escribe `process.` o `require(` literalmente. El escape
52
+ // clásico de `node:vm` por la cadena de constructores la atraviesa entera.
53
+ // Medido ejecutándolo:
54
+ //
55
+ // const real = this.constructor.constructor("return process")();
56
+ // → {"pid":80212,"envs":67,"cwd":"/Users/…/packages/coding-agent"}
57
+ //
58
+ // El propio Node lo dice en su documentación: «The node:vm module is not a
59
+ // security mechanism. Do not use it to run untrusted code.»
60
+ //
61
+ // Lo que SÍ hace esto, y es lo único que se puede prometer: atrapar el acceso
62
+ // ingenuo al host —el guion que un modelo escribe sin mala intención porque
63
+ // está acostumbrado a Node— y convertirlo en un error legible en vez de en un
64
+ // comportamiento raro. Para código de orquestación NO CONFIABLE la respuesta
65
+ // es un contenedor, no esto.
66
+ //
67
+ // La guarda de este límite está en `test/workflows-sandbox-limite.test.ts`: si
68
+ // alguien sustituye `node:vm` por un aislador de verdad, esa prueba se pondrá
69
+ // roja y habrá que reescribir esta advertencia. Es el orden correcto.
44
70
  if (HOST_BUILTIN_BLOCKLIST.test(script)) {
45
- throw new WorkflowError("WORKFLOW_INVALID_SCRIPT", "Script contains forbidden host access (require/process/import) workflows run sandboxed", { recoverable: false });
71
+ throw new WorkflowError("WORKFLOW_INVALID_SCRIPT", "El guion usa require/process/import, que no están disponibles en el intérprete de workflows. " +
72
+ "Usa los enlaces del guion (agent, parallel, pipeline, log). Aviso: este filtro atrapa el acceso " +
73
+ "ingenuo al host, NO es un aislamiento de seguridad — para código no confiable, contenedor.", { recoverable: false });
46
74
  }
47
75
  const match = /export\s+const\s+meta\s*=\s*({)/m.exec(script);
48
76
  if (!match) {
@@ -126,9 +154,46 @@ export async function runWorkflow(script, options) {
126
154
  logs.push(message);
127
155
  options.onLog?.(message);
128
156
  };
157
+ // Se cargan una vez por run y se memoriza: un workflow con cien agentes no
158
+ // puede leer el disco cien veces.
159
+ let agentesDefinidos = null;
160
+ const resolverAgentesDefinidos = () => {
161
+ if (agentesDefinidos)
162
+ return agentesDefinidos;
163
+ // Los de proyecto solo cuentan si el proyecto es de confianza: vienen del
164
+ // repositorio, igual que una extensión.
165
+ const requiere = hasTrustRequiringProjectResources(options.cwd);
166
+ const carga = cargarAgentes({
167
+ agentDir: options.agentDir,
168
+ cwd: options.cwd,
169
+ proyectoDeConfianza: !requiere || new ProjectTrustStore(options.agentDir).get(options.cwd) === true,
170
+ configDirName: CONFIG_DIR_NAME,
171
+ });
172
+ for (const problema of carga.problemas) {
173
+ options.onLog?.(`[agents] ${problema.ruta}: ${problema.motivo}`);
174
+ }
175
+ if (carga.bloqueadosSinConfianza > 0) {
176
+ options.onLog?.(`[agents] ${carga.bloqueadosSinConfianza} agente(s) del proyecto ignorados: el proyecto no es de confianza`);
177
+ }
178
+ agentesDefinidos = carga.agentes;
179
+ return agentesDefinidos;
180
+ };
129
181
  const agent = async (agentOptions) => {
130
182
  const index = callIndex++;
131
183
  options.onAgentStart?.(index, agentOptions.label ?? `agent-${index}`, agentOptions.phase);
184
+ // Agentes definidos por el usuario en Markdown. Sus ajustes son la BASE:
185
+ // lo que el script pase explícitamente gana, para que un workflow pueda
186
+ // ajustar un agente prestado sin tener que copiarlo entero.
187
+ if (agentOptions.agentType) {
188
+ const disponibles = resolverAgentesDefinidos();
189
+ const definido = disponibles.find((a) => a.nombre === agentOptions.agentType);
190
+ if (!definido) {
191
+ // Ignorarlo en silencio dejaría al workflow corriendo con un agente
192
+ // genérico creyendo que usa el suyo.
193
+ throw new Error(`agentType '${agentOptions.agentType}' no existe. Disponibles: ${disponibles.map((a) => a.nombre).join(", ") || "(ninguno)"}`);
194
+ }
195
+ agentOptions = { ...aOpcionesDeAgente(definido), ...agentOptions };
196
+ }
132
197
  const journalKey = `${runId}:${index}`;
133
198
  const identityHash = agentIdentityHash({
134
199
  prompt: agentOptions.prompt,
@@ -145,8 +210,16 @@ export async function runWorkflow(script, options) {
145
210
  options.onAgentEnd?.(index, agentOptions.label ?? `agent-${index}`, cached.result, { cached: true });
146
211
  return cached.result;
147
212
  }
213
+ const label = agentOptions.label ?? `agent-${index}`;
214
+ const onYieldDelScript = agentOptions.onYield;
148
215
  const result = await runner.run({
149
216
  ...agentOptions,
217
+ // Combina el onYield del propio script (si lo puso) con el del host: los
218
+ // dos quieren enterarse del mismo hallazgo, en el mismo instante.
219
+ onYield: (hallazgo) => {
220
+ options.onAgentYield?.(index, label, hallazgo);
221
+ onYieldDelScript?.(hallazgo);
222
+ },
150
223
  // Determinista: un resume reencuentra el mismo worktree.
151
224
  isolationKey: journalKey.replace(":", "-"),
152
225
  cwd: agentOptions.cwd ?? options.cwd,
@@ -159,6 +232,12 @@ export async function runWorkflow(script, options) {
159
232
  tokenUsage.cost += result.usage.cost;
160
233
  tokenUsage.cacheRead += result.usage.cacheRead ?? 0;
161
234
  tokenUsage.cacheWrite += result.usage.cacheWrite ?? 0;
235
+ // Journal para el resume: identidad + resultado del agente. NO se guarda
236
+ // storeDelta a propósito — en este DSL el store lo escribe el SCRIPT, no
237
+ // los agentes, y al reanudar el script se re-ejecuta entero (con
238
+ // Math.random/Date.now deshabilitados para que sea determinista), así que
239
+ // el store se reconstruye solo. Guardar deltas sería estado duplicado.
240
+ options.onJournalEntry?.({ index, hash: identityHash, result: result.result });
162
241
  options.onAgentEnd?.(index, agentOptions.label ?? `agent-${index}`, result.result, result.usage);
163
242
  return result.result;
164
243
  };
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/workflows/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Workflow runtime — ejecuta scripts de workflow en un sandbox vm.\n *\n * El script es un módulo ESM con `export const meta = {...}` y el cuerpo\n * (async). El vm recibe SOLO la API del workflow (agent/parallel/pipeline/\n * store/phase/checkpoint/args/cwd/runId/log) — sin process/require/fs/fetch\n * (sandbox; la red solo via tools de agente). Determinismo: Math.random y\n * Date.now se neutralizan en el realm (resume estable). No se inyectan host\n * built-ins (su .constructor sería el host Function — bypass del guard).\n */\n\nimport vm from \"node:vm\";\nimport type { TSchema } from \"typebox\";\nimport { AgentRunner, agentIdentityHash, type CreateSubagentSession } from \"./agent-runner.ts\";\nimport { SharedStore } from \"./shared-store.ts\";\nimport {\n\tDEFAULT_WORKFLOW_LIMITS,\n\ttype WorkflowApi,\n\tWorkflowError,\n\ttype WorkflowErrorCode,\n\ttype WorkflowLimits,\n\ttype WorkflowMeta,\n\ttype WorkflowRunResult,\n} from \"./types.ts\";\n\nconst _DETERMINISM_PRELUDE = `\n Math.random = () => { throw new Error(\"Math.random is disabled for workflow determinism\"); };\n Date.now = () => { throw new Error(\"Date.now is disabled for workflow determinism\"); };\n (globalThis as any).__adaWorkflowTime = 0;\n`;\n\nconst HOST_BUILTIN_BLOCKLIST = /require\\s*\\(|process\\s*\\.|global\\s*\\.\\s*process|import\\s*\\(/;\n\nexport interface WorkflowRuntimeOptions {\n\tcwd: string;\n\tagentDir: string;\n\tcreateSession: CreateSubagentSession;\n\tlimits?: Partial<WorkflowLimits>;\n\tresumeJournal?: Map<string, JournalEntryLike>;\n\tonAgentStart?: (index: number, label: string, phase: string | undefined) => void;\n\tonAgentEnd?: (index: number, label: string, result: unknown, usage: unknown) => void;\n\tonPhase?: (title: string) => void;\n\tonLog?: (message: string) => void;\n\tonTokenUsage?: (usage: unknown) => void;\n\tconfirm?: (prompt: string, options: unknown) => Promise<unknown>;\n\targs?: Record<string, unknown>;\n\tsignal?: AbortSignal;\n\t/** runId fijo para resume (mismo run). Default: generado. */\n\trunId?: string;\n}\n\nexport interface JournalEntryLike {\n\thash: string;\n\tresult: unknown;\n\tstoreDelta?: Record<string, unknown>;\n}\n\n/** Limiter de concurrencia (semáforo simple). */\nexport function createLimiter(maxConcurrent: number): <T>(fn: () => Promise<T>) => Promise<T> {\n\tlet active = 0;\n\tconst queue: Array<() => void> = [];\n\treturn async <T>(fn: () => Promise<T>): Promise<T> => {\n\t\tif (active >= maxConcurrent) {\n\t\t\tawait new Promise<void>((resolve) => queue.push(resolve));\n\t\t}\n\t\tactive++;\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} finally {\n\t\t\tactive--;\n\t\t\tqueue.shift()?.();\n\t\t}\n\t};\n}\n\n/**\n * Extrae `export const meta = {...}` del script: devuelve { meta, body }.\n * Fallo con WORKFLOW_INVALID_SCRIPT si no hay meta o el JS no balancea.\n */\nexport function parseWorkflowScript(script: string): { meta: WorkflowMeta; body: string } {\n\tif (HOST_BUILTIN_BLOCKLIST.test(script)) {\n\t\tthrow new WorkflowError(\n\t\t\t\"WORKFLOW_INVALID_SCRIPT\",\n\t\t\t\"Script contains forbidden host access (require/process/import) — workflows run sandboxed\",\n\t\t\t{ recoverable: false },\n\t\t);\n\t}\n\tconst match = /export\\s+const\\s+meta\\s*=\\s*({)/m.exec(script);\n\tif (!match) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"Script must export `const meta = {...}`\", {\n\t\t\trecoverable: false,\n\t\t});\n\t}\n\t// Extraer el objeto JSON con llaves balanceadas (el regex no-greedy falla con objetos anidados).\n\tconst start = match.index + match[0].length - 1;\n\tlet depth = 0;\n\tlet end = -1;\n\tlet inString = false;\n\tlet escaped = false;\n\tfor (let i = start; i < script.length; i++) {\n\t\tconst ch = script[i];\n\t\tif (inString) {\n\t\t\tif (escaped) escaped = false;\n\t\t\telse if (ch === \"\\\\\") escaped = true;\n\t\t\telse if (ch === '\"') inString = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === '\"') inString = true;\n\t\telse if (ch === \"{\") depth++;\n\t\telse if (ch === \"}\") {\n\t\t\tdepth--;\n\t\t\tif (depth === 0) {\n\t\t\t\tend = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (end === -1) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"meta object is not closed\", { recoverable: false });\n\t}\n\tconst metaSource = script.slice(start, end + 1);\n\tlet meta: WorkflowMeta;\n\ttry {\n\t\tmeta = JSON.parse(metaSource) as WorkflowMeta;\n\t} catch {\n\t\tthrow new WorkflowError(\n\t\t\t\"WORKFLOW_INVALID_SCRIPT\",\n\t\t\t\"meta is not valid JSON — use plain JSON (no functions/comments)\",\n\t\t\t{\n\t\t\t\trecoverable: false,\n\t\t\t},\n\t\t);\n\t}\n\tif (!meta.name || !meta.description) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"meta requires name and description\", { recoverable: false });\n\t}\n\tconst body = script.slice(end + 1).trim();\n\tif (!body) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"Script has no body\", { recoverable: false });\n\t}\n\treturn { meta, body };\n}\n\nexport async function runWorkflow<T = unknown>(\n\tscript: string,\n\toptions: WorkflowRuntimeOptions,\n): Promise<WorkflowRunResult<T>> {\n\tconst limits: WorkflowLimits = { ...DEFAULT_WORKFLOW_LIMITS, ...options.limits };\n\tconst { meta, body } = parseWorkflowScript(script);\n\n\tconst runId = options.runId ?? `wf-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n\tconst store = new SharedStore();\n\tconst agentCounter = { count: 0 };\n\tconst limiter = createLimiter(limits.maxConcurrency);\n\tconst runner = new AgentRunner({\n\t\tagentDir: options.agentDir,\n\t\tcreateSession: options.createSession,\n\t\tlimiter,\n\t\tagentCounter,\n\t\tmaxAgents: limits.maxAgentsPerRun,\n\t\tretries: limits.maxRetries,\n\t\tagentTimeoutMs: limits.agentTimeoutMs,\n\t});\n\n\tconst logs: string[] = [];\n\tconst phases: string[] = [];\n\tlet callIndex = 0;\n\tconst tokenUsage = { input: 0, output: 0, total: 0, cost: 0, cacheRead: 0, cacheWrite: 0 };\n\tconst started = Date.now();\n\n\tconst log = (message: string) => {\n\t\tlogs.push(message);\n\t\toptions.onLog?.(message);\n\t};\n\n\tconst agent = async <_TSchemaDef extends TSchema | undefined = undefined>(\n\t\tagentOptions: Parameters<WorkflowApi[\"agent\"]>[0],\n\t) => {\n\t\tconst index = callIndex++;\n\t\toptions.onAgentStart?.(index, agentOptions.label ?? `agent-${index}`, agentOptions.phase);\n\n\t\tconst journalKey = `${runId}:${index}`;\n\t\tconst identityHash = agentIdentityHash({\n\t\t\tprompt: agentOptions.prompt,\n\t\t\tmodel: agentOptions.model,\n\t\t\ttier: agentOptions.tier,\n\t\t\tphase: agentOptions.phase,\n\t\t\tstableKey: agentOptions.stableKey,\n\t\t\tschema: agentOptions.schema,\n\t\t});\n\t\tconst cached = options.resumeJournal?.get(journalKey);\n\t\tif (cached && cached.hash === identityHash) {\n\t\t\tif (cached.storeDelta) store.applyDelta(cached.storeDelta);\n\t\t\toptions.onAgentEnd?.(index, agentOptions.label ?? `agent-${index}`, cached.result, { cached: true });\n\t\t\treturn cached.result;\n\t\t}\n\n\t\tconst result = await runner.run({\n\t\t\t...agentOptions,\n\t\t\t// Determinista: un resume reencuentra el mismo worktree.\n\t\t\tisolationKey: journalKey.replace(\":\", \"-\"),\n\t\t\tcwd: agentOptions.cwd ?? options.cwd,\n\t\t});\n\t\tif (result === null) return null;\n\n\t\ttokenUsage.input += result.usage.input;\n\t\ttokenUsage.output += result.usage.output;\n\t\ttokenUsage.total += result.usage.total;\n\t\ttokenUsage.cost += result.usage.cost;\n\t\ttokenUsage.cacheRead += result.usage.cacheRead ?? 0;\n\t\ttokenUsage.cacheWrite += result.usage.cacheWrite ?? 0;\n\n\t\toptions.onAgentEnd?.(index, agentOptions.label ?? `agent-${index}`, result.result, result.usage);\n\t\treturn result.result;\n\t};\n\n\tconst parallel = async <R>(fns: Array<() => Promise<R>>): Promise<Array<Awaited<R>>> => {\n\t\treturn Promise.all(fns.map((fn) => fn()));\n\t};\n\n\tconst pipeline = async <R>(fns: Array<(prev?: Awaited<R>) => Promise<R>>): Promise<Awaited<R>> => {\n\t\tlet prev: Awaited<R> | undefined;\n\t\tfor (const fn of fns) {\n\t\t\tprev = await fn(prev);\n\t\t}\n\t\treturn prev as Awaited<R>;\n\t};\n\n\tconst phase = (title: string, detail?: string) => {\n\t\tphases.push(title);\n\t\toptions.onPhase?.(title);\n\t\tif (detail) log(`phase ${title}: ${detail}`);\n\t};\n\n\tconst checkpoint = async <T>(\n\t\tpromptText: string,\n\t\tcheckpointOptions?: {\n\t\t\tdefault?: unknown;\n\t\t\theadless?: \"default\" | \"abort\";\n\t\t\tkind?: \"confirm\" | \"input\" | \"select\";\n\t\t\tchoices?: string[];\n\t\t},\n\t) => {\n\t\tif (options.confirm) {\n\t\t\treturn (await options.confirm(promptText, checkpointOptions)) as T;\n\t\t}\n\t\tif (checkpointOptions?.headless === \"abort\") {\n\t\t\tthrow new WorkflowError(\n\t\t\t\t\"WORKFLOW_ABORTED\",\n\t\t\t\t`checkpoint \"${promptText}\" needs human input but none is available`,\n\t\t\t\t{\n\t\t\t\t\trecoverable: false,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn (checkpointOptions?.default ?? true) as T;\n\t};\n\n\tconst api: WorkflowApi = {\n\t\tagent,\n\t\tparallel,\n\t\tpipeline,\n\t\tphase,\n\t\tstore: {\n\t\t\tput: (k, v) => store.put(k, v),\n\t\t\tget: <U>(k: string) => store.get<U>(k),\n\t\t\thas: (k) => store.has(k),\n\t\t\tdelete: (k) => store.delete(k),\n\t\t\tentries: () => store.entries(),\n\t\t},\n\t\tcheckpoint,\n\t\targs: options.args ?? {},\n\t\tcwd: options.cwd ?? process.cwd(),\n\t\trunId,\n\t\tlog,\n\t};\n\n\tconst context = vm.createContext({\n\t\t...api,\n\t\tObject,\n\t\tArray,\n\t\tJSON,\n\t\tMath: {\n\t\t\t...Math,\n\t\t\trandom: () => {\n\t\t\t\tthrow new Error(\"Math.random disabled\");\n\t\t\t},\n\t\t},\n\t\tDate: { ...Date, now: () => started },\n\t\tPromise,\n\t\tSet,\n\t\tMap,\n\t\tError,\n\t\tString,\n\t\tNumber,\n\t\tBoolean,\n\t\tconsole: {\n\t\t\tlog,\n\t\t\tinfo: log,\n\t\t\twarn: (m: unknown) => log(`[warn] ${String(m)}`),\n\t\t\terror: (m: unknown) => log(`[error] ${String(m)}`),\n\t\t},\n\t\t// Timers: necesarios para esperas cooperativas en scripts (no son acceso\n\t\t// a host — solo programan la cola del event loop).\n\t\tsetTimeout,\n\t\tclearTimeout,\n\t\tsetInterval,\n\t\tclearInterval,\n\t});\n\n\tconst wrapped = `(async () => {\\n${body}\\n})()`;\n\n\tconst scriptTimeout = new Promise<never>((_resolve, reject) => {\n\t\tsetTimeout(() => {\n\t\t\treject(\n\t\t\t\tnew WorkflowError(\"WORKFLOW_SCRIPT_TIMEOUT\", \"Workflow script exceeded its timeout\", {\n\t\t\t\t\trecoverable: false,\n\t\t\t\t}),\n\t\t\t);\n\t\t}, limits.scriptTimeoutMs);\n\t});\n\n\tlet aborted = false;\n\tif (options.signal?.aborted) {\n\t\taborted = true;\n\t} else if (options.signal) {\n\t\toptions.signal.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\taborted = true;\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t}\n\n\t// Notificador de abort: interrumpe el race (≤25ms). El interval se limpia\n\t// SIEMPRE en el finally, así ninguna promesa queda viva tras el run.\n\t// Abort mediante sentinel (nunca rechazo → nunca unhandled).\n\t// El interval se limpia SIEMPRE en el finally.\n\tconst ABORT_SENTINEL = Symbol(\"abort\");\n\tlet abortTimer: ReturnType<typeof setInterval> | undefined;\n\tconst abortNotifier = new Promise<unknown>((resolve) => {\n\t\tabortTimer = setInterval(() => {\n\t\t\tif (aborted) {\n\t\t\t\tclearInterval(abortTimer);\n\t\t\t\tresolve(ABORT_SENTINEL);\n\t\t\t}\n\t\t}, 25);\n\t});\n\n\ttry {\n\t\tconst result = await Promise.race([\n\t\t\tnew vm.Script(wrapped, { filename: `${meta.name || \"workflow\"}.js` }).runInContext(context),\n\t\t\tscriptTimeout,\n\t\t\tabortNotifier,\n\t\t]);\n\t\tif (result === ABORT_SENTINEL) {\n\t\t\tthrow new WorkflowError(\"WORKFLOW_ABORTED\", \"Workflow aborted\", { recoverable: false });\n\t\t}\n\n\t\toptions.onTokenUsage?.(tokenUsage);\n\t\treturn {\n\t\t\tmeta,\n\t\t\tresult: result as T,\n\t\t\tlogs,\n\t\t\tphases,\n\t\t\tagentCount: agentCounter.count,\n\t\t\tdurationMs: Date.now() - started,\n\t\t\trunId,\n\t\t\ttokenUsage,\n\t\t};\n\t} finally {\n\t\tif (abortTimer) clearInterval(abortTimer);\n\t}\n}\n\n/** Re-export del hash para journaling externo. */\nexport { agentIdentityHash };\nexport type { WorkflowErrorCode };\n"]}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/workflows/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Workflow runtime — ejecuta scripts de workflow en un sandbox vm.\n *\n * El script es un módulo ESM con `export const meta = {...}` y el cuerpo\n * (async). El vm recibe SOLO la API del workflow (agent/parallel/pipeline/\n * store/phase/checkpoint/args/cwd/runId/log) — sin process/require/fs/fetch\n * (sandbox; la red solo via tools de agente). Determinismo: Math.random y\n * Date.now se neutralizan en el realm (resume estable). No se inyectan host\n * built-ins (su .constructor sería el host Function — bypass del guard).\n */\n\nimport vm from \"node:vm\";\nimport type { TSchema } from \"typebox\";\nimport { CONFIG_DIR_NAME } from \"../../config.ts\";\nimport { aOpcionesDeAgente, cargarAgentes } from \"../agents/loader.ts\";\nimport { hasTrustRequiringProjectResources, ProjectTrustStore } from \"../trust-manager.ts\";\nimport { AgentRunner, agentIdentityHash, type CreateSubagentSession } from \"./agent-runner.ts\";\nimport type { HallazgoParcial } from \"./contrato/yield.ts\";\nimport { SharedStore } from \"./shared-store.ts\";\nimport {\n\tDEFAULT_WORKFLOW_LIMITS,\n\ttype WorkflowApi,\n\tWorkflowError,\n\ttype WorkflowErrorCode,\n\ttype WorkflowLimits,\n\ttype WorkflowMeta,\n\ttype WorkflowRunResult,\n} from \"./types.ts\";\n\nconst _DETERMINISM_PRELUDE = `\n Math.random = () => { throw new Error(\"Math.random is disabled for workflow determinism\"); };\n Date.now = () => { throw new Error(\"Date.now is disabled for workflow determinism\"); };\n (globalThis as any).__adaWorkflowTime = 0;\n`;\n\nconst HOST_BUILTIN_BLOCKLIST = /require\\s*\\(|process\\s*\\.|global\\s*\\.\\s*process|import\\s*\\(/;\n\nexport interface WorkflowRuntimeOptions {\n\tcwd: string;\n\tagentDir: string;\n\tcreateSession: CreateSubagentSession;\n\tlimits?: Partial<WorkflowLimits>;\n\tresumeJournal?: Map<string, JournalEntryLike>;\n\t/**\n\t * Se llama tras cada agente ejecutado (no tras un hit de caché). Sin esto el\n\t * journal nunca se rellenaba: la ruta de resume estaba escrita y testeada del\n\t * lado consumidor, pero nadie producía las entradas.\n\t */\n\tonJournalEntry?: (entry: { index: number; hash: string; result: unknown }) => void;\n\tonAgentStart?: (index: number, label: string, phase: string | undefined) => void;\n\tonAgentEnd?: (index: number, label: string, result: unknown, usage: unknown) => void;\n\t/** Se llama EN CUANTO un subagente entrega un hallazgo con `yield` — antes de que termine (contrato/yield.ts). */\n\tonAgentYield?: (index: number, label: string, hallazgo: HallazgoParcial) => void;\n\tonPhase?: (title: string) => void;\n\tonLog?: (message: string) => void;\n\tonTokenUsage?: (usage: unknown) => void;\n\tconfirm?: (prompt: string, options: unknown) => Promise<unknown>;\n\targs?: Record<string, unknown>;\n\tsignal?: AbortSignal;\n\t/** runId fijo para resume (mismo run). Default: generado. */\n\trunId?: string;\n}\n\nexport interface JournalEntryLike {\n\thash: string;\n\tresult: unknown;\n\tstoreDelta?: Record<string, unknown>;\n}\n\n/** Limiter de concurrencia (semáforo simple). */\nexport function createLimiter(maxConcurrent: number): <T>(fn: () => Promise<T>) => Promise<T> {\n\tlet active = 0;\n\tconst queue: Array<() => void> = [];\n\treturn async <T>(fn: () => Promise<T>): Promise<T> => {\n\t\tif (active >= maxConcurrent) {\n\t\t\tawait new Promise<void>((resolve) => queue.push(resolve));\n\t\t}\n\t\tactive++;\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} finally {\n\t\t\tactive--;\n\t\t\tqueue.shift()?.();\n\t\t}\n\t};\n}\n\n/**\n * Extrae `export const meta = {...}` del script: devuelve { meta, body }.\n * Fallo con WORKFLOW_INVALID_SCRIPT si no hay meta o el JS no balancea.\n */\nexport function parseWorkflowScript(script: string): { meta: WorkflowMeta; body: string } {\n\t// ESTO NO ES UNA FRONTERA DE SEGURIDAD, y decir lo contrario nos costaría la\n\t// credibilidad delante de un evaluador.\n\t//\n\t// La lista negra es una expresión regular sobre el TEXTO del guion, así que\n\t// solo para al que escribe `process.` o `require(` literalmente. El escape\n\t// clásico de `node:vm` por la cadena de constructores la atraviesa entera.\n\t// Medido ejecutándolo:\n\t//\n\t// const real = this.constructor.constructor(\"return process\")();\n\t// → {\"pid\":80212,\"envs\":67,\"cwd\":\"/Users/…/packages/coding-agent\"}\n\t//\n\t// El propio Node lo dice en su documentación: «The node:vm module is not a\n\t// security mechanism. Do not use it to run untrusted code.»\n\t//\n\t// Lo que SÍ hace esto, y es lo único que se puede prometer: atrapar el acceso\n\t// ingenuo al host —el guion que un modelo escribe sin mala intención porque\n\t// está acostumbrado a Node— y convertirlo en un error legible en vez de en un\n\t// comportamiento raro. Para código de orquestación NO CONFIABLE la respuesta\n\t// es un contenedor, no esto.\n\t//\n\t// La guarda de este límite está en `test/workflows-sandbox-limite.test.ts`: si\n\t// alguien sustituye `node:vm` por un aislador de verdad, esa prueba se pondrá\n\t// roja y habrá que reescribir esta advertencia. Es el orden correcto.\n\tif (HOST_BUILTIN_BLOCKLIST.test(script)) {\n\t\tthrow new WorkflowError(\n\t\t\t\"WORKFLOW_INVALID_SCRIPT\",\n\t\t\t\"El guion usa require/process/import, que no están disponibles en el intérprete de workflows. \" +\n\t\t\t\t\"Usa los enlaces del guion (agent, parallel, pipeline, log). Aviso: este filtro atrapa el acceso \" +\n\t\t\t\t\"ingenuo al host, NO es un aislamiento de seguridad — para código no confiable, contenedor.\",\n\t\t\t{ recoverable: false },\n\t\t);\n\t}\n\tconst match = /export\\s+const\\s+meta\\s*=\\s*({)/m.exec(script);\n\tif (!match) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"Script must export `const meta = {...}`\", {\n\t\t\trecoverable: false,\n\t\t});\n\t}\n\t// Extraer el objeto JSON con llaves balanceadas (el regex no-greedy falla con objetos anidados).\n\tconst start = match.index + match[0].length - 1;\n\tlet depth = 0;\n\tlet end = -1;\n\tlet inString = false;\n\tlet escaped = false;\n\tfor (let i = start; i < script.length; i++) {\n\t\tconst ch = script[i];\n\t\tif (inString) {\n\t\t\tif (escaped) escaped = false;\n\t\t\telse if (ch === \"\\\\\") escaped = true;\n\t\t\telse if (ch === '\"') inString = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === '\"') inString = true;\n\t\telse if (ch === \"{\") depth++;\n\t\telse if (ch === \"}\") {\n\t\t\tdepth--;\n\t\t\tif (depth === 0) {\n\t\t\t\tend = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (end === -1) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"meta object is not closed\", { recoverable: false });\n\t}\n\tconst metaSource = script.slice(start, end + 1);\n\tlet meta: WorkflowMeta;\n\ttry {\n\t\tmeta = JSON.parse(metaSource) as WorkflowMeta;\n\t} catch {\n\t\tthrow new WorkflowError(\n\t\t\t\"WORKFLOW_INVALID_SCRIPT\",\n\t\t\t\"meta is not valid JSON — use plain JSON (no functions/comments)\",\n\t\t\t{\n\t\t\t\trecoverable: false,\n\t\t\t},\n\t\t);\n\t}\n\tif (!meta.name || !meta.description) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"meta requires name and description\", { recoverable: false });\n\t}\n\tconst body = script.slice(end + 1).trim();\n\tif (!body) {\n\t\tthrow new WorkflowError(\"WORKFLOW_INVALID_SCRIPT\", \"Script has no body\", { recoverable: false });\n\t}\n\treturn { meta, body };\n}\n\nexport async function runWorkflow<T = unknown>(\n\tscript: string,\n\toptions: WorkflowRuntimeOptions,\n): Promise<WorkflowRunResult<T>> {\n\tconst limits: WorkflowLimits = { ...DEFAULT_WORKFLOW_LIMITS, ...options.limits };\n\tconst { meta, body } = parseWorkflowScript(script);\n\n\tconst runId = options.runId ?? `wf-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n\tconst store = new SharedStore();\n\tconst agentCounter = { count: 0 };\n\tconst limiter = createLimiter(limits.maxConcurrency);\n\tconst runner = new AgentRunner({\n\t\tagentDir: options.agentDir,\n\t\tcreateSession: options.createSession,\n\t\tlimiter,\n\t\tagentCounter,\n\t\tmaxAgents: limits.maxAgentsPerRun,\n\t\tretries: limits.maxRetries,\n\t\tagentTimeoutMs: limits.agentTimeoutMs,\n\t});\n\n\tconst logs: string[] = [];\n\tconst phases: string[] = [];\n\tlet callIndex = 0;\n\tconst tokenUsage = { input: 0, output: 0, total: 0, cost: 0, cacheRead: 0, cacheWrite: 0 };\n\tconst started = Date.now();\n\n\tconst log = (message: string) => {\n\t\tlogs.push(message);\n\t\toptions.onLog?.(message);\n\t};\n\n\t// Se cargan una vez por run y se memoriza: un workflow con cien agentes no\n\t// puede leer el disco cien veces.\n\tlet agentesDefinidos: ReturnType<typeof cargarAgentes>[\"agentes\"] | null = null;\n\tconst resolverAgentesDefinidos = () => {\n\t\tif (agentesDefinidos) return agentesDefinidos;\n\t\t// Los de proyecto solo cuentan si el proyecto es de confianza: vienen del\n\t\t// repositorio, igual que una extensión.\n\t\tconst requiere = hasTrustRequiringProjectResources(options.cwd);\n\t\tconst carga = cargarAgentes({\n\t\t\tagentDir: options.agentDir,\n\t\t\tcwd: options.cwd,\n\t\t\tproyectoDeConfianza: !requiere || new ProjectTrustStore(options.agentDir).get(options.cwd) === true,\n\t\t\tconfigDirName: CONFIG_DIR_NAME,\n\t\t});\n\t\tfor (const problema of carga.problemas) {\n\t\t\toptions.onLog?.(`[agents] ${problema.ruta}: ${problema.motivo}`);\n\t\t}\n\t\tif (carga.bloqueadosSinConfianza > 0) {\n\t\t\toptions.onLog?.(\n\t\t\t\t`[agents] ${carga.bloqueadosSinConfianza} agente(s) del proyecto ignorados: el proyecto no es de confianza`,\n\t\t\t);\n\t\t}\n\t\tagentesDefinidos = carga.agentes;\n\t\treturn agentesDefinidos;\n\t};\n\n\tconst agent = async <_TSchemaDef extends TSchema | undefined = undefined>(\n\t\tagentOptions: Parameters<WorkflowApi[\"agent\"]>[0],\n\t) => {\n\t\tconst index = callIndex++;\n\t\toptions.onAgentStart?.(index, agentOptions.label ?? `agent-${index}`, agentOptions.phase);\n\n\t\t// Agentes definidos por el usuario en Markdown. Sus ajustes son la BASE:\n\t\t// lo que el script pase explícitamente gana, para que un workflow pueda\n\t\t// ajustar un agente prestado sin tener que copiarlo entero.\n\t\tif (agentOptions.agentType) {\n\t\t\tconst disponibles = resolverAgentesDefinidos();\n\t\t\tconst definido = disponibles.find((a) => a.nombre === agentOptions.agentType);\n\t\t\tif (!definido) {\n\t\t\t\t// Ignorarlo en silencio dejaría al workflow corriendo con un agente\n\t\t\t\t// genérico creyendo que usa el suyo.\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`agentType '${agentOptions.agentType}' no existe. Disponibles: ${disponibles.map((a) => a.nombre).join(\", \") || \"(ninguno)\"}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tagentOptions = { ...aOpcionesDeAgente(definido), ...agentOptions };\n\t\t}\n\n\t\tconst journalKey = `${runId}:${index}`;\n\t\tconst identityHash = agentIdentityHash({\n\t\t\tprompt: agentOptions.prompt,\n\t\t\tmodel: agentOptions.model,\n\t\t\ttier: agentOptions.tier,\n\t\t\tphase: agentOptions.phase,\n\t\t\tstableKey: agentOptions.stableKey,\n\t\t\tschema: agentOptions.schema,\n\t\t});\n\t\tconst cached = options.resumeJournal?.get(journalKey);\n\t\tif (cached && cached.hash === identityHash) {\n\t\t\tif (cached.storeDelta) store.applyDelta(cached.storeDelta);\n\t\t\toptions.onAgentEnd?.(index, agentOptions.label ?? `agent-${index}`, cached.result, { cached: true });\n\t\t\treturn cached.result;\n\t\t}\n\n\t\tconst label = agentOptions.label ?? `agent-${index}`;\n\t\tconst onYieldDelScript = agentOptions.onYield;\n\t\tconst result = await runner.run({\n\t\t\t...agentOptions,\n\t\t\t// Combina el onYield del propio script (si lo puso) con el del host: los\n\t\t\t// dos quieren enterarse del mismo hallazgo, en el mismo instante.\n\t\t\tonYield: (hallazgo) => {\n\t\t\t\toptions.onAgentYield?.(index, label, hallazgo);\n\t\t\t\tonYieldDelScript?.(hallazgo);\n\t\t\t},\n\t\t\t// Determinista: un resume reencuentra el mismo worktree.\n\t\t\tisolationKey: journalKey.replace(\":\", \"-\"),\n\t\t\tcwd: agentOptions.cwd ?? options.cwd,\n\t\t});\n\t\tif (result === null) return null;\n\n\t\ttokenUsage.input += result.usage.input;\n\t\ttokenUsage.output += result.usage.output;\n\t\ttokenUsage.total += result.usage.total;\n\t\ttokenUsage.cost += result.usage.cost;\n\t\ttokenUsage.cacheRead += result.usage.cacheRead ?? 0;\n\t\ttokenUsage.cacheWrite += result.usage.cacheWrite ?? 0;\n\n\t\t// Journal para el resume: identidad + resultado del agente. NO se guarda\n\t\t// storeDelta a propósito — en este DSL el store lo escribe el SCRIPT, no\n\t\t// los agentes, y al reanudar el script se re-ejecuta entero (con\n\t\t// Math.random/Date.now deshabilitados para que sea determinista), así que\n\t\t// el store se reconstruye solo. Guardar deltas sería estado duplicado.\n\t\toptions.onJournalEntry?.({ index, hash: identityHash, result: result.result });\n\t\toptions.onAgentEnd?.(index, agentOptions.label ?? `agent-${index}`, result.result, result.usage);\n\t\treturn result.result;\n\t};\n\n\tconst parallel = async <R>(fns: Array<() => Promise<R>>): Promise<Array<Awaited<R>>> => {\n\t\treturn Promise.all(fns.map((fn) => fn()));\n\t};\n\n\tconst pipeline = async <R>(fns: Array<(prev?: Awaited<R>) => Promise<R>>): Promise<Awaited<R>> => {\n\t\tlet prev: Awaited<R> | undefined;\n\t\tfor (const fn of fns) {\n\t\t\tprev = await fn(prev);\n\t\t}\n\t\treturn prev as Awaited<R>;\n\t};\n\n\tconst phase = (title: string, detail?: string) => {\n\t\tphases.push(title);\n\t\toptions.onPhase?.(title);\n\t\tif (detail) log(`phase ${title}: ${detail}`);\n\t};\n\n\tconst checkpoint = async <T>(\n\t\tpromptText: string,\n\t\tcheckpointOptions?: {\n\t\t\tdefault?: unknown;\n\t\t\theadless?: \"default\" | \"abort\";\n\t\t\tkind?: \"confirm\" | \"input\" | \"select\";\n\t\t\tchoices?: string[];\n\t\t},\n\t) => {\n\t\tif (options.confirm) {\n\t\t\treturn (await options.confirm(promptText, checkpointOptions)) as T;\n\t\t}\n\t\tif (checkpointOptions?.headless === \"abort\") {\n\t\t\tthrow new WorkflowError(\n\t\t\t\t\"WORKFLOW_ABORTED\",\n\t\t\t\t`checkpoint \"${promptText}\" needs human input but none is available`,\n\t\t\t\t{\n\t\t\t\t\trecoverable: false,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn (checkpointOptions?.default ?? true) as T;\n\t};\n\n\tconst api: WorkflowApi = {\n\t\tagent,\n\t\tparallel,\n\t\tpipeline,\n\t\tphase,\n\t\tstore: {\n\t\t\tput: (k, v) => store.put(k, v),\n\t\t\tget: <U>(k: string) => store.get<U>(k),\n\t\t\thas: (k) => store.has(k),\n\t\t\tdelete: (k) => store.delete(k),\n\t\t\tentries: () => store.entries(),\n\t\t},\n\t\tcheckpoint,\n\t\targs: options.args ?? {},\n\t\tcwd: options.cwd ?? process.cwd(),\n\t\trunId,\n\t\tlog,\n\t};\n\n\tconst context = vm.createContext({\n\t\t...api,\n\t\tObject,\n\t\tArray,\n\t\tJSON,\n\t\tMath: {\n\t\t\t...Math,\n\t\t\trandom: () => {\n\t\t\t\tthrow new Error(\"Math.random disabled\");\n\t\t\t},\n\t\t},\n\t\tDate: { ...Date, now: () => started },\n\t\tPromise,\n\t\tSet,\n\t\tMap,\n\t\tError,\n\t\tString,\n\t\tNumber,\n\t\tBoolean,\n\t\tconsole: {\n\t\t\tlog,\n\t\t\tinfo: log,\n\t\t\twarn: (m: unknown) => log(`[warn] ${String(m)}`),\n\t\t\terror: (m: unknown) => log(`[error] ${String(m)}`),\n\t\t},\n\t\t// Timers: necesarios para esperas cooperativas en scripts (no son acceso\n\t\t// a host — solo programan la cola del event loop).\n\t\tsetTimeout,\n\t\tclearTimeout,\n\t\tsetInterval,\n\t\tclearInterval,\n\t});\n\n\tconst wrapped = `(async () => {\\n${body}\\n})()`;\n\n\tconst scriptTimeout = new Promise<never>((_resolve, reject) => {\n\t\tsetTimeout(() => {\n\t\t\treject(\n\t\t\t\tnew WorkflowError(\"WORKFLOW_SCRIPT_TIMEOUT\", \"Workflow script exceeded its timeout\", {\n\t\t\t\t\trecoverable: false,\n\t\t\t\t}),\n\t\t\t);\n\t\t}, limits.scriptTimeoutMs);\n\t});\n\n\tlet aborted = false;\n\tif (options.signal?.aborted) {\n\t\taborted = true;\n\t} else if (options.signal) {\n\t\toptions.signal.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\taborted = true;\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t}\n\n\t// Notificador de abort: interrumpe el race (≤25ms). El interval se limpia\n\t// SIEMPRE en el finally, así ninguna promesa queda viva tras el run.\n\t// Abort mediante sentinel (nunca rechazo → nunca unhandled).\n\t// El interval se limpia SIEMPRE en el finally.\n\tconst ABORT_SENTINEL = Symbol(\"abort\");\n\tlet abortTimer: ReturnType<typeof setInterval> | undefined;\n\tconst abortNotifier = new Promise<unknown>((resolve) => {\n\t\tabortTimer = setInterval(() => {\n\t\t\tif (aborted) {\n\t\t\t\tclearInterval(abortTimer);\n\t\t\t\tresolve(ABORT_SENTINEL);\n\t\t\t}\n\t\t}, 25);\n\t});\n\n\ttry {\n\t\tconst result = await Promise.race([\n\t\t\tnew vm.Script(wrapped, { filename: `${meta.name || \"workflow\"}.js` }).runInContext(context),\n\t\t\tscriptTimeout,\n\t\t\tabortNotifier,\n\t\t]);\n\t\tif (result === ABORT_SENTINEL) {\n\t\t\tthrow new WorkflowError(\"WORKFLOW_ABORTED\", \"Workflow aborted\", { recoverable: false });\n\t\t}\n\n\t\toptions.onTokenUsage?.(tokenUsage);\n\t\treturn {\n\t\t\tmeta,\n\t\t\tresult: result as T,\n\t\t\tlogs,\n\t\t\tphases,\n\t\t\tagentCount: agentCounter.count,\n\t\t\tdurationMs: Date.now() - started,\n\t\t\trunId,\n\t\t\ttokenUsage,\n\t\t};\n\t} finally {\n\t\tif (abortTimer) clearInterval(abortTimer);\n\t}\n}\n\n/** Re-export del hash para journaling externo. */\nexport { agentIdentityHash };\nexport type { WorkflowErrorCode };\n"]}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `workflow save-as-skill` — empaqueta un run YA EJECUTADO como algo
3
+ * re-ejecutable por nombre.
4
+ *
5
+ * Todo el sustrato existía y nadie escribía en él: `PersistedRunState` guarda el
6
+ * script del run, sus args, fases y journal; `resolveWorkflowScriptByName` ya
7
+ * resuelve `<agentDir>/workflows/<name>.js` como script de usuario de primera
8
+ * clase. Solo faltaba el comando que uniera las dos cosas.
9
+ *
10
+ * Es estrictamente mejor que las "skills" auto-generadas de otros harnesses,
11
+ * que son descripciones que el modelo *cree* haber seguido: aquí el script
12
+ * guardado se ejecutó de verdad, y su procedencia (runId, args, resultado) queda
13
+ * en la cabecera.
14
+ */
15
+ import type { PersistedRunState } from "./journal.ts";
16
+ export interface SaveAsSkillResult {
17
+ ok: boolean;
18
+ error?: string;
19
+ filePath?: string;
20
+ name?: string;
21
+ }
22
+ export declare function saveRunAsSkill(options: {
23
+ agentDir: string;
24
+ name: string;
25
+ run: PersistedRunState;
26
+ }): Promise<SaveAsSkillResult>;
27
+ //# sourceMappingURL=save-as-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-as-skill.d.ts","sourceRoot":"","sources":["../../../src/core/workflows/save-as-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAKD,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,iBAAiB,CAAC;CACvB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsC7B","sourcesContent":["/**\n * `workflow save-as-skill` — empaqueta un run YA EJECUTADO como algo\n * re-ejecutable por nombre.\n *\n * Todo el sustrato existía y nadie escribía en él: `PersistedRunState` guarda el\n * script del run, sus args, fases y journal; `resolveWorkflowScriptByName` ya\n * resuelve `<agentDir>/workflows/<name>.js` como script de usuario de primera\n * clase. Solo faltaba el comando que uniera las dos cosas.\n *\n * Es estrictamente mejor que las \"skills\" auto-generadas de otros harnesses,\n * que son descripciones que el modelo *cree* haber seguido: aquí el script\n * guardado se ejecutó de verdad, y su procedencia (runId, args, resultado) queda\n * en la cabecera.\n */\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PersistedRunState } from \"./journal.ts\";\nimport { resolveBuiltinWorkflowScript } from \"./resolve-script.ts\";\n\nexport interface SaveAsSkillResult {\n\tok: boolean;\n\terror?: string;\n\tfilePath?: string;\n\tname?: string;\n}\n\n/** Nombres válidos de fichero: sin rutas ni sorpresas. */\nconst VALID_NAME = /^[a-z0-9][a-z0-9_-]{0,63}$/i;\n\nexport async function saveRunAsSkill(options: {\n\tagentDir: string;\n\tname: string;\n\trun: PersistedRunState;\n}): Promise<SaveAsSkillResult> {\n\tconst { agentDir, name, run } = options;\n\n\tif (!VALID_NAME.test(name)) {\n\t\treturn { ok: false, error: `Nombre inválido '${name}': usa letras, números, guion y guion bajo.` };\n\t}\n\n\t// Evidence gate: no se empaqueta un run que no llegó a terminar bien. Un\n\t// script \"reutilizable\" que nunca funcionó es peor que no tenerlo.\n\tif (run.status !== \"completed\") {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: `El run ${run.runId} está en estado '${run.status}'. Solo se empaquetan runs completados (evidence gate).`,\n\t\t};\n\t}\n\n\t// Los builtins se resuelven ANTES que los scripts de usuario, así que\n\t// guardar con un nombre reservado crearía un fichero inalcanzable en\n\t// silencio. Mejor rechazarlo en el momento de guardar.\n\tif (resolveBuiltinWorkflowScript(name)) {\n\t\treturn { ok: false, error: `'${name}' es un workflow builtin. Elige otro nombre.` };\n\t}\n\n\t// Solo se guarda `run.script`: vino de un builtin o de un script de usuario\n\t// ya confiado. Nunca JS escrito por el modelo en caliente.\n\tconst header = [\n\t\t\"// Guardado por `workflow save-as-skill`.\",\n\t\t`// Procedencia: run ${run.runId} (${run.name}), completado ${run.updatedAt}.`,\n\t\t`// Args de aquella ejecución: ${JSON.stringify(run.args ?? {})}`,\n\t\trun.resultPath ? `// Resultado: ${run.resultPath}` : \"// Resultado: (no persistido)\",\n\t\t\"\",\n\t].join(\"\\n\");\n\n\tconst dir = join(agentDir, \"workflows\");\n\tawait mkdir(dir, { recursive: true });\n\tconst filePath = join(dir, `${name}.js`);\n\tawait writeFile(filePath, header + run.script, \"utf-8\");\n\treturn { ok: true, filePath, name };\n}\n"]}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * `workflow save-as-skill` — empaqueta un run YA EJECUTADO como algo
3
+ * re-ejecutable por nombre.
4
+ *
5
+ * Todo el sustrato existía y nadie escribía en él: `PersistedRunState` guarda el
6
+ * script del run, sus args, fases y journal; `resolveWorkflowScriptByName` ya
7
+ * resuelve `<agentDir>/workflows/<name>.js` como script de usuario de primera
8
+ * clase. Solo faltaba el comando que uniera las dos cosas.
9
+ *
10
+ * Es estrictamente mejor que las "skills" auto-generadas de otros harnesses,
11
+ * que son descripciones que el modelo *cree* haber seguido: aquí el script
12
+ * guardado se ejecutó de verdad, y su procedencia (runId, args, resultado) queda
13
+ * en la cabecera.
14
+ */
15
+ import { mkdir, writeFile } from "node:fs/promises";
16
+ import { join } from "node:path";
17
+ import { resolveBuiltinWorkflowScript } from "./resolve-script.js";
18
+ /** Nombres válidos de fichero: sin rutas ni sorpresas. */
19
+ const VALID_NAME = /^[a-z0-9][a-z0-9_-]{0,63}$/i;
20
+ export async function saveRunAsSkill(options) {
21
+ const { agentDir, name, run } = options;
22
+ if (!VALID_NAME.test(name)) {
23
+ return { ok: false, error: `Nombre inválido '${name}': usa letras, números, guion y guion bajo.` };
24
+ }
25
+ // Evidence gate: no se empaqueta un run que no llegó a terminar bien. Un
26
+ // script "reutilizable" que nunca funcionó es peor que no tenerlo.
27
+ if (run.status !== "completed") {
28
+ return {
29
+ ok: false,
30
+ error: `El run ${run.runId} está en estado '${run.status}'. Solo se empaquetan runs completados (evidence gate).`,
31
+ };
32
+ }
33
+ // Los builtins se resuelven ANTES que los scripts de usuario, así que
34
+ // guardar con un nombre reservado crearía un fichero inalcanzable en
35
+ // silencio. Mejor rechazarlo en el momento de guardar.
36
+ if (resolveBuiltinWorkflowScript(name)) {
37
+ return { ok: false, error: `'${name}' es un workflow builtin. Elige otro nombre.` };
38
+ }
39
+ // Solo se guarda `run.script`: vino de un builtin o de un script de usuario
40
+ // ya confiado. Nunca JS escrito por el modelo en caliente.
41
+ const header = [
42
+ "// Guardado por `workflow save-as-skill`.",
43
+ `// Procedencia: run ${run.runId} (${run.name}), completado ${run.updatedAt}.`,
44
+ `// Args de aquella ejecución: ${JSON.stringify(run.args ?? {})}`,
45
+ run.resultPath ? `// Resultado: ${run.resultPath}` : "// Resultado: (no persistido)",
46
+ "",
47
+ ].join("\n");
48
+ const dir = join(agentDir, "workflows");
49
+ await mkdir(dir, { recursive: true });
50
+ const filePath = join(dir, `${name}.js`);
51
+ await writeFile(filePath, header + run.script, "utf-8");
52
+ return { ok: true, filePath, name };
53
+ }
54
+ //# sourceMappingURL=save-as-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-as-skill.js","sourceRoot":"","sources":["../../../src/core/workflows/save-as-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AASnE,2DAA0D;AAC1D,MAAM,UAAU,GAAG,6BAA6B,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAIpC,EAA8B;IAC9B,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAExC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAoB,IAAI,8CAA6C,EAAE,CAAC;IACpG,CAAC;IAED,0EAAyE;IACzE,oEAAmE;IACnE,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO;YACN,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,UAAU,GAAG,CAAC,KAAK,qBAAoB,GAAG,CAAC,MAAM,yDAAyD;SACjH,CAAC;IACH,CAAC;IAED,uEAAsE;IACtE,sEAAqE;IACrE,uDAAuD;IACvD,IAAI,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,IAAI,8CAA8C,EAAE,CAAC;IACrF,CAAC;IAED,4EAA4E;IAC5E,2DAA2D;IAC3D,MAAM,MAAM,GAAG;QACd,2CAA2C;QAC3C,uBAAuB,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,IAAI,iBAAiB,GAAG,CAAC,SAAS,GAAG;QAC9E,kCAAiC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;QACjE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,+BAA+B;QACpF,EAAE;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACxC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IACzC,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,CACpC","sourcesContent":["/**\n * `workflow save-as-skill` — empaqueta un run YA EJECUTADO como algo\n * re-ejecutable por nombre.\n *\n * Todo el sustrato existía y nadie escribía en él: `PersistedRunState` guarda el\n * script del run, sus args, fases y journal; `resolveWorkflowScriptByName` ya\n * resuelve `<agentDir>/workflows/<name>.js` como script de usuario de primera\n * clase. Solo faltaba el comando que uniera las dos cosas.\n *\n * Es estrictamente mejor que las \"skills\" auto-generadas de otros harnesses,\n * que son descripciones que el modelo *cree* haber seguido: aquí el script\n * guardado se ejecutó de verdad, y su procedencia (runId, args, resultado) queda\n * en la cabecera.\n */\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PersistedRunState } from \"./journal.ts\";\nimport { resolveBuiltinWorkflowScript } from \"./resolve-script.ts\";\n\nexport interface SaveAsSkillResult {\n\tok: boolean;\n\terror?: string;\n\tfilePath?: string;\n\tname?: string;\n}\n\n/** Nombres válidos de fichero: sin rutas ni sorpresas. */\nconst VALID_NAME = /^[a-z0-9][a-z0-9_-]{0,63}$/i;\n\nexport async function saveRunAsSkill(options: {\n\tagentDir: string;\n\tname: string;\n\trun: PersistedRunState;\n}): Promise<SaveAsSkillResult> {\n\tconst { agentDir, name, run } = options;\n\n\tif (!VALID_NAME.test(name)) {\n\t\treturn { ok: false, error: `Nombre inválido '${name}': usa letras, números, guion y guion bajo.` };\n\t}\n\n\t// Evidence gate: no se empaqueta un run que no llegó a terminar bien. Un\n\t// script \"reutilizable\" que nunca funcionó es peor que no tenerlo.\n\tif (run.status !== \"completed\") {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: `El run ${run.runId} está en estado '${run.status}'. Solo se empaquetan runs completados (evidence gate).`,\n\t\t};\n\t}\n\n\t// Los builtins se resuelven ANTES que los scripts de usuario, así que\n\t// guardar con un nombre reservado crearía un fichero inalcanzable en\n\t// silencio. Mejor rechazarlo en el momento de guardar.\n\tif (resolveBuiltinWorkflowScript(name)) {\n\t\treturn { ok: false, error: `'${name}' es un workflow builtin. Elige otro nombre.` };\n\t}\n\n\t// Solo se guarda `run.script`: vino de un builtin o de un script de usuario\n\t// ya confiado. Nunca JS escrito por el modelo en caliente.\n\tconst header = [\n\t\t\"// Guardado por `workflow save-as-skill`.\",\n\t\t`// Procedencia: run ${run.runId} (${run.name}), completado ${run.updatedAt}.`,\n\t\t`// Args de aquella ejecución: ${JSON.stringify(run.args ?? {})}`,\n\t\trun.resultPath ? `// Resultado: ${run.resultPath}` : \"// Resultado: (no persistido)\",\n\t\t\"\",\n\t].join(\"\\n\");\n\n\tconst dir = join(agentDir, \"workflows\");\n\tawait mkdir(dir, { recursive: true });\n\tconst filePath = join(dir, `${name}.js`);\n\tawait writeFile(filePath, header + run.script, \"utf-8\");\n\treturn { ok: true, filePath, name };\n}\n"]}