@hoilab/ada-cli 0.84.21 → 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 (1337) hide show
  1. package/CHANGELOG.md +49 -2
  2. package/README.es.md +174 -0
  3. package/README.md +203 -658
  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/args.d.ts +3 -0
  9. package/dist/cli/args.d.ts.map +1 -1
  10. package/dist/cli/args.js +11 -0
  11. package/dist/cli/args.js.map +1 -1
  12. package/dist/cli/audit-command.d.ts +15 -0
  13. package/dist/cli/audit-command.d.ts.map +1 -0
  14. package/dist/cli/audit-command.js +280 -0
  15. package/dist/cli/audit-command.js.map +1 -0
  16. package/dist/cli/banco-command.d.ts +15 -0
  17. package/dist/cli/banco-command.d.ts.map +1 -0
  18. package/dist/cli/banco-command.js +213 -0
  19. package/dist/cli/banco-command.js.map +1 -0
  20. package/dist/cli/cleanse-command.d.ts +11 -0
  21. package/dist/cli/cleanse-command.d.ts.map +1 -0
  22. package/dist/cli/cleanse-command.js +101 -0
  23. package/dist/cli/cleanse-command.js.map +1 -0
  24. package/dist/cli/commit-command.d.ts +31 -0
  25. package/dist/cli/commit-command.d.ts.map +1 -0
  26. package/dist/cli/commit-command.js +158 -0
  27. package/dist/cli/commit-command.js.map +1 -0
  28. package/dist/cli/computer-command.d.ts +12 -0
  29. package/dist/cli/computer-command.d.ts.map +1 -0
  30. package/dist/cli/computer-command.js +141 -0
  31. package/dist/cli/computer-command.js.map +1 -0
  32. package/dist/cli/discover-command.d.ts +18 -0
  33. package/dist/cli/discover-command.d.ts.map +1 -0
  34. package/dist/cli/discover-command.js +108 -0
  35. package/dist/cli/discover-command.js.map +1 -0
  36. package/dist/cli/file-processor.d.ts.map +1 -1
  37. package/dist/cli/file-processor.js +2 -1
  38. package/dist/cli/file-processor.js.map +1 -1
  39. package/dist/cli/hashline-command.d.ts +11 -0
  40. package/dist/cli/hashline-command.d.ts.map +1 -0
  41. package/dist/cli/hashline-command.js +106 -0
  42. package/dist/cli/hashline-command.js.map +1 -0
  43. package/dist/cli/home-screen.d.ts.map +1 -1
  44. package/dist/cli/home-screen.js +2 -2
  45. package/dist/cli/home-screen.js.map +1 -1
  46. package/dist/cli/import-command.d.ts +35 -0
  47. package/dist/cli/import-command.d.ts.map +1 -0
  48. package/dist/cli/import-command.js +164 -0
  49. package/dist/cli/import-command.js.map +1 -0
  50. package/dist/cli/politica-command.d.ts +20 -0
  51. package/dist/cli/politica-command.d.ts.map +1 -0
  52. package/dist/cli/politica-command.js +93 -0
  53. package/dist/cli/politica-command.js.map +1 -0
  54. package/dist/cli/refine-command.d.ts +18 -0
  55. package/dist/cli/refine-command.d.ts.map +1 -0
  56. package/dist/cli/refine-command.js +101 -0
  57. package/dist/cli/refine-command.js.map +1 -0
  58. package/dist/cli/review-command.d.ts +24 -0
  59. package/dist/cli/review-command.d.ts.map +1 -0
  60. package/dist/cli/review-command.js +168 -0
  61. package/dist/cli/review-command.js.map +1 -0
  62. package/dist/cli/schedule-command.d.ts +17 -0
  63. package/dist/cli/schedule-command.d.ts.map +1 -0
  64. package/dist/cli/schedule-command.js +117 -0
  65. package/dist/cli/schedule-command.js.map +1 -0
  66. package/dist/cli/serve-command.d.ts +72 -0
  67. package/dist/cli/serve-command.d.ts.map +1 -0
  68. package/dist/cli/serve-command.js +568 -0
  69. package/dist/cli/serve-command.js.map +1 -0
  70. package/dist/cli/startup-ui.d.ts.map +1 -1
  71. package/dist/cli/startup-ui.js +9 -3
  72. package/dist/cli/startup-ui.js.map +1 -1
  73. package/dist/cli/telegram-command.d.ts +18 -0
  74. package/dist/cli/telegram-command.d.ts.map +1 -0
  75. package/dist/cli/telegram-command.js +137 -0
  76. package/dist/cli/telegram-command.js.map +1 -0
  77. package/dist/cli/telemetria-command.d.ts +22 -0
  78. package/dist/cli/telemetria-command.d.ts.map +1 -0
  79. package/dist/cli/telemetria-command.js +127 -0
  80. package/dist/cli/telemetria-command.js.map +1 -0
  81. package/dist/cli/undo-command.d.ts +9 -0
  82. package/dist/cli/undo-command.d.ts.map +1 -0
  83. package/dist/cli/undo-command.js +56 -0
  84. package/dist/cli/undo-command.js.map +1 -0
  85. package/dist/cli/usage-command.d.ts +10 -0
  86. package/dist/cli/usage-command.d.ts.map +1 -0
  87. package/dist/cli/usage-command.js +209 -0
  88. package/dist/cli/usage-command.js.map +1 -0
  89. package/dist/cli/wiki-command.d.ts +9 -0
  90. package/dist/cli/wiki-command.d.ts.map +1 -0
  91. package/dist/cli/wiki-command.js +76 -0
  92. package/dist/cli/wiki-command.js.map +1 -0
  93. package/dist/cli.d.ts +6 -0
  94. package/dist/cli.d.ts.map +1 -1
  95. package/dist/cli.js +10 -11
  96. package/dist/cli.js.map +1 -1
  97. package/dist/config.d.ts +1 -1
  98. package/dist/config.d.ts.map +1 -1
  99. package/dist/config.js +3 -2
  100. package/dist/config.js.map +1 -1
  101. package/dist/core/ada.d.ts +58 -0
  102. package/dist/core/ada.d.ts.map +1 -0
  103. package/dist/core/ada.js +61 -0
  104. package/dist/core/ada.js.map +1 -0
  105. package/dist/core/advisor/guarda.d.ts +66 -0
  106. package/dist/core/advisor/guarda.d.ts.map +1 -0
  107. package/dist/core/advisor/guarda.js +191 -0
  108. package/dist/core/advisor/guarda.js.map +1 -0
  109. package/dist/core/advisor/runtime.d.ts +66 -0
  110. package/dist/core/advisor/runtime.d.ts.map +1 -0
  111. package/dist/core/advisor/runtime.js +121 -0
  112. package/dist/core/advisor/runtime.js.map +1 -0
  113. package/dist/core/advisor/sesion.d.ts +109 -0
  114. package/dist/core/advisor/sesion.d.ts.map +1 -0
  115. package/dist/core/advisor/sesion.js +139 -0
  116. package/dist/core/advisor/sesion.js.map +1 -0
  117. package/dist/core/agent-session.d.ts +85 -7
  118. package/dist/core/agent-session.d.ts.map +1 -1
  119. package/dist/core/agent-session.js +862 -78
  120. package/dist/core/agent-session.js.map +1 -1
  121. package/dist/core/agents/loader.d.ts +77 -0
  122. package/dist/core/agents/loader.d.ts.map +1 -0
  123. package/dist/core/agents/loader.js +154 -0
  124. package/dist/core/agents/loader.js.map +1 -0
  125. package/dist/core/aprobacion/generados.d.ts +37 -0
  126. package/dist/core/aprobacion/generados.d.ts.map +1 -0
  127. package/dist/core/aprobacion/generados.js +85 -0
  128. package/dist/core/aprobacion/generados.js.map +1 -0
  129. package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
  130. package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
  131. package/dist/core/aprobacion/politica-de-maquina.js +212 -0
  132. package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
  133. package/dist/core/aprobacion/politica.d.ts +90 -0
  134. package/dist/core/aprobacion/politica.d.ts.map +1 -0
  135. package/dist/core/aprobacion/politica.js +375 -0
  136. package/dist/core/aprobacion/politica.js.map +1 -0
  137. package/dist/core/arranque/atajos.d.ts +46 -0
  138. package/dist/core/arranque/atajos.d.ts.map +1 -0
  139. package/dist/core/arranque/atajos.js +113 -0
  140. package/dist/core/arranque/atajos.js.map +1 -0
  141. package/dist/core/audit/exportacion.d.ts +54 -0
  142. package/dist/core/audit/exportacion.d.ts.map +1 -0
  143. package/dist/core/audit/exportacion.js +265 -0
  144. package/dist/core/audit/exportacion.js.map +1 -0
  145. package/dist/core/audit/libro.d.ts +318 -0
  146. package/dist/core/audit/libro.d.ts.map +1 -0
  147. package/dist/core/audit/libro.js +508 -0
  148. package/dist/core/audit/libro.js.map +1 -0
  149. package/dist/core/audit/registro-sesion.d.ts +78 -0
  150. package/dist/core/audit/registro-sesion.d.ts.map +1 -0
  151. package/dist/core/audit/registro-sesion.js +202 -0
  152. package/dist/core/audit/registro-sesion.js.map +1 -0
  153. package/dist/core/audit/retencion.d.ts +82 -0
  154. package/dist/core/audit/retencion.d.ts.map +1 -0
  155. package/dist/core/audit/retencion.js +152 -0
  156. package/dist/core/audit/retencion.js.map +1 -0
  157. package/dist/core/audit/rutas.d.ts +23 -0
  158. package/dist/core/audit/rutas.d.ts.map +1 -0
  159. package/dist/core/audit/rutas.js +23 -0
  160. package/dist/core/audit/rutas.js.map +1 -0
  161. package/dist/core/auth-storage.d.ts +0 -3
  162. package/dist/core/auth-storage.d.ts.map +1 -1
  163. package/dist/core/auth-storage.js +21 -8
  164. package/dist/core/auth-storage.js.map +1 -1
  165. package/dist/core/banco/almacenamiento.d.ts +18 -0
  166. package/dist/core/banco/almacenamiento.d.ts.map +1 -0
  167. package/dist/core/banco/almacenamiento.js +50 -0
  168. package/dist/core/banco/almacenamiento.js.map +1 -0
  169. package/dist/core/banco/analisis.d.ts +37 -0
  170. package/dist/core/banco/analisis.d.ts.map +1 -0
  171. package/dist/core/banco/analisis.js +164 -0
  172. package/dist/core/banco/analisis.js.map +1 -0
  173. package/dist/core/banco/bloques.d.ts +39 -0
  174. package/dist/core/banco/bloques.d.ts.map +1 -0
  175. package/dist/core/banco/bloques.js +84 -0
  176. package/dist/core/banco/bloques.js.map +1 -0
  177. package/dist/core/banco/cargas.d.ts +84 -0
  178. package/dist/core/banco/cargas.d.ts.map +1 -0
  179. package/dist/core/banco/cargas.js +520 -0
  180. package/dist/core/banco/cargas.js.map +1 -0
  181. package/dist/core/banco/comparar.d.ts +29 -0
  182. package/dist/core/banco/comparar.d.ts.map +1 -0
  183. package/dist/core/banco/comparar.js +28 -0
  184. package/dist/core/banco/comparar.js.map +1 -0
  185. package/dist/core/banco/ejecutar.d.ts +44 -0
  186. package/dist/core/banco/ejecutar.d.ts.map +1 -0
  187. package/dist/core/banco/ejecutar.js +183 -0
  188. package/dist/core/banco/ejecutar.js.map +1 -0
  189. package/dist/core/banco/generar.d.ts +24 -0
  190. package/dist/core/banco/generar.d.ts.map +1 -0
  191. package/dist/core/banco/generar.js +159 -0
  192. package/dist/core/banco/generar.js.map +1 -0
  193. package/dist/core/banco/mutaciones.d.ts +25 -0
  194. package/dist/core/banco/mutaciones.d.ts.map +1 -0
  195. package/dist/core/banco/mutaciones.js +215 -0
  196. package/dist/core/banco/mutaciones.js.map +1 -0
  197. package/dist/core/banco/tipos.d.ts +121 -0
  198. package/dist/core/banco/tipos.d.ts.map +1 -0
  199. package/dist/core/banco/tipos.js +16 -0
  200. package/dist/core/banco/tipos.js.map +1 -0
  201. package/dist/core/blobs/almacen.d.ts +81 -0
  202. package/dist/core/blobs/almacen.d.ts.map +1 -0
  203. package/dist/core/blobs/almacen.js +198 -0
  204. package/dist/core/blobs/almacen.js.map +1 -0
  205. package/dist/core/blobs/broker.d.ts +103 -0
  206. package/dist/core/blobs/broker.d.ts.map +1 -0
  207. package/dist/core/blobs/broker.js +204 -0
  208. package/dist/core/blobs/broker.js.map +1 -0
  209. package/dist/core/blobs/index.d.ts +70 -0
  210. package/dist/core/blobs/index.d.ts.map +1 -0
  211. package/dist/core/blobs/index.js +232 -0
  212. package/dist/core/blobs/index.js.map +1 -0
  213. package/dist/core/blobs/payload.d.ts +55 -0
  214. package/dist/core/blobs/payload.d.ts.map +1 -0
  215. package/dist/core/blobs/payload.js +255 -0
  216. package/dist/core/blobs/payload.js.map +1 -0
  217. package/dist/core/blobs/proveedor.d.ts +85 -0
  218. package/dist/core/blobs/proveedor.d.ts.map +1 -0
  219. package/dist/core/blobs/proveedor.js +196 -0
  220. package/dist/core/blobs/proveedor.js.map +1 -0
  221. package/dist/core/browser/cdp.d.ts +41 -0
  222. package/dist/core/browser/cdp.d.ts.map +1 -0
  223. package/dist/core/browser/cdp.js +119 -0
  224. package/dist/core/browser/cdp.js.map +1 -0
  225. package/dist/core/browser/politica.d.ts +51 -0
  226. package/dist/core/browser/politica.d.ts.map +1 -0
  227. package/dist/core/browser/politica.js +123 -0
  228. package/dist/core/browser/politica.js.map +1 -0
  229. package/dist/core/browser/sesion.d.ts +52 -0
  230. package/dist/core/browser/sesion.d.ts.map +1 -0
  231. package/dist/core/browser/sesion.js +176 -0
  232. package/dist/core/browser/sesion.js.map +1 -0
  233. package/dist/core/browser/tools.d.ts +16 -0
  234. package/dist/core/browser/tools.d.ts.map +1 -0
  235. package/dist/core/browser/tools.js +279 -0
  236. package/dist/core/browser/tools.js.map +1 -0
  237. package/dist/core/commit/diff.d.ts +56 -0
  238. package/dist/core/commit/diff.d.ts.map +1 -0
  239. package/dist/core/commit/diff.js +145 -0
  240. package/dist/core/commit/diff.js.map +1 -0
  241. package/dist/core/commit/mensaje.d.ts +80 -0
  242. package/dist/core/commit/mensaje.d.ts.map +1 -0
  243. package/dist/core/commit/mensaje.js +207 -0
  244. package/dist/core/commit/mensaje.js.map +1 -0
  245. package/dist/core/compactar/index.d.ts +52 -0
  246. package/dist/core/compactar/index.d.ts.map +1 -0
  247. package/dist/core/compactar/index.js +91 -0
  248. package/dist/core/compactar/index.js.map +1 -0
  249. package/dist/core/compactar/registro-denso.d.ts +160 -0
  250. package/dist/core/compactar/registro-denso.d.ts.map +1 -0
  251. package/dist/core/compactar/registro-denso.js +620 -0
  252. package/dist/core/compactar/registro-denso.js.map +1 -0
  253. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  254. package/dist/core/compaction/branch-summarization.js +3 -0
  255. package/dist/core/compaction/branch-summarization.js.map +1 -1
  256. package/dist/core/compaction/compaction.d.ts +4 -3
  257. package/dist/core/compaction/compaction.d.ts.map +1 -1
  258. package/dist/core/compaction/compaction.js +41 -32
  259. package/dist/core/compaction/compaction.js.map +1 -1
  260. package/dist/core/computer/captura.d.ts +35 -0
  261. package/dist/core/computer/captura.d.ts.map +1 -0
  262. package/dist/core/computer/captura.js +140 -0
  263. package/dist/core/computer/captura.js.map +1 -0
  264. package/dist/core/computer/driver.d.ts +130 -0
  265. package/dist/core/computer/driver.d.ts.map +1 -0
  266. package/dist/core/computer/driver.js +206 -0
  267. package/dist/core/computer/driver.js.map +1 -0
  268. package/dist/core/computer/motor/actions.d.ts +109 -0
  269. package/dist/core/computer/motor/actions.d.ts.map +1 -0
  270. package/dist/core/computer/motor/actions.js +157 -0
  271. package/dist/core/computer/motor/actions.js.map +1 -0
  272. package/dist/core/computer/motor/bridge.d.ts +232 -0
  273. package/dist/core/computer/motor/bridge.d.ts.map +1 -0
  274. package/dist/core/computer/motor/bridge.js +2335 -0
  275. package/dist/core/computer/motor/bridge.js.map +1 -0
  276. package/dist/core/computer/motor/cdp.d.ts +107 -0
  277. package/dist/core/computer/motor/cdp.d.ts.map +1 -0
  278. package/dist/core/computer/motor/cdp.js +659 -0
  279. package/dist/core/computer/motor/cdp.js.map +1 -0
  280. package/dist/core/computer/motor/config.d.ts +23 -0
  281. package/dist/core/computer/motor/config.d.ts.map +1 -0
  282. package/dist/core/computer/motor/config.js +100 -0
  283. package/dist/core/computer/motor/config.js.map +1 -0
  284. package/dist/core/computer/motor/contract.d.ts +81 -0
  285. package/dist/core/computer/motor/contract.d.ts.map +1 -0
  286. package/dist/core/computer/motor/contract.js +14 -0
  287. package/dist/core/computer/motor/contract.js.map +1 -0
  288. package/dist/core/computer/motor/note.d.ts +37 -0
  289. package/dist/core/computer/motor/note.d.ts.map +1 -0
  290. package/dist/core/computer/motor/note.js +162 -0
  291. package/dist/core/computer/motor/note.js.map +1 -0
  292. package/dist/core/computer/motor/outline.d.ts +155 -0
  293. package/dist/core/computer/motor/outline.d.ts.map +1 -0
  294. package/dist/core/computer/motor/outline.js +590 -0
  295. package/dist/core/computer/motor/outline.js.map +1 -0
  296. package/dist/core/computer/motor/output.d.ts +18 -0
  297. package/dist/core/computer/motor/output.d.ts.map +1 -0
  298. package/dist/core/computer/motor/output.js +148 -0
  299. package/dist/core/computer/motor/output.js.map +1 -0
  300. package/dist/core/computer/motor/permissions.d.ts +41 -0
  301. package/dist/core/computer/motor/permissions.d.ts.map +1 -0
  302. package/dist/core/computer/motor/permissions.js +51 -0
  303. package/dist/core/computer/motor/permissions.js.map +1 -0
  304. package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
  305. package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
  306. package/dist/core/computer/motor/platform/architecture.js +21 -0
  307. package/dist/core/computer/motor/platform/architecture.js.map +1 -0
  308. package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
  309. package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
  310. package/dist/core/computer/motor/platform/coerce.js +17 -0
  311. package/dist/core/computer/motor/platform/coerce.js.map +1 -0
  312. package/dist/core/computer/motor/platform/index.d.ts +4 -0
  313. package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
  314. package/dist/core/computer/motor/platform/index.js +79 -0
  315. package/dist/core/computer/motor/platform/index.js.map +1 -0
  316. package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
  317. package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
  318. package/dist/core/computer/motor/platform/linux/backend.js +173 -0
  319. package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
  320. package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
  321. package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
  322. package/dist/core/computer/motor/platform/linux/helper.js +261 -0
  323. package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
  324. package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
  325. package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
  326. package/dist/core/computer/motor/platform/macos/backend.js +124 -0
  327. package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
  328. package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
  329. package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
  330. package/dist/core/computer/motor/platform/macos/browser.js +101 -0
  331. package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
  332. package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
  333. package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
  334. package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
  335. package/dist/core/computer/motor/platform/macos/helper.js +277 -0
  336. package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
  337. package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
  338. package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
  339. package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
  340. package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
  341. package/dist/core/computer/motor/platform/types.d.ts +263 -0
  342. package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
  343. package/dist/core/computer/motor/platform/types.js +2 -0
  344. package/dist/core/computer/motor/platform/types.js.map +1 -0
  345. package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
  346. package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
  347. package/dist/core/computer/motor/platform/windows/backend.js +163 -0
  348. package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
  349. package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
  350. package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
  351. package/dist/core/computer/motor/platform/windows/helper.js +174 -0
  352. package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
  353. package/dist/core/computer/motor/root-selection.d.ts +6 -0
  354. package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
  355. package/dist/core/computer/motor/root-selection.js +28 -0
  356. package/dist/core/computer/motor/root-selection.js.map +1 -0
  357. package/dist/core/computer/motor/runtime.d.ts +50 -0
  358. package/dist/core/computer/motor/runtime.d.ts.map +1 -0
  359. package/dist/core/computer/motor/runtime.js +119 -0
  360. package/dist/core/computer/motor/runtime.js.map +1 -0
  361. package/dist/core/computer/motor/state.d.ts +68 -0
  362. package/dist/core/computer/motor/state.d.ts.map +1 -0
  363. package/dist/core/computer/motor/state.js +100 -0
  364. package/dist/core/computer/motor/state.js.map +1 -0
  365. package/dist/core/computer/motor/view.d.ts +6 -0
  366. package/dist/core/computer/motor/view.d.ts.map +1 -0
  367. package/dist/core/computer/motor/view.js +185 -0
  368. package/dist/core/computer/motor/view.js.map +1 -0
  369. package/dist/core/computer/motor-ada.d.ts +159 -0
  370. package/dist/core/computer/motor-ada.d.ts.map +1 -0
  371. package/dist/core/computer/motor-ada.js +412 -0
  372. package/dist/core/computer/motor-ada.js.map +1 -0
  373. package/dist/core/computer/politica.d.ts +56 -0
  374. package/dist/core/computer/politica.d.ts.map +1 -0
  375. package/dist/core/computer/politica.js +163 -0
  376. package/dist/core/computer/politica.js.map +1 -0
  377. package/dist/core/computer/tools.d.ts +26 -0
  378. package/dist/core/computer/tools.d.ts.map +1 -0
  379. package/dist/core/computer/tools.js +399 -0
  380. package/dist/core/computer/tools.js.map +1 -0
  381. package/dist/core/context-breakdown.d.ts +80 -0
  382. package/dist/core/context-breakdown.d.ts.map +1 -0
  383. package/dist/core/context-breakdown.js +87 -0
  384. package/dist/core/context-breakdown.js.map +1 -0
  385. package/dist/core/credenciales/cliente.d.ts +60 -0
  386. package/dist/core/credenciales/cliente.d.ts.map +1 -0
  387. package/dist/core/credenciales/cliente.js +81 -0
  388. package/dist/core/credenciales/cliente.js.map +1 -0
  389. package/dist/core/credenciales/pool.d.ts +96 -0
  390. package/dist/core/credenciales/pool.d.ts.map +1 -0
  391. package/dist/core/credenciales/pool.js +128 -0
  392. package/dist/core/credenciales/pool.js.map +1 -0
  393. package/dist/core/credenciales/reposo.d.ts +93 -0
  394. package/dist/core/credenciales/reposo.d.ts.map +1 -0
  395. package/dist/core/credenciales/reposo.js +489 -0
  396. package/dist/core/credenciales/reposo.js.map +1 -0
  397. package/dist/core/credenciales/servidor.d.ts +55 -0
  398. package/dist/core/credenciales/servidor.d.ts.map +1 -0
  399. package/dist/core/credenciales/servidor.js +205 -0
  400. package/dist/core/credenciales/servidor.js.map +1 -0
  401. package/dist/core/defaults.d.ts +1 -0
  402. package/dist/core/defaults.d.ts.map +1 -1
  403. package/dist/core/defaults.js +9 -0
  404. package/dist/core/defaults.js.map +1 -1
  405. package/dist/core/descubrimiento/comandos.d.ts +30 -0
  406. package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
  407. package/dist/core/descubrimiento/comandos.js +76 -0
  408. package/dist/core/descubrimiento/comandos.js.map +1 -0
  409. package/dist/core/descubrimiento/mcp.d.ts +42 -0
  410. package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
  411. package/dist/core/descubrimiento/mcp.js +130 -0
  412. package/dist/core/descubrimiento/mcp.js.map +1 -0
  413. package/dist/core/descubrimiento/reglas.d.ts +61 -0
  414. package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
  415. package/dist/core/descubrimiento/reglas.js +134 -0
  416. package/dist/core/descubrimiento/reglas.js.map +1 -0
  417. package/dist/core/descubrimiento/skills.d.ts +57 -0
  418. package/dist/core/descubrimiento/skills.d.ts.map +1 -0
  419. package/dist/core/descubrimiento/skills.js +113 -0
  420. package/dist/core/descubrimiento/skills.js.map +1 -0
  421. package/dist/core/dificultad/clasificador.d.ts +133 -0
  422. package/dist/core/dificultad/clasificador.d.ts.map +1 -0
  423. package/dist/core/dificultad/clasificador.js +288 -0
  424. package/dist/core/dificultad/clasificador.js.map +1 -0
  425. package/dist/core/edicion/diario.d.ts +37 -0
  426. package/dist/core/edicion/diario.d.ts.map +1 -0
  427. package/dist/core/edicion/diario.js +51 -0
  428. package/dist/core/edicion/diario.js.map +1 -0
  429. package/dist/core/edicion/hashline.d.ts +71 -0
  430. package/dist/core/edicion/hashline.d.ts.map +1 -0
  431. package/dist/core/edicion/hashline.js +111 -0
  432. package/dist/core/edicion/hashline.js.map +1 -0
  433. package/dist/core/edicion/hueco.d.ts +64 -0
  434. package/dist/core/edicion/hueco.d.ts.map +1 -0
  435. package/dist/core/edicion/hueco.js +162 -0
  436. package/dist/core/edicion/hueco.js.map +1 -0
  437. package/dist/core/edicion/limpiar-carga.d.ts +39 -0
  438. package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
  439. package/dist/core/edicion/limpiar-carga.js +121 -0
  440. package/dist/core/edicion/limpiar-carga.js.map +1 -0
  441. package/dist/core/edicion/observador.d.ts +80 -0
  442. package/dist/core/edicion/observador.d.ts.map +1 -0
  443. package/dist/core/edicion/observador.js +183 -0
  444. package/dist/core/edicion/observador.js.map +1 -0
  445. package/dist/core/edicion/parecido.d.ts +53 -0
  446. package/dist/core/edicion/parecido.d.ts.map +1 -0
  447. package/dist/core/edicion/parecido.js +145 -0
  448. package/dist/core/edicion/parecido.js.map +1 -0
  449. package/dist/core/edicion/parseo.d.ts +58 -0
  450. package/dist/core/edicion/parseo.d.ts.map +1 -0
  451. package/dist/core/edicion/parseo.js +124 -0
  452. package/dist/core/edicion/parseo.js.map +1 -0
  453. package/dist/core/edicion/reparacion.d.ts +67 -0
  454. package/dist/core/edicion/reparacion.d.ts.map +1 -0
  455. package/dist/core/edicion/reparacion.js +202 -0
  456. package/dist/core/edicion/reparacion.js.map +1 -0
  457. package/dist/core/edicion/sangria.d.ts +121 -0
  458. package/dist/core/edicion/sangria.d.ts.map +1 -0
  459. package/dist/core/edicion/sangria.js +341 -0
  460. package/dist/core/edicion/sangria.js.map +1 -0
  461. package/dist/core/edicion/tipos.d.ts +58 -0
  462. package/dist/core/edicion/tipos.d.ts.map +1 -0
  463. package/dist/core/edicion/tipos.js +160 -0
  464. package/dist/core/edicion/tipos.js.map +1 -0
  465. package/dist/core/engine-personality.d.ts +12 -0
  466. package/dist/core/engine-personality.d.ts.map +1 -0
  467. package/dist/core/engine-personality.js +53 -0
  468. package/dist/core/engine-personality.js.map +1 -0
  469. package/dist/core/errores/proveedor.d.ts +53 -0
  470. package/dist/core/errores/proveedor.d.ts.map +1 -0
  471. package/dist/core/errores/proveedor.js +191 -0
  472. package/dist/core/errores/proveedor.js.map +1 -0
  473. package/dist/core/estructural/buscar.d.ts +61 -0
  474. package/dist/core/estructural/buscar.d.ts.map +1 -0
  475. package/dist/core/estructural/buscar.js +261 -0
  476. package/dist/core/estructural/buscar.js.map +1 -0
  477. package/dist/core/estructural/editar.d.ts +36 -0
  478. package/dist/core/estructural/editar.d.ts.map +1 -0
  479. package/dist/core/estructural/editar.js +123 -0
  480. package/dist/core/estructural/editar.js.map +1 -0
  481. package/dist/core/estructural/tools.d.ts +11 -0
  482. package/dist/core/estructural/tools.d.ts.map +1 -0
  483. package/dist/core/estructural/tools.js +100 -0
  484. package/dist/core/estructural/tools.js.map +1 -0
  485. package/dist/core/experimental.d.ts.map +1 -1
  486. package/dist/core/experimental.js +10 -1
  487. package/dist/core/experimental.js.map +1 -1
  488. package/dist/core/extensiones/suplantacion.d.ts +49 -0
  489. package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
  490. package/dist/core/extensiones/suplantacion.js +61 -0
  491. package/dist/core/extensiones/suplantacion.js.map +1 -0
  492. package/dist/core/extensiones/vigilancia.d.ts +54 -0
  493. package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
  494. package/dist/core/extensiones/vigilancia.js +217 -0
  495. package/dist/core/extensiones/vigilancia.js.map +1 -0
  496. package/dist/core/extensions/index.d.ts +1 -1
  497. package/dist/core/extensions/index.d.ts.map +1 -1
  498. package/dist/core/extensions/index.js.map +1 -1
  499. package/dist/core/extensions/loader.d.ts.map +1 -1
  500. package/dist/core/extensions/loader.js +21 -6
  501. package/dist/core/extensions/loader.js.map +1 -1
  502. package/dist/core/extensions/types.d.ts +23 -4
  503. package/dist/core/extensions/types.d.ts.map +1 -1
  504. package/dist/core/extensions/types.js.map +1 -1
  505. package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
  506. package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
  507. package/dist/core/harness/fuentes-de-contexto.js +44 -0
  508. package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
  509. package/dist/core/harness/refine.d.ts +40 -0
  510. package/dist/core/harness/refine.d.ts.map +1 -0
  511. package/dist/core/harness/refine.js +109 -0
  512. package/dist/core/harness/refine.js.map +1 -0
  513. package/dist/core/harness/store.d.ts +75 -0
  514. package/dist/core/harness/store.d.ts.map +1 -0
  515. package/dist/core/harness/store.js +149 -0
  516. package/dist/core/harness/store.js.map +1 -0
  517. package/dist/core/hooks/contract.d.ts +85 -0
  518. package/dist/core/hooks/contract.d.ts.map +1 -0
  519. package/dist/core/hooks/contract.js +140 -0
  520. package/dist/core/hooks/contract.js.map +1 -0
  521. package/dist/core/hooks/runner.d.ts +42 -0
  522. package/dist/core/hooks/runner.d.ts.map +1 -0
  523. package/dist/core/hooks/runner.js +85 -0
  524. package/dist/core/hooks/runner.js.map +1 -0
  525. package/dist/core/hooks/session-hooks.d.ts +62 -0
  526. package/dist/core/hooks/session-hooks.d.ts.map +1 -0
  527. package/dist/core/hooks/session-hooks.js +84 -0
  528. package/dist/core/hooks/session-hooks.js.map +1 -0
  529. package/dist/core/importar/formatos.d.ts +69 -0
  530. package/dist/core/importar/formatos.d.ts.map +1 -0
  531. package/dist/core/importar/formatos.js +235 -0
  532. package/dist/core/importar/formatos.js.map +1 -0
  533. package/dist/core/interactivo/deteccion.d.ts +44 -0
  534. package/dist/core/interactivo/deteccion.d.ts.map +1 -0
  535. package/dist/core/interactivo/deteccion.js +82 -0
  536. package/dist/core/interactivo/deteccion.js.map +1 -0
  537. package/dist/core/interactivo/sesion.d.ts +50 -0
  538. package/dist/core/interactivo/sesion.d.ts.map +1 -0
  539. package/dist/core/interactivo/sesion.js +156 -0
  540. package/dist/core/interactivo/sesion.js.map +1 -0
  541. package/dist/core/interactivo/tools.d.ts +21 -0
  542. package/dist/core/interactivo/tools.d.ts.map +1 -0
  543. package/dist/core/interactivo/tools.js +122 -0
  544. package/dist/core/interactivo/tools.js.map +1 -0
  545. package/dist/core/keybindings.d.ts.map +1 -1
  546. package/dist/core/keybindings.js +2 -1
  547. package/dist/core/keybindings.js.map +1 -1
  548. package/dist/core/lectura/mapa.d.ts +70 -0
  549. package/dist/core/lectura/mapa.d.ts.map +1 -0
  550. package/dist/core/lectura/mapa.js +177 -0
  551. package/dist/core/lectura/mapa.js.map +1 -0
  552. package/dist/core/lectura/pdf.d.ts +49 -0
  553. package/dist/core/lectura/pdf.d.ts.map +1 -0
  554. package/dist/core/lectura/pdf.js +337 -0
  555. package/dist/core/lectura/pdf.js.map +1 -0
  556. package/dist/core/limpieza/comprobadores.d.ts +28 -0
  557. package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
  558. package/dist/core/limpieza/comprobadores.js +311 -0
  559. package/dist/core/limpieza/comprobadores.js.map +1 -0
  560. package/dist/core/limpieza/parseo.d.ts +19 -0
  561. package/dist/core/limpieza/parseo.d.ts.map +1 -0
  562. package/dist/core/limpieza/parseo.js +124 -0
  563. package/dist/core/limpieza/parseo.js.map +1 -0
  564. package/dist/core/limpieza/reparacion.d.ts +77 -0
  565. package/dist/core/limpieza/reparacion.d.ts.map +1 -0
  566. package/dist/core/limpieza/reparacion.js +254 -0
  567. package/dist/core/limpieza/reparacion.js.map +1 -0
  568. package/dist/core/limpieza/tipos.d.ts +56 -0
  569. package/dist/core/limpieza/tipos.d.ts.map +1 -0
  570. package/dist/core/limpieza/tipos.js +9 -0
  571. package/dist/core/limpieza/tipos.js.map +1 -0
  572. package/dist/core/lsp/cliente.d.ts +52 -0
  573. package/dist/core/lsp/cliente.d.ts.map +1 -0
  574. package/dist/core/lsp/cliente.js +232 -0
  575. package/dist/core/lsp/cliente.js.map +1 -0
  576. package/dist/core/lsp/descubrimiento.d.ts +62 -0
  577. package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
  578. package/dist/core/lsp/descubrimiento.js +152 -0
  579. package/dist/core/lsp/descubrimiento.js.map +1 -0
  580. package/dist/core/lsp/ediciones.d.ts +59 -0
  581. package/dist/core/lsp/ediciones.d.ts.map +1 -0
  582. package/dist/core/lsp/ediciones.js +89 -0
  583. package/dist/core/lsp/ediciones.js.map +1 -0
  584. package/dist/core/lsp/extension.d.ts +28 -0
  585. package/dist/core/lsp/extension.d.ts.map +1 -0
  586. package/dist/core/lsp/extension.js +34 -0
  587. package/dist/core/lsp/extension.js.map +1 -0
  588. package/dist/core/lsp/tools.d.ts +45 -0
  589. package/dist/core/lsp/tools.d.ts.map +1 -0
  590. package/dist/core/lsp/tools.js +265 -0
  591. package/dist/core/lsp/tools.js.map +1 -0
  592. package/dist/core/mcp/client.d.ts +60 -0
  593. package/dist/core/mcp/client.d.ts.map +1 -0
  594. package/dist/core/mcp/client.js +139 -0
  595. package/dist/core/mcp/client.js.map +1 -0
  596. package/dist/core/mcp/manager.d.ts +86 -0
  597. package/dist/core/mcp/manager.d.ts.map +1 -0
  598. package/dist/core/mcp/manager.js +124 -0
  599. package/dist/core/mcp/manager.js.map +1 -0
  600. package/dist/core/mcp/tools.d.ts +15 -0
  601. package/dist/core/mcp/tools.d.ts.map +1 -0
  602. package/dist/core/mcp/tools.js +84 -0
  603. package/dist/core/mcp/tools.js.map +1 -0
  604. package/dist/core/memory-engine/audit-export.d.ts +56 -0
  605. package/dist/core/memory-engine/audit-export.d.ts.map +1 -0
  606. package/dist/core/memory-engine/audit-export.js +100 -0
  607. package/dist/core/memory-engine/audit-export.js.map +1 -0
  608. package/dist/core/memory-engine/audit-indice.d.ts +153 -0
  609. package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
  610. package/dist/core/memory-engine/audit-indice.js +271 -0
  611. package/dist/core/memory-engine/audit-indice.js.map +1 -0
  612. package/dist/core/memory-engine/audit.d.ts +18 -6
  613. package/dist/core/memory-engine/audit.d.ts.map +1 -1
  614. package/dist/core/memory-engine/audit.js +32 -50
  615. package/dist/core/memory-engine/audit.js.map +1 -1
  616. package/dist/core/memory-engine/engine.d.ts +21 -4
  617. package/dist/core/memory-engine/engine.d.ts.map +1 -1
  618. package/dist/core/memory-engine/engine.js +219 -55
  619. package/dist/core/memory-engine/engine.js.map +1 -1
  620. package/dist/core/memory-engine/inverted-index.d.ts.map +1 -1
  621. package/dist/core/memory-engine/inverted-index.js +67 -10
  622. package/dist/core/memory-engine/inverted-index.js.map +1 -1
  623. package/dist/core/memory-engine/keychain.d.ts.map +1 -1
  624. package/dist/core/memory-engine/keychain.js +1 -6
  625. package/dist/core/memory-engine/keychain.js.map +1 -1
  626. package/dist/core/memory-engine/observation-store.d.ts +0 -1
  627. package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
  628. package/dist/core/memory-engine/observation-store.js +40 -12
  629. package/dist/core/memory-engine/observation-store.js.map +1 -1
  630. package/dist/core/memory-engine/refinements.d.ts +51 -0
  631. package/dist/core/memory-engine/refinements.d.ts.map +1 -0
  632. package/dist/core/memory-engine/refinements.js +99 -0
  633. package/dist/core/memory-engine/refinements.js.map +1 -0
  634. package/dist/core/memory-engine/scanner.d.ts.map +1 -1
  635. package/dist/core/memory-engine/scanner.js +25 -5
  636. package/dist/core/memory-engine/scanner.js.map +1 -1
  637. package/dist/core/memory-engine/security.d.ts.map +1 -1
  638. package/dist/core/memory-engine/security.js +131 -23
  639. package/dist/core/memory-engine/security.js.map +1 -1
  640. package/dist/core/memory-engine/session-indexer.d.ts.map +1 -1
  641. package/dist/core/memory-engine/session-indexer.js +8 -2
  642. package/dist/core/memory-engine/session-indexer.js.map +1 -1
  643. package/dist/core/memory-engine/tools.d.ts +2 -2
  644. package/dist/core/memory-engine/tools.d.ts.map +1 -1
  645. package/dist/core/memory-engine/tools.js +41 -8
  646. package/dist/core/memory-engine/tools.js.map +1 -1
  647. package/dist/core/memory-engine/types.d.ts +2 -0
  648. package/dist/core/memory-engine/types.d.ts.map +1 -1
  649. package/dist/core/memory-engine/types.js.map +1 -1
  650. package/dist/core/memory-engine/vault.d.ts.map +1 -1
  651. package/dist/core/memory-engine/vault.js +2 -2
  652. package/dist/core/memory-engine/vault.js.map +1 -1
  653. package/dist/core/model-config.d.ts.map +1 -1
  654. package/dist/core/model-config.js +2 -1
  655. package/dist/core/model-config.js.map +1 -1
  656. package/dist/core/model-resolver.d.ts +1 -0
  657. package/dist/core/model-resolver.d.ts.map +1 -1
  658. package/dist/core/model-resolver.js +19 -7
  659. package/dist/core/model-resolver.js.map +1 -1
  660. package/dist/core/models-store.d.ts.map +1 -1
  661. package/dist/core/models-store.js +2 -1
  662. package/dist/core/models-store.js.map +1 -1
  663. package/dist/core/muestreo-restringido.d.ts +49 -0
  664. package/dist/core/muestreo-restringido.d.ts.map +1 -0
  665. package/dist/core/muestreo-restringido.js +65 -0
  666. package/dist/core/muestreo-restringido.js.map +1 -0
  667. package/dist/core/orphan-process-journal.d.ts +48 -0
  668. package/dist/core/orphan-process-journal.d.ts.map +1 -0
  669. package/dist/core/orphan-process-journal.js +116 -0
  670. package/dist/core/orphan-process-journal.js.map +1 -0
  671. package/dist/core/package-manager.d.ts.map +1 -1
  672. package/dist/core/package-manager.js +11 -6
  673. package/dist/core/package-manager.js.map +1 -1
  674. package/dist/core/pi-manifest.d.ts.map +1 -1
  675. package/dist/core/pi-manifest.js +2 -1
  676. package/dist/core/pi-manifest.js.map +1 -1
  677. package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
  678. package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
  679. package/dist/core/privacidad/categorias-especiales.js +745 -0
  680. package/dist/core/privacidad/categorias-especiales.js.map +1 -0
  681. package/dist/core/privacidad/tapar.d.ts +48 -0
  682. package/dist/core/privacidad/tapar.d.ts.map +1 -0
  683. package/dist/core/privacidad/tapar.js +66 -0
  684. package/dist/core/privacidad/tapar.js.map +1 -0
  685. package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
  686. package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
  687. package/dist/core/prompt-cache/diagnostics.js +100 -0
  688. package/dist/core/prompt-cache/diagnostics.js.map +1 -0
  689. package/dist/core/prompt-cache/index.d.ts +33 -0
  690. package/dist/core/prompt-cache/index.d.ts.map +1 -0
  691. package/dist/core/prompt-cache/index.js +189 -0
  692. package/dist/core/prompt-cache/index.js.map +1 -0
  693. package/dist/core/prompt-cache/payload.d.ts +58 -0
  694. package/dist/core/prompt-cache/payload.d.ts.map +1 -0
  695. package/dist/core/prompt-cache/payload.js +122 -0
  696. package/dist/core/prompt-cache/payload.js.map +1 -0
  697. package/dist/core/prompt-cache/stabilize.d.ts +65 -0
  698. package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
  699. package/dist/core/prompt-cache/stabilize.js +137 -0
  700. package/dist/core/prompt-cache/stabilize.js.map +1 -0
  701. package/dist/core/prompt-cache/stats.d.ts +55 -0
  702. package/dist/core/prompt-cache/stats.d.ts.map +1 -0
  703. package/dist/core/prompt-cache/stats.js +158 -0
  704. package/dist/core/prompt-cache/stats.js.map +1 -0
  705. package/dist/core/prompt-eleccion.d.ts +38 -0
  706. package/dist/core/prompt-eleccion.d.ts.map +1 -0
  707. package/dist/core/prompt-eleccion.js +46 -0
  708. package/dist/core/prompt-eleccion.js.map +1 -0
  709. package/dist/core/prompt-optimizer.d.ts +53 -0
  710. package/dist/core/prompt-optimizer.d.ts.map +1 -0
  711. package/dist/core/prompt-optimizer.js +138 -0
  712. package/dist/core/prompt-optimizer.js.map +1 -0
  713. package/dist/core/prompts/montar.d.ts +75 -0
  714. package/dist/core/prompts/montar.d.ts.map +1 -0
  715. package/dist/core/prompts/montar.js +146 -0
  716. package/dist/core/prompts/montar.js.map +1 -0
  717. package/dist/core/prompts/plantilla.d.ts +54 -0
  718. package/dist/core/prompts/plantilla.d.ts.map +1 -0
  719. package/dist/core/prompts/plantilla.js +153 -0
  720. package/dist/core/prompts/plantilla.js.map +1 -0
  721. package/dist/core/prompts/sistema.md +134 -0
  722. package/dist/core/provider-attribution.d.ts +24 -2
  723. package/dist/core/provider-attribution.d.ts.map +1 -1
  724. package/dist/core/provider-attribution.js +24 -42
  725. package/dist/core/provider-attribution.js.map +1 -1
  726. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  727. package/dist/core/remote-catalog-provider.js +2 -1
  728. package/dist/core/remote-catalog-provider.js.map +1 -1
  729. package/dist/core/remoto/destino.d.ts +38 -0
  730. package/dist/core/remoto/destino.d.ts.map +1 -0
  731. package/dist/core/remoto/destino.js +105 -0
  732. package/dist/core/remoto/destino.js.map +1 -0
  733. package/dist/core/remoto/ejecutor.d.ts +59 -0
  734. package/dist/core/remoto/ejecutor.d.ts.map +1 -0
  735. package/dist/core/remoto/ejecutor.js +225 -0
  736. package/dist/core/remoto/ejecutor.js.map +1 -0
  737. package/dist/core/remoto/ficheros.d.ts +29 -0
  738. package/dist/core/remoto/ficheros.d.ts.map +1 -0
  739. package/dist/core/remoto/ficheros.js +90 -0
  740. package/dist/core/remoto/ficheros.js.map +1 -0
  741. package/dist/core/remoto/registro-extension.d.ts +15 -0
  742. package/dist/core/remoto/registro-extension.d.ts.map +1 -0
  743. package/dist/core/remoto/registro-extension.js +17 -0
  744. package/dist/core/remoto/registro-extension.js.map +1 -0
  745. package/dist/core/remoto/tools.d.ts +28 -0
  746. package/dist/core/remoto/tools.d.ts.map +1 -0
  747. package/dist/core/remoto/tools.js +31 -0
  748. package/dist/core/remoto/tools.js.map +1 -0
  749. package/dist/core/resource-loader.d.ts +58 -0
  750. package/dist/core/resource-loader.d.ts.map +1 -1
  751. package/dist/core/resource-loader.js +326 -8
  752. package/dist/core/resource-loader.js.map +1 -1
  753. package/dist/core/revision/hallazgo.d.ts +51 -0
  754. package/dist/core/revision/hallazgo.d.ts.map +1 -0
  755. package/dist/core/revision/hallazgo.js +73 -0
  756. package/dist/core/revision/hallazgo.js.map +1 -0
  757. package/dist/core/revision/revisor.d.ts +81 -0
  758. package/dist/core/revision/revisor.d.ts.map +1 -0
  759. package/dist/core/revision/revisor.js +132 -0
  760. package/dist/core/revision/revisor.js.map +1 -0
  761. package/dist/core/revision/sarif.d.ts +30 -0
  762. package/dist/core/revision/sarif.d.ts.map +1 -0
  763. package/dist/core/revision/sarif.js +83 -0
  764. package/dist/core/revision/sarif.js.map +1 -0
  765. package/dist/core/scheduler/scheduler.d.ts +87 -0
  766. package/dist/core/scheduler/scheduler.d.ts.map +1 -0
  767. package/dist/core/scheduler/scheduler.js +178 -0
  768. package/dist/core/scheduler/scheduler.js.map +1 -0
  769. package/dist/core/sdk.d.ts +8 -0
  770. package/dist/core/sdk.d.ts.map +1 -1
  771. package/dist/core/sdk.js +11 -1
  772. package/dist/core/sdk.js.map +1 -1
  773. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
  774. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
  775. package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
  776. package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
  777. package/dist/core/session-manager.d.ts.map +1 -1
  778. package/dist/core/session-manager.js +2 -1
  779. package/dist/core/session-manager.js.map +1 -1
  780. package/dist/core/settings-diagnostics.d.ts +9 -0
  781. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  782. package/dist/core/settings-diagnostics.js +21 -0
  783. package/dist/core/settings-diagnostics.js.map +1 -0
  784. package/dist/core/settings-manager.d.ts +156 -0
  785. package/dist/core/settings-manager.d.ts.map +1 -1
  786. package/dist/core/settings-manager.js +255 -10
  787. package/dist/core/settings-manager.js.map +1 -1
  788. package/dist/core/skills.d.ts.map +1 -1
  789. package/dist/core/skills.js +51 -33
  790. package/dist/core/skills.js.map +1 -1
  791. package/dist/core/slash-commands.d.ts.map +1 -1
  792. package/dist/core/slash-commands.js +2 -1
  793. package/dist/core/slash-commands.js.map +1 -1
  794. package/dist/core/system-prompt.d.ts +17 -0
  795. package/dist/core/system-prompt.d.ts.map +1 -1
  796. package/dist/core/system-prompt.js +13 -5
  797. package/dist/core/system-prompt.js.map +1 -1
  798. package/dist/core/telemetria/otlp.d.ts +122 -0
  799. package/dist/core/telemetria/otlp.d.ts.map +1 -0
  800. package/dist/core/telemetria/otlp.js +373 -0
  801. package/dist/core/telemetria/otlp.js.map +1 -0
  802. package/dist/core/tools/coercion-argumentos.d.ts +48 -0
  803. package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
  804. package/dist/core/tools/coercion-argumentos.js +99 -0
  805. package/dist/core/tools/coercion-argumentos.js.map +1 -0
  806. package/dist/core/tools/edit-diff.d.ts +0 -12
  807. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  808. package/dist/core/tools/edit-diff.js +234 -12
  809. package/dist/core/tools/edit-diff.js.map +1 -1
  810. package/dist/core/tools/edit.d.ts.map +1 -1
  811. package/dist/core/tools/edit.js +28 -5
  812. package/dist/core/tools/edit.js.map +1 -1
  813. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  814. package/dist/core/tools/file-mutation-queue.js +5 -0
  815. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  816. package/dist/core/tools/index.d.ts.map +1 -1
  817. package/dist/core/tools/index.js +2 -2
  818. package/dist/core/tools/index.js.map +1 -1
  819. package/dist/core/tools/json-tolerante.d.ts +30 -0
  820. package/dist/core/tools/json-tolerante.d.ts.map +1 -0
  821. package/dist/core/tools/json-tolerante.js +70 -0
  822. package/dist/core/tools/json-tolerante.js.map +1 -0
  823. package/dist/core/tools/project-memory-tool.d.ts.map +1 -1
  824. package/dist/core/tools/project-memory-tool.js +4 -1
  825. package/dist/core/tools/project-memory-tool.js.map +1 -1
  826. package/dist/core/tools/read.d.ts.map +1 -1
  827. package/dist/core/tools/read.js +17 -0
  828. package/dist/core/tools/read.js.map +1 -1
  829. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
  830. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  831. package/dist/core/tools/tool-definition-wrapper.js +17 -1
  832. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  833. package/dist/core/trust-manager.d.ts.map +1 -1
  834. package/dist/core/trust-manager.js +2 -1
  835. package/dist/core/trust-manager.js.map +1 -1
  836. package/dist/core/turno-vacio/detectar.d.ts +38 -0
  837. package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
  838. package/dist/core/turno-vacio/detectar.js +66 -0
  839. package/dist/core/turno-vacio/detectar.js.map +1 -0
  840. package/dist/core/undo/journal.d.ts +57 -0
  841. package/dist/core/undo/journal.d.ts.map +1 -0
  842. package/dist/core/undo/journal.js +178 -0
  843. package/dist/core/undo/journal.js.map +1 -0
  844. package/dist/core/urls-internas/auditoria.d.ts +10 -0
  845. package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
  846. package/dist/core/urls-internas/auditoria.js +42 -0
  847. package/dist/core/urls-internas/auditoria.js.map +1 -0
  848. package/dist/core/urls-internas/boveda.d.ts +13 -0
  849. package/dist/core/urls-internas/boveda.d.ts.map +1 -0
  850. package/dist/core/urls-internas/boveda.js +40 -0
  851. package/dist/core/urls-internas/boveda.js.map +1 -0
  852. package/dist/core/urls-internas/lector.d.ts +30 -0
  853. package/dist/core/urls-internas/lector.d.ts.map +1 -0
  854. package/dist/core/urls-internas/lector.js +56 -0
  855. package/dist/core/urls-internas/lector.js.map +1 -0
  856. package/dist/core/urls-internas/memoria.d.ts +11 -0
  857. package/dist/core/urls-internas/memoria.d.ts.map +1 -0
  858. package/dist/core/urls-internas/memoria.js +25 -0
  859. package/dist/core/urls-internas/memoria.js.map +1 -0
  860. package/dist/core/urls-internas/parse.d.ts +28 -0
  861. package/dist/core/urls-internas/parse.d.ts.map +1 -0
  862. package/dist/core/urls-internas/parse.js +32 -0
  863. package/dist/core/urls-internas/parse.js.map +1 -0
  864. package/dist/core/urls-internas/reglas.d.ts +10 -0
  865. package/dist/core/urls-internas/reglas.d.ts.map +1 -0
  866. package/dist/core/urls-internas/reglas.js +31 -0
  867. package/dist/core/urls-internas/reglas.js.map +1 -0
  868. package/dist/core/usage/aggregate.d.ts +68 -0
  869. package/dist/core/usage/aggregate.d.ts.map +1 -0
  870. package/dist/core/usage/aggregate.js +93 -0
  871. package/dist/core/usage/aggregate.js.map +1 -0
  872. package/dist/core/usage/cuota/anthropic.d.ts +10 -0
  873. package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
  874. package/dist/core/usage/cuota/anthropic.js +63 -0
  875. package/dist/core/usage/cuota/anthropic.js.map +1 -0
  876. package/dist/core/usage/cuota/cache.d.ts +20 -0
  877. package/dist/core/usage/cuota/cache.d.ts.map +1 -0
  878. package/dist/core/usage/cuota/cache.js +36 -0
  879. package/dist/core/usage/cuota/cache.js.map +1 -0
  880. package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
  881. package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
  882. package/dist/core/usage/cuota/github-copilot.js +67 -0
  883. package/dist/core/usage/cuota/github-copilot.js.map +1 -0
  884. package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
  885. package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
  886. package/dist/core/usage/cuota/google-gemini.js +72 -0
  887. package/dist/core/usage/cuota/google-gemini.js.map +1 -0
  888. package/dist/core/usage/cuota/index.d.ts +25 -0
  889. package/dist/core/usage/cuota/index.d.ts.map +1 -0
  890. package/dist/core/usage/cuota/index.js +50 -0
  891. package/dist/core/usage/cuota/index.js.map +1 -0
  892. package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
  893. package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
  894. package/dist/core/usage/cuota/openai-codex.js +59 -0
  895. package/dist/core/usage/cuota/openai-codex.js.map +1 -0
  896. package/dist/core/usage/cuota/openrouter.d.ts +10 -0
  897. package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
  898. package/dist/core/usage/cuota/openrouter.js +47 -0
  899. package/dist/core/usage/cuota/openrouter.js.map +1 -0
  900. package/dist/core/usage/cuota/tipos.d.ts +50 -0
  901. package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
  902. package/dist/core/usage/cuota/tipos.js +25 -0
  903. package/dist/core/usage/cuota/tipos.js.map +1 -0
  904. package/dist/core/web/busqueda-nativa.d.ts +82 -0
  905. package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
  906. package/dist/core/web/busqueda-nativa.js +163 -0
  907. package/dist/core/web/busqueda-nativa.js.map +1 -0
  908. package/dist/core/web/destino.d.ts +58 -0
  909. package/dist/core/web/destino.d.ts.map +1 -0
  910. package/dist/core/web/destino.js +127 -0
  911. package/dist/core/web/destino.js.map +1 -0
  912. package/dist/core/web/proveedores/brave.d.ts +6 -0
  913. package/dist/core/web/proveedores/brave.d.ts.map +1 -0
  914. package/dist/core/web/proveedores/brave.js +20 -0
  915. package/dist/core/web/proveedores/brave.js.map +1 -0
  916. package/dist/core/web/proveedores/claves.d.ts +19 -0
  917. package/dist/core/web/proveedores/claves.d.ts.map +1 -0
  918. package/dist/core/web/proveedores/claves.js +36 -0
  919. package/dist/core/web/proveedores/claves.js.map +1 -0
  920. package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
  921. package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
  922. package/dist/core/web/proveedores/duckduckgo.js +109 -0
  923. package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
  924. package/dist/core/web/proveedores/ecosia.d.ts +3 -0
  925. package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
  926. package/dist/core/web/proveedores/ecosia.js +72 -0
  927. package/dist/core/web/proveedores/ecosia.js.map +1 -0
  928. package/dist/core/web/proveedores/exa.d.ts +6 -0
  929. package/dist/core/web/proveedores/exa.d.ts.map +1 -0
  930. package/dist/core/web/proveedores/exa.js +24 -0
  931. package/dist/core/web/proveedores/exa.js.map +1 -0
  932. package/dist/core/web/proveedores/mojeek.d.ts +3 -0
  933. package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
  934. package/dist/core/web/proveedores/mojeek.js +65 -0
  935. package/dist/core/web/proveedores/mojeek.js.map +1 -0
  936. package/dist/core/web/proveedores/navegador.d.ts +10 -0
  937. package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
  938. package/dist/core/web/proveedores/navegador.js +13 -0
  939. package/dist/core/web/proveedores/navegador.js.map +1 -0
  940. package/dist/core/web/proveedores/registro.d.ts +43 -0
  941. package/dist/core/web/proveedores/registro.d.ts.map +1 -0
  942. package/dist/core/web/proveedores/registro.js +49 -0
  943. package/dist/core/web/proveedores/registro.js.map +1 -0
  944. package/dist/core/web/proveedores/searxng.d.ts +9 -0
  945. package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
  946. package/dist/core/web/proveedores/searxng.js +17 -0
  947. package/dist/core/web/proveedores/searxng.js.map +1 -0
  948. package/dist/core/web/proveedores/serper.d.ts +9 -0
  949. package/dist/core/web/proveedores/serper.d.ts.map +1 -0
  950. package/dist/core/web/proveedores/serper.js +19 -0
  951. package/dist/core/web/proveedores/serper.js.map +1 -0
  952. package/dist/core/web/proveedores/tavily.d.ts +6 -0
  953. package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
  954. package/dist/core/web/proveedores/tavily.js +19 -0
  955. package/dist/core/web/proveedores/tavily.js.map +1 -0
  956. package/dist/core/web/proveedores/tipos.d.ts +36 -0
  957. package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
  958. package/dist/core/web/proveedores/tipos.js +10 -0
  959. package/dist/core/web/proveedores/tipos.js.map +1 -0
  960. package/dist/core/web/registro-red.d.ts +43 -0
  961. package/dist/core/web/registro-red.d.ts.map +1 -0
  962. package/dist/core/web/registro-red.js +86 -0
  963. package/dist/core/web/registro-red.js.map +1 -0
  964. package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
  965. package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
  966. package/dist/core/web/scrapers/cisa-kev.js +38 -0
  967. package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
  968. package/dist/core/web/scrapers/crates-io.d.ts +11 -0
  969. package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
  970. package/dist/core/web/scrapers/crates-io.js +29 -0
  971. package/dist/core/web/scrapers/crates-io.js.map +1 -0
  972. package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
  973. package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
  974. package/dist/core/web/scrapers/docs-rs.js +35 -0
  975. package/dist/core/web/scrapers/docs-rs.js.map +1 -0
  976. package/dist/core/web/scrapers/github.d.ts +3 -0
  977. package/dist/core/web/scrapers/github.d.ts.map +1 -0
  978. package/dist/core/web/scrapers/github.js +72 -0
  979. package/dist/core/web/scrapers/github.js.map +1 -0
  980. package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
  981. package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
  982. package/dist/core/web/scrapers/go-pkg.js +30 -0
  983. package/dist/core/web/scrapers/go-pkg.js.map +1 -0
  984. package/dist/core/web/scrapers/hex.d.ts +6 -0
  985. package/dist/core/web/scrapers/hex.d.ts.map +1 -0
  986. package/dist/core/web/scrapers/hex.js +27 -0
  987. package/dist/core/web/scrapers/hex.js.map +1 -0
  988. package/dist/core/web/scrapers/maven.d.ts +8 -0
  989. package/dist/core/web/scrapers/maven.d.ts.map +1 -0
  990. package/dist/core/web/scrapers/maven.js +41 -0
  991. package/dist/core/web/scrapers/maven.js.map +1 -0
  992. package/dist/core/web/scrapers/mdn.d.ts +6 -0
  993. package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
  994. package/dist/core/web/scrapers/mdn.js +28 -0
  995. package/dist/core/web/scrapers/mdn.js.map +1 -0
  996. package/dist/core/web/scrapers/npm.d.ts +11 -0
  997. package/dist/core/web/scrapers/npm.d.ts.map +1 -0
  998. package/dist/core/web/scrapers/npm.js +57 -0
  999. package/dist/core/web/scrapers/npm.js.map +1 -0
  1000. package/dist/core/web/scrapers/nuget.d.ts +8 -0
  1001. package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
  1002. package/dist/core/web/scrapers/nuget.js +22 -0
  1003. package/dist/core/web/scrapers/nuget.js.map +1 -0
  1004. package/dist/core/web/scrapers/nvd.d.ts +7 -0
  1005. package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
  1006. package/dist/core/web/scrapers/nvd.js +37 -0
  1007. package/dist/core/web/scrapers/nvd.js.map +1 -0
  1008. package/dist/core/web/scrapers/pypi.d.ts +6 -0
  1009. package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
  1010. package/dist/core/web/scrapers/pypi.js +31 -0
  1011. package/dist/core/web/scrapers/pypi.js.map +1 -0
  1012. package/dist/core/web/scrapers/registro.d.ts +13 -0
  1013. package/dist/core/web/scrapers/registro.d.ts.map +1 -0
  1014. package/dist/core/web/scrapers/registro.js +65 -0
  1015. package/dist/core/web/scrapers/registro.js.map +1 -0
  1016. package/dist/core/web/scrapers/rubygems.d.ts +6 -0
  1017. package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
  1018. package/dist/core/web/scrapers/rubygems.js +23 -0
  1019. package/dist/core/web/scrapers/rubygems.js.map +1 -0
  1020. package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
  1021. package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
  1022. package/dist/core/web/scrapers/stackoverflow.js +46 -0
  1023. package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
  1024. package/dist/core/web/scrapers/tipos.d.ts +42 -0
  1025. package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
  1026. package/dist/core/web/scrapers/tipos.js +23 -0
  1027. package/dist/core/web/scrapers/tipos.js.map +1 -0
  1028. package/dist/core/web/texto.d.ts +10 -0
  1029. package/dist/core/web/texto.d.ts.map +1 -0
  1030. package/dist/core/web/texto.js +26 -0
  1031. package/dist/core/web/texto.js.map +1 -0
  1032. package/dist/core/web/tools.d.ts +91 -0
  1033. package/dist/core/web/tools.d.ts.map +1 -0
  1034. package/dist/core/web/tools.js +304 -0
  1035. package/dist/core/web/tools.js.map +1 -0
  1036. package/dist/core/wiki/almacen.d.ts +33 -0
  1037. package/dist/core/wiki/almacen.d.ts.map +1 -0
  1038. package/dist/core/wiki/almacen.js +93 -0
  1039. package/dist/core/wiki/almacen.js.map +1 -0
  1040. package/dist/core/wiki/citas.d.ts +111 -0
  1041. package/dist/core/wiki/citas.d.ts.map +1 -0
  1042. package/dist/core/wiki/citas.js +146 -0
  1043. package/dist/core/wiki/citas.js.map +1 -0
  1044. package/dist/core/workflows/agent-runner.d.ts +88 -0
  1045. package/dist/core/workflows/agent-runner.d.ts.map +1 -0
  1046. package/dist/core/workflows/agent-runner.js +312 -0
  1047. package/dist/core/workflows/agent-runner.js.map +1 -0
  1048. package/dist/core/workflows/builtins.d.ts +41 -0
  1049. package/dist/core/workflows/builtins.d.ts.map +1 -0
  1050. package/dist/core/workflows/builtins.js +283 -0
  1051. package/dist/core/workflows/builtins.js.map +1 -0
  1052. package/dist/core/workflows/contrato/esquema.d.ts +32 -0
  1053. package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
  1054. package/dist/core/workflows/contrato/esquema.js +25 -0
  1055. package/dist/core/workflows/contrato/esquema.js.map +1 -0
  1056. package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
  1057. package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
  1058. package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
  1059. package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
  1060. package/dist/core/workflows/contrato/validador.d.ts +30 -0
  1061. package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
  1062. package/dist/core/workflows/contrato/validador.js +56 -0
  1063. package/dist/core/workflows/contrato/validador.js.map +1 -0
  1064. package/dist/core/workflows/contrato/yield.d.ts +65 -0
  1065. package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
  1066. package/dist/core/workflows/contrato/yield.js +80 -0
  1067. package/dist/core/workflows/contrato/yield.js.map +1 -0
  1068. package/dist/core/workflows/goal-engine/engine.d.ts +151 -0
  1069. package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -0
  1070. package/dist/core/workflows/goal-engine/engine.js +503 -0
  1071. package/dist/core/workflows/goal-engine/engine.js.map +1 -0
  1072. package/dist/core/workflows/goal-engine/errors.d.ts +7 -0
  1073. package/dist/core/workflows/goal-engine/errors.d.ts.map +1 -0
  1074. package/dist/core/workflows/goal-engine/errors.js +9 -0
  1075. package/dist/core/workflows/goal-engine/errors.js.map +1 -0
  1076. package/dist/core/workflows/goal-engine/index.d.ts +13 -0
  1077. package/dist/core/workflows/goal-engine/index.d.ts.map +1 -0
  1078. package/dist/core/workflows/goal-engine/index.js +8 -0
  1079. package/dist/core/workflows/goal-engine/index.js.map +1 -0
  1080. package/dist/core/workflows/goal-engine/persistence.d.ts +31 -0
  1081. package/dist/core/workflows/goal-engine/persistence.d.ts.map +1 -0
  1082. package/dist/core/workflows/goal-engine/persistence.js +145 -0
  1083. package/dist/core/workflows/goal-engine/persistence.js.map +1 -0
  1084. package/dist/core/workflows/goal-engine/prompts.d.ts +37 -0
  1085. package/dist/core/workflows/goal-engine/prompts.d.ts.map +1 -0
  1086. package/dist/core/workflows/goal-engine/prompts.js +131 -0
  1087. package/dist/core/workflows/goal-engine/prompts.js.map +1 -0
  1088. package/dist/core/workflows/goal-engine/state.d.ts +41 -0
  1089. package/dist/core/workflows/goal-engine/state.d.ts.map +1 -0
  1090. package/dist/core/workflows/goal-engine/state.js +397 -0
  1091. package/dist/core/workflows/goal-engine/state.js.map +1 -0
  1092. package/dist/core/workflows/goal-engine/tools.d.ts +31 -0
  1093. package/dist/core/workflows/goal-engine/tools.d.ts.map +1 -0
  1094. package/dist/core/workflows/goal-engine/tools.js +211 -0
  1095. package/dist/core/workflows/goal-engine/tools.js.map +1 -0
  1096. package/dist/core/workflows/goal-engine/types.d.ts +286 -0
  1097. package/dist/core/workflows/goal-engine/types.d.ts.map +1 -0
  1098. package/dist/core/workflows/goal-engine/types.js +17 -0
  1099. package/dist/core/workflows/goal-engine/types.js.map +1 -0
  1100. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts +23 -0
  1101. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts.map +1 -0
  1102. package/dist/core/workflows/goal-engine/worktree-fingerprint.js +72 -0
  1103. package/dist/core/workflows/goal-engine/worktree-fingerprint.js.map +1 -0
  1104. package/dist/core/workflows/graph-sync.d.ts +67 -0
  1105. package/dist/core/workflows/graph-sync.d.ts.map +1 -0
  1106. package/dist/core/workflows/graph-sync.js +188 -0
  1107. package/dist/core/workflows/graph-sync.js.map +1 -0
  1108. package/dist/core/workflows/graph.d.ts +143 -0
  1109. package/dist/core/workflows/graph.d.ts.map +1 -0
  1110. package/dist/core/workflows/graph.js +319 -0
  1111. package/dist/core/workflows/graph.js.map +1 -0
  1112. package/dist/core/workflows/index.d.ts +26 -0
  1113. package/dist/core/workflows/index.d.ts.map +1 -0
  1114. package/dist/core/workflows/index.js +18 -0
  1115. package/dist/core/workflows/index.js.map +1 -0
  1116. package/dist/core/workflows/journal.d.ts +68 -0
  1117. package/dist/core/workflows/journal.d.ts.map +1 -0
  1118. package/dist/core/workflows/journal.js +83 -0
  1119. package/dist/core/workflows/journal.js.map +1 -0
  1120. package/dist/core/workflows/manager.d.ts +122 -0
  1121. package/dist/core/workflows/manager.d.ts.map +1 -0
  1122. package/dist/core/workflows/manager.js +351 -0
  1123. package/dist/core/workflows/manager.js.map +1 -0
  1124. package/dist/core/workflows/resolve-script.d.ts +35 -0
  1125. package/dist/core/workflows/resolve-script.d.ts.map +1 -0
  1126. package/dist/core/workflows/resolve-script.js +66 -0
  1127. package/dist/core/workflows/resolve-script.js.map +1 -0
  1128. package/dist/core/workflows/runtime.d.ts +62 -0
  1129. package/dist/core/workflows/runtime.d.ts.map +1 -0
  1130. package/dist/core/workflows/runtime.js +380 -0
  1131. package/dist/core/workflows/runtime.js.map +1 -0
  1132. package/dist/core/workflows/save-as-skill.d.ts +27 -0
  1133. package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
  1134. package/dist/core/workflows/save-as-skill.js +54 -0
  1135. package/dist/core/workflows/save-as-skill.js.map +1 -0
  1136. package/dist/core/workflows/shared-store.d.ts +31 -0
  1137. package/dist/core/workflows/shared-store.d.ts.map +1 -0
  1138. package/dist/core/workflows/shared-store.js +80 -0
  1139. package/dist/core/workflows/shared-store.js.map +1 -0
  1140. package/dist/core/workflows/subagent-host.d.ts +50 -0
  1141. package/dist/core/workflows/subagent-host.d.ts.map +1 -0
  1142. package/dist/core/workflows/subagent-host.js +225 -0
  1143. package/dist/core/workflows/subagent-host.js.map +1 -0
  1144. package/dist/core/workflows/tool-workflow.d.ts +22 -0
  1145. package/dist/core/workflows/tool-workflow.d.ts.map +1 -0
  1146. package/dist/core/workflows/tool-workflow.js +120 -0
  1147. package/dist/core/workflows/tool-workflow.js.map +1 -0
  1148. package/dist/core/workflows/types.d.ts +191 -0
  1149. package/dist/core/workflows/types.d.ts.map +1 -0
  1150. package/dist/core/workflows/types.js +26 -0
  1151. package/dist/core/workflows/types.js.map +1 -0
  1152. package/dist/core/workflows/worktree.d.ts +42 -0
  1153. package/dist/core/workflows/worktree.d.ts.map +1 -0
  1154. package/dist/core/workflows/worktree.js +107 -0
  1155. package/dist/core/workflows/worktree.js.map +1 -0
  1156. package/dist/extensions/llama/index.d.ts.map +1 -1
  1157. package/dist/extensions/llama/index.js +2 -0
  1158. package/dist/extensions/llama/index.js.map +1 -1
  1159. package/dist/extensions/llama/provider.d.ts.map +1 -1
  1160. package/dist/extensions/llama/provider.js +6 -2
  1161. package/dist/extensions/llama/provider.js.map +1 -1
  1162. package/dist/extensions/remoto/index.d.ts +22 -0
  1163. package/dist/extensions/remoto/index.d.ts.map +1 -0
  1164. package/dist/extensions/remoto/index.js +54 -0
  1165. package/dist/extensions/remoto/index.js.map +1 -0
  1166. package/dist/index.d.ts +1 -13
  1167. package/dist/index.d.ts.map +1 -1
  1168. package/dist/index.js +7 -13
  1169. package/dist/index.js.map +1 -1
  1170. package/dist/main.d.ts +4 -0
  1171. package/dist/main.d.ts.map +1 -1
  1172. package/dist/main.js +26 -15
  1173. package/dist/main.js.map +1 -1
  1174. package/dist/migrations.d.ts.map +1 -1
  1175. package/dist/migrations.js +4 -3
  1176. package/dist/migrations.js.map +1 -1
  1177. package/dist/modes/acp/acp-mode.d.ts +42 -0
  1178. package/dist/modes/acp/acp-mode.d.ts.map +1 -0
  1179. package/dist/modes/acp/acp-mode.js +190 -0
  1180. package/dist/modes/acp/acp-mode.js.map +1 -0
  1181. package/dist/modes/acp/events.d.ts +74 -0
  1182. package/dist/modes/acp/events.d.ts.map +1 -0
  1183. package/dist/modes/acp/events.js +116 -0
  1184. package/dist/modes/acp/events.js.map +1 -0
  1185. package/dist/modes/interactive/components/home-screen.d.ts.map +1 -1
  1186. package/dist/modes/interactive/components/home-screen.js +2 -2
  1187. package/dist/modes/interactive/components/home-screen.js.map +1 -1
  1188. package/dist/modes/interactive/components/model-selector.d.ts +9 -3
  1189. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  1190. package/dist/modes/interactive/components/model-selector.js +56 -12
  1191. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  1192. package/dist/modes/interactive/components/prompt-optimization.d.ts +16 -0
  1193. package/dist/modes/interactive/components/prompt-optimization.d.ts.map +1 -0
  1194. package/dist/modes/interactive/components/prompt-optimization.js +46 -0
  1195. package/dist/modes/interactive/components/prompt-optimization.js.map +1 -0
  1196. package/dist/modes/interactive/components/settings-selector.d.ts +19 -2
  1197. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1198. package/dist/modes/interactive/components/settings-selector.js +180 -56
  1199. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1200. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  1201. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  1202. package/dist/modes/interactive/components/settings-submenu.js +165 -0
  1203. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  1204. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  1205. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  1206. package/dist/modes/interactive/components/thinking-selector.js +74 -17
  1207. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  1208. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  1209. package/dist/modes/interactive/external-editor.js +2 -1
  1210. package/dist/modes/interactive/external-editor.js.map +1 -1
  1211. package/dist/modes/interactive/interactive-mode.d.ts +21 -1
  1212. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1213. package/dist/modes/interactive/interactive-mode.js +709 -75
  1214. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1215. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  1216. package/dist/modes/interactive/theme/theme.js +4 -3
  1217. package/dist/modes/interactive/theme/theme.js.map +1 -1
  1218. package/dist/modes/json-event.d.ts +16 -13
  1219. package/dist/modes/json-event.d.ts.map +1 -1
  1220. package/dist/modes/json-event.js +20 -6
  1221. package/dist/modes/json-event.js.map +1 -1
  1222. package/dist/modes/print-mode.d.ts.map +1 -1
  1223. package/dist/modes/print-mode.js +11 -0
  1224. package/dist/modes/print-mode.js.map +1 -1
  1225. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  1226. package/dist/modes/rpc/rpc-mode.js +173 -0
  1227. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  1228. package/dist/modes/rpc/rpc-types.d.ts +29 -0
  1229. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  1230. package/dist/modes/rpc/rpc-types.js.map +1 -1
  1231. package/dist/package-manager-cli.d.ts.map +1 -1
  1232. package/dist/package-manager-cli.js +27 -5
  1233. package/dist/package-manager-cli.js.map +1 -1
  1234. package/dist/server/attach.d.ts +56 -0
  1235. package/dist/server/attach.d.ts.map +1 -0
  1236. package/dist/server/attach.js +130 -0
  1237. package/dist/server/attach.js.map +1 -0
  1238. package/dist/server/extension-ops.d.ts +40 -0
  1239. package/dist/server/extension-ops.d.ts.map +1 -0
  1240. package/dist/server/extension-ops.js +146 -0
  1241. package/dist/server/extension-ops.js.map +1 -0
  1242. package/dist/server/pi-server-service.d.ts +85 -0
  1243. package/dist/server/pi-server-service.d.ts.map +1 -0
  1244. package/dist/server/pi-server-service.js +213 -0
  1245. package/dist/server/pi-server-service.js.map +1 -0
  1246. package/dist/server/scheduler-tick.d.ts +32 -0
  1247. package/dist/server/scheduler-tick.d.ts.map +1 -0
  1248. package/dist/server/scheduler-tick.js +47 -0
  1249. package/dist/server/scheduler-tick.js.map +1 -0
  1250. package/dist/server/serve.d.ts +25 -0
  1251. package/dist/server/serve.d.ts.map +1 -0
  1252. package/dist/server/serve.js +83 -0
  1253. package/dist/server/serve.js.map +1 -0
  1254. package/dist/server/transcript.d.ts +38 -0
  1255. package/dist/server/transcript.d.ts.map +1 -0
  1256. package/dist/server/transcript.js +176 -0
  1257. package/dist/server/transcript.js.map +1 -0
  1258. package/dist/skills/ada-engine/SKILL.md +153 -0
  1259. package/dist/skills/skill-creator/SKILL.md +90 -0
  1260. package/dist/telegram/api.d.ts +75 -0
  1261. package/dist/telegram/api.d.ts.map +1 -0
  1262. package/dist/telegram/api.js +104 -0
  1263. package/dist/telegram/api.js.map +1 -0
  1264. package/dist/telegram/bridge.d.ts +85 -0
  1265. package/dist/telegram/bridge.d.ts.map +1 -0
  1266. package/dist/telegram/bridge.js +182 -0
  1267. package/dist/telegram/bridge.js.map +1 -0
  1268. package/dist/telegram/journal.d.ts +67 -0
  1269. package/dist/telegram/journal.d.ts.map +1 -0
  1270. package/dist/telegram/journal.js +119 -0
  1271. package/dist/telegram/journal.js.map +1 -0
  1272. package/dist/telegram/servidor.d.ts +15 -0
  1273. package/dist/telegram/servidor.d.ts.map +1 -0
  1274. package/dist/telegram/servidor.js +74 -0
  1275. package/dist/telegram/servidor.js.map +1 -0
  1276. package/dist/utils/frontmatter.d.ts.map +1 -1
  1277. package/dist/utils/frontmatter.js +2 -1
  1278. package/dist/utils/frontmatter.js.map +1 -1
  1279. package/dist/utils/management-http.d.ts +5 -3
  1280. package/dist/utils/management-http.d.ts.map +1 -1
  1281. package/dist/utils/management-http.js +14 -10
  1282. package/dist/utils/management-http.js.map +1 -1
  1283. package/dist/utils/shell.d.ts +11 -0
  1284. package/dist/utils/shell.d.ts.map +1 -1
  1285. package/dist/utils/shell.js +11 -0
  1286. package/dist/utils/shell.js.map +1 -1
  1287. package/dist/utils/text.d.ts +8 -0
  1288. package/dist/utils/text.d.ts.map +1 -0
  1289. package/dist/utils/text.js +9 -0
  1290. package/dist/utils/text.js.map +1 -0
  1291. package/dist/utils/version-check.d.ts.map +1 -1
  1292. package/dist/utils/version-check.js +29 -1
  1293. package/dist/utils/version-check.js.map +1 -1
  1294. package/docs/compaction.md +25 -10
  1295. package/docs/compliance.md +241 -0
  1296. package/docs/containerization.md +24 -24
  1297. package/docs/custom-provider.md +15 -12
  1298. package/docs/development.md +47 -10
  1299. package/docs/docs.json +14 -2
  1300. package/docs/environment-variables.md +20 -17
  1301. package/docs/extensions.md +62 -51
  1302. package/docs/index.md +15 -21
  1303. package/docs/json.md +10 -5
  1304. package/docs/keybindings.md +5 -5
  1305. package/docs/llama-cpp.md +9 -7
  1306. package/docs/models.md +18 -12
  1307. package/docs/packages.md +45 -45
  1308. package/docs/prompt-templates.md +5 -5
  1309. package/docs/providers.md +12 -12
  1310. package/docs/quickstart.md +39 -39
  1311. package/docs/rpc.md +21 -15
  1312. package/docs/sdk.md +38 -38
  1313. package/docs/security.md +26 -21
  1314. package/docs/session-format.md +7 -7
  1315. package/docs/sessions.md +14 -14
  1316. package/docs/settings.md +47 -22
  1317. package/docs/shell-aliases.md +2 -2
  1318. package/docs/skills.md +14 -13
  1319. package/docs/terminal-setup.md +14 -14
  1320. package/docs/termux.md +7 -7
  1321. package/docs/themes.md +11 -11
  1322. package/docs/tmux.md +4 -4
  1323. package/docs/tui.md +3 -3
  1324. package/docs/usage.md +54 -54
  1325. package/docs/windows.md +2 -2
  1326. package/examples/extensions/border-status-editor.ts +1 -1
  1327. package/examples/extensions/git-checkpoint.ts +2 -2
  1328. package/examples/extensions/notify.ts +3 -1
  1329. package/examples/extensions/subagent/README.md +1 -1
  1330. package/examples/extensions/subagent/index.ts +6 -1
  1331. package/examples/extensions/titlebar-spinner.ts +1 -1
  1332. package/examples/rpc-extension-ui.ts +1 -1
  1333. package/examples/sdk/06-extensions.ts +1 -1
  1334. package/examples/sdk/12-full-control.ts +9 -0
  1335. package/examples/sdk/README.md +1 -1
  1336. package/npm-shrinkwrap.json +35 -261
  1337. package/package.json +9 -3
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Caché en disco de los identificadores que devuelve la API de ficheros del
3
+ * proveedor, indexada por (proveedor, hash del contenido).
4
+ *
5
+ * Por qué en disco y no en memoria: el ahorro grande no es entre turnos de una
6
+ * sesión —eso lo daría un Map— sino entre SESIONES. La captura de pantalla que
7
+ * pegaste ayer y vuelves a pegar hoy es el mismo fichero para el proveedor, y
8
+ * volver a subir 1,4 MB es tiempo y cuota tirados.
9
+ *
10
+ * Por qué se relee el fichero antes de escribir: hay más de un proceso de Ada
11
+ * a la vez (CLI + escritorio + subagentes) y todos apuntan al mismo agentDir.
12
+ * Escribir el mapa entero desde memoria haría que el último en cerrar borrase
13
+ * lo que subieron los demás; ya nos pasó con un fichero compartido y varios
14
+ * escritores. Aquí se funde por entrada, quedándose con la de uso más reciente.
15
+ */
16
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
17
+ import { dirname, join } from "node:path";
18
+ const MAX_EDAD_POR_DEFECTO_MS = 30 * 24 * 60 * 60 * 1000;
19
+ const MAX_ENTRADAS_POR_DEFECTO = 500;
20
+ /**
21
+ * Clave del mapa. El separador es `|` y no un byte NUL a propósito: un NUL en
22
+ * el fichero lo vuelve binario para `grep` y para `git diff`, y este fichero se
23
+ * mira a mano cuando algo va mal.
24
+ */
25
+ export function claveDeBlob(proveedor, hash) {
26
+ return `${proveedor}|${hash}`;
27
+ }
28
+ function esEntrada(valor) {
29
+ if (!valor || typeof valor !== "object")
30
+ return false;
31
+ const e = valor;
32
+ return (typeof e.id === "string" &&
33
+ e.id.length > 0 &&
34
+ typeof e.bytes === "number" &&
35
+ typeof e.mime === "string" &&
36
+ typeof e.subidoEn === "number" &&
37
+ typeof e.usadoEn === "number");
38
+ }
39
+ function leerFichero(texto) {
40
+ const mapa = new Map();
41
+ let crudo;
42
+ try {
43
+ crudo = JSON.parse(texto);
44
+ }
45
+ catch {
46
+ // Un fichero corrupto se trata como vacío: como mucho se resube. Fallar
47
+ // aquí dejaría al agente sin poder mandar adjuntos por un JSON roto.
48
+ return mapa;
49
+ }
50
+ const doc = crudo;
51
+ if (!doc || typeof doc !== "object" || !doc.entradas || typeof doc.entradas !== "object")
52
+ return mapa;
53
+ for (const [clave, valor] of Object.entries(doc.entradas)) {
54
+ if (esEntrada(valor))
55
+ mapa.set(clave, valor);
56
+ }
57
+ return mapa;
58
+ }
59
+ export class AlmacenDeBlobs {
60
+ ruta;
61
+ entradas = new Map();
62
+ sucio = false;
63
+ /**
64
+ * Claves quitadas A PROPÓSITO (id muerto, purga por edad, purga a mano). La
65
+ * fusión de `volcar()` las tiene que borrar también de la copia en disco: si
66
+ * no, la entrada que este proceso acaba de tirar vuelve desde el fichero que
67
+ * dejó otro proceso y la purga no llega nunca al disco.
68
+ *
69
+ * Vive aquí y no en quien llama porque el llamador se olvida: la purga
70
+ * automática del arranque lo hacía y la de `/blobs purgar` no, así que el
71
+ * fichero crecía sin límite y las entradas de más de 30 días resucitaban en
72
+ * cada volcado. Comprobado ejecutándolo: purgar + volcar dejaba la clave
73
+ * `anthropic|aaa` intacta en disco.
74
+ */
75
+ olvidadas = new Set();
76
+ constructor(agentDir, nombreFichero = "blobs.json") {
77
+ this.ruta = join(agentDir, nombreFichero);
78
+ }
79
+ get rutaFichero() {
80
+ return this.ruta;
81
+ }
82
+ async cargar() {
83
+ try {
84
+ this.entradas = leerFichero(await readFile(this.ruta, "utf-8"));
85
+ }
86
+ catch {
87
+ // No existe todavía: primer arranque.
88
+ this.entradas = new Map();
89
+ }
90
+ }
91
+ /** Devuelve la entrada y marca el uso. `undefined` = no la tenemos. */
92
+ leer(proveedor, hash, ahora = Date.now()) {
93
+ const entrada = this.entradas.get(claveDeBlob(proveedor, hash));
94
+ if (!entrada)
95
+ return undefined;
96
+ entrada.usadoEn = ahora;
97
+ this.sucio = true;
98
+ return entrada;
99
+ }
100
+ guardar(proveedor, hash, entrada) {
101
+ const clave = claveDeBlob(proveedor, hash);
102
+ this.entradas.set(clave, entrada);
103
+ // Se ha vuelto a subir: deja de estar olvidada, o la fusión la borraría
104
+ // justo después de haberla pagado.
105
+ this.olvidadas.delete(clave);
106
+ this.sucio = true;
107
+ }
108
+ /**
109
+ * Borra una entrada. Se llama cuando el proveedor rechaza el id: mejor
110
+ * resubir 1 MB que dejar la conversación atada a un id muerto.
111
+ */
112
+ olvidar(proveedor, hash) {
113
+ const clave = claveDeBlob(proveedor, hash);
114
+ const borrada = this.entradas.delete(clave);
115
+ this.olvidadas.add(clave);
116
+ if (borrada)
117
+ this.sucio = true;
118
+ return borrada;
119
+ }
120
+ olvidarPorId(id) {
121
+ const borradas = [];
122
+ for (const [clave, entrada] of this.entradas) {
123
+ if (entrada.id !== id)
124
+ continue;
125
+ this.entradas.delete(clave);
126
+ this.olvidadas.add(clave);
127
+ borradas.push(clave);
128
+ }
129
+ if (borradas.length > 0)
130
+ this.sucio = true;
131
+ return borradas;
132
+ }
133
+ tamano() {
134
+ return this.entradas.size;
135
+ }
136
+ // Aquí vivía `listar()`. Nadie lo llamaba: `/blobs` enseña el tamaño y la
137
+ // ruta del fichero, que se mira a mano. Borrado por lo mismo que
138
+ // `borrarFichero`.
139
+ /** Devuelve las claves purgadas. Por edad primero, por número después. */
140
+ purgar(opciones = {}) {
141
+ const ahora = opciones.ahora ?? Date.now();
142
+ const maxEdadMs = opciones.maxEdadMs ?? MAX_EDAD_POR_DEFECTO_MS;
143
+ const maxEntradas = opciones.maxEntradas ?? MAX_ENTRADAS_POR_DEFECTO;
144
+ const purgadas = [];
145
+ for (const [clave, entrada] of this.entradas) {
146
+ if (ahora - entrada.usadoEn > maxEdadMs) {
147
+ this.entradas.delete(clave);
148
+ purgadas.push(clave);
149
+ }
150
+ }
151
+ if (this.entradas.size > maxEntradas) {
152
+ const porAntiguedad = [...this.entradas].sort((a, b) => a[1].usadoEn - b[1].usadoEn);
153
+ const sobran = this.entradas.size - maxEntradas;
154
+ for (const [clave] of porAntiguedad.slice(0, sobran)) {
155
+ this.entradas.delete(clave);
156
+ purgadas.push(clave);
157
+ }
158
+ }
159
+ if (purgadas.length > 0)
160
+ this.sucio = true;
161
+ for (const clave of purgadas)
162
+ this.olvidadas.add(clave);
163
+ return purgadas;
164
+ }
165
+ /**
166
+ * Escribe fundiendo con lo que haya en disco. Las claves que este proceso ha
167
+ * borrado a propósito se quitan de la fusión: sin eso, la fusión las
168
+ * resucitaría desde la copia en disco de otro proceso y volveríamos a mandar
169
+ * un id que ya sabemos muerto, o a guardar para siempre lo que purgamos.
170
+ */
171
+ async volcar(olvidadas = []) {
172
+ if (!this.sucio)
173
+ return;
174
+ let enDisco = new Map();
175
+ try {
176
+ enDisco = leerFichero(await readFile(this.ruta, "utf-8"));
177
+ }
178
+ catch {
179
+ // Sin fichero previo: la fusión es la identidad.
180
+ }
181
+ for (const clave of this.olvidadas)
182
+ enDisco.delete(clave);
183
+ for (const clave of olvidadas)
184
+ enDisco.delete(clave);
185
+ for (const [clave, mia] of this.entradas) {
186
+ const suya = enDisco.get(clave);
187
+ enDisco.set(clave, !suya || mia.usadoEn >= suya.usadoEn ? mia : suya);
188
+ }
189
+ const doc = { version: 1, entradas: Object.fromEntries(enDisco) };
190
+ await mkdir(dirname(this.ruta), { recursive: true });
191
+ const temporal = `${this.ruta}.${process.pid}.tmp`;
192
+ await writeFile(temporal, JSON.stringify(doc, null, "\t"), "utf-8");
193
+ await rename(temporal, this.ruta);
194
+ this.entradas = enDisco;
195
+ this.sucio = false;
196
+ }
197
+ }
198
+ //# sourceMappingURL=almacen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"almacen.js","sourceRoot":"","sources":["../../../src/core/blobs/almacen.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Caché en disco de los identificadores que devuelve la API de ficheros del\n * proveedor, indexada por (proveedor, hash del contenido).\n *\n * Por qué en disco y no en memoria: el ahorro grande no es entre turnos de una\n * sesión —eso lo daría un Map— sino entre SESIONES. La captura de pantalla que\n * pegaste ayer y vuelves a pegar hoy es el mismo fichero para el proveedor, y\n * volver a subir 1,4 MB es tiempo y cuota tirados.\n *\n * Por qué se relee el fichero antes de escribir: hay más de un proceso de Ada\n * a la vez (CLI + escritorio + subagentes) y todos apuntan al mismo agentDir.\n * Escribir el mapa entero desde memoria haría que el último en cerrar borrase\n * lo que subieron los demás; ya nos pasó con un fichero compartido y varios\n * escritores. Aquí se funde por entrada, quedándose con la de uso más reciente.\n */\n\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface EntradaDeBlob {\n\t/** Identificador que devolvió el proveedor (`file_...` / `file-...`). */\n\tid: string;\n\t/** Tamaño en bytes del contenido original, para el informe de `/blobs`. */\n\tbytes: number;\n\tmime: string;\n\t/** Milisegundos epoch de la subida. */\n\tsubidoEn: number;\n\t/** Milisegundos epoch del último uso; manda en la purga y en la fusión. */\n\tusadoEn: number;\n}\n\nexport interface OpcionesDePurga {\n\t/** Edad máxima desde el último uso. Por defecto 30 días. */\n\tmaxEdadMs?: number;\n\t/** Número máximo de entradas que se conservan. Por defecto 500. */\n\tmaxEntradas?: number;\n\t/** Reloj inyectable; los tests no pueden esperar 30 días. */\n\tahora?: number;\n}\n\nconst MAX_EDAD_POR_DEFECTO_MS = 30 * 24 * 60 * 60 * 1000;\nconst MAX_ENTRADAS_POR_DEFECTO = 500;\n\n/**\n * Clave del mapa. El separador es `|` y no un byte NUL a propósito: un NUL en\n * el fichero lo vuelve binario para `grep` y para `git diff`, y este fichero se\n * mira a mano cuando algo va mal.\n */\nexport function claveDeBlob(proveedor: string, hash: string): string {\n\treturn `${proveedor}|${hash}`;\n}\n\ninterface FicheroDeBlobs {\n\tversion: number;\n\tentradas: Record<string, EntradaDeBlob>;\n}\n\nfunction esEntrada(valor: unknown): valor is EntradaDeBlob {\n\tif (!valor || typeof valor !== \"object\") return false;\n\tconst e = valor as Record<string, unknown>;\n\treturn (\n\t\ttypeof e.id === \"string\" &&\n\t\te.id.length > 0 &&\n\t\ttypeof e.bytes === \"number\" &&\n\t\ttypeof e.mime === \"string\" &&\n\t\ttypeof e.subidoEn === \"number\" &&\n\t\ttypeof e.usadoEn === \"number\"\n\t);\n}\n\nfunction leerFichero(texto: string): Map<string, EntradaDeBlob> {\n\tconst mapa = new Map<string, EntradaDeBlob>();\n\tlet crudo: unknown;\n\ttry {\n\t\tcrudo = JSON.parse(texto);\n\t} catch {\n\t\t// Un fichero corrupto se trata como vacío: como mucho se resube. Fallar\n\t\t// aquí dejaría al agente sin poder mandar adjuntos por un JSON roto.\n\t\treturn mapa;\n\t}\n\tconst doc = crudo as Partial<FicheroDeBlobs> | null;\n\tif (!doc || typeof doc !== \"object\" || !doc.entradas || typeof doc.entradas !== \"object\") return mapa;\n\tfor (const [clave, valor] of Object.entries(doc.entradas)) {\n\t\tif (esEntrada(valor)) mapa.set(clave, valor);\n\t}\n\treturn mapa;\n}\n\nexport class AlmacenDeBlobs {\n\tprivate readonly ruta: string;\n\tprivate entradas = new Map<string, EntradaDeBlob>();\n\tprivate sucio = false;\n\t/**\n\t * Claves quitadas A PROPÓSITO (id muerto, purga por edad, purga a mano). La\n\t * fusión de `volcar()` las tiene que borrar también de la copia en disco: si\n\t * no, la entrada que este proceso acaba de tirar vuelve desde el fichero que\n\t * dejó otro proceso y la purga no llega nunca al disco.\n\t *\n\t * Vive aquí y no en quien llama porque el llamador se olvida: la purga\n\t * automática del arranque lo hacía y la de `/blobs purgar` no, así que el\n\t * fichero crecía sin límite y las entradas de más de 30 días resucitaban en\n\t * cada volcado. Comprobado ejecutándolo: purgar + volcar dejaba la clave\n\t * `anthropic|aaa` intacta en disco.\n\t */\n\tprivate readonly olvidadas = new Set<string>();\n\n\tconstructor(agentDir: string, nombreFichero = \"blobs.json\") {\n\t\tthis.ruta = join(agentDir, nombreFichero);\n\t}\n\n\tget rutaFichero(): string {\n\t\treturn this.ruta;\n\t}\n\n\tasync cargar(): Promise<void> {\n\t\ttry {\n\t\t\tthis.entradas = leerFichero(await readFile(this.ruta, \"utf-8\"));\n\t\t} catch {\n\t\t\t// No existe todavía: primer arranque.\n\t\t\tthis.entradas = new Map();\n\t\t}\n\t}\n\n\t/** Devuelve la entrada y marca el uso. `undefined` = no la tenemos. */\n\tleer(proveedor: string, hash: string, ahora = Date.now()): EntradaDeBlob | undefined {\n\t\tconst entrada = this.entradas.get(claveDeBlob(proveedor, hash));\n\t\tif (!entrada) return undefined;\n\t\tentrada.usadoEn = ahora;\n\t\tthis.sucio = true;\n\t\treturn entrada;\n\t}\n\n\tguardar(proveedor: string, hash: string, entrada: EntradaDeBlob): void {\n\t\tconst clave = claveDeBlob(proveedor, hash);\n\t\tthis.entradas.set(clave, entrada);\n\t\t// Se ha vuelto a subir: deja de estar olvidada, o la fusión la borraría\n\t\t// justo después de haberla pagado.\n\t\tthis.olvidadas.delete(clave);\n\t\tthis.sucio = true;\n\t}\n\n\t/**\n\t * Borra una entrada. Se llama cuando el proveedor rechaza el id: mejor\n\t * resubir 1 MB que dejar la conversación atada a un id muerto.\n\t */\n\tolvidar(proveedor: string, hash: string): boolean {\n\t\tconst clave = claveDeBlob(proveedor, hash);\n\t\tconst borrada = this.entradas.delete(clave);\n\t\tthis.olvidadas.add(clave);\n\t\tif (borrada) this.sucio = true;\n\t\treturn borrada;\n\t}\n\n\tolvidarPorId(id: string): string[] {\n\t\tconst borradas: string[] = [];\n\t\tfor (const [clave, entrada] of this.entradas) {\n\t\t\tif (entrada.id !== id) continue;\n\t\t\tthis.entradas.delete(clave);\n\t\t\tthis.olvidadas.add(clave);\n\t\t\tborradas.push(clave);\n\t\t}\n\t\tif (borradas.length > 0) this.sucio = true;\n\t\treturn borradas;\n\t}\n\n\ttamano(): number {\n\t\treturn this.entradas.size;\n\t}\n\n\t// Aquí vivía `listar()`. Nadie lo llamaba: `/blobs` enseña el tamaño y la\n\t// ruta del fichero, que se mira a mano. Borrado por lo mismo que\n\t// `borrarFichero`.\n\n\t/** Devuelve las claves purgadas. Por edad primero, por número después. */\n\tpurgar(opciones: OpcionesDePurga = {}): string[] {\n\t\tconst ahora = opciones.ahora ?? Date.now();\n\t\tconst maxEdadMs = opciones.maxEdadMs ?? MAX_EDAD_POR_DEFECTO_MS;\n\t\tconst maxEntradas = opciones.maxEntradas ?? MAX_ENTRADAS_POR_DEFECTO;\n\t\tconst purgadas: string[] = [];\n\n\t\tfor (const [clave, entrada] of this.entradas) {\n\t\t\tif (ahora - entrada.usadoEn > maxEdadMs) {\n\t\t\t\tthis.entradas.delete(clave);\n\t\t\t\tpurgadas.push(clave);\n\t\t\t}\n\t\t}\n\n\t\tif (this.entradas.size > maxEntradas) {\n\t\t\tconst porAntiguedad = [...this.entradas].sort((a, b) => a[1].usadoEn - b[1].usadoEn);\n\t\t\tconst sobran = this.entradas.size - maxEntradas;\n\t\t\tfor (const [clave] of porAntiguedad.slice(0, sobran)) {\n\t\t\t\tthis.entradas.delete(clave);\n\t\t\t\tpurgadas.push(clave);\n\t\t\t}\n\t\t}\n\n\t\tif (purgadas.length > 0) this.sucio = true;\n\t\tfor (const clave of purgadas) this.olvidadas.add(clave);\n\t\treturn purgadas;\n\t}\n\n\t/**\n\t * Escribe fundiendo con lo que haya en disco. Las claves que este proceso ha\n\t * borrado a propósito se quitan de la fusión: sin eso, la fusión las\n\t * resucitaría desde la copia en disco de otro proceso y volveríamos a mandar\n\t * un id que ya sabemos muerto, o a guardar para siempre lo que purgamos.\n\t */\n\tasync volcar(olvidadas: Iterable<string> = []): Promise<void> {\n\t\tif (!this.sucio) return;\n\t\tlet enDisco = new Map<string, EntradaDeBlob>();\n\t\ttry {\n\t\t\tenDisco = leerFichero(await readFile(this.ruta, \"utf-8\"));\n\t\t} catch {\n\t\t\t// Sin fichero previo: la fusión es la identidad.\n\t\t}\n\t\tfor (const clave of this.olvidadas) enDisco.delete(clave);\n\t\tfor (const clave of olvidadas) enDisco.delete(clave);\n\t\tfor (const [clave, mia] of this.entradas) {\n\t\t\tconst suya = enDisco.get(clave);\n\t\t\tenDisco.set(clave, !suya || mia.usadoEn >= suya.usadoEn ? mia : suya);\n\t\t}\n\t\tconst doc: FicheroDeBlobs = { version: 1, entradas: Object.fromEntries(enDisco) };\n\t\tawait mkdir(dirname(this.ruta), { recursive: true });\n\t\tconst temporal = `${this.ruta}.${process.pid}.tmp`;\n\t\tawait writeFile(temporal, JSON.stringify(doc, null, \"\\t\"), \"utf-8\");\n\t\tawait rename(temporal, this.ruta);\n\t\tthis.entradas = enDisco;\n\t\tthis.sucio = false;\n\t}\n}\n"]}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * El broker: decide, para cada adjunto de una petición, si se sube, se
3
+ * reutiliza un id que ya teníamos, o se deja en línea como siempre.
4
+ *
5
+ * Tres reglas que no son negociables, y por qué:
6
+ *
7
+ * 1. Nunca se rompe la conversación. Si la subida falla, si la credencial no
8
+ * está, si el proveedor no contesta — el adjunto viaja en línea igual que
9
+ * antes de que este módulo existiera. Este módulo solo puede AHORRAR; nunca
10
+ * puede ser el motivo de que un turno no salga.
11
+ *
12
+ * 2. Un id que viene de una sesión anterior no se usa a ciegas. Se comprueba
13
+ * UNA vez por proceso. Si el proveedor dice 404, se olvida y se resube; si
14
+ * la red falla no sabemos nada, y "no sé" no es "está muerto": ese turno va
15
+ * en línea y se vuelve a intentar en el siguiente.
16
+ *
17
+ * 3. El informe distingue tres cosas: "no había nada que subir", "no puedo
18
+ * subir y este es el motivo" y "lo he subido/reutilizado". Un `[]` y un
19
+ * `null` no significan lo mismo y no se mezclan nunca.
20
+ */
21
+ import type { AlmacenDeBlobs } from "./almacen.ts";
22
+ import { type Credencial, type Fetch, type ModeloParaBlobs } from "./proveedor.ts";
23
+ /** 1 MiB. Por debajo de esto la subida cuesta más latencia de la que ahorra. */
24
+ export declare const MIN_BYTES_POR_DEFECTO: number;
25
+ export interface OmisionDeBlob {
26
+ bytes: number;
27
+ motivo: string;
28
+ }
29
+ export type Diagnostico = {
30
+ estado: "listo";
31
+ subidos: number;
32
+ reutilizados: number;
33
+ /** Adjuntos que había pero no se pudieron referenciar, con su motivo. */
34
+ omitidos: OmisionDeBlob[];
35
+ } | {
36
+ estado: "nada-que-subir";
37
+ /** Adjuntos vistos pero por debajo del umbral. */
38
+ pequenos: number;
39
+ } | {
40
+ estado: "no-puedo";
41
+ motivo: string;
42
+ };
43
+ export interface ResultadoDeProceso {
44
+ payload: unknown;
45
+ diagnostico: Diagnostico;
46
+ }
47
+ export interface OpcionesDeBroker {
48
+ almacen: AlmacenDeBlobs;
49
+ fetchImpl?: Fetch;
50
+ minBytes?: number;
51
+ }
52
+ export declare function hashDeContenido(datos: Uint8Array): string;
53
+ /**
54
+ * ¿Este estado HTTP se puede achacar a las referencias a fichero que acabamos
55
+ * de mandar?
56
+ *
57
+ * 401, 403 y 429 quedan fuera: son credencial y cuota. Apagar el ahorro para el
58
+ * resto del proceso en la primera racha de rate limit sería leer "espera" como
59
+ * "no puedes", que es el defecto que este repositorio persigue. El resto de la
60
+ * familia 4xx sí: un `file_id` que el proveedor no acepta sale por ahí, y
61
+ * pagar una subida de más es más barato que repetir el fallo turno tras turno.
62
+ *
63
+ * Vive suelta y no dentro de la clase porque la usan los DOS caminos que apagan
64
+ * la reescritura (`after_provider_response` y `message_end`); tenerlo duplicado
65
+ * ya hizo que uno de los dos apagara con un 429.
66
+ */
67
+ export declare function esRechazoDeReferencias(estado: number): boolean;
68
+ export declare class BrokerDeBlobs {
69
+ private readonly almacen;
70
+ /**
71
+ * `undefined` = usar el `fetch` global EN EL MOMENTO DE LA LLAMADA, no el
72
+ * que hubiera al construir el broker. El despachador HTTP de Ada instala su
73
+ * propio `globalThis.fetch` (proxy, timeouts) DESPUÉS de cargar las
74
+ * extensiones; capturarlo en el constructor se saltaría esa configuración.
75
+ */
76
+ private readonly fetchImpl;
77
+ private readonly minBytes;
78
+ /** Ids que este proceso ya sabe vivos (los subió él o los verificó). */
79
+ private readonly verificados;
80
+ /** Referencias que viajaron en la última petición, para atribuir un 4xx. */
81
+ private ultimosEnviados;
82
+ /** Contadores para `/blobs`. */
83
+ readonly contadores: {
84
+ subidas: number;
85
+ reutilizaciones: number;
86
+ resubidasPorRechazo: number;
87
+ };
88
+ constructor(opciones: OpcionesDeBroker);
89
+ procesar(payload: unknown, modelo: ModeloParaBlobs | undefined, credencial: Credencial | undefined, signal?: AbortSignal): Promise<ResultadoDeProceso>;
90
+ private referenciaPara;
91
+ /**
92
+ * El proveedor rechazó la petición justo después de que le mandáramos
93
+ * referencias. No sabemos si fue por ellas —el evento no trae cuerpo—, pero
94
+ * un id inválido es la causa más cara de descartar: se olvidan y el turno
95
+ * siguiente resube. Como mucho se paga una subida de más.
96
+ */
97
+ rechazoDelProveedor(estado: number): string[];
98
+ peticionCorrecta(): void;
99
+ private red;
100
+ private olvidar;
101
+ volcar(): Promise<void>;
102
+ }
103
+ //# sourceMappingURL=broker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.d.ts","sourceRoot":"","sources":["../../../src/core/blobs/broker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAEN,KAAK,UAAU,EAEf,KAAK,KAAK,EACV,KAAK,eAAe,EAIpB,MAAM,gBAAgB,CAAC;AAExB,iFAAgF;AAChF,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GACpB;IACA,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,0EAAyE;IACzE,QAAQ,EAAE,aAAa,EAAE,CAAC;CACzB,GACD;IACA,MAAM,EAAE,gBAAgB,CAAC;IACzB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;CAChB,GACD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAQD,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEzD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,2EAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,8EAA4E;IAC5E,OAAO,CAAC,eAAe,CAAmB;IAC1C,gCAAgC;IAChC,QAAQ,CAAC,UAAU;;;;MAA8D;IAEjF,YAAY,QAAQ,EAAE,gBAAgB,EAIrC;IAEK,QAAQ,CACb,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAmE7B;YAEa,cAAc;IAgD5B;;;;;OAKG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAY5C;IAED,gBAAgB,IAAI,IAAI,CAEvB;IAED,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,OAAO;IAIT,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5B;CACD","sourcesContent":["/**\n * El broker: decide, para cada adjunto de una petición, si se sube, se\n * reutiliza un id que ya teníamos, o se deja en línea como siempre.\n *\n * Tres reglas que no son negociables, y por qué:\n *\n * 1. Nunca se rompe la conversación. Si la subida falla, si la credencial no\n * está, si el proveedor no contesta — el adjunto viaja en línea igual que\n * antes de que este módulo existiera. Este módulo solo puede AHORRAR; nunca\n * puede ser el motivo de que un turno no salga.\n *\n * 2. Un id que viene de una sesión anterior no se usa a ciegas. Se comprueba\n * UNA vez por proceso. Si el proveedor dice 404, se olvida y se resube; si\n * la red falla no sabemos nada, y \"no sé\" no es \"está muerto\": ese turno va\n * en línea y se vuelve a intentar en el siguiente.\n *\n * 3. El informe distingue tres cosas: \"no había nada que subir\", \"no puedo\n * subir y este es el motivo\" y \"lo he subido/reutilizado\". Un `[]` y un\n * `null` no significan lo mismo y no se mezclan nunca.\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { AlmacenDeBlobs } from \"./almacen.ts\";\nimport { type BloqueBlob, claveDeRuta, localizarBlobs, reescribirBlobs } from \"./payload.ts\";\nimport {\n\ttype CapacidadDeBlobs,\n\ttype Credencial,\n\tcapacidadDeBlobs,\n\ttype Fetch,\n\ttype ModeloParaBlobs,\n\tpuedeSubir,\n\tsubirFichero,\n\tverificarFichero,\n} from \"./proveedor.ts\";\n\n/** 1 MiB. Por debajo de esto la subida cuesta más latencia de la que ahorra. */\nexport const MIN_BYTES_POR_DEFECTO = 1024 * 1024;\n\nexport interface OmisionDeBlob {\n\tbytes: number;\n\tmotivo: string;\n}\n\nexport type Diagnostico =\n\t| {\n\t\t\testado: \"listo\";\n\t\t\tsubidos: number;\n\t\t\treutilizados: number;\n\t\t\t/** Adjuntos que había pero no se pudieron referenciar, con su motivo. */\n\t\t\tomitidos: OmisionDeBlob[];\n\t }\n\t| {\n\t\t\testado: \"nada-que-subir\";\n\t\t\t/** Adjuntos vistos pero por debajo del umbral. */\n\t\t\tpequenos: number;\n\t }\n\t| { estado: \"no-puedo\"; motivo: string };\n\nexport interface ResultadoDeProceso {\n\tpayload: unknown;\n\tdiagnostico: Diagnostico;\n}\n\nexport interface OpcionesDeBroker {\n\talmacen: AlmacenDeBlobs;\n\tfetchImpl?: Fetch;\n\tminBytes?: number;\n}\n\ninterface IdEnviado {\n\tproveedor: string;\n\thash: string;\n\tid: string;\n}\n\nexport function hashDeContenido(datos: Uint8Array): string {\n\treturn createHash(\"sha256\").update(datos).digest(\"hex\");\n}\n\n/**\n * ¿Este estado HTTP se puede achacar a las referencias a fichero que acabamos\n * de mandar?\n *\n * 401, 403 y 429 quedan fuera: son credencial y cuota. Apagar el ahorro para el\n * resto del proceso en la primera racha de rate limit sería leer \"espera\" como\n * \"no puedes\", que es el defecto que este repositorio persigue. El resto de la\n * familia 4xx sí: un `file_id` que el proveedor no acepta sale por ahí, y\n * pagar una subida de más es más barato que repetir el fallo turno tras turno.\n *\n * Vive suelta y no dentro de la clase porque la usan los DOS caminos que apagan\n * la reescritura (`after_provider_response` y `message_end`); tenerlo duplicado\n * ya hizo que uno de los dos apagara con un 429.\n */\nexport function esRechazoDeReferencias(estado: number): boolean {\n\tif (estado < 400 || estado >= 500) return false;\n\treturn estado !== 401 && estado !== 403 && estado !== 429;\n}\n\nexport class BrokerDeBlobs {\n\tprivate readonly almacen: AlmacenDeBlobs;\n\t/**\n\t * `undefined` = usar el `fetch` global EN EL MOMENTO DE LA LLAMADA, no el\n\t * que hubiera al construir el broker. El despachador HTTP de Ada instala su\n\t * propio `globalThis.fetch` (proxy, timeouts) DESPUÉS de cargar las\n\t * extensiones; capturarlo en el constructor se saltaría esa configuración.\n\t */\n\tprivate readonly fetchImpl: Fetch | undefined;\n\tprivate readonly minBytes: number;\n\t/** Ids que este proceso ya sabe vivos (los subió él o los verificó). */\n\tprivate readonly verificados = new Set<string>();\n\t/** Referencias que viajaron en la última petición, para atribuir un 4xx. */\n\tprivate ultimosEnviados: IdEnviado[] = [];\n\t/** Contadores para `/blobs`. */\n\treadonly contadores = { subidas: 0, reutilizaciones: 0, resubidasPorRechazo: 0 };\n\n\tconstructor(opciones: OpcionesDeBroker) {\n\t\tthis.almacen = opciones.almacen;\n\t\tthis.fetchImpl = opciones.fetchImpl;\n\t\tthis.minBytes = opciones.minBytes ?? MIN_BYTES_POR_DEFECTO;\n\t}\n\n\tasync procesar(\n\t\tpayload: unknown,\n\t\tmodelo: ModeloParaBlobs | undefined,\n\t\tcredencial: Credencial | undefined,\n\t\tsignal?: AbortSignal,\n\t): Promise<ResultadoDeProceso> {\n\t\tthis.ultimosEnviados = [];\n\t\tconst capacidad = capacidadDeBlobs(modelo);\n\t\tif (!puedeSubir(capacidad)) {\n\t\t\treturn { payload, diagnostico: { estado: \"no-puedo\", motivo: capacidad.motivo } };\n\t\t}\n\t\tif (!credencial || (!credencial.apiKey && !credencial.cabeceras)) {\n\t\t\treturn {\n\t\t\t\tpayload,\n\t\t\t\tdiagnostico: { estado: \"no-puedo\", motivo: `sin credencial resuelta para \"${capacidad.proveedor}\"` },\n\t\t\t};\n\t\t}\n\n\t\tconst candidatos = localizarBlobs(payload, modelo?.api ?? \"\");\n\t\tif (candidatos === null) {\n\t\t\t// El payload no tiene la forma que esperábamos para esta API. Decirlo,\n\t\t\t// no callarlo: si upstream cambia la forma, esto se ve en `/blobs`.\n\t\t\treturn {\n\t\t\t\tpayload,\n\t\t\t\tdiagnostico: { estado: \"no-puedo\", motivo: `el payload de \"${modelo?.api}\" no tiene la forma esperada` },\n\t\t\t};\n\t\t}\n\n\t\tconst grandes = candidatos.filter((bloque) => bloque.bytes >= this.minBytes);\n\t\tif (grandes.length === 0) {\n\t\t\treturn { payload, diagnostico: { estado: \"nada-que-subir\", pequenos: candidatos.length } };\n\t\t}\n\n\t\tconst ids = new Map<string, string>();\n\t\tconst omitidos: OmisionDeBlob[] = [];\n\t\tlet subidos = 0;\n\t\tlet reutilizados = 0;\n\t\t/** Dentro de una misma petición, el mismo contenido se resuelve una vez. */\n\t\tconst resueltosAqui = new Map<string, string>();\n\n\t\tfor (const bloque of grandes) {\n\t\t\tconst datos = Buffer.from(bloque.base64, \"base64\");\n\t\t\tconst hash = hashDeContenido(datos);\n\n\t\t\tconst yaResuelto = resueltosAqui.get(hash);\n\t\t\tif (yaResuelto) {\n\t\t\t\tids.set(claveDeRuta(bloque.ruta), yaResuelto);\n\t\t\t\treutilizados++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst resultado = await this.referenciaPara(capacidad, credencial, hash, datos, bloque, signal);\n\t\t\tif (!resultado.ok) {\n\t\t\t\tomitidos.push({ bytes: bloque.bytes, motivo: resultado.motivo });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tresueltosAqui.set(hash, resultado.id);\n\t\t\tids.set(claveDeRuta(bloque.ruta), resultado.id);\n\t\t\tthis.ultimosEnviados.push({ proveedor: capacidad.proveedor, hash, id: resultado.id });\n\t\t\tif (resultado.nueva) {\n\t\t\t\tsubidos++;\n\t\t\t\tthis.contadores.subidas++;\n\t\t\t} else {\n\t\t\t\treutilizados++;\n\t\t\t\tthis.contadores.reutilizaciones++;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tpayload: reescribirBlobs(payload, modelo?.api ?? \"\", ids),\n\t\t\tdiagnostico: { estado: \"listo\", subidos, reutilizados, omitidos },\n\t\t};\n\t}\n\n\tprivate async referenciaPara(\n\t\tcapacidad: CapacidadDeBlobs,\n\t\tcredencial: Credencial,\n\t\thash: string,\n\t\tdatos: Uint8Array,\n\t\tbloque: BloqueBlob,\n\t\tsignal?: AbortSignal,\n\t): Promise<{ ok: true; id: string; nueva: boolean } | { ok: false; motivo: string }> {\n\t\tconst entrada = this.almacen.leer(capacidad.proveedor, hash);\n\t\tif (entrada) {\n\t\t\tif (this.verificados.has(entrada.id)) return { ok: true, id: entrada.id, nueva: false };\n\t\t\tconst estado = await verificarFichero(capacidad, credencial, entrada.id, this.red(), signal);\n\t\t\tif (estado === \"vivo\") {\n\t\t\t\tthis.verificados.add(entrada.id);\n\t\t\t\treturn { ok: true, id: entrada.id, nueva: false };\n\t\t\t}\n\t\t\tif (estado === \"muerto\") {\n\t\t\t\tthis.olvidar(capacidad.proveedor, hash);\n\t\t\t\tthis.contadores.resubidasPorRechazo++;\n\t\t\t\t// Cae a la subida de abajo: un id caducado se resube, no se falla.\n\t\t\t} else {\n\t\t\t\t// \"desconocido\": no sabemos si sirve. Este turno va en línea.\n\t\t\t\treturn { ok: false, motivo: `no se pudo verificar el id ${entrada.id}; el adjunto va en línea` };\n\t\t\t}\n\t\t}\n\n\t\tconst nombre = `ada-${hash.slice(0, 16)}.${extensionDe(bloque.mime)}`;\n\t\tconst subida = await subirFichero(\n\t\t\tcapacidad,\n\t\t\tcredencial,\n\t\t\t{ datos, mime: bloque.mime, nombre },\n\t\t\tthis.red(),\n\t\t\tsignal,\n\t\t);\n\t\tif (!subida.ok) return { ok: false, motivo: subida.motivo };\n\n\t\tconst ahora = Date.now();\n\t\tthis.almacen.guardar(capacidad.proveedor, hash, {\n\t\t\tid: subida.id,\n\t\t\tbytes: bloque.bytes,\n\t\t\tmime: bloque.mime,\n\t\t\tsubidoEn: ahora,\n\t\t\tusadoEn: ahora,\n\t\t});\n\t\tthis.verificados.add(subida.id);\n\t\treturn { ok: true, id: subida.id, nueva: true };\n\t}\n\n\t/**\n\t * El proveedor rechazó la petición justo después de que le mandáramos\n\t * referencias. No sabemos si fue por ellas —el evento no trae cuerpo—, pero\n\t * un id inválido es la causa más cara de descartar: se olvidan y el turno\n\t * siguiente resube. Como mucho se paga una subida de más.\n\t */\n\trechazoDelProveedor(estado: number): string[] {\n\t\tif (!esRechazoDeReferencias(estado)) return [];\n\t\tif (this.ultimosEnviados.length === 0) return [];\n\t\tconst olvidados: string[] = [];\n\t\tfor (const enviado of this.ultimosEnviados) {\n\t\t\tthis.olvidar(enviado.proveedor, enviado.hash);\n\t\t\tthis.verificados.delete(enviado.id);\n\t\t\tthis.contadores.resubidasPorRechazo++;\n\t\t\tolvidados.push(enviado.id);\n\t\t}\n\t\tthis.ultimosEnviados = [];\n\t\treturn olvidados;\n\t}\n\n\tpeticionCorrecta(): void {\n\t\tthis.ultimosEnviados = [];\n\t}\n\n\tprivate red(): Fetch {\n\t\treturn this.fetchImpl ?? globalThis.fetch;\n\t}\n\n\tprivate olvidar(proveedor: string, hash: string): void {\n\t\tthis.almacen.olvidar(proveedor, hash);\n\t}\n\n\tasync volcar(): Promise<void> {\n\t\tawait this.almacen.volcar();\n\t}\n}\n\nfunction extensionDe(mime: string): string {\n\tconst cola = mime.split(\"/\")[1] ?? \"bin\";\n\treturn cola.replace(/[^a-z0-9]/gi, \"\") || \"bin\";\n}\n"]}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * El broker: decide, para cada adjunto de una petición, si se sube, se
3
+ * reutiliza un id que ya teníamos, o se deja en línea como siempre.
4
+ *
5
+ * Tres reglas que no son negociables, y por qué:
6
+ *
7
+ * 1. Nunca se rompe la conversación. Si la subida falla, si la credencial no
8
+ * está, si el proveedor no contesta — el adjunto viaja en línea igual que
9
+ * antes de que este módulo existiera. Este módulo solo puede AHORRAR; nunca
10
+ * puede ser el motivo de que un turno no salga.
11
+ *
12
+ * 2. Un id que viene de una sesión anterior no se usa a ciegas. Se comprueba
13
+ * UNA vez por proceso. Si el proveedor dice 404, se olvida y se resube; si
14
+ * la red falla no sabemos nada, y "no sé" no es "está muerto": ese turno va
15
+ * en línea y se vuelve a intentar en el siguiente.
16
+ *
17
+ * 3. El informe distingue tres cosas: "no había nada que subir", "no puedo
18
+ * subir y este es el motivo" y "lo he subido/reutilizado". Un `[]` y un
19
+ * `null` no significan lo mismo y no se mezclan nunca.
20
+ */
21
+ import { createHash } from "node:crypto";
22
+ import { claveDeRuta, localizarBlobs, reescribirBlobs } from "./payload.js";
23
+ import { capacidadDeBlobs, puedeSubir, subirFichero, verificarFichero, } from "./proveedor.js";
24
+ /** 1 MiB. Por debajo de esto la subida cuesta más latencia de la que ahorra. */
25
+ export const MIN_BYTES_POR_DEFECTO = 1024 * 1024;
26
+ export function hashDeContenido(datos) {
27
+ return createHash("sha256").update(datos).digest("hex");
28
+ }
29
+ /**
30
+ * ¿Este estado HTTP se puede achacar a las referencias a fichero que acabamos
31
+ * de mandar?
32
+ *
33
+ * 401, 403 y 429 quedan fuera: son credencial y cuota. Apagar el ahorro para el
34
+ * resto del proceso en la primera racha de rate limit sería leer "espera" como
35
+ * "no puedes", que es el defecto que este repositorio persigue. El resto de la
36
+ * familia 4xx sí: un `file_id` que el proveedor no acepta sale por ahí, y
37
+ * pagar una subida de más es más barato que repetir el fallo turno tras turno.
38
+ *
39
+ * Vive suelta y no dentro de la clase porque la usan los DOS caminos que apagan
40
+ * la reescritura (`after_provider_response` y `message_end`); tenerlo duplicado
41
+ * ya hizo que uno de los dos apagara con un 429.
42
+ */
43
+ export function esRechazoDeReferencias(estado) {
44
+ if (estado < 400 || estado >= 500)
45
+ return false;
46
+ return estado !== 401 && estado !== 403 && estado !== 429;
47
+ }
48
+ export class BrokerDeBlobs {
49
+ almacen;
50
+ /**
51
+ * `undefined` = usar el `fetch` global EN EL MOMENTO DE LA LLAMADA, no el
52
+ * que hubiera al construir el broker. El despachador HTTP de Ada instala su
53
+ * propio `globalThis.fetch` (proxy, timeouts) DESPUÉS de cargar las
54
+ * extensiones; capturarlo en el constructor se saltaría esa configuración.
55
+ */
56
+ fetchImpl;
57
+ minBytes;
58
+ /** Ids que este proceso ya sabe vivos (los subió él o los verificó). */
59
+ verificados = new Set();
60
+ /** Referencias que viajaron en la última petición, para atribuir un 4xx. */
61
+ ultimosEnviados = [];
62
+ /** Contadores para `/blobs`. */
63
+ contadores = { subidas: 0, reutilizaciones: 0, resubidasPorRechazo: 0 };
64
+ constructor(opciones) {
65
+ this.almacen = opciones.almacen;
66
+ this.fetchImpl = opciones.fetchImpl;
67
+ this.minBytes = opciones.minBytes ?? MIN_BYTES_POR_DEFECTO;
68
+ }
69
+ async procesar(payload, modelo, credencial, signal) {
70
+ this.ultimosEnviados = [];
71
+ const capacidad = capacidadDeBlobs(modelo);
72
+ if (!puedeSubir(capacidad)) {
73
+ return { payload, diagnostico: { estado: "no-puedo", motivo: capacidad.motivo } };
74
+ }
75
+ if (!credencial || (!credencial.apiKey && !credencial.cabeceras)) {
76
+ return {
77
+ payload,
78
+ diagnostico: { estado: "no-puedo", motivo: `sin credencial resuelta para "${capacidad.proveedor}"` },
79
+ };
80
+ }
81
+ const candidatos = localizarBlobs(payload, modelo?.api ?? "");
82
+ if (candidatos === null) {
83
+ // El payload no tiene la forma que esperábamos para esta API. Decirlo,
84
+ // no callarlo: si upstream cambia la forma, esto se ve en `/blobs`.
85
+ return {
86
+ payload,
87
+ diagnostico: { estado: "no-puedo", motivo: `el payload de "${modelo?.api}" no tiene la forma esperada` },
88
+ };
89
+ }
90
+ const grandes = candidatos.filter((bloque) => bloque.bytes >= this.minBytes);
91
+ if (grandes.length === 0) {
92
+ return { payload, diagnostico: { estado: "nada-que-subir", pequenos: candidatos.length } };
93
+ }
94
+ const ids = new Map();
95
+ const omitidos = [];
96
+ let subidos = 0;
97
+ let reutilizados = 0;
98
+ /** Dentro de una misma petición, el mismo contenido se resuelve una vez. */
99
+ const resueltosAqui = new Map();
100
+ for (const bloque of grandes) {
101
+ const datos = Buffer.from(bloque.base64, "base64");
102
+ const hash = hashDeContenido(datos);
103
+ const yaResuelto = resueltosAqui.get(hash);
104
+ if (yaResuelto) {
105
+ ids.set(claveDeRuta(bloque.ruta), yaResuelto);
106
+ reutilizados++;
107
+ continue;
108
+ }
109
+ const resultado = await this.referenciaPara(capacidad, credencial, hash, datos, bloque, signal);
110
+ if (!resultado.ok) {
111
+ omitidos.push({ bytes: bloque.bytes, motivo: resultado.motivo });
112
+ continue;
113
+ }
114
+ resueltosAqui.set(hash, resultado.id);
115
+ ids.set(claveDeRuta(bloque.ruta), resultado.id);
116
+ this.ultimosEnviados.push({ proveedor: capacidad.proveedor, hash, id: resultado.id });
117
+ if (resultado.nueva) {
118
+ subidos++;
119
+ this.contadores.subidas++;
120
+ }
121
+ else {
122
+ reutilizados++;
123
+ this.contadores.reutilizaciones++;
124
+ }
125
+ }
126
+ return {
127
+ payload: reescribirBlobs(payload, modelo?.api ?? "", ids),
128
+ diagnostico: { estado: "listo", subidos, reutilizados, omitidos },
129
+ };
130
+ }
131
+ async referenciaPara(capacidad, credencial, hash, datos, bloque, signal) {
132
+ const entrada = this.almacen.leer(capacidad.proveedor, hash);
133
+ if (entrada) {
134
+ if (this.verificados.has(entrada.id))
135
+ return { ok: true, id: entrada.id, nueva: false };
136
+ const estado = await verificarFichero(capacidad, credencial, entrada.id, this.red(), signal);
137
+ if (estado === "vivo") {
138
+ this.verificados.add(entrada.id);
139
+ return { ok: true, id: entrada.id, nueva: false };
140
+ }
141
+ if (estado === "muerto") {
142
+ this.olvidar(capacidad.proveedor, hash);
143
+ this.contadores.resubidasPorRechazo++;
144
+ // Cae a la subida de abajo: un id caducado se resube, no se falla.
145
+ }
146
+ else {
147
+ // "desconocido": no sabemos si sirve. Este turno va en línea.
148
+ return { ok: false, motivo: `no se pudo verificar el id ${entrada.id}; el adjunto va en línea` };
149
+ }
150
+ }
151
+ const nombre = `ada-${hash.slice(0, 16)}.${extensionDe(bloque.mime)}`;
152
+ const subida = await subirFichero(capacidad, credencial, { datos, mime: bloque.mime, nombre }, this.red(), signal);
153
+ if (!subida.ok)
154
+ return { ok: false, motivo: subida.motivo };
155
+ const ahora = Date.now();
156
+ this.almacen.guardar(capacidad.proveedor, hash, {
157
+ id: subida.id,
158
+ bytes: bloque.bytes,
159
+ mime: bloque.mime,
160
+ subidoEn: ahora,
161
+ usadoEn: ahora,
162
+ });
163
+ this.verificados.add(subida.id);
164
+ return { ok: true, id: subida.id, nueva: true };
165
+ }
166
+ /**
167
+ * El proveedor rechazó la petición justo después de que le mandáramos
168
+ * referencias. No sabemos si fue por ellas —el evento no trae cuerpo—, pero
169
+ * un id inválido es la causa más cara de descartar: se olvidan y el turno
170
+ * siguiente resube. Como mucho se paga una subida de más.
171
+ */
172
+ rechazoDelProveedor(estado) {
173
+ if (!esRechazoDeReferencias(estado))
174
+ return [];
175
+ if (this.ultimosEnviados.length === 0)
176
+ return [];
177
+ const olvidados = [];
178
+ for (const enviado of this.ultimosEnviados) {
179
+ this.olvidar(enviado.proveedor, enviado.hash);
180
+ this.verificados.delete(enviado.id);
181
+ this.contadores.resubidasPorRechazo++;
182
+ olvidados.push(enviado.id);
183
+ }
184
+ this.ultimosEnviados = [];
185
+ return olvidados;
186
+ }
187
+ peticionCorrecta() {
188
+ this.ultimosEnviados = [];
189
+ }
190
+ red() {
191
+ return this.fetchImpl ?? globalThis.fetch;
192
+ }
193
+ olvidar(proveedor, hash) {
194
+ this.almacen.olvidar(proveedor, hash);
195
+ }
196
+ async volcar() {
197
+ await this.almacen.volcar();
198
+ }
199
+ }
200
+ function extensionDe(mime) {
201
+ const cola = mime.split("/")[1] ?? "bin";
202
+ return cola.replace(/[^a-z0-9]/gi, "") || "bin";
203
+ }
204
+ //# sourceMappingURL=broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../../src/core/blobs/broker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * El broker: decide, para cada adjunto de una petición, si se sube, se\n * reutiliza un id que ya teníamos, o se deja en línea como siempre.\n *\n * Tres reglas que no son negociables, y por qué:\n *\n * 1. Nunca se rompe la conversación. Si la subida falla, si la credencial no\n * está, si el proveedor no contesta — el adjunto viaja en línea igual que\n * antes de que este módulo existiera. Este módulo solo puede AHORRAR; nunca\n * puede ser el motivo de que un turno no salga.\n *\n * 2. Un id que viene de una sesión anterior no se usa a ciegas. Se comprueba\n * UNA vez por proceso. Si el proveedor dice 404, se olvida y se resube; si\n * la red falla no sabemos nada, y \"no sé\" no es \"está muerto\": ese turno va\n * en línea y se vuelve a intentar en el siguiente.\n *\n * 3. El informe distingue tres cosas: \"no había nada que subir\", \"no puedo\n * subir y este es el motivo\" y \"lo he subido/reutilizado\". Un `[]` y un\n * `null` no significan lo mismo y no se mezclan nunca.\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { AlmacenDeBlobs } from \"./almacen.ts\";\nimport { type BloqueBlob, claveDeRuta, localizarBlobs, reescribirBlobs } from \"./payload.ts\";\nimport {\n\ttype CapacidadDeBlobs,\n\ttype Credencial,\n\tcapacidadDeBlobs,\n\ttype Fetch,\n\ttype ModeloParaBlobs,\n\tpuedeSubir,\n\tsubirFichero,\n\tverificarFichero,\n} from \"./proveedor.ts\";\n\n/** 1 MiB. Por debajo de esto la subida cuesta más latencia de la que ahorra. */\nexport const MIN_BYTES_POR_DEFECTO = 1024 * 1024;\n\nexport interface OmisionDeBlob {\n\tbytes: number;\n\tmotivo: string;\n}\n\nexport type Diagnostico =\n\t| {\n\t\t\testado: \"listo\";\n\t\t\tsubidos: number;\n\t\t\treutilizados: number;\n\t\t\t/** Adjuntos que había pero no se pudieron referenciar, con su motivo. */\n\t\t\tomitidos: OmisionDeBlob[];\n\t }\n\t| {\n\t\t\testado: \"nada-que-subir\";\n\t\t\t/** Adjuntos vistos pero por debajo del umbral. */\n\t\t\tpequenos: number;\n\t }\n\t| { estado: \"no-puedo\"; motivo: string };\n\nexport interface ResultadoDeProceso {\n\tpayload: unknown;\n\tdiagnostico: Diagnostico;\n}\n\nexport interface OpcionesDeBroker {\n\talmacen: AlmacenDeBlobs;\n\tfetchImpl?: Fetch;\n\tminBytes?: number;\n}\n\ninterface IdEnviado {\n\tproveedor: string;\n\thash: string;\n\tid: string;\n}\n\nexport function hashDeContenido(datos: Uint8Array): string {\n\treturn createHash(\"sha256\").update(datos).digest(\"hex\");\n}\n\n/**\n * ¿Este estado HTTP se puede achacar a las referencias a fichero que acabamos\n * de mandar?\n *\n * 401, 403 y 429 quedan fuera: son credencial y cuota. Apagar el ahorro para el\n * resto del proceso en la primera racha de rate limit sería leer \"espera\" como\n * \"no puedes\", que es el defecto que este repositorio persigue. El resto de la\n * familia 4xx sí: un `file_id` que el proveedor no acepta sale por ahí, y\n * pagar una subida de más es más barato que repetir el fallo turno tras turno.\n *\n * Vive suelta y no dentro de la clase porque la usan los DOS caminos que apagan\n * la reescritura (`after_provider_response` y `message_end`); tenerlo duplicado\n * ya hizo que uno de los dos apagara con un 429.\n */\nexport function esRechazoDeReferencias(estado: number): boolean {\n\tif (estado < 400 || estado >= 500) return false;\n\treturn estado !== 401 && estado !== 403 && estado !== 429;\n}\n\nexport class BrokerDeBlobs {\n\tprivate readonly almacen: AlmacenDeBlobs;\n\t/**\n\t * `undefined` = usar el `fetch` global EN EL MOMENTO DE LA LLAMADA, no el\n\t * que hubiera al construir el broker. El despachador HTTP de Ada instala su\n\t * propio `globalThis.fetch` (proxy, timeouts) DESPUÉS de cargar las\n\t * extensiones; capturarlo en el constructor se saltaría esa configuración.\n\t */\n\tprivate readonly fetchImpl: Fetch | undefined;\n\tprivate readonly minBytes: number;\n\t/** Ids que este proceso ya sabe vivos (los subió él o los verificó). */\n\tprivate readonly verificados = new Set<string>();\n\t/** Referencias que viajaron en la última petición, para atribuir un 4xx. */\n\tprivate ultimosEnviados: IdEnviado[] = [];\n\t/** Contadores para `/blobs`. */\n\treadonly contadores = { subidas: 0, reutilizaciones: 0, resubidasPorRechazo: 0 };\n\n\tconstructor(opciones: OpcionesDeBroker) {\n\t\tthis.almacen = opciones.almacen;\n\t\tthis.fetchImpl = opciones.fetchImpl;\n\t\tthis.minBytes = opciones.minBytes ?? MIN_BYTES_POR_DEFECTO;\n\t}\n\n\tasync procesar(\n\t\tpayload: unknown,\n\t\tmodelo: ModeloParaBlobs | undefined,\n\t\tcredencial: Credencial | undefined,\n\t\tsignal?: AbortSignal,\n\t): Promise<ResultadoDeProceso> {\n\t\tthis.ultimosEnviados = [];\n\t\tconst capacidad = capacidadDeBlobs(modelo);\n\t\tif (!puedeSubir(capacidad)) {\n\t\t\treturn { payload, diagnostico: { estado: \"no-puedo\", motivo: capacidad.motivo } };\n\t\t}\n\t\tif (!credencial || (!credencial.apiKey && !credencial.cabeceras)) {\n\t\t\treturn {\n\t\t\t\tpayload,\n\t\t\t\tdiagnostico: { estado: \"no-puedo\", motivo: `sin credencial resuelta para \"${capacidad.proveedor}\"` },\n\t\t\t};\n\t\t}\n\n\t\tconst candidatos = localizarBlobs(payload, modelo?.api ?? \"\");\n\t\tif (candidatos === null) {\n\t\t\t// El payload no tiene la forma que esperábamos para esta API. Decirlo,\n\t\t\t// no callarlo: si upstream cambia la forma, esto se ve en `/blobs`.\n\t\t\treturn {\n\t\t\t\tpayload,\n\t\t\t\tdiagnostico: { estado: \"no-puedo\", motivo: `el payload de \"${modelo?.api}\" no tiene la forma esperada` },\n\t\t\t};\n\t\t}\n\n\t\tconst grandes = candidatos.filter((bloque) => bloque.bytes >= this.minBytes);\n\t\tif (grandes.length === 0) {\n\t\t\treturn { payload, diagnostico: { estado: \"nada-que-subir\", pequenos: candidatos.length } };\n\t\t}\n\n\t\tconst ids = new Map<string, string>();\n\t\tconst omitidos: OmisionDeBlob[] = [];\n\t\tlet subidos = 0;\n\t\tlet reutilizados = 0;\n\t\t/** Dentro de una misma petición, el mismo contenido se resuelve una vez. */\n\t\tconst resueltosAqui = new Map<string, string>();\n\n\t\tfor (const bloque of grandes) {\n\t\t\tconst datos = Buffer.from(bloque.base64, \"base64\");\n\t\t\tconst hash = hashDeContenido(datos);\n\n\t\t\tconst yaResuelto = resueltosAqui.get(hash);\n\t\t\tif (yaResuelto) {\n\t\t\t\tids.set(claveDeRuta(bloque.ruta), yaResuelto);\n\t\t\t\treutilizados++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst resultado = await this.referenciaPara(capacidad, credencial, hash, datos, bloque, signal);\n\t\t\tif (!resultado.ok) {\n\t\t\t\tomitidos.push({ bytes: bloque.bytes, motivo: resultado.motivo });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tresueltosAqui.set(hash, resultado.id);\n\t\t\tids.set(claveDeRuta(bloque.ruta), resultado.id);\n\t\t\tthis.ultimosEnviados.push({ proveedor: capacidad.proveedor, hash, id: resultado.id });\n\t\t\tif (resultado.nueva) {\n\t\t\t\tsubidos++;\n\t\t\t\tthis.contadores.subidas++;\n\t\t\t} else {\n\t\t\t\treutilizados++;\n\t\t\t\tthis.contadores.reutilizaciones++;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tpayload: reescribirBlobs(payload, modelo?.api ?? \"\", ids),\n\t\t\tdiagnostico: { estado: \"listo\", subidos, reutilizados, omitidos },\n\t\t};\n\t}\n\n\tprivate async referenciaPara(\n\t\tcapacidad: CapacidadDeBlobs,\n\t\tcredencial: Credencial,\n\t\thash: string,\n\t\tdatos: Uint8Array,\n\t\tbloque: BloqueBlob,\n\t\tsignal?: AbortSignal,\n\t): Promise<{ ok: true; id: string; nueva: boolean } | { ok: false; motivo: string }> {\n\t\tconst entrada = this.almacen.leer(capacidad.proveedor, hash);\n\t\tif (entrada) {\n\t\t\tif (this.verificados.has(entrada.id)) return { ok: true, id: entrada.id, nueva: false };\n\t\t\tconst estado = await verificarFichero(capacidad, credencial, entrada.id, this.red(), signal);\n\t\t\tif (estado === \"vivo\") {\n\t\t\t\tthis.verificados.add(entrada.id);\n\t\t\t\treturn { ok: true, id: entrada.id, nueva: false };\n\t\t\t}\n\t\t\tif (estado === \"muerto\") {\n\t\t\t\tthis.olvidar(capacidad.proveedor, hash);\n\t\t\t\tthis.contadores.resubidasPorRechazo++;\n\t\t\t\t// Cae a la subida de abajo: un id caducado se resube, no se falla.\n\t\t\t} else {\n\t\t\t\t// \"desconocido\": no sabemos si sirve. Este turno va en línea.\n\t\t\t\treturn { ok: false, motivo: `no se pudo verificar el id ${entrada.id}; el adjunto va en línea` };\n\t\t\t}\n\t\t}\n\n\t\tconst nombre = `ada-${hash.slice(0, 16)}.${extensionDe(bloque.mime)}`;\n\t\tconst subida = await subirFichero(\n\t\t\tcapacidad,\n\t\t\tcredencial,\n\t\t\t{ datos, mime: bloque.mime, nombre },\n\t\t\tthis.red(),\n\t\t\tsignal,\n\t\t);\n\t\tif (!subida.ok) return { ok: false, motivo: subida.motivo };\n\n\t\tconst ahora = Date.now();\n\t\tthis.almacen.guardar(capacidad.proveedor, hash, {\n\t\t\tid: subida.id,\n\t\t\tbytes: bloque.bytes,\n\t\t\tmime: bloque.mime,\n\t\t\tsubidoEn: ahora,\n\t\t\tusadoEn: ahora,\n\t\t});\n\t\tthis.verificados.add(subida.id);\n\t\treturn { ok: true, id: subida.id, nueva: true };\n\t}\n\n\t/**\n\t * El proveedor rechazó la petición justo después de que le mandáramos\n\t * referencias. No sabemos si fue por ellas —el evento no trae cuerpo—, pero\n\t * un id inválido es la causa más cara de descartar: se olvidan y el turno\n\t * siguiente resube. Como mucho se paga una subida de más.\n\t */\n\trechazoDelProveedor(estado: number): string[] {\n\t\tif (!esRechazoDeReferencias(estado)) return [];\n\t\tif (this.ultimosEnviados.length === 0) return [];\n\t\tconst olvidados: string[] = [];\n\t\tfor (const enviado of this.ultimosEnviados) {\n\t\t\tthis.olvidar(enviado.proveedor, enviado.hash);\n\t\t\tthis.verificados.delete(enviado.id);\n\t\t\tthis.contadores.resubidasPorRechazo++;\n\t\t\tolvidados.push(enviado.id);\n\t\t}\n\t\tthis.ultimosEnviados = [];\n\t\treturn olvidados;\n\t}\n\n\tpeticionCorrecta(): void {\n\t\tthis.ultimosEnviados = [];\n\t}\n\n\tprivate red(): Fetch {\n\t\treturn this.fetchImpl ?? globalThis.fetch;\n\t}\n\n\tprivate olvidar(proveedor: string, hash: string): void {\n\t\tthis.almacen.olvidar(proveedor, hash);\n\t}\n\n\tasync volcar(): Promise<void> {\n\t\tawait this.almacen.volcar();\n\t}\n}\n\nfunction extensionDe(mime: string): string {\n\tconst cola = mime.split(\"/\")[1] ?? \"bin\";\n\treturn cola.replace(/[^a-z0-9]/gi, \"\") || \"bin\";\n}\n"]}