@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,271 @@
1
+ /**
2
+ * El índice del audit del motor de memoria: lo que DEBERÍA existir.
3
+ *
4
+ * EL AGUJERO, medido antes de escribir nada, sobre un directorio temporal con
5
+ * cinco entradas y la implementación de `audit.ts` tal como estaba:
6
+ *
7
+ * 1) las 5 entradas intactas : {"valid":true,"entriesChecked":5}
8
+ * 2) editada la del medio : {"valid":false,"entriesChecked":2}
9
+ * 3) fichero BORRADO entero : {"valid":true,"entriesChecked":0} <- éxito
10
+ * 4) TRUNCADO (-2 últimas) : {"valid":true,"entriesChecked":3} <- éxito
11
+ * 5) QUITADA una del medio : {"valid":false,"entriesChecked":2}
12
+ *
13
+ * Y las dos que sacan la forma completa:
14
+ *
15
+ * B) directorio `audit/` borrado : {"valid":false,"entriesChecked":0}
16
+ * C) instalación nueva : {"valid":false,"entriesChecked":0} <- lo mismo
17
+ *
18
+ * O sea: no había tres estados, había dos, y ninguno caía donde debía. Un
19
+ * borrado se leía como éxito y una instalación virgen se leía como
20
+ * manipulación — un detector que acusa a toda instalación limpia deja de
21
+ * leerse, y con él se va también la señal de la manipulación real.
22
+ *
23
+ * LA RAZÓN DE FONDO, y por eso esto es un módulo aparte y no un `if` más en
24
+ * `verify`: la cadena de hashes NO PUEDE, por construcción, hablar de lo que ya
25
+ * no está. `readdir(audit/)` solo sabe contestar «lo que hay». Para contestar
26
+ * «lo que debería haber» hace falta un registro APARTE, que es exactamente lo
27
+ * que `audit/libro.ts` resolvió con su índice de dos directorios.
28
+ *
29
+ * LA DIFERENCIA CON `libro.ts`, que es la que decide el diseño: allí el ancla
30
+ * es un ENLACE DURO por fichero, y basta porque el ataque que importa es `rm`.
31
+ * Aquí no basta. Un enlace duro comparte inodo, así que `truncate` recorta los
32
+ * bytes de los DOS nombres a la vez y el caso 4 seguiría pasando entero. Y el
33
+ * caso 4 tiene una variante peor, la que de verdad ocurre: truncar y dejar que
34
+ * el proceso siga: `load()` lee la última entrada superviviente, retoma `seq` y
35
+ * `lastHash` desde ahí y encadena por encima del hueco. Quedan `seq` 1,2,3,4
36
+ * correlativos y cadena perfecta, con dos entradas desaparecidas y ni una sola
37
+ * señal.
38
+ *
39
+ * Por eso el ancla de aquí es por ENTRADA y no por fichero: un fichero
40
+ * `<nombre>.ancla` en `audit-indice/`, append-only, con el hash de cada entrada
41
+ * escrita, uno por línea. Verificar es entonces una resta de conjuntos: los
42
+ * hashes que el índice recuerda y que ya no aparecen en el log son entradas que
43
+ * han desaparecido, se las hayan llevado borrando el fichero, recortándole la
44
+ * cola o quitándolas del medio.
45
+ *
46
+ * DOS DECISIONES QUE CONVIENE NO DESHACER SIN PENSARLAS:
47
+ *
48
+ * 1. **Se ancla DESPUÉS de escribir la entrada, nunca antes.** Al revés —
49
+ * escribir el ancla primero— un proceso que muera entre las dos escrituras
50
+ * dejaría un hash anclado cuya entrada no llegó nunca, y la siguiente
51
+ * verificación acusaría de manipulación a un simple corte de luz. Se prefiere
52
+ * el fallo del otro lado: durante esa ventana de microsegundos la última
53
+ * entrada está sin anclar y su desaparición no se detectaría. Un falso
54
+ * negativo estrechísimo es mejor que un falso positivo en cada caída.
55
+ * 2. **Lo que sobra no acusa.** Entradas del log que no estén en el índice NO
56
+ * son un hallazgo: son logs escritos antes de que el índice existiera, o la
57
+ * ventana del punto anterior. Solo cuenta lo que el índice recuerda y ya no
58
+ * está. Sin esta asimetría, el día de la actualización toda instalación
59
+ * existente gritaría «manipulado».
60
+ *
61
+ * HASTA DÓNDE LLEGA, dicho sin adornos: quien borre los DOS directorios deja un
62
+ * registro vacío indistinguible de una instalación nueva. Contra eso no hay
63
+ * ancla local que valga —cualquier ancla en el mismo disco y con los mismos
64
+ * permisos se borra igual—; hace falta un ancla externa. Lo que esto elimina es
65
+ * que un solo `rm` o un solo `truncate` pasen desapercibidos.
66
+ */
67
+ import { appendFile, mkdir, readdir, readFile } from "node:fs/promises";
68
+ import { join } from "node:path";
69
+ /** Donde vive el log: `<rootDir>/audit/audit-YYYY-MM-DD.jsonl`. */
70
+ export const DIR_AUDIT = "audit";
71
+ /**
72
+ * El índice: `<rootDir>/audit-indice/<nombre del log>.ancla`.
73
+ *
74
+ * Va FUERA de `audit/` a propósito. Dentro, el `rm -rf audit/` que este
75
+ * mecanismo existe para detectar se llevaría por delante también la prueba.
76
+ */
77
+ export const DIR_INDICE_AUDIT = "audit-indice";
78
+ const RE_LOG = /^audit-.*\.jsonl$/;
79
+ const SUFIJO_ANCLA = ".ancla";
80
+ /**
81
+ * Anota en el índice el hash de una entrada recién escrita.
82
+ *
83
+ * Append-only y una línea por entrada: sobrescribir un ancla con «la última»
84
+ * la volvería inútil justo en el caso que importa, porque tras un truncado el
85
+ * proceso siguiente la sobrescribiría con un número MENOR y borraría la prueba.
86
+ */
87
+ export async function anclarEntrada(raiz, fichero, hash) {
88
+ const dir = join(raiz, DIR_INDICE_AUDIT);
89
+ await mkdir(dir, { recursive: true });
90
+ await appendFile(join(dir, fichero + SUFIJO_ANCLA), `${hash}\n`, "utf-8");
91
+ }
92
+ /** `null` = no se ha podido mirar, que no es lo mismo que «no hay nada». */
93
+ async function listar(dir, filtro) {
94
+ try {
95
+ return (await readdir(dir)).filter((f) => filtro.test(f)).sort();
96
+ }
97
+ catch (error) {
98
+ if (error.code === "ENOENT")
99
+ return [];
100
+ return null;
101
+ }
102
+ }
103
+ function veredictoIlegible(motivo, comprobadas = 0) {
104
+ return { estado: "alterado", valid: false, entriesChecked: comprobadas, causa: "ilegible", motivo };
105
+ }
106
+ /**
107
+ * Verifica el registro entero y contesta TRES estados.
108
+ *
109
+ * Reparto de tareas, que es lo que hace que esto no sea un parche:
110
+ *
111
+ * · la cadena de hashes dice si lo que HAY está intacto y en orden;
112
+ * · el índice dice si lo que hay es TODO lo que hubo.
113
+ *
114
+ * Ninguna de las dos puede contestar la pregunta de la otra.
115
+ *
116
+ * `rehash` se inyecta en vez de importarse para no crear un ciclo con
117
+ * `audit.ts`, que es quien tiene la única canonicalización buena — la misma que
118
+ * usa al escribir, reconstruida con un rest para que las dos caras no puedan
119
+ * divergir.
120
+ */
121
+ export async function verificarRegistro(raiz, rehash) {
122
+ const dirAudit = join(raiz, DIR_AUDIT);
123
+ const dirIndice = join(raiz, DIR_INDICE_AUDIT);
124
+ const logs = await listar(dirAudit, RE_LOG);
125
+ if (logs === null)
126
+ return veredictoIlegible("no se ha podido leer el directorio del registro: no es «está bien», es «no lo sé»");
127
+ const anclas = await listar(dirIndice, new RegExp(`^audit-.*\\.jsonl\\${SUFIJO_ANCLA}$`));
128
+ if (anclas === null)
129
+ return veredictoIlegible("no se ha podido leer el índice del registro: no es «está bien», es «no lo sé»");
130
+ // Lo que el índice recuerda, por fichero.
131
+ const recordados = new Map();
132
+ for (const ancla of anclas) {
133
+ const nombre = ancla.slice(0, -SUFIJO_ANCLA.length);
134
+ try {
135
+ const hashes = (await readFile(join(dirIndice, ancla), "utf-8")).split("\n").filter(Boolean);
136
+ if (hashes.length > 0)
137
+ recordados.set(nombre, hashes);
138
+ }
139
+ catch {
140
+ return veredictoIlegible(`no se ha podido leer el ancla de ${nombre}: no es «está bien», es «no lo sé»`);
141
+ }
142
+ }
143
+ // Un registro que nunca se escribió NO es un registro íntegro. Este es el
144
+ // caso C: sin esto, la instalación virgen daba el mismo veredicto que el
145
+ // directorio borrado del caso B.
146
+ if (logs.length === 0 && recordados.size === 0) {
147
+ return { estado: "vacio", valid: true, entriesChecked: 0 };
148
+ }
149
+ const presentes = new Set(logs);
150
+ const borrados = [];
151
+ const incompletos = [];
152
+ const sinAncla = [];
153
+ // Los ficheros que el índice recuerda y ya NO están. Se cuentan antes de
154
+ // recorrer la cadena porque son la EXPLICACIÓN de los enlaces rotos que
155
+ // vengan después: sin esto, un fichero borrado se denunciaría como «enlace
156
+ // roto» en el fichero siguiente, acusando de mover entradas a quien borró un
157
+ // día entero.
158
+ for (const [nombre, hashes] of recordados) {
159
+ if (!presentes.has(nombre))
160
+ borrados.push({ fichero: nombre, entradas: hashes.length });
161
+ }
162
+ let prevHash = null;
163
+ let comprobadas = 0;
164
+ // La cadena del audit de memoria es GLOBAL entre ficheros —`append` nunca
165
+ // reinicia `prevHash` al cambiar de día—, así que se arrastra de un fichero
166
+ // al siguiente. Es justo al revés que en `libro.ts`, donde cada fichero es
167
+ // una sesión y empieza en `null`.
168
+ for (const nombre of logs) {
169
+ const anclados = recordados.get(nombre);
170
+ if (!anclados)
171
+ sinAncla.push(nombre);
172
+ let crudo;
173
+ try {
174
+ crudo = await readFile(join(dirAudit, nombre), "utf-8");
175
+ }
176
+ catch {
177
+ return {
178
+ ...veredictoIlegible(`no se ha podido leer ${nombre}: no es «está bien», es «no lo sé»`, comprobadas),
179
+ ficheroAlterado: nombre,
180
+ };
181
+ }
182
+ const vistos = new Set();
183
+ for (const linea of crudo.split("\n").filter(Boolean)) {
184
+ let entrada;
185
+ try {
186
+ entrada = JSON.parse(linea);
187
+ }
188
+ catch {
189
+ return {
190
+ estado: "alterado",
191
+ valid: false,
192
+ entriesChecked: comprobadas,
193
+ causa: "editada",
194
+ motivo: "hay una línea que no es JSON válido",
195
+ ficheroAlterado: nombre,
196
+ ...(borrados.length ? { borrados } : {}),
197
+ };
198
+ }
199
+ const { hash, prevHash: declarado, ...carga } = entrada;
200
+ // Dos preguntas distintas que antes iban juntas y contestaban lo mismo:
201
+ //
202
+ // · ¿el hash cuadra con SU PROPIO contenido? -> la han editado.
203
+ // · ¿su `prevHash` apunta a la anterior? -> faltan entradas o
204
+ // están cambiadas de orden.
205
+ if (typeof hash !== "string" || hash !== rehash(declarado ?? null, carga)) {
206
+ return {
207
+ estado: "alterado",
208
+ valid: false,
209
+ entriesChecked: comprobadas,
210
+ tamperedAt: entrada.ts,
211
+ causa: "editada",
212
+ motivo: "el hash de una entrada no cuadra con su contenido: la han editado",
213
+ ficheroAlterado: nombre,
214
+ ...(borrados.length ? { borrados } : {}),
215
+ };
216
+ }
217
+ if ((declarado ?? null) !== prevHash) {
218
+ // Un enlace roto DESPUÉS de una ausencia ya conocida no es un
219
+ // hallazgo nuevo: es su consecuencia. Se sigue leyendo para poder
220
+ // contar lo que queda, y la causa se decide al final.
221
+ if (borrados.length === 0 && incompletos.length === 0) {
222
+ return {
223
+ estado: "alterado",
224
+ valid: false,
225
+ entriesChecked: comprobadas,
226
+ tamperedAt: entrada.ts,
227
+ causa: "enlace-roto",
228
+ motivo: "el enlace de una entrada no apunta a la anterior: faltan entradas o están cambiadas de orden",
229
+ ficheroAlterado: nombre,
230
+ };
231
+ }
232
+ }
233
+ vistos.add(hash);
234
+ prevHash = hash;
235
+ comprobadas++;
236
+ }
237
+ // La resta que la cadena no puede hacer: lo que el índice recuerda y el
238
+ // fichero ya no enseña. Cubre el truncado, el truncado-y-seguir-
239
+ // escribiendo, y la entrada quitada del medio.
240
+ if (anclados) {
241
+ const faltan = anclados.filter((h) => !vistos.has(h)).length;
242
+ if (faltan > 0)
243
+ incompletos.push({ fichero: nombre, entradas: anclados.length, faltan });
244
+ }
245
+ }
246
+ if (borrados.length > 0 || incompletos.length > 0) {
247
+ const soloBorrados = incompletos.length === 0;
248
+ return {
249
+ estado: "alterado",
250
+ valid: false,
251
+ entriesChecked: comprobadas,
252
+ causa: soloBorrados ? "borrado" : "faltan-entradas",
253
+ motivo: soloBorrados
254
+ ? "el índice recuerda ficheros que ya no están: los han borrado"
255
+ : "faltan entradas que el índice recuerda haber escrito: las han quitado del registro",
256
+ ...(borrados.length ? { borrados } : {}),
257
+ ...(incompletos.length ? { incompletos } : {}),
258
+ ...(sinAncla.length ? { sinAncla } : {}),
259
+ };
260
+ }
261
+ // Un registro con ancla y sin entradas todavía sigue siendo un registro
262
+ // vacío: `estado: "vacio"` y no `"integro"`, para que la respuesta no
263
+ // dependa de si el índice llegó a crearse antes de la primera entrada.
264
+ return {
265
+ estado: comprobadas === 0 ? "vacio" : "integro",
266
+ valid: true,
267
+ entriesChecked: comprobadas,
268
+ ...(sinAncla.length ? { sinAncla } : {}),
269
+ };
270
+ }
271
+ //# sourceMappingURL=audit-indice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-indice.js","sourceRoot":"","sources":["../../../src/core/memory-engine/audit-indice.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * El índice del audit del motor de memoria: lo que DEBERÍA existir.\n *\n * EL AGUJERO, medido antes de escribir nada, sobre un directorio temporal con\n * cinco entradas y la implementación de `audit.ts` tal como estaba:\n *\n * 1) las 5 entradas intactas : {\"valid\":true,\"entriesChecked\":5}\n * 2) editada la del medio : {\"valid\":false,\"entriesChecked\":2}\n * 3) fichero BORRADO entero : {\"valid\":true,\"entriesChecked\":0} <- éxito\n * 4) TRUNCADO (-2 últimas) : {\"valid\":true,\"entriesChecked\":3} <- éxito\n * 5) QUITADA una del medio : {\"valid\":false,\"entriesChecked\":2}\n *\n * Y las dos que sacan la forma completa:\n *\n * B) directorio `audit/` borrado : {\"valid\":false,\"entriesChecked\":0}\n * C) instalación nueva : {\"valid\":false,\"entriesChecked\":0} <- lo mismo\n *\n * O sea: no había tres estados, había dos, y ninguno caía donde debía. Un\n * borrado se leía como éxito y una instalación virgen se leía como\n * manipulación — un detector que acusa a toda instalación limpia deja de\n * leerse, y con él se va también la señal de la manipulación real.\n *\n * LA RAZÓN DE FONDO, y por eso esto es un módulo aparte y no un `if` más en\n * `verify`: la cadena de hashes NO PUEDE, por construcción, hablar de lo que ya\n * no está. `readdir(audit/)` solo sabe contestar «lo que hay». Para contestar\n * «lo que debería haber» hace falta un registro APARTE, que es exactamente lo\n * que `audit/libro.ts` resolvió con su índice de dos directorios.\n *\n * LA DIFERENCIA CON `libro.ts`, que es la que decide el diseño: allí el ancla\n * es un ENLACE DURO por fichero, y basta porque el ataque que importa es `rm`.\n * Aquí no basta. Un enlace duro comparte inodo, así que `truncate` recorta los\n * bytes de los DOS nombres a la vez y el caso 4 seguiría pasando entero. Y el\n * caso 4 tiene una variante peor, la que de verdad ocurre: truncar y dejar que\n * el proceso siga: `load()` lee la última entrada superviviente, retoma `seq` y\n * `lastHash` desde ahí y encadena por encima del hueco. Quedan `seq` 1,2,3,4\n * correlativos y cadena perfecta, con dos entradas desaparecidas y ni una sola\n * señal.\n *\n * Por eso el ancla de aquí es por ENTRADA y no por fichero: un fichero\n * `<nombre>.ancla` en `audit-indice/`, append-only, con el hash de cada entrada\n * escrita, uno por línea. Verificar es entonces una resta de conjuntos: los\n * hashes que el índice recuerda y que ya no aparecen en el log son entradas que\n * han desaparecido, se las hayan llevado borrando el fichero, recortándole la\n * cola o quitándolas del medio.\n *\n * DOS DECISIONES QUE CONVIENE NO DESHACER SIN PENSARLAS:\n *\n * 1. **Se ancla DESPUÉS de escribir la entrada, nunca antes.** Al revés —\n * escribir el ancla primero— un proceso que muera entre las dos escrituras\n * dejaría un hash anclado cuya entrada no llegó nunca, y la siguiente\n * verificación acusaría de manipulación a un simple corte de luz. Se prefiere\n * el fallo del otro lado: durante esa ventana de microsegundos la última\n * entrada está sin anclar y su desaparición no se detectaría. Un falso\n * negativo estrechísimo es mejor que un falso positivo en cada caída.\n * 2. **Lo que sobra no acusa.** Entradas del log que no estén en el índice NO\n * son un hallazgo: son logs escritos antes de que el índice existiera, o la\n * ventana del punto anterior. Solo cuenta lo que el índice recuerda y ya no\n * está. Sin esta asimetría, el día de la actualización toda instalación\n * existente gritaría «manipulado».\n *\n * HASTA DÓNDE LLEGA, dicho sin adornos: quien borre los DOS directorios deja un\n * registro vacío indistinguible de una instalación nueva. Contra eso no hay\n * ancla local que valga —cualquier ancla en el mismo disco y con los mismos\n * permisos se borra igual—; hace falta un ancla externa. Lo que esto elimina es\n * que un solo `rm` o un solo `truncate` pasen desapercibidos.\n */\n\nimport { appendFile, mkdir, readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/** Donde vive el log: `<rootDir>/audit/audit-YYYY-MM-DD.jsonl`. */\nexport const DIR_AUDIT = \"audit\";\n\n/**\n * El índice: `<rootDir>/audit-indice/<nombre del log>.ancla`.\n *\n * Va FUERA de `audit/` a propósito. Dentro, el `rm -rf audit/` que este\n * mecanismo existe para detectar se llevaría por delante también la prueba.\n */\nexport const DIR_INDICE_AUDIT = \"audit-indice\";\n\nconst RE_LOG = /^audit-.*\\.jsonl$/;\nconst SUFIJO_ANCLA = \".ancla\";\n\n/** Los tres estados. «Vacío» NO es «íntegro»: ver la cabecera de este fichero. */\nexport type EstadoDelRegistro = \"integro\" | \"alterado\" | \"vacio\";\n\n/**\n * Por qué está alterado, que no es lo mismo que el hecho de que lo esté.\n *\n * Un detector que diera el mismo veredicto a tres causas distintas no\n * distinguiría ninguna, y el mensaje acabaría acusando de lo que no es.\n *\n * `ilegible` es el que no acusa de nada: es «no lo he podido mirar», y va\n * separado de los demás porque para quien responde a una auditoría no es lo\n * mismo que «lo he mirado y no cuadra».\n */\nexport type CausaDeAlteracion = \"editada\" | \"enlace-roto\" | \"borrado\" | \"faltan-entradas\" | \"ilegible\";\n\nexport interface VeredictoDelRegistro {\n\testado: EstadoDelRegistro;\n\t/**\n\t * Compat con quien ya lee este veredicto: el modo interactivo, la ruta\n\t * `/api/memory/audit` del escritorio y `audit-export.ts`. Es `estado ===\n\t * \"integro\" || estado === \"vacio\"` — una instalación virgen no está\n\t * manipulada, y quien quiera distinguirlas tiene `estado`.\n\t */\n\tvalid: boolean;\n\tentriesChecked: number;\n\t/** Sello de tiempo de la primera entrada que no cuadra. */\n\ttamperedAt?: string;\n\tcausa?: CausaDeAlteracion;\n\t/** Por qué no verifica, en una frase estable. */\n\tmotivo?: string;\n\t/** Dónde mirar. Sin esto el aviso de manipulación se queda en susto. */\n\tficheroAlterado?: string;\n\t/** Ficheros que el índice recuerda y que ya no están, con cuántas entradas tenían. */\n\tborrados?: { fichero: string; entradas: number }[];\n\t/** Ficheros que siguen ahí pero a los que les faltan entradas ancladas. */\n\tincompletos?: { fichero: string; entradas: number; faltan: number }[];\n\t/**\n\t * Ficheros del log sin ancla en el índice: logs anteriores al índice.\n\t *\n\t * NO es una acusación y por eso va aparte: meterlo en `estado: \"alterado\"`\n\t * habría hecho que toda instalación ya existente gritara «manipulado» el día\n\t * de la actualización.\n\t */\n\tsinAncla?: string[];\n}\n\n/** Carga a hashear de una entrada, tal y como `audit.ts` la reconstruye. */\ntype Rehasheador = (prevHash: string | null, carga: Record<string, unknown>) => string;\n\n/** Lo mínimo que la verificación necesita saber de una entrada. */\ninterface EntradaLeida {\n\tts?: string;\n\thash?: string;\n\tprevHash?: string | null;\n\t[campo: string]: unknown;\n}\n\n/**\n * Anota en el índice el hash de una entrada recién escrita.\n *\n * Append-only y una línea por entrada: sobrescribir un ancla con «la última»\n * la volvería inútil justo en el caso que importa, porque tras un truncado el\n * proceso siguiente la sobrescribiría con un número MENOR y borraría la prueba.\n */\nexport async function anclarEntrada(raiz: string, fichero: string, hash: string): Promise<void> {\n\tconst dir = join(raiz, DIR_INDICE_AUDIT);\n\tawait mkdir(dir, { recursive: true });\n\tawait appendFile(join(dir, fichero + SUFIJO_ANCLA), `${hash}\\n`, \"utf-8\");\n}\n\n/** `null` = no se ha podido mirar, que no es lo mismo que «no hay nada». */\nasync function listar(dir: string, filtro: RegExp): Promise<string[] | null> {\n\ttry {\n\t\treturn (await readdir(dir)).filter((f) => filtro.test(f)).sort();\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n\t\treturn null;\n\t}\n}\n\nfunction veredictoIlegible(motivo: string, comprobadas = 0): VeredictoDelRegistro {\n\treturn { estado: \"alterado\", valid: false, entriesChecked: comprobadas, causa: \"ilegible\", motivo };\n}\n\n/**\n * Verifica el registro entero y contesta TRES estados.\n *\n * Reparto de tareas, que es lo que hace que esto no sea un parche:\n *\n * · la cadena de hashes dice si lo que HAY está intacto y en orden;\n * · el índice dice si lo que hay es TODO lo que hubo.\n *\n * Ninguna de las dos puede contestar la pregunta de la otra.\n *\n * `rehash` se inyecta en vez de importarse para no crear un ciclo con\n * `audit.ts`, que es quien tiene la única canonicalización buena — la misma que\n * usa al escribir, reconstruida con un rest para que las dos caras no puedan\n * divergir.\n */\nexport async function verificarRegistro(raiz: string, rehash: Rehasheador): Promise<VeredictoDelRegistro> {\n\tconst dirAudit = join(raiz, DIR_AUDIT);\n\tconst dirIndice = join(raiz, DIR_INDICE_AUDIT);\n\n\tconst logs = await listar(dirAudit, RE_LOG);\n\tif (logs === null)\n\t\treturn veredictoIlegible(\"no se ha podido leer el directorio del registro: no es «está bien», es «no lo sé»\");\n\tconst anclas = await listar(dirIndice, new RegExp(`^audit-.*\\\\.jsonl\\\\${SUFIJO_ANCLA}$`));\n\tif (anclas === null)\n\t\treturn veredictoIlegible(\"no se ha podido leer el índice del registro: no es «está bien», es «no lo sé»\");\n\n\t// Lo que el índice recuerda, por fichero.\n\tconst recordados = new Map<string, string[]>();\n\tfor (const ancla of anclas) {\n\t\tconst nombre = ancla.slice(0, -SUFIJO_ANCLA.length);\n\t\ttry {\n\t\t\tconst hashes = (await readFile(join(dirIndice, ancla), \"utf-8\")).split(\"\\n\").filter(Boolean);\n\t\t\tif (hashes.length > 0) recordados.set(nombre, hashes);\n\t\t} catch {\n\t\t\treturn veredictoIlegible(`no se ha podido leer el ancla de ${nombre}: no es «está bien», es «no lo sé»`);\n\t\t}\n\t}\n\n\t// Un registro que nunca se escribió NO es un registro íntegro. Este es el\n\t// caso C: sin esto, la instalación virgen daba el mismo veredicto que el\n\t// directorio borrado del caso B.\n\tif (logs.length === 0 && recordados.size === 0) {\n\t\treturn { estado: \"vacio\", valid: true, entriesChecked: 0 };\n\t}\n\n\tconst presentes = new Set(logs);\n\tconst borrados: { fichero: string; entradas: number }[] = [];\n\tconst incompletos: { fichero: string; entradas: number; faltan: number }[] = [];\n\tconst sinAncla: string[] = [];\n\n\t// Los ficheros que el índice recuerda y ya NO están. Se cuentan antes de\n\t// recorrer la cadena porque son la EXPLICACIÓN de los enlaces rotos que\n\t// vengan después: sin esto, un fichero borrado se denunciaría como «enlace\n\t// roto» en el fichero siguiente, acusando de mover entradas a quien borró un\n\t// día entero.\n\tfor (const [nombre, hashes] of recordados) {\n\t\tif (!presentes.has(nombre)) borrados.push({ fichero: nombre, entradas: hashes.length });\n\t}\n\n\tlet prevHash: string | null = null;\n\tlet comprobadas = 0;\n\t// La cadena del audit de memoria es GLOBAL entre ficheros —`append` nunca\n\t// reinicia `prevHash` al cambiar de día—, así que se arrastra de un fichero\n\t// al siguiente. Es justo al revés que en `libro.ts`, donde cada fichero es\n\t// una sesión y empieza en `null`.\n\tfor (const nombre of logs) {\n\t\tconst anclados = recordados.get(nombre);\n\t\tif (!anclados) sinAncla.push(nombre);\n\t\tlet crudo: string;\n\t\ttry {\n\t\t\tcrudo = await readFile(join(dirAudit, nombre), \"utf-8\");\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\t...veredictoIlegible(`no se ha podido leer ${nombre}: no es «está bien», es «no lo sé»`, comprobadas),\n\t\t\t\tficheroAlterado: nombre,\n\t\t\t};\n\t\t}\n\t\tconst vistos = new Set<string>();\n\t\tfor (const linea of crudo.split(\"\\n\").filter(Boolean)) {\n\t\t\tlet entrada: EntradaLeida;\n\t\t\ttry {\n\t\t\t\tentrada = JSON.parse(linea) as EntradaLeida;\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\testado: \"alterado\",\n\t\t\t\t\tvalid: false,\n\t\t\t\t\tentriesChecked: comprobadas,\n\t\t\t\t\tcausa: \"editada\",\n\t\t\t\t\tmotivo: \"hay una línea que no es JSON válido\",\n\t\t\t\t\tficheroAlterado: nombre,\n\t\t\t\t\t...(borrados.length ? { borrados } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst { hash, prevHash: declarado, ...carga } = entrada;\n\t\t\t// Dos preguntas distintas que antes iban juntas y contestaban lo mismo:\n\t\t\t//\n\t\t\t// · ¿el hash cuadra con SU PROPIO contenido? -> la han editado.\n\t\t\t// · ¿su `prevHash` apunta a la anterior? -> faltan entradas o\n\t\t\t// están cambiadas de orden.\n\t\t\tif (typeof hash !== \"string\" || hash !== rehash(declarado ?? null, carga)) {\n\t\t\t\treturn {\n\t\t\t\t\testado: \"alterado\",\n\t\t\t\t\tvalid: false,\n\t\t\t\t\tentriesChecked: comprobadas,\n\t\t\t\t\ttamperedAt: entrada.ts,\n\t\t\t\t\tcausa: \"editada\",\n\t\t\t\t\tmotivo: \"el hash de una entrada no cuadra con su contenido: la han editado\",\n\t\t\t\t\tficheroAlterado: nombre,\n\t\t\t\t\t...(borrados.length ? { borrados } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ((declarado ?? null) !== prevHash) {\n\t\t\t\t// Un enlace roto DESPUÉS de una ausencia ya conocida no es un\n\t\t\t\t// hallazgo nuevo: es su consecuencia. Se sigue leyendo para poder\n\t\t\t\t// contar lo que queda, y la causa se decide al final.\n\t\t\t\tif (borrados.length === 0 && incompletos.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\testado: \"alterado\",\n\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\tentriesChecked: comprobadas,\n\t\t\t\t\t\ttamperedAt: entrada.ts,\n\t\t\t\t\t\tcausa: \"enlace-roto\",\n\t\t\t\t\t\tmotivo:\n\t\t\t\t\t\t\t\"el enlace de una entrada no apunta a la anterior: faltan entradas o están cambiadas de orden\",\n\t\t\t\t\t\tficheroAlterado: nombre,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tvistos.add(hash);\n\t\t\tprevHash = hash;\n\t\t\tcomprobadas++;\n\t\t}\n\t\t// La resta que la cadena no puede hacer: lo que el índice recuerda y el\n\t\t// fichero ya no enseña. Cubre el truncado, el truncado-y-seguir-\n\t\t// escribiendo, y la entrada quitada del medio.\n\t\tif (anclados) {\n\t\t\tconst faltan = anclados.filter((h) => !vistos.has(h)).length;\n\t\t\tif (faltan > 0) incompletos.push({ fichero: nombre, entradas: anclados.length, faltan });\n\t\t}\n\t}\n\n\tif (borrados.length > 0 || incompletos.length > 0) {\n\t\tconst soloBorrados = incompletos.length === 0;\n\t\treturn {\n\t\t\testado: \"alterado\",\n\t\t\tvalid: false,\n\t\t\tentriesChecked: comprobadas,\n\t\t\tcausa: soloBorrados ? \"borrado\" : \"faltan-entradas\",\n\t\t\tmotivo: soloBorrados\n\t\t\t\t? \"el índice recuerda ficheros que ya no están: los han borrado\"\n\t\t\t\t: \"faltan entradas que el índice recuerda haber escrito: las han quitado del registro\",\n\t\t\t...(borrados.length ? { borrados } : {}),\n\t\t\t...(incompletos.length ? { incompletos } : {}),\n\t\t\t...(sinAncla.length ? { sinAncla } : {}),\n\t\t};\n\t}\n\n\t// Un registro con ancla y sin entradas todavía sigue siendo un registro\n\t// vacío: `estado: \"vacio\"` y no `\"integro\"`, para que la respuesta no\n\t// dependa de si el índice llegó a crearse antes de la primera entrada.\n\treturn {\n\t\testado: comprobadas === 0 ? \"vacio\" : \"integro\",\n\t\tvalid: true,\n\t\tentriesChecked: comprobadas,\n\t\t...(sinAncla.length ? { sinAncla } : {}),\n\t};\n}\n"]}
@@ -7,6 +7,7 @@
7
7
  * detectable by re-verifying the chain (enterprise security auditing).
8
8
  */
9
9
  import { existsSync } from "node:fs";
10
+ import { type VeredictoDelRegistro } from "./audit-indice.ts";
10
11
  export interface AuditEntry {
11
12
  seq: number;
12
13
  ts: string;
@@ -23,6 +24,8 @@ export interface AuditEntry {
23
24
  }
24
25
  export declare class AuditLog {
25
26
  private dir;
27
+ /** La raíz, porque el índice vive FUERA de `audit/`. Ver `audit-indice.ts`. */
28
+ private raiz;
26
29
  private seq;
27
30
  private lastHash;
28
31
  constructor(rootDir: string);
@@ -35,12 +38,21 @@ export declare class AuditLog {
35
38
  }): Promise<void>;
36
39
  /** Read the most recent entries across audit files. */
37
40
  read(limit?: number, since?: string): Promise<AuditEntry[]>;
38
- /** Verify the hash chain. Returns the first tampered entry, or null. */
39
- verify(): Promise<{
40
- valid: boolean;
41
- tamperedAt?: string;
42
- entriesChecked: number;
43
- }>;
41
+ /**
42
+ * Verifica el registro y contesta TRES estados: íntegro, alterado y vacío.
43
+ *
44
+ * El recorrido de la cadena vive ahora en `audit-indice.ts` junto a lo que le
45
+ * faltaba —el registro de lo que DEBERÍA existir—, porque separarlos era el
46
+ * agujero: la cadena de hashes prueba integridad DENTRO de lo que hay y no
47
+ * puede, por construcción, hablar de lo que ya no está. Aquí se queda solo la
48
+ * canonicalización, que es lo único que tiene que compartir con `append` y no
49
+ * puede divergir de ella.
50
+ *
51
+ * Medido: con esto, borrar el fichero pasa de `{valid:true, entriesChecked:0}`
52
+ * a `{estado:"alterado"}` nombrando lo que falta, y una instalación nueva pasa
53
+ * de `{valid:false}` —acusar a toda instalación limpia— a `{estado:"vacio"}`.
54
+ */
55
+ verify(): Promise<VeredictoDelRegistro>;
44
56
  get lastSeq(): number;
45
57
  }
46
58
  export { existsSync };
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/core/memory-engine/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,MAAM,WAAW,UAAU;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;IACzI,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAOD,qBAAa,QAAQ;IACpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,QAAQ,CAAuB;IAEvC,YAAY,OAAO,EAAE,MAAM,EAE1B;IAED,OAAO,CAAC,OAAO;IAIf,4EAA4E;IACtE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B1B;IAEK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBvH;IAED,uDAAuD;IACjD,IAAI,CAAC,KAAK,SAAK,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA2B5D;IAED,wEAAwE;IAClE,MAAM,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAsCvF;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;CACD;AAED,OAAO,EAAE,UAAU,EAAE,CAAC","sourcesContent":["/**\n * Audit log for the Ada Memory Engine — append-only JSONL with a hash chain.\n *\n * Every memory write, rejection, consolidation and (optionally) search is\n * recorded with: timestamp, actor, target, outcome and reason. Each entry\n * carries the hash of the previous entry, so tampering with any record is\n * detectable by re-verifying the chain (enterprise security auditing).\n */\n\nimport { createHash } from \"node:crypto\";\nimport { readFile, writeFile, appendFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface AuditEntry {\n\tseq: number;\n\tts: string; // ISO\n\taction: \"add\" | \"replace\" | \"remove\" | \"rejected\" | \"consolidate\" | \"search\" | \"migrate\" | \"flush\" | \"review\" | \"detected\" | \"vault-use\";\n\tsource: \"agent\" | \"user\" | \"auto\" | \"cli\" | \"desktop\" | \"api\";\n\ttarget: string; // global | user | project | failure | session\n\tscope: string; // project hash or \"global\"\n\tsessionId?: string;\n\tok: boolean;\n\tcategories?: string[];\n\treason?: string;\n\thash: string;\n\tprevHash: string | null;\n}\n\nfunction hashEntry(prevHash: string | null, payload: Omit<AuditEntry, \"hash\" | \"prevHash\">): string {\n\tconst canonical = JSON.stringify({ prevHash, ...payload });\n\treturn createHash(\"sha256\").update(canonical).digest(\"hex\");\n}\n\nexport class AuditLog {\n\tprivate dir: string;\n\tprivate seq = 0;\n\tprivate lastHash: string | null = null;\n\n\tconstructor(rootDir: string) {\n\t\tthis.dir = join(rootDir, \"audit\");\n\t}\n\n\tprivate fileFor(date: string): string {\n\t\treturn join(this.dir, `audit-${date}.jsonl`);\n\t}\n\n\t/** Load the latest sequence number + hash from the newest existing file. */\n\tasync load(): Promise<void> {\n\t\ttry {\n\t\t\tawait mkdir(this.dir, { recursive: true });\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\t// Find the most recent audit file.\n\t\tlet latest: string | null = null;\n\t\ttry {\n\t\t\tconst { readdir } = await import(\"node:fs/promises\");\n\t\t\tconst files = (await readdir(this.dir)).filter((f) => /^audit-\\d{4}-\\d{2}-\\d{2}\\.jsonl$/.test(f)).sort();\n\t\t\tlatest = files.length > 0 ? files[files.length - 1] : null;\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tif (!latest) return;\n\t\ttry {\n\t\t\tconst raw = await readFile(join(this.dir, latest), \"utf-8\");\n\t\t\tconst lines = raw.split(\"\\n\").filter(Boolean);\n\t\t\tif (lines.length === 0) return;\n\t\t\tconst last = JSON.parse(lines[lines.length - 1]) as AuditEntry;\n\t\t\tthis.seq = typeof last.seq === \"number\" ? last.seq : 0;\n\t\t\tthis.lastHash = typeof last.hash === \"string\" ? last.hash : null;\n\t\t} catch {\n\t\t\t// Corrupt tail: restart sequence (previous records remain intact).\n\t\t}\n\t}\n\n\tasync append(entry: Omit<AuditEntry, \"seq\" | \"ts\" | \"hash\" | \"prevHash\"> & { ts?: string; seq?: number }): Promise<void> {\n\t\ttry {\n\t\t\tconst date = new Date().toISOString().slice(0, 10);\n\t\t\tconst file = this.fileFor(date);\n\t\t\tawait mkdir(this.dir, { recursive: true });\n\t\t\tconst payload = {\n\t\t\t\tseq: entry.seq ?? ++this.seq,\n\t\t\t\tts: entry.ts ?? new Date().toISOString(),\n\t\t\t\taction: entry.action,\n\t\t\t\tsource: entry.source,\n\t\t\t\ttarget: entry.target,\n\t\t\t\tscope: entry.scope,\n\t\t\t\tok: entry.ok,\n\t\t\t\tcategories: entry.categories,\n\t\t\t\treason: entry.reason,\n\t\t\t\tsessionId: entry.sessionId,\n\t\t\t};\n\t\t\tconst hash = hashEntry(this.lastHash, payload);\n\t\t\tconst full: AuditEntry = { ...payload, hash, prevHash: this.lastHash };\n\t\t\tthis.lastHash = hash;\n\t\t\tawait appendFile(file, `${JSON.stringify(full)}\\n`, \"utf-8\");\n\t\t} catch {\n\t\t\t// Audit must never break the conversation.\n\t\t}\n\t}\n\n\t/** Read the most recent entries across audit files. */\n\tasync read(limit = 50, since?: string): Promise<AuditEntry[]> {\n\t\ttry {\n\t\t\tconst { readdir } = await import(\"node:fs/promises\");\n\t\t\tconst files = (await readdir(this.dir)).filter((f) => /^audit-.*\\.jsonl$/.test(f)).sort().reverse();\n\t\t\tconst out: AuditEntry[] = [];\n\t\t\tfor (const file of files) {\n\t\t\t\ttry {\n\t\t\t\t\tconst raw = await readFile(join(this.dir, file), \"utf-8\");\n\t\t\t\t\tconst lines = raw.split(\"\\n\").filter(Boolean);\n\t\t\t\t\tfor (const line of lines.reverse()) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst entry = JSON.parse(line) as AuditEntry;\n\t\t\t\t\t\t\tif (since && entry.ts < since) continue;\n\t\t\t\t\t\t\tout.push(entry);\n\t\t\t\t\t\t\tif (out.length >= limit) return out;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out;\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/** Verify the hash chain. Returns the first tampered entry, or null. */\n\tasync verify(): Promise<{ valid: boolean; tamperedAt?: string; entriesChecked: number }> {\n\t\ttry {\n\t\t\tconst { readdir } = await import(\"node:fs/promises\");\n\t\t\tconst files = (await readdir(this.dir)).filter((f) => /^audit-.*\\.jsonl$/.test(f)).sort();\n\t\t\tlet prevHash: string | null = null;\n\t\t\tlet checked = 0;\n\t\t\tfor (const file of files) {\n\t\t\t\tconst raw = await readFile(join(this.dir, file), \"utf-8\");\n\t\t\t\tfor (const line of raw.split(\"\\n\").filter(Boolean)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst entry = JSON.parse(line) as AuditEntry;\n\t\t\t\t\t\tconst payload = {\n\t\t\t\t\t\t\tseq: entry.seq,\n\t\t\t\t\t\t\tts: entry.ts,\n\t\t\t\t\t\t\taction: entry.action,\n\t\t\t\t\t\t\tsource: entry.source,\n\t\t\t\t\t\t\ttarget: entry.target,\n\t\t\t\t\t\t\tscope: entry.scope,\n\t\t\t\t\t\t\tok: entry.ok,\n\t\t\t\t\t\t\tcategories: entry.categories,\n\t\t\t\t\t\t\treason: entry.reason,\n\t\t\t\t\t\t\tsessionId: entry.sessionId,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst expected = hashEntry(prevHash, payload);\n\t\t\t\t\t\tif (entry.hash !== expected || entry.prevHash !== prevHash) {\n\t\t\t\t\t\t\treturn { valid: false, tamperedAt: entry.ts, entriesChecked: checked };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprevHash = entry.hash;\n\t\t\t\t\t\tchecked++;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn { valid: false, tamperedAt: undefined, entriesChecked: checked };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { valid: true, entriesChecked: checked };\n\t\t} catch {\n\t\t\treturn { valid: false, entriesChecked: 0 };\n\t\t}\n\t}\n\n\tget lastSeq(): number {\n\t\treturn this.seq;\n\t}\n}\n\nexport { existsSync };\n"]}
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/core/memory-engine/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAA4B,KAAK,oBAAoB,EAAqB,MAAM,mBAAmB,CAAC;AAE3G,MAAM,WAAW,UAAU;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EACH,KAAK,GACL,SAAS,GACT,QAAQ,GACR,UAAU,GACV,aAAa,GACb,QAAQ,GACR,SAAS,GACT,OAAO,GACP,QAAQ,GACR,UAAU,GACV,WAAW,CAAC;IACf,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAOD,qBAAa,QAAQ;IACpB,OAAO,CAAC,GAAG,CAAS;IACpB,iFAA+E;IAC/E,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,QAAQ,CAAuB;IAEvC,YAAY,OAAO,EAAE,MAAM,EAG1B;IAED,OAAO,CAAC,OAAO;IAIf,4EAA4E;IACtE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B1B;IAEK,MAAM,CACX,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACzF,OAAO,CAAC,IAAI,CAAC,CA4Bf;IAED,uDAAuD;IACjD,IAAI,CAAC,KAAK,SAAK,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA0B5D;IAED;;;;;;;;;;;;;OAaG;IACG,MAAM,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAE5C;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;CACD;AAED,OAAO,EAAE,UAAU,EAAE,CAAC","sourcesContent":["/**\n * Audit log for the Ada Memory Engine — append-only JSONL with a hash chain.\n *\n * Every memory write, rejection, consolidation and (optionally) search is\n * recorded with: timestamp, actor, target, outcome and reason. Each entry\n * carries the hash of the previous entry, so tampering with any record is\n * detectable by re-verifying the chain (enterprise security auditing).\n */\n\nimport { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { anclarEntrada, DIR_AUDIT, type VeredictoDelRegistro, verificarRegistro } from \"./audit-indice.ts\";\n\nexport interface AuditEntry {\n\tseq: number;\n\tts: string; // ISO\n\taction:\n\t\t| \"add\"\n\t\t| \"replace\"\n\t\t| \"remove\"\n\t\t| \"rejected\"\n\t\t| \"consolidate\"\n\t\t| \"search\"\n\t\t| \"migrate\"\n\t\t| \"flush\"\n\t\t| \"review\"\n\t\t| \"detected\"\n\t\t| \"vault-use\";\n\tsource: \"agent\" | \"user\" | \"auto\" | \"cli\" | \"desktop\" | \"api\";\n\ttarget: string; // global | user | project | failure | session\n\tscope: string; // project hash or \"global\"\n\tsessionId?: string;\n\tok: boolean;\n\tcategories?: string[];\n\treason?: string;\n\thash: string;\n\tprevHash: string | null;\n}\n\nfunction hashEntry(prevHash: string | null, payload: Record<string, unknown>): string {\n\tconst canonical = JSON.stringify({ prevHash, ...payload });\n\treturn createHash(\"sha256\").update(canonical).digest(\"hex\");\n}\n\nexport class AuditLog {\n\tprivate dir: string;\n\t/** La raíz, porque el índice vive FUERA de `audit/`. Ver `audit-indice.ts`. */\n\tprivate raiz: string;\n\tprivate seq = 0;\n\tprivate lastHash: string | null = null;\n\n\tconstructor(rootDir: string) {\n\t\tthis.raiz = rootDir;\n\t\tthis.dir = join(rootDir, DIR_AUDIT);\n\t}\n\n\tprivate fileFor(date: string): string {\n\t\treturn join(this.dir, `audit-${date}.jsonl`);\n\t}\n\n\t/** Load the latest sequence number + hash from the newest existing file. */\n\tasync load(): Promise<void> {\n\t\ttry {\n\t\t\tawait mkdir(this.dir, { recursive: true });\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\t// Find the most recent audit file.\n\t\tlet latest: string | null = null;\n\t\ttry {\n\t\t\tconst { readdir } = await import(\"node:fs/promises\");\n\t\t\tconst files = (await readdir(this.dir)).filter((f) => /^audit-\\d{4}-\\d{2}-\\d{2}\\.jsonl$/.test(f)).sort();\n\t\t\tlatest = files.length > 0 ? files[files.length - 1] : null;\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tif (!latest) return;\n\t\ttry {\n\t\t\tconst raw = await readFile(join(this.dir, latest), \"utf-8\");\n\t\t\tconst lines = raw.split(\"\\n\").filter(Boolean);\n\t\t\tif (lines.length === 0) return;\n\t\t\tconst last = JSON.parse(lines[lines.length - 1]) as AuditEntry;\n\t\t\tthis.seq = typeof last.seq === \"number\" ? last.seq : 0;\n\t\t\tthis.lastHash = typeof last.hash === \"string\" ? last.hash : null;\n\t\t} catch {\n\t\t\t// Corrupt tail: restart sequence (previous records remain intact).\n\t\t}\n\t}\n\n\tasync append(\n\t\tentry: Omit<AuditEntry, \"seq\" | \"ts\" | \"hash\" | \"prevHash\"> & { ts?: string; seq?: number },\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst date = new Date().toISOString().slice(0, 10);\n\t\t\tconst file = this.fileFor(date);\n\t\t\tawait mkdir(this.dir, { recursive: true });\n\t\t\tconst payload = {\n\t\t\t\tseq: entry.seq ?? ++this.seq,\n\t\t\t\tts: entry.ts ?? new Date().toISOString(),\n\t\t\t\taction: entry.action,\n\t\t\t\tsource: entry.source,\n\t\t\t\ttarget: entry.target,\n\t\t\t\tscope: entry.scope,\n\t\t\t\tok: entry.ok,\n\t\t\t\tcategories: entry.categories,\n\t\t\t\treason: entry.reason,\n\t\t\t\tsessionId: entry.sessionId,\n\t\t\t};\n\t\t\tconst hash = hashEntry(this.lastHash, payload);\n\t\t\tconst full: AuditEntry = { ...payload, hash, prevHash: this.lastHash };\n\t\t\tthis.lastHash = hash;\n\t\t\tawait appendFile(file, `${JSON.stringify(full)}\\n`, \"utf-8\");\n\t\t\t// DESPUÉS de la entrada, nunca antes: al revés, una caída entre las dos\n\t\t\t// escrituras dejaría un hash anclado sin entrada y `verify` acusaría de\n\t\t\t// manipulación a un corte de luz. Ver `audit-indice.ts`.\n\t\t\tawait anclarEntrada(this.raiz, basename(file), hash);\n\t\t} catch {\n\t\t\t// Audit must never break the conversation.\n\t\t}\n\t}\n\n\t/** Read the most recent entries across audit files. */\n\tasync read(limit = 50, since?: string): Promise<AuditEntry[]> {\n\t\ttry {\n\t\t\tconst { readdir } = await import(\"node:fs/promises\");\n\t\t\tconst files = (await readdir(this.dir))\n\t\t\t\t.filter((f) => /^audit-.*\\.jsonl$/.test(f))\n\t\t\t\t.sort()\n\t\t\t\t.reverse();\n\t\t\tconst out: AuditEntry[] = [];\n\t\t\tfor (const file of files) {\n\t\t\t\ttry {\n\t\t\t\t\tconst raw = await readFile(join(this.dir, file), \"utf-8\");\n\t\t\t\t\tconst lines = raw.split(\"\\n\").filter(Boolean);\n\t\t\t\t\tfor (const line of lines.reverse()) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst entry = JSON.parse(line) as AuditEntry;\n\t\t\t\t\t\t\tif (since && entry.ts < since) continue;\n\t\t\t\t\t\t\tout.push(entry);\n\t\t\t\t\t\t\tif (out.length >= limit) return out;\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t\treturn out;\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Verifica el registro y contesta TRES estados: íntegro, alterado y vacío.\n\t *\n\t * El recorrido de la cadena vive ahora en `audit-indice.ts` junto a lo que le\n\t * faltaba —el registro de lo que DEBERÍA existir—, porque separarlos era el\n\t * agujero: la cadena de hashes prueba integridad DENTRO de lo que hay y no\n\t * puede, por construcción, hablar de lo que ya no está. Aquí se queda solo la\n\t * canonicalización, que es lo único que tiene que compartir con `append` y no\n\t * puede divergir de ella.\n\t *\n\t * Medido: con esto, borrar el fichero pasa de `{valid:true, entriesChecked:0}`\n\t * a `{estado:\"alterado\"}` nombrando lo que falta, y una instalación nueva pasa\n\t * de `{valid:false}` —acusar a toda instalación limpia— a `{estado:\"vacio\"}`.\n\t */\n\tasync verify(): Promise<VeredictoDelRegistro> {\n\t\treturn verificarRegistro(this.raiz, hashEntry);\n\t}\n\n\tget lastSeq(): number {\n\t\treturn this.seq;\n\t}\n}\n\nexport { existsSync };\n"]}
@@ -7,19 +7,23 @@
7
7
  * detectable by re-verifying the chain (enterprise security auditing).
8
8
  */
9
9
  import { createHash } from "node:crypto";
10
- import { readFile, appendFile, mkdir } from "node:fs/promises";
11
10
  import { existsSync } from "node:fs";
12
- import { join } from "node:path";
11
+ import { appendFile, mkdir, readFile } from "node:fs/promises";
12
+ import { basename, join } from "node:path";
13
+ import { anclarEntrada, DIR_AUDIT, verificarRegistro } from "./audit-indice.js";
13
14
  function hashEntry(prevHash, payload) {
14
15
  const canonical = JSON.stringify({ prevHash, ...payload });
15
16
  return createHash("sha256").update(canonical).digest("hex");
16
17
  }
17
18
  export class AuditLog {
18
19
  dir;
20
+ /** La raíz, porque el índice vive FUERA de `audit/`. Ver `audit-indice.ts`. */
21
+ raiz;
19
22
  seq = 0;
20
23
  lastHash = null;
21
24
  constructor(rootDir) {
22
- this.dir = join(rootDir, "audit");
25
+ this.raiz = rootDir;
26
+ this.dir = join(rootDir, DIR_AUDIT);
23
27
  }
24
28
  fileFor(date) {
25
29
  return join(this.dir, `audit-${date}.jsonl`);
@@ -78,6 +82,10 @@ export class AuditLog {
78
82
  const full = { ...payload, hash, prevHash: this.lastHash };
79
83
  this.lastHash = hash;
80
84
  await appendFile(file, `${JSON.stringify(full)}\n`, "utf-8");
85
+ // DESPUÉS de la entrada, nunca antes: al revés, una caída entre las dos
86
+ // escrituras dejaría un hash anclado sin entrada y `verify` acusaría de
87
+ // manipulación a un corte de luz. Ver `audit-indice.ts`.
88
+ await anclarEntrada(this.raiz, basename(file), hash);
81
89
  }
82
90
  catch {
83
91
  // Audit must never break the conversation.
@@ -87,7 +95,10 @@ export class AuditLog {
87
95
  async read(limit = 50, since) {
88
96
  try {
89
97
  const { readdir } = await import("node:fs/promises");
90
- const files = (await readdir(this.dir)).filter((f) => /^audit-.*\.jsonl$/.test(f)).sort().reverse();
98
+ const files = (await readdir(this.dir))
99
+ .filter((f) => /^audit-.*\.jsonl$/.test(f))
100
+ .sort()
101
+ .reverse();
91
102
  const out = [];
92
103
  for (const file of files) {
93
104
  try {
@@ -102,14 +113,10 @@ export class AuditLog {
102
113
  if (out.length >= limit)
103
114
  return out;
104
115
  }
105
- catch {
106
- continue;
107
- }
116
+ catch { }
108
117
  }
109
118
  }
110
- catch {
111
- continue;
112
- }
119
+ catch { }
113
120
  }
114
121
  return out;
115
122
  }
@@ -117,47 +124,22 @@ export class AuditLog {
117
124
  return [];
118
125
  }
119
126
  }
120
- /** Verify the hash chain. Returns the first tampered entry, or null. */
127
+ /**
128
+ * Verifica el registro y contesta TRES estados: íntegro, alterado y vacío.
129
+ *
130
+ * El recorrido de la cadena vive ahora en `audit-indice.ts` junto a lo que le
131
+ * faltaba —el registro de lo que DEBERÍA existir—, porque separarlos era el
132
+ * agujero: la cadena de hashes prueba integridad DENTRO de lo que hay y no
133
+ * puede, por construcción, hablar de lo que ya no está. Aquí se queda solo la
134
+ * canonicalización, que es lo único que tiene que compartir con `append` y no
135
+ * puede divergir de ella.
136
+ *
137
+ * Medido: con esto, borrar el fichero pasa de `{valid:true, entriesChecked:0}`
138
+ * a `{estado:"alterado"}` nombrando lo que falta, y una instalación nueva pasa
139
+ * de `{valid:false}` —acusar a toda instalación limpia— a `{estado:"vacio"}`.
140
+ */
121
141
  async verify() {
122
- try {
123
- const { readdir } = await import("node:fs/promises");
124
- const files = (await readdir(this.dir)).filter((f) => /^audit-.*\.jsonl$/.test(f)).sort();
125
- let prevHash = null;
126
- let checked = 0;
127
- for (const file of files) {
128
- const raw = await readFile(join(this.dir, file), "utf-8");
129
- for (const line of raw.split("\n").filter(Boolean)) {
130
- try {
131
- const entry = JSON.parse(line);
132
- const payload = {
133
- seq: entry.seq,
134
- ts: entry.ts,
135
- action: entry.action,
136
- source: entry.source,
137
- target: entry.target,
138
- scope: entry.scope,
139
- ok: entry.ok,
140
- categories: entry.categories,
141
- reason: entry.reason,
142
- sessionId: entry.sessionId,
143
- };
144
- const expected = hashEntry(prevHash, payload);
145
- if (entry.hash !== expected || entry.prevHash !== prevHash) {
146
- return { valid: false, tamperedAt: entry.ts, entriesChecked: checked };
147
- }
148
- prevHash = entry.hash;
149
- checked++;
150
- }
151
- catch {
152
- return { valid: false, tamperedAt: undefined, entriesChecked: checked };
153
- }
154
- }
155
- }
156
- return { valid: true, entriesChecked: checked };
157
- }
158
- catch {
159
- return { valid: false, entriesChecked: 0 };
160
- }
142
+ return verificarRegistro(this.raiz, hashEntry);
161
143
  }
162
144
  get lastSeq() {
163
145
  return this.seq;
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/core/memory-engine/audit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Audit log for the Ada Memory Engine — append-only JSONL with a hash chain.\n *\n * Every memory write, rejection, consolidation and (optionally) search is\n * recorded with: timestamp, actor, target, outcome and reason. Each entry\n * carries the hash of the previous entry, so tampering with any record is\n * detectable by re-verifying the chain (enterprise security auditing).\n */\n\nimport { createHash } from \"node:crypto\";\nimport { readFile, writeFile, appendFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface AuditEntry {\n\tseq: number;\n\tts: string; // ISO\n\taction: \"add\" | \"replace\" | \"remove\" | \"rejected\" | \"consolidate\" | \"search\" | \"migrate\" | \"flush\" | \"review\" | \"detected\" | \"vault-use\";\n\tsource: \"agent\" | \"user\" | \"auto\" | \"cli\" | \"desktop\" | \"api\";\n\ttarget: string; // global | user | project | failure | session\n\tscope: string; // project hash or \"global\"\n\tsessionId?: string;\n\tok: boolean;\n\tcategories?: string[];\n\treason?: string;\n\thash: string;\n\tprevHash: string | null;\n}\n\nfunction hashEntry(prevHash: string | null, payload: Omit<AuditEntry, \"hash\" | \"prevHash\">): string {\n\tconst canonical = JSON.stringify({ prevHash, ...payload });\n\treturn createHash(\"sha256\").update(canonical).digest(\"hex\");\n}\n\nexport class AuditLog {\n\tprivate dir: string;\n\tprivate seq = 0;\n\tprivate lastHash: string | null = null;\n\n\tconstructor(rootDir: string) {\n\t\tthis.dir = join(rootDir, \"audit\");\n\t}\n\n\tprivate fileFor(date: string): string {\n\t\treturn join(this.dir, `audit-${date}.jsonl`);\n\t}\n\n\t/** Load the latest sequence number + hash from the newest existing file. */\n\tasync load(): Promise<void> {\n\t\ttry {\n\t\t\tawait mkdir(this.dir, { recursive: true });\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\t// Find the most recent audit file.\n\t\tlet latest: string | null = null;\n\t\ttry {\n\t\t\tconst { readdir } = await import(\"node:fs/promises\");\n\t\t\tconst files = (await readdir(this.dir)).filter((f) => /^audit-\\d{4}-\\d{2}-\\d{2}\\.jsonl$/.test(f)).sort();\n\t\t\tlatest = files.length > 0 ? files[files.length - 1] : null;\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tif (!latest) return;\n\t\ttry {\n\t\t\tconst raw = await readFile(join(this.dir, latest), \"utf-8\");\n\t\t\tconst lines = raw.split(\"\\n\").filter(Boolean);\n\t\t\tif (lines.length === 0) return;\n\t\t\tconst last = JSON.parse(lines[lines.length - 1]) as AuditEntry;\n\t\t\tthis.seq = typeof last.seq === \"number\" ? last.seq : 0;\n\t\t\tthis.lastHash = typeof last.hash === \"string\" ? last.hash : null;\n\t\t} catch {\n\t\t\t// Corrupt tail: restart sequence (previous records remain intact).\n\t\t}\n\t}\n\n\tasync append(entry: Omit<AuditEntry, \"seq\" | \"ts\" | \"hash\" | \"prevHash\"> & { ts?: string; seq?: number }): Promise<void> {\n\t\ttry {\n\t\t\tconst date = new Date().toISOString().slice(0, 10);\n\t\t\tconst file = this.fileFor(date);\n\t\t\tawait mkdir(this.dir, { recursive: true });\n\t\t\tconst payload = {\n\t\t\t\tseq: entry.seq ?? ++this.seq,\n\t\t\t\tts: entry.ts ?? new Date().toISOString(),\n\t\t\t\taction: entry.action,\n\t\t\t\tsource: entry.source,\n\t\t\t\ttarget: entry.target,\n\t\t\t\tscope: entry.scope,\n\t\t\t\tok: entry.ok,\n\t\t\t\tcategories: entry.categories,\n\t\t\t\treason: entry.reason,\n\t\t\t\tsessionId: entry.sessionId,\n\t\t\t};\n\t\t\tconst hash = hashEntry(this.lastHash, payload);\n\t\t\tconst full: AuditEntry = { ...payload, hash, prevHash: this.lastHash };\n\t\t\tthis.lastHash = hash;\n\t\t\tawait appendFile(file, `${JSON.stringify(full)}\\n`, \"utf-8\");\n\t\t} catch {\n\t\t\t// Audit must never break the conversation.\n\t\t}\n\t}\n\n\t/** Read the most recent entries across audit files. */\n\tasync read(limit = 50, since?: string): Promise<AuditEntry[]> {\n\t\ttry {\n\t\t\tconst { readdir } = await import(\"node:fs/promises\");\n\t\t\tconst files = (await readdir(this.dir)).filter((f) => /^audit-.*\\.jsonl$/.test(f)).sort().reverse();\n\t\t\tconst out: AuditEntry[] = [];\n\t\t\tfor (const file of files) {\n\t\t\t\ttry {\n\t\t\t\t\tconst raw = await readFile(join(this.dir, file), \"utf-8\");\n\t\t\t\t\tconst lines = raw.split(\"\\n\").filter(Boolean);\n\t\t\t\t\tfor (const line of lines.reverse()) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst entry = JSON.parse(line) as AuditEntry;\n\t\t\t\t\t\t\tif (since && entry.ts < since) continue;\n\t\t\t\t\t\t\tout.push(entry);\n\t\t\t\t\t\t\tif (out.length >= limit) return out;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out;\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/** Verify the hash chain. Returns the first tampered entry, or null. */\n\tasync verify(): Promise<{ valid: boolean; tamperedAt?: string; entriesChecked: number }> {\n\t\ttry {\n\t\t\tconst { readdir } = await import(\"node:fs/promises\");\n\t\t\tconst files = (await readdir(this.dir)).filter((f) => /^audit-.*\\.jsonl$/.test(f)).sort();\n\t\t\tlet prevHash: string | null = null;\n\t\t\tlet checked = 0;\n\t\t\tfor (const file of files) {\n\t\t\t\tconst raw = await readFile(join(this.dir, file), \"utf-8\");\n\t\t\t\tfor (const line of raw.split(\"\\n\").filter(Boolean)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst entry = JSON.parse(line) as AuditEntry;\n\t\t\t\t\t\tconst payload = {\n\t\t\t\t\t\t\tseq: entry.seq,\n\t\t\t\t\t\t\tts: entry.ts,\n\t\t\t\t\t\t\taction: entry.action,\n\t\t\t\t\t\t\tsource: entry.source,\n\t\t\t\t\t\t\ttarget: entry.target,\n\t\t\t\t\t\t\tscope: entry.scope,\n\t\t\t\t\t\t\tok: entry.ok,\n\t\t\t\t\t\t\tcategories: entry.categories,\n\t\t\t\t\t\t\treason: entry.reason,\n\t\t\t\t\t\t\tsessionId: entry.sessionId,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst expected = hashEntry(prevHash, payload);\n\t\t\t\t\t\tif (entry.hash !== expected || entry.prevHash !== prevHash) {\n\t\t\t\t\t\t\treturn { valid: false, tamperedAt: entry.ts, entriesChecked: checked };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprevHash = entry.hash;\n\t\t\t\t\t\tchecked++;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn { valid: false, tamperedAt: undefined, entriesChecked: checked };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { valid: true, entriesChecked: checked };\n\t\t} catch {\n\t\t\treturn { valid: false, entriesChecked: 0 };\n\t\t}\n\t}\n\n\tget lastSeq(): number {\n\t\treturn this.seq;\n\t}\n}\n\nexport { existsSync };\n"]}
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/core/memory-engine/audit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Audit log for the Ada Memory Engine — append-only JSONL with a hash chain.\n *\n * Every memory write, rejection, consolidation and (optionally) search is\n * recorded with: timestamp, actor, target, outcome and reason. Each entry\n * carries the hash of the previous entry, so tampering with any record is\n * detectable by re-verifying the chain (enterprise security auditing).\n */\n\nimport { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { anclarEntrada, DIR_AUDIT, type VeredictoDelRegistro, verificarRegistro } from \"./audit-indice.ts\";\n\nexport interface AuditEntry {\n\tseq: number;\n\tts: string; // ISO\n\taction:\n\t\t| \"add\"\n\t\t| \"replace\"\n\t\t| \"remove\"\n\t\t| \"rejected\"\n\t\t| \"consolidate\"\n\t\t| \"search\"\n\t\t| \"migrate\"\n\t\t| \"flush\"\n\t\t| \"review\"\n\t\t| \"detected\"\n\t\t| \"vault-use\";\n\tsource: \"agent\" | \"user\" | \"auto\" | \"cli\" | \"desktop\" | \"api\";\n\ttarget: string; // global | user | project | failure | session\n\tscope: string; // project hash or \"global\"\n\tsessionId?: string;\n\tok: boolean;\n\tcategories?: string[];\n\treason?: string;\n\thash: string;\n\tprevHash: string | null;\n}\n\nfunction hashEntry(prevHash: string | null, payload: Record<string, unknown>): string {\n\tconst canonical = JSON.stringify({ prevHash, ...payload });\n\treturn createHash(\"sha256\").update(canonical).digest(\"hex\");\n}\n\nexport class AuditLog {\n\tprivate dir: string;\n\t/** La raíz, porque el índice vive FUERA de `audit/`. Ver `audit-indice.ts`. */\n\tprivate raiz: string;\n\tprivate seq = 0;\n\tprivate lastHash: string | null = null;\n\n\tconstructor(rootDir: string) {\n\t\tthis.raiz = rootDir;\n\t\tthis.dir = join(rootDir, DIR_AUDIT);\n\t}\n\n\tprivate fileFor(date: string): string {\n\t\treturn join(this.dir, `audit-${date}.jsonl`);\n\t}\n\n\t/** Load the latest sequence number + hash from the newest existing file. */\n\tasync load(): Promise<void> {\n\t\ttry {\n\t\t\tawait mkdir(this.dir, { recursive: true });\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\t// Find the most recent audit file.\n\t\tlet latest: string | null = null;\n\t\ttry {\n\t\t\tconst { readdir } = await import(\"node:fs/promises\");\n\t\t\tconst files = (await readdir(this.dir)).filter((f) => /^audit-\\d{4}-\\d{2}-\\d{2}\\.jsonl$/.test(f)).sort();\n\t\t\tlatest = files.length > 0 ? files[files.length - 1] : null;\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tif (!latest) return;\n\t\ttry {\n\t\t\tconst raw = await readFile(join(this.dir, latest), \"utf-8\");\n\t\t\tconst lines = raw.split(\"\\n\").filter(Boolean);\n\t\t\tif (lines.length === 0) return;\n\t\t\tconst last = JSON.parse(lines[lines.length - 1]) as AuditEntry;\n\t\t\tthis.seq = typeof last.seq === \"number\" ? last.seq : 0;\n\t\t\tthis.lastHash = typeof last.hash === \"string\" ? last.hash : null;\n\t\t} catch {\n\t\t\t// Corrupt tail: restart sequence (previous records remain intact).\n\t\t}\n\t}\n\n\tasync append(\n\t\tentry: Omit<AuditEntry, \"seq\" | \"ts\" | \"hash\" | \"prevHash\"> & { ts?: string; seq?: number },\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst date = new Date().toISOString().slice(0, 10);\n\t\t\tconst file = this.fileFor(date);\n\t\t\tawait mkdir(this.dir, { recursive: true });\n\t\t\tconst payload = {\n\t\t\t\tseq: entry.seq ?? ++this.seq,\n\t\t\t\tts: entry.ts ?? new Date().toISOString(),\n\t\t\t\taction: entry.action,\n\t\t\t\tsource: entry.source,\n\t\t\t\ttarget: entry.target,\n\t\t\t\tscope: entry.scope,\n\t\t\t\tok: entry.ok,\n\t\t\t\tcategories: entry.categories,\n\t\t\t\treason: entry.reason,\n\t\t\t\tsessionId: entry.sessionId,\n\t\t\t};\n\t\t\tconst hash = hashEntry(this.lastHash, payload);\n\t\t\tconst full: AuditEntry = { ...payload, hash, prevHash: this.lastHash };\n\t\t\tthis.lastHash = hash;\n\t\t\tawait appendFile(file, `${JSON.stringify(full)}\\n`, \"utf-8\");\n\t\t\t// DESPUÉS de la entrada, nunca antes: al revés, una caída entre las dos\n\t\t\t// escrituras dejaría un hash anclado sin entrada y `verify` acusaría de\n\t\t\t// manipulación a un corte de luz. Ver `audit-indice.ts`.\n\t\t\tawait anclarEntrada(this.raiz, basename(file), hash);\n\t\t} catch {\n\t\t\t// Audit must never break the conversation.\n\t\t}\n\t}\n\n\t/** Read the most recent entries across audit files. */\n\tasync read(limit = 50, since?: string): Promise<AuditEntry[]> {\n\t\ttry {\n\t\t\tconst { readdir } = await import(\"node:fs/promises\");\n\t\t\tconst files = (await readdir(this.dir))\n\t\t\t\t.filter((f) => /^audit-.*\\.jsonl$/.test(f))\n\t\t\t\t.sort()\n\t\t\t\t.reverse();\n\t\t\tconst out: AuditEntry[] = [];\n\t\t\tfor (const file of files) {\n\t\t\t\ttry {\n\t\t\t\t\tconst raw = await readFile(join(this.dir, file), \"utf-8\");\n\t\t\t\t\tconst lines = raw.split(\"\\n\").filter(Boolean);\n\t\t\t\t\tfor (const line of lines.reverse()) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst entry = JSON.parse(line) as AuditEntry;\n\t\t\t\t\t\t\tif (since && entry.ts < since) continue;\n\t\t\t\t\t\t\tout.push(entry);\n\t\t\t\t\t\t\tif (out.length >= limit) return out;\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t\treturn out;\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Verifica el registro y contesta TRES estados: íntegro, alterado y vacío.\n\t *\n\t * El recorrido de la cadena vive ahora en `audit-indice.ts` junto a lo que le\n\t * faltaba —el registro de lo que DEBERÍA existir—, porque separarlos era el\n\t * agujero: la cadena de hashes prueba integridad DENTRO de lo que hay y no\n\t * puede, por construcción, hablar de lo que ya no está. Aquí se queda solo la\n\t * canonicalización, que es lo único que tiene que compartir con `append` y no\n\t * puede divergir de ella.\n\t *\n\t * Medido: con esto, borrar el fichero pasa de `{valid:true, entriesChecked:0}`\n\t * a `{estado:\"alterado\"}` nombrando lo que falta, y una instalación nueva pasa\n\t * de `{valid:false}` —acusar a toda instalación limpia— a `{estado:\"vacio\"}`.\n\t */\n\tasync verify(): Promise<VeredictoDelRegistro> {\n\t\treturn verificarRegistro(this.raiz, hashEntry);\n\t}\n\n\tget lastSeq(): number {\n\t\treturn this.seq;\n\t}\n}\n\nexport { existsSync };\n"]}