@hoilab/ada-cli 0.85.0 → 0.85.3

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 (1682) hide show
  1. package/dist/ada-publico.d.ts.map +1 -1
  2. package/dist/ada-publico.js.map +1 -1
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/bun/register-bedrock.d.ts.map +1 -1
  6. package/dist/bun/register-bedrock.js.map +1 -1
  7. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  8. package/dist/bun/restore-sandbox-env.js.map +1 -1
  9. package/dist/cli/args.d.ts.map +1 -1
  10. package/dist/cli/args.js.map +1 -1
  11. package/dist/cli/audit-command.d.ts.map +1 -1
  12. package/dist/cli/audit-command.js.map +1 -1
  13. package/dist/cli/auth-check.d.ts.map +1 -1
  14. package/dist/cli/auth-check.js.map +1 -1
  15. package/dist/cli/auth-command.d.ts.map +1 -1
  16. package/dist/cli/auth-command.js.map +1 -1
  17. package/dist/cli/banco-command.d.ts.map +1 -1
  18. package/dist/cli/banco-command.js.map +1 -1
  19. package/dist/cli/cleanse-command.d.ts.map +1 -1
  20. package/dist/cli/cleanse-command.js +5 -2
  21. package/dist/cli/cleanse-command.js.map +1 -1
  22. package/dist/cli/commit-command.d.ts +8 -6
  23. package/dist/cli/commit-command.d.ts.map +1 -1
  24. package/dist/cli/commit-command.js +124 -92
  25. package/dist/cli/commit-command.js.map +1 -1
  26. package/dist/cli/completion.d.ts +20 -0
  27. package/dist/cli/completion.d.ts.map +1 -0
  28. package/dist/cli/completion.js +75 -0
  29. package/dist/cli/completion.js.map +1 -0
  30. package/dist/cli/computer-command.d.ts.map +1 -1
  31. package/dist/cli/computer-command.js.map +1 -1
  32. package/dist/cli/config-selector.d.ts.map +1 -1
  33. package/dist/cli/config-selector.js.map +1 -1
  34. package/dist/cli/credential-print.d.ts.map +1 -1
  35. package/dist/cli/credential-print.js.map +1 -1
  36. package/dist/cli/discover-command.d.ts.map +1 -1
  37. package/dist/cli/discover-command.js +5 -1
  38. package/dist/cli/discover-command.js.map +1 -1
  39. package/dist/cli/experimental/auth.d.ts.map +1 -1
  40. package/dist/cli/experimental/auth.js.map +1 -1
  41. package/dist/cli/experimental/cli.d.ts +1 -1
  42. package/dist/cli/experimental/cli.d.ts.map +1 -1
  43. package/dist/cli/experimental/cli.js.map +1 -1
  44. package/dist/cli/experimental/command-options.d.ts.map +1 -1
  45. package/dist/cli/experimental/command-options.js.map +1 -1
  46. package/dist/cli/experimental/command.d.ts.map +1 -1
  47. package/dist/cli/experimental/command.js.map +1 -1
  48. package/dist/cli/experimental/commands/client.d.ts.map +1 -1
  49. package/dist/cli/experimental/commands/client.js.map +1 -1
  50. package/dist/cli/experimental/commands/pi.d.ts.map +1 -1
  51. package/dist/cli/experimental/commands/pi.js.map +1 -1
  52. package/dist/cli/experimental/commands/server.d.ts.map +1 -1
  53. package/dist/cli/experimental/commands/server.js.map +1 -1
  54. package/dist/cli/experimental/transport-address.d.ts.map +1 -1
  55. package/dist/cli/experimental/transport-address.js.map +1 -1
  56. package/dist/cli/file-processor.d.ts.map +1 -1
  57. package/dist/cli/file-processor.js.map +1 -1
  58. package/dist/cli/guardrails.d.ts +14 -0
  59. package/dist/cli/guardrails.d.ts.map +1 -0
  60. package/dist/cli/guardrails.js +47 -0
  61. package/dist/cli/guardrails.js.map +1 -0
  62. package/dist/cli/hashline-command.d.ts.map +1 -1
  63. package/dist/cli/hashline-command.js.map +1 -1
  64. package/dist/cli/home-screen.d.ts.map +1 -1
  65. package/dist/cli/home-screen.js +1 -0
  66. package/dist/cli/home-screen.js.map +1 -1
  67. package/dist/cli/import-command.d.ts.map +1 -1
  68. package/dist/cli/import-command.js.map +1 -1
  69. package/dist/cli/initial-message.d.ts +1 -1
  70. package/dist/cli/initial-message.d.ts.map +1 -1
  71. package/dist/cli/initial-message.js.map +1 -1
  72. package/dist/cli/list-models.d.ts.map +1 -1
  73. package/dist/cli/list-models.js.map +1 -1
  74. package/dist/cli/politica-command.d.ts.map +1 -1
  75. package/dist/cli/politica-command.js.map +1 -1
  76. package/dist/cli/project-trust.d.ts.map +1 -1
  77. package/dist/cli/project-trust.js.map +1 -1
  78. package/dist/cli/refine-command.d.ts.map +1 -1
  79. package/dist/cli/refine-command.js.map +1 -1
  80. package/dist/cli/review-command.d.ts.map +1 -1
  81. package/dist/cli/review-command.js +77 -13
  82. package/dist/cli/review-command.js.map +1 -1
  83. package/dist/cli/schedule-command.d.ts.map +1 -1
  84. package/dist/cli/schedule-command.js.map +1 -1
  85. package/dist/cli/serve-command.d.ts +0 -1
  86. package/dist/cli/serve-command.d.ts.map +1 -1
  87. package/dist/cli/serve-command.js +12 -6
  88. package/dist/cli/serve-command.js.map +1 -1
  89. package/dist/cli/session-picker.d.ts.map +1 -1
  90. package/dist/cli/session-picker.js.map +1 -1
  91. package/dist/cli/startup-ui.d.ts.map +1 -1
  92. package/dist/cli/startup-ui.js.map +1 -1
  93. package/dist/cli/telegram-command.d.ts.map +1 -1
  94. package/dist/cli/telegram-command.js.map +1 -1
  95. package/dist/cli/telemetria-command.d.ts.map +1 -1
  96. package/dist/cli/telemetria-command.js.map +1 -1
  97. package/dist/cli/undo-command.d.ts.map +1 -1
  98. package/dist/cli/undo-command.js.map +1 -1
  99. package/dist/cli/update-cli.d.ts +82 -0
  100. package/dist/cli/update-cli.d.ts.map +1 -0
  101. package/dist/cli/update-cli.js +372 -0
  102. package/dist/cli/update-cli.js.map +1 -0
  103. package/dist/cli/usage-command.d.ts.map +1 -1
  104. package/dist/cli/usage-command.js +75 -6
  105. package/dist/cli/usage-command.js.map +1 -1
  106. package/dist/cli/wiki-command.d.ts.map +1 -1
  107. package/dist/cli/wiki-command.js.map +1 -1
  108. package/dist/cli.d.ts +0 -6
  109. package/dist/cli.d.ts.map +1 -1
  110. package/dist/cli.js +0 -0
  111. package/dist/cli.js.map +1 -1
  112. package/dist/client/index.d.ts.map +1 -1
  113. package/dist/client/index.js.map +1 -1
  114. package/dist/client/remote-session.d.ts.map +1 -1
  115. package/dist/client/remote-session.js.map +1 -1
  116. package/dist/client/transcript.d.ts.map +1 -1
  117. package/dist/client/transcript.js.map +1 -1
  118. package/dist/config.d.ts.map +1 -1
  119. package/dist/config.js.map +1 -1
  120. package/dist/core/ada.d.ts +5 -0
  121. package/dist/core/ada.d.ts.map +1 -1
  122. package/dist/core/ada.js +5 -0
  123. package/dist/core/ada.js.map +1 -1
  124. package/dist/core/advisor/guarda.d.ts.map +1 -1
  125. package/dist/core/advisor/guarda.js.map +1 -1
  126. package/dist/core/advisor/runtime.d.ts.map +1 -1
  127. package/dist/core/advisor/runtime.js.map +1 -1
  128. package/dist/core/advisor/sesion.d.ts.map +1 -1
  129. package/dist/core/advisor/sesion.js.map +1 -1
  130. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  131. package/dist/core/agent-session-runtime.js.map +1 -1
  132. package/dist/core/agent-session-services.d.ts.map +1 -1
  133. package/dist/core/agent-session-services.js +33 -0
  134. package/dist/core/agent-session-services.js.map +1 -1
  135. package/dist/core/agent-session.d.ts +67 -0
  136. package/dist/core/agent-session.d.ts.map +1 -1
  137. package/dist/core/agent-session.js +43 -2
  138. package/dist/core/agent-session.js.map +1 -1
  139. package/dist/core/agents/loader.d.ts.map +1 -1
  140. package/dist/core/agents/loader.js.map +1 -1
  141. package/dist/core/appendonly/append-only-context.d.ts +118 -0
  142. package/dist/core/appendonly/append-only-context.d.ts.map +1 -0
  143. package/dist/core/appendonly/append-only-context.js +256 -0
  144. package/dist/core/appendonly/append-only-context.js.map +1 -0
  145. package/dist/core/appendonly/auto.d.ts +30 -0
  146. package/dist/core/appendonly/auto.d.ts.map +1 -0
  147. package/dist/core/appendonly/auto.js +68 -0
  148. package/dist/core/appendonly/auto.js.map +1 -0
  149. package/dist/core/appendonly/extension.d.ts +29 -0
  150. package/dist/core/appendonly/extension.d.ts.map +1 -0
  151. package/dist/core/appendonly/extension.js +51 -0
  152. package/dist/core/appendonly/extension.js.map +1 -0
  153. package/dist/core/appendonly/index.d.ts +41 -0
  154. package/dist/core/appendonly/index.d.ts.map +1 -0
  155. package/dist/core/appendonly/index.js +42 -0
  156. package/dist/core/appendonly/index.js.map +1 -0
  157. package/dist/core/aprobacion/generados.d.ts.map +1 -1
  158. package/dist/core/aprobacion/generados.js.map +1 -1
  159. package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -1
  160. package/dist/core/aprobacion/politica-de-maquina.js.map +1 -1
  161. package/dist/core/aprobacion/politica.d.ts +1 -1
  162. package/dist/core/aprobacion/politica.d.ts.map +1 -1
  163. package/dist/core/aprobacion/politica.js.map +1 -1
  164. package/dist/core/arranque/atajos.d.ts.map +1 -1
  165. package/dist/core/arranque/atajos.js +20 -0
  166. package/dist/core/arranque/atajos.js.map +1 -1
  167. package/dist/core/audit/exportacion.d.ts.map +1 -1
  168. package/dist/core/audit/exportacion.js +5 -3
  169. package/dist/core/audit/exportacion.js.map +1 -1
  170. package/dist/core/audit/libro.d.ts +7 -0
  171. package/dist/core/audit/libro.d.ts.map +1 -1
  172. package/dist/core/audit/libro.js.map +1 -1
  173. package/dist/core/audit/registro-sesion.d.ts.map +1 -1
  174. package/dist/core/audit/registro-sesion.js.map +1 -1
  175. package/dist/core/audit/retencion.d.ts.map +1 -1
  176. package/dist/core/audit/retencion.js.map +1 -1
  177. package/dist/core/audit/rutas.d.ts.map +1 -1
  178. package/dist/core/audit/rutas.js.map +1 -1
  179. package/dist/core/auth-guidance.d.ts.map +1 -1
  180. package/dist/core/auth-guidance.js.map +1 -1
  181. package/dist/core/auth-storage.d.ts.map +1 -1
  182. package/dist/core/auth-storage.js.map +1 -1
  183. package/dist/core/banco/almacenamiento.d.ts.map +1 -1
  184. package/dist/core/banco/almacenamiento.js.map +1 -1
  185. package/dist/core/banco/analisis.d.ts.map +1 -1
  186. package/dist/core/banco/analisis.js.map +1 -1
  187. package/dist/core/banco/asides.d.ts +64 -0
  188. package/dist/core/banco/asides.d.ts.map +1 -0
  189. package/dist/core/banco/asides.js +113 -0
  190. package/dist/core/banco/asides.js.map +1 -0
  191. package/dist/core/banco/bloques.d.ts.map +1 -1
  192. package/dist/core/banco/bloques.js.map +1 -1
  193. package/dist/core/banco/cargas.d.ts.map +1 -1
  194. package/dist/core/banco/cargas.js.map +1 -1
  195. package/dist/core/banco/comparar.d.ts.map +1 -1
  196. package/dist/core/banco/comparar.js.map +1 -1
  197. package/dist/core/banco/cow-isolation.d.ts +74 -0
  198. package/dist/core/banco/cow-isolation.d.ts.map +1 -0
  199. package/dist/core/banco/cow-isolation.js +259 -0
  200. package/dist/core/banco/cow-isolation.js.map +1 -0
  201. package/dist/core/banco/ejecutar.d.ts.map +1 -1
  202. package/dist/core/banco/ejecutar.js.map +1 -1
  203. package/dist/core/banco/generar.d.ts.map +1 -1
  204. package/dist/core/banco/generar.js.map +1 -1
  205. package/dist/core/banco/mutaciones.d.ts.map +1 -1
  206. package/dist/core/banco/mutaciones.js.map +1 -1
  207. package/dist/core/banco/park-revive.d.ts +67 -0
  208. package/dist/core/banco/park-revive.d.ts.map +1 -0
  209. package/dist/core/banco/park-revive.js +130 -0
  210. package/dist/core/banco/park-revive.js.map +1 -0
  211. package/dist/core/banco/pruning.d.ts +48 -0
  212. package/dist/core/banco/pruning.d.ts.map +1 -0
  213. package/dist/core/banco/pruning.js +146 -0
  214. package/dist/core/banco/pruning.js.map +1 -0
  215. package/dist/core/banco/steering.d.ts +81 -0
  216. package/dist/core/banco/steering.d.ts.map +1 -0
  217. package/dist/core/banco/steering.js +96 -0
  218. package/dist/core/banco/steering.js.map +1 -0
  219. package/dist/core/banco/tipos.d.ts.map +1 -1
  220. package/dist/core/banco/tipos.js.map +1 -1
  221. package/dist/core/bash-executor.d.ts.map +1 -1
  222. package/dist/core/bash-executor.js.map +1 -1
  223. package/dist/core/blobs/almacen.d.ts.map +1 -1
  224. package/dist/core/blobs/almacen.js.map +1 -1
  225. package/dist/core/blobs/broker.d.ts +1 -0
  226. package/dist/core/blobs/broker.d.ts.map +1 -1
  227. package/dist/core/blobs/broker.js +1 -1
  228. package/dist/core/blobs/broker.js.map +1 -1
  229. package/dist/core/blobs/index.d.ts +1 -0
  230. package/dist/core/blobs/index.d.ts.map +1 -1
  231. package/dist/core/blobs/index.js +1 -0
  232. package/dist/core/blobs/index.js.map +1 -1
  233. package/dist/core/blobs/payload.d.ts.map +1 -1
  234. package/dist/core/blobs/payload.js.map +1 -1
  235. package/dist/core/blobs/proveedor.d.ts.map +1 -1
  236. package/dist/core/blobs/proveedor.js.map +1 -1
  237. package/dist/core/blobs/uploaders.d.ts +105 -0
  238. package/dist/core/blobs/uploaders.d.ts.map +1 -0
  239. package/dist/core/blobs/uploaders.js +224 -0
  240. package/dist/core/blobs/uploaders.js.map +1 -0
  241. package/dist/core/broker/broker.d.ts +54 -0
  242. package/dist/core/broker/broker.d.ts.map +1 -0
  243. package/dist/core/broker/broker.js +216 -0
  244. package/dist/core/broker/broker.js.map +1 -0
  245. package/dist/core/broker/index.d.ts +21 -0
  246. package/dist/core/broker/index.d.ts.map +1 -0
  247. package/dist/core/broker/index.js +33 -0
  248. package/dist/core/broker/index.js.map +1 -0
  249. package/dist/core/broker/ps.d.ts +20 -0
  250. package/dist/core/broker/ps.d.ts.map +1 -0
  251. package/dist/core/broker/ps.js +55 -0
  252. package/dist/core/broker/ps.js.map +1 -0
  253. package/dist/core/broker/types.d.ts +45 -0
  254. package/dist/core/broker/types.d.ts.map +1 -0
  255. package/dist/core/broker/types.js +19 -0
  256. package/dist/core/broker/types.js.map +1 -0
  257. package/dist/core/browser/cdp.d.ts.map +1 -1
  258. package/dist/core/browser/cdp.js.map +1 -1
  259. package/dist/core/browser/politica.d.ts.map +1 -1
  260. package/dist/core/browser/politica.js.map +1 -1
  261. package/dist/core/browser/sesion.d.ts.map +1 -1
  262. package/dist/core/browser/sesion.js.map +1 -1
  263. package/dist/core/browser/tools.d.ts.map +1 -1
  264. package/dist/core/browser/tools.js.map +1 -1
  265. package/dist/core/cache-stats.d.ts.map +1 -1
  266. package/dist/core/cache-stats.js.map +1 -1
  267. package/dist/core/capability/capability.test.d.ts +12 -0
  268. package/dist/core/capability/capability.test.d.ts.map +1 -0
  269. package/dist/core/capability/capability.test.js +258 -0
  270. package/dist/core/capability/capability.test.js.map +1 -0
  271. package/dist/core/capability/fs.d.ts +32 -0
  272. package/dist/core/capability/fs.d.ts.map +1 -0
  273. package/dist/core/capability/fs.js +106 -0
  274. package/dist/core/capability/fs.js.map +1 -0
  275. package/dist/core/capability/index.d.ts +68 -0
  276. package/dist/core/capability/index.d.ts.map +1 -0
  277. package/dist/core/capability/index.js +258 -0
  278. package/dist/core/capability/index.js.map +1 -0
  279. package/dist/core/capability/types.d.ts +168 -0
  280. package/dist/core/capability/types.d.ts.map +1 -0
  281. package/dist/core/capability/types.js +16 -0
  282. package/dist/core/capability/types.js.map +1 -0
  283. package/dist/core/carga-plugins/index.d.ts +49 -0
  284. package/dist/core/carga-plugins/index.d.ts.map +1 -0
  285. package/dist/core/carga-plugins/index.js +85 -0
  286. package/dist/core/carga-plugins/index.js.map +1 -0
  287. package/dist/core/carga-plugins/invalidacion.d.ts +60 -0
  288. package/dist/core/carga-plugins/invalidacion.d.ts.map +1 -0
  289. package/dist/core/carga-plugins/invalidacion.js +94 -0
  290. package/dist/core/carga-plugins/invalidacion.js.map +1 -0
  291. package/dist/core/carga-plugins/paralelo.d.ts +48 -0
  292. package/dist/core/carga-plugins/paralelo.d.ts.map +1 -0
  293. package/dist/core/carga-plugins/paralelo.js +47 -0
  294. package/dist/core/carga-plugins/paralelo.js.map +1 -0
  295. package/dist/core/colaboracion/autoresearch.d.ts +56 -0
  296. package/dist/core/colaboracion/autoresearch.d.ts.map +1 -0
  297. package/dist/core/colaboracion/autoresearch.js +95 -0
  298. package/dist/core/colaboracion/autoresearch.js.map +1 -0
  299. package/dist/core/colaboracion/index.d.ts +10 -0
  300. package/dist/core/colaboracion/index.d.ts.map +1 -0
  301. package/dist/core/colaboracion/index.js +7 -0
  302. package/dist/core/colaboracion/index.js.map +1 -0
  303. package/dist/core/colaboracion/kernels.d.ts +63 -0
  304. package/dist/core/colaboracion/kernels.d.ts.map +1 -0
  305. package/dist/core/colaboracion/kernels.js +99 -0
  306. package/dist/core/colaboracion/kernels.js.map +1 -0
  307. package/dist/core/colaboracion/rele/index.d.ts +8 -0
  308. package/dist/core/colaboracion/rele/index.d.ts.map +1 -0
  309. package/dist/core/colaboracion/rele/index.js +6 -0
  310. package/dist/core/colaboracion/rele/index.js.map +1 -0
  311. package/dist/core/colaboracion/rele/rele-servidor.d.ts +69 -0
  312. package/dist/core/colaboracion/rele/rele-servidor.d.ts.map +1 -0
  313. package/dist/core/colaboracion/rele/rele-servidor.js +197 -0
  314. package/dist/core/colaboracion/rele/rele-servidor.js.map +1 -0
  315. package/dist/core/colaboracion/rele/suscriptor.d.ts +31 -0
  316. package/dist/core/colaboracion/rele/suscriptor.d.ts.map +1 -0
  317. package/dist/core/colaboracion/rele/suscriptor.js +173 -0
  318. package/dist/core/colaboracion/rele/suscriptor.js.map +1 -0
  319. package/dist/core/colaboracion/sesion-colaborativa.d.ts +61 -0
  320. package/dist/core/colaboracion/sesion-colaborativa.d.ts.map +1 -0
  321. package/dist/core/colaboracion/sesion-colaborativa.js +127 -0
  322. package/dist/core/colaboracion/sesion-colaborativa.js.map +1 -0
  323. package/dist/core/commits/agentic.d.ts +101 -0
  324. package/dist/core/commits/agentic.d.ts.map +1 -0
  325. package/dist/core/commits/agentic.js +268 -0
  326. package/dist/core/commits/agentic.js.map +1 -0
  327. package/dist/core/commits/changelog.d.ts +37 -0
  328. package/dist/core/commits/changelog.d.ts.map +1 -0
  329. package/dist/core/commits/changelog.js +155 -0
  330. package/dist/core/commits/changelog.js.map +1 -0
  331. package/dist/core/commits/diff.d.ts.map +1 -0
  332. package/dist/core/commits/diff.js.map +1 -0
  333. package/dist/core/commits/git.d.ts +43 -0
  334. package/dist/core/commits/git.d.ts.map +1 -0
  335. package/dist/core/commits/git.js +61 -0
  336. package/dist/core/commits/git.js.map +1 -0
  337. package/dist/core/commits/split.d.ts +45 -0
  338. package/dist/core/commits/split.d.ts.map +1 -0
  339. package/dist/core/commits/split.js +128 -0
  340. package/dist/core/commits/split.js.map +1 -0
  341. package/dist/core/compactacion/comandos.d.ts +53 -0
  342. package/dist/core/compactacion/comandos.d.ts.map +1 -0
  343. package/dist/core/compactacion/comandos.js +155 -0
  344. package/dist/core/compactacion/comandos.js.map +1 -0
  345. package/dist/core/compactacion/extension.d.ts +28 -0
  346. package/dist/core/compactacion/extension.d.ts.map +1 -0
  347. package/dist/core/compactacion/extension.js +159 -0
  348. package/dist/core/compactacion/extension.js.map +1 -0
  349. package/dist/core/compactacion/handoff.d.ts +61 -0
  350. package/dist/core/compactacion/handoff.d.ts.map +1 -0
  351. package/dist/core/compactacion/handoff.js +139 -0
  352. package/dist/core/compactacion/handoff.js.map +1 -0
  353. package/dist/core/compactacion/index.d.ts +15 -0
  354. package/dist/core/compactacion/index.d.ts.map +1 -0
  355. package/dist/core/compactacion/index.js +15 -0
  356. package/dist/core/compactacion/index.js.map +1 -0
  357. package/dist/core/compactacion/prune.d.ts +38 -0
  358. package/dist/core/compactacion/prune.d.ts.map +1 -0
  359. package/dist/core/compactacion/prune.js +81 -0
  360. package/dist/core/compactacion/prune.js.map +1 -0
  361. package/dist/core/compactacion/shake.d.ts +40 -0
  362. package/dist/core/compactacion/shake.d.ts.map +1 -0
  363. package/dist/core/compactacion/shake.js +106 -0
  364. package/dist/core/compactacion/shake.js.map +1 -0
  365. package/dist/core/compactacion/tipos.d.ts +54 -0
  366. package/dist/core/compactacion/tipos.d.ts.map +1 -0
  367. package/dist/core/compactacion/tipos.js +44 -0
  368. package/dist/core/compactacion/tipos.js.map +1 -0
  369. package/dist/core/compactar/index.d.ts.map +1 -1
  370. package/dist/core/compactar/index.js.map +1 -1
  371. package/dist/core/compactar/registro-denso.d.ts.map +1 -1
  372. package/dist/core/compactar/registro-denso.js.map +1 -1
  373. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  374. package/dist/core/compaction/branch-summarization.js.map +1 -1
  375. package/dist/core/compaction/compaction.d.ts.map +1 -1
  376. package/dist/core/compaction/compaction.js.map +1 -1
  377. package/dist/core/compaction/index.d.ts.map +1 -1
  378. package/dist/core/compaction/index.js.map +1 -1
  379. package/dist/core/compaction/utils.d.ts.map +1 -1
  380. package/dist/core/compaction/utils.js.map +1 -1
  381. package/dist/core/computer/captura.d.ts.map +1 -1
  382. package/dist/core/computer/captura.js.map +1 -1
  383. package/dist/core/computer/driver.d.ts.map +1 -1
  384. package/dist/core/computer/driver.js.map +1 -1
  385. package/dist/core/computer/motor/actions.d.ts.map +1 -1
  386. package/dist/core/computer/motor/actions.js.map +1 -1
  387. package/dist/core/computer/motor/bridge.d.ts +2 -2
  388. package/dist/core/computer/motor/bridge.d.ts.map +1 -1
  389. package/dist/core/computer/motor/bridge.js.map +1 -1
  390. package/dist/core/computer/motor/cdp.d.ts.map +1 -1
  391. package/dist/core/computer/motor/cdp.js.map +1 -1
  392. package/dist/core/computer/motor/config.d.ts.map +1 -1
  393. package/dist/core/computer/motor/config.js.map +1 -1
  394. package/dist/core/computer/motor/contract.d.ts.map +1 -1
  395. package/dist/core/computer/motor/contract.js.map +1 -1
  396. package/dist/core/computer/motor/note.d.ts.map +1 -1
  397. package/dist/core/computer/motor/note.js.map +1 -1
  398. package/dist/core/computer/motor/outline.d.ts.map +1 -1
  399. package/dist/core/computer/motor/outline.js.map +1 -1
  400. package/dist/core/computer/motor/output.d.ts.map +1 -1
  401. package/dist/core/computer/motor/output.js.map +1 -1
  402. package/dist/core/computer/motor/permissions.d.ts.map +1 -1
  403. package/dist/core/computer/motor/permissions.js.map +1 -1
  404. package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -1
  405. package/dist/core/computer/motor/platform/architecture.js.map +1 -1
  406. package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -1
  407. package/dist/core/computer/motor/platform/coerce.js.map +1 -1
  408. package/dist/core/computer/motor/platform/index.d.ts.map +1 -1
  409. package/dist/core/computer/motor/platform/index.js.map +1 -1
  410. package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -1
  411. package/dist/core/computer/motor/platform/linux/backend.js.map +1 -1
  412. package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -1
  413. package/dist/core/computer/motor/platform/linux/helper.js.map +1 -1
  414. package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -1
  415. package/dist/core/computer/motor/platform/macos/backend.js.map +1 -1
  416. package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -1
  417. package/dist/core/computer/motor/platform/macos/browser.js.map +1 -1
  418. package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -1
  419. package/dist/core/computer/motor/platform/macos/helper.js.map +1 -1
  420. package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -1
  421. package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -1
  422. package/dist/core/computer/motor/platform/types.d.ts.map +1 -1
  423. package/dist/core/computer/motor/platform/types.js.map +1 -1
  424. package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -1
  425. package/dist/core/computer/motor/platform/windows/backend.js.map +1 -1
  426. package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -1
  427. package/dist/core/computer/motor/platform/windows/helper.js.map +1 -1
  428. package/dist/core/computer/motor/root-selection.d.ts.map +1 -1
  429. package/dist/core/computer/motor/root-selection.js.map +1 -1
  430. package/dist/core/computer/motor/runtime.d.ts.map +1 -1
  431. package/dist/core/computer/motor/runtime.js.map +1 -1
  432. package/dist/core/computer/motor/state.d.ts.map +1 -1
  433. package/dist/core/computer/motor/state.js.map +1 -1
  434. package/dist/core/computer/motor/view.d.ts.map +1 -1
  435. package/dist/core/computer/motor/view.js.map +1 -1
  436. package/dist/core/computer/motor-ada.d.ts.map +1 -1
  437. package/dist/core/computer/motor-ada.js.map +1 -1
  438. package/dist/core/computer/politica.d.ts.map +1 -1
  439. package/dist/core/computer/politica.js.map +1 -1
  440. package/dist/core/computer/tools.d.ts.map +1 -1
  441. package/dist/core/computer/tools.js.map +1 -1
  442. package/dist/core/config/quarantine.d.ts +57 -0
  443. package/dist/core/config/quarantine.d.ts.map +1 -0
  444. package/dist/core/config/quarantine.js +161 -0
  445. package/dist/core/config/quarantine.js.map +1 -0
  446. package/dist/core/config-viva/ambito.d.ts +46 -0
  447. package/dist/core/config-viva/ambito.d.ts.map +1 -0
  448. package/dist/core/config-viva/ambito.js +62 -0
  449. package/dist/core/config-viva/ambito.js.map +1 -0
  450. package/dist/core/config-viva/cache-negativa.d.ts +50 -0
  451. package/dist/core/config-viva/cache-negativa.d.ts.map +1 -0
  452. package/dist/core/config-viva/cache-negativa.js +78 -0
  453. package/dist/core/config-viva/cache-negativa.js.map +1 -0
  454. package/dist/core/config-viva/headers-vivos.d.ts +41 -0
  455. package/dist/core/config-viva/headers-vivos.d.ts.map +1 -0
  456. package/dist/core/config-viva/headers-vivos.js +43 -0
  457. package/dist/core/config-viva/headers-vivos.js.map +1 -0
  458. package/dist/core/config-viva/index.d.ts +16 -0
  459. package/dist/core/config-viva/index.d.ts.map +1 -0
  460. package/dist/core/config-viva/index.js +16 -0
  461. package/dist/core/config-viva/index.js.map +1 -0
  462. package/dist/core/config-viva/proveedor.d.ts +48 -0
  463. package/dist/core/config-viva/proveedor.d.ts.map +1 -0
  464. package/dist/core/config-viva/proveedor.js +78 -0
  465. package/dist/core/config-viva/proveedor.js.map +1 -0
  466. package/dist/core/context-breakdown.d.ts.map +1 -1
  467. package/dist/core/context-breakdown.js.map +1 -1
  468. package/dist/core/credenciales/cliente.d.ts.map +1 -1
  469. package/dist/core/credenciales/cliente.js.map +1 -1
  470. package/dist/core/credenciales/pool.d.ts +36 -1
  471. package/dist/core/credenciales/pool.d.ts.map +1 -1
  472. package/dist/core/credenciales/pool.js +56 -7
  473. package/dist/core/credenciales/pool.js.map +1 -1
  474. package/dist/core/credenciales/ranking.d.ts +56 -0
  475. package/dist/core/credenciales/ranking.d.ts.map +1 -0
  476. package/dist/core/credenciales/ranking.js +94 -0
  477. package/dist/core/credenciales/ranking.js.map +1 -0
  478. package/dist/core/credenciales/ratelimit.d.ts +54 -0
  479. package/dist/core/credenciales/ratelimit.d.ts.map +1 -0
  480. package/dist/core/credenciales/ratelimit.js +116 -0
  481. package/dist/core/credenciales/ratelimit.js.map +1 -0
  482. package/dist/core/credenciales/reposo.d.ts.map +1 -1
  483. package/dist/core/credenciales/reposo.js.map +1 -1
  484. package/dist/core/credenciales/servidor.d.ts +8 -0
  485. package/dist/core/credenciales/servidor.d.ts.map +1 -1
  486. package/dist/core/credenciales/servidor.js +9 -1
  487. package/dist/core/credenciales/servidor.js.map +1 -1
  488. package/dist/core/defaults.d.ts.map +1 -1
  489. package/dist/core/defaults.js.map +1 -1
  490. package/dist/core/descubrimiento/comandos.d.ts.map +1 -1
  491. package/dist/core/descubrimiento/comandos.js.map +1 -1
  492. package/dist/core/descubrimiento/mcp.d.ts +12 -0
  493. package/dist/core/descubrimiento/mcp.d.ts.map +1 -1
  494. package/dist/core/descubrimiento/mcp.js +32 -0
  495. package/dist/core/descubrimiento/mcp.js.map +1 -1
  496. package/dist/core/descubrimiento/reglas.d.ts.map +1 -1
  497. package/dist/core/descubrimiento/reglas.js.map +1 -1
  498. package/dist/core/descubrimiento/runtimes/index.d.ts +24 -0
  499. package/dist/core/descubrimiento/runtimes/index.d.ts.map +1 -0
  500. package/dist/core/descubrimiento/runtimes/index.js +109 -0
  501. package/dist/core/descubrimiento/runtimes/index.js.map +1 -0
  502. package/dist/core/descubrimiento/runtimes/litellm.d.ts +12 -0
  503. package/dist/core/descubrimiento/runtimes/litellm.d.ts.map +1 -0
  504. package/dist/core/descubrimiento/runtimes/litellm.js +185 -0
  505. package/dist/core/descubrimiento/runtimes/litellm.js.map +1 -0
  506. package/dist/core/descubrimiento/runtimes/lm-studio.d.ts +13 -0
  507. package/dist/core/descubrimiento/runtimes/lm-studio.d.ts.map +1 -0
  508. package/dist/core/descubrimiento/runtimes/lm-studio.js +142 -0
  509. package/dist/core/descubrimiento/runtimes/lm-studio.js.map +1 -0
  510. package/dist/core/descubrimiento/runtimes/ollama.d.ts +8 -0
  511. package/dist/core/descubrimiento/runtimes/ollama.d.ts.map +1 -0
  512. package/dist/core/descubrimiento/runtimes/ollama.js +96 -0
  513. package/dist/core/descubrimiento/runtimes/ollama.js.map +1 -0
  514. package/dist/core/descubrimiento/runtimes/tipos.d.ts +47 -0
  515. package/dist/core/descubrimiento/runtimes/tipos.d.ts.map +1 -0
  516. package/dist/core/descubrimiento/runtimes/tipos.js +10 -0
  517. package/dist/core/descubrimiento/runtimes/tipos.js.map +1 -0
  518. package/dist/core/descubrimiento/skills.d.ts.map +1 -1
  519. package/dist/core/descubrimiento/skills.js.map +1 -1
  520. package/dist/core/diagnostics.d.ts.map +1 -1
  521. package/dist/core/diagnostics.js.map +1 -1
  522. package/dist/core/dificultad/clasificador.d.ts.map +1 -1
  523. package/dist/core/dificultad/clasificador.js.map +1 -1
  524. package/dist/core/edicion/diario.d.ts.map +1 -1
  525. package/dist/core/edicion/diario.js.map +1 -1
  526. package/dist/core/edicion/hashline.d.ts.map +1 -1
  527. package/dist/core/edicion/hashline.js.map +1 -1
  528. package/dist/core/edicion/hueco.d.ts.map +1 -1
  529. package/dist/core/edicion/hueco.js.map +1 -1
  530. package/dist/core/edicion/ipynb.d.ts +51 -0
  531. package/dist/core/edicion/ipynb.d.ts.map +1 -0
  532. package/dist/core/edicion/ipynb.js +110 -0
  533. package/dist/core/edicion/ipynb.js.map +1 -0
  534. package/dist/core/edicion/limpiar-carga.d.ts.map +1 -1
  535. package/dist/core/edicion/limpiar-carga.js.map +1 -1
  536. package/dist/core/edicion/observador.d.ts.map +1 -1
  537. package/dist/core/edicion/observador.js.map +1 -1
  538. package/dist/core/edicion/parecido.d.ts.map +1 -1
  539. package/dist/core/edicion/parecido.js.map +1 -1
  540. package/dist/core/edicion/parseo.d.ts.map +1 -1
  541. package/dist/core/edicion/parseo.js.map +1 -1
  542. package/dist/core/edicion/portapapeles.d.ts +28 -0
  543. package/dist/core/edicion/portapapeles.d.ts.map +1 -0
  544. package/dist/core/edicion/portapapeles.js +49 -0
  545. package/dist/core/edicion/portapapeles.js.map +1 -0
  546. package/dist/core/edicion/reparacion.d.ts.map +1 -1
  547. package/dist/core/edicion/reparacion.js.map +1 -1
  548. package/dist/core/edicion/rutas-difusas.d.ts +44 -0
  549. package/dist/core/edicion/rutas-difusas.d.ts.map +1 -0
  550. package/dist/core/edicion/rutas-difusas.js +93 -0
  551. package/dist/core/edicion/rutas-difusas.js.map +1 -0
  552. package/dist/core/edicion/sangria.d.ts.map +1 -1
  553. package/dist/core/edicion/sangria.js.map +1 -1
  554. package/dist/core/edicion/tipos.d.ts.map +1 -1
  555. package/dist/core/edicion/tipos.js.map +1 -1
  556. package/dist/core/engine-personality.d.ts.map +1 -1
  557. package/dist/core/engine-personality.js.map +1 -1
  558. package/dist/core/errores/proveedor.d.ts.map +1 -1
  559. package/dist/core/errores/proveedor.js.map +1 -1
  560. package/dist/core/estructural/buscar.d.ts.map +1 -1
  561. package/dist/core/estructural/buscar.js.map +1 -1
  562. package/dist/core/estructural/editar.d.ts.map +1 -1
  563. package/dist/core/estructural/editar.js.map +1 -1
  564. package/dist/core/estructural/tools.d.ts.map +1 -1
  565. package/dist/core/estructural/tools.js.map +1 -1
  566. package/dist/core/event-bus.d.ts.map +1 -1
  567. package/dist/core/event-bus.js.map +1 -1
  568. package/dist/core/exec.d.ts.map +1 -1
  569. package/dist/core/exec.js.map +1 -1
  570. package/dist/core/experimental.d.ts.map +1 -1
  571. package/dist/core/experimental.js.map +1 -1
  572. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  573. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  574. package/dist/core/export-html/index.d.ts.map +1 -1
  575. package/dist/core/export-html/index.js +183 -13
  576. package/dist/core/export-html/index.js.map +1 -1
  577. package/dist/core/export-html/template.css +88 -4
  578. package/dist/core/export-html/template.html +3 -1
  579. package/dist/core/export-html/template.js +84 -0
  580. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  581. package/dist/core/export-html/tool-renderer.js.map +1 -1
  582. package/dist/core/extensiones/suplantacion.d.ts.map +1 -1
  583. package/dist/core/extensiones/suplantacion.js.map +1 -1
  584. package/dist/core/extensiones/vigilancia.d.ts.map +1 -1
  585. package/dist/core/extensiones/vigilancia.js.map +1 -1
  586. package/dist/core/extensions/index.d.ts.map +1 -1
  587. package/dist/core/extensions/index.js.map +1 -1
  588. package/dist/core/extensions/loader.d.ts.map +1 -1
  589. package/dist/core/extensions/loader.js.map +1 -1
  590. package/dist/core/extensions/runner.d.ts.map +1 -1
  591. package/dist/core/extensions/runner.js.map +1 -1
  592. package/dist/core/extensions/types.d.ts.map +1 -1
  593. package/dist/core/extensions/types.js.map +1 -1
  594. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  595. package/dist/core/extensions/wrapper.js.map +1 -1
  596. package/dist/core/footer-data-provider.d.ts.map +1 -1
  597. package/dist/core/footer-data-provider.js.map +1 -1
  598. package/dist/core/gc/archivo-frio.d.ts +33 -0
  599. package/dist/core/gc/archivo-frio.d.ts.map +1 -0
  600. package/dist/core/gc/archivo-frio.js +152 -0
  601. package/dist/core/gc/archivo-frio.js.map +1 -0
  602. package/dist/core/gc/blobs-gc.d.ts +25 -0
  603. package/dist/core/gc/blobs-gc.d.ts.map +1 -0
  604. package/dist/core/gc/blobs-gc.js +143 -0
  605. package/dist/core/gc/blobs-gc.js.map +1 -0
  606. package/dist/core/gc/index.d.ts +42 -0
  607. package/dist/core/gc/index.d.ts.map +1 -0
  608. package/dist/core/gc/index.js +50 -0
  609. package/dist/core/gc/index.js.map +1 -0
  610. package/dist/core/gc/lock.d.ts +19 -0
  611. package/dist/core/gc/lock.d.ts.map +1 -0
  612. package/dist/core/gc/lock.js +48 -0
  613. package/dist/core/gc/lock.js.map +1 -0
  614. package/dist/core/gc/reconciliacion.d.ts +19 -0
  615. package/dist/core/gc/reconciliacion.d.ts.map +1 -0
  616. package/dist/core/gc/reconciliacion.js +102 -0
  617. package/dist/core/gc/reconciliacion.js.map +1 -0
  618. package/dist/core/gc/wal.d.ts +15 -0
  619. package/dist/core/gc/wal.d.ts.map +1 -0
  620. package/dist/core/gc/wal.js +44 -0
  621. package/dist/core/gc/wal.js.map +1 -0
  622. package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -1
  623. package/dist/core/harness/fuentes-de-contexto.js.map +1 -1
  624. package/dist/core/harness/refine.d.ts.map +1 -1
  625. package/dist/core/harness/refine.js.map +1 -1
  626. package/dist/core/harness/store.d.ts.map +1 -1
  627. package/dist/core/harness/store.js.map +1 -1
  628. package/dist/core/higiene/index.d.ts +8 -0
  629. package/dist/core/higiene/index.d.ts.map +1 -0
  630. package/dist/core/higiene/index.js +8 -0
  631. package/dist/core/higiene/index.js.map +1 -0
  632. package/dist/core/higiene/managed-timers.d.ts +19 -0
  633. package/dist/core/higiene/managed-timers.d.ts.map +1 -0
  634. package/dist/core/higiene/managed-timers.js +68 -0
  635. package/dist/core/higiene/managed-timers.js.map +1 -0
  636. package/dist/core/higiene/race-handler.d.ts +7 -0
  637. package/dist/core/higiene/race-handler.d.ts.map +1 -0
  638. package/dist/core/higiene/race-handler.js +32 -0
  639. package/dist/core/higiene/race-handler.js.map +1 -0
  640. package/dist/core/higiene/withHostGuard.d.ts +27 -0
  641. package/dist/core/higiene/withHostGuard.d.ts.map +1 -0
  642. package/dist/core/higiene/withHostGuard.js +79 -0
  643. package/dist/core/higiene/withHostGuard.js.map +1 -0
  644. package/dist/core/hooks/contract.d.ts.map +1 -1
  645. package/dist/core/hooks/contract.js.map +1 -1
  646. package/dist/core/hooks/runner.d.ts.map +1 -1
  647. package/dist/core/hooks/runner.js.map +1 -1
  648. package/dist/core/hooks/session-hooks.d.ts.map +1 -1
  649. package/dist/core/hooks/session-hooks.js.map +1 -1
  650. package/dist/core/hooks-ts/cargador.d.ts +29 -0
  651. package/dist/core/hooks-ts/cargador.d.ts.map +1 -0
  652. package/dist/core/hooks-ts/cargador.js +51 -0
  653. package/dist/core/hooks-ts/cargador.js.map +1 -0
  654. package/dist/core/hooks-ts/index.d.ts +25 -0
  655. package/dist/core/hooks-ts/index.d.ts.map +1 -0
  656. package/dist/core/hooks-ts/index.js +25 -0
  657. package/dist/core/hooks-ts/index.js.map +1 -0
  658. package/dist/core/hooks-ts/runner.d.ts +40 -0
  659. package/dist/core/hooks-ts/runner.d.ts.map +1 -0
  660. package/dist/core/hooks-ts/runner.js +95 -0
  661. package/dist/core/hooks-ts/runner.js.map +1 -0
  662. package/dist/core/hooks-ts/tipos.d.ts +69 -0
  663. package/dist/core/hooks-ts/tipos.d.ts.map +1 -0
  664. package/dist/core/hooks-ts/tipos.js +90 -0
  665. package/dist/core/hooks-ts/tipos.js.map +1 -0
  666. package/dist/core/http-dispatcher.d.ts.map +1 -1
  667. package/dist/core/http-dispatcher.js.map +1 -1
  668. package/dist/core/importar/formatos.d.ts.map +1 -1
  669. package/dist/core/importar/formatos.js.map +1 -1
  670. package/dist/core/index.d.ts.map +1 -1
  671. package/dist/core/index.js.map +1 -1
  672. package/dist/core/interactivo/deteccion.d.ts.map +1 -1
  673. package/dist/core/interactivo/deteccion.js.map +1 -1
  674. package/dist/core/interactivo/sesion.d.ts.map +1 -1
  675. package/dist/core/interactivo/sesion.js.map +1 -1
  676. package/dist/core/interactivo/tools.d.ts.map +1 -1
  677. package/dist/core/interactivo/tools.js.map +1 -1
  678. package/dist/core/keybindings.d.ts +170 -170
  679. package/dist/core/keybindings.d.ts.map +1 -1
  680. package/dist/core/keybindings.js.map +1 -1
  681. package/dist/core/lectura/mapa.d.ts.map +1 -1
  682. package/dist/core/lectura/mapa.js.map +1 -1
  683. package/dist/core/lectura/pdf.d.ts.map +1 -1
  684. package/dist/core/lectura/pdf.js.map +1 -1
  685. package/dist/core/lectura/sniffer.d.ts +54 -0
  686. package/dist/core/lectura/sniffer.d.ts.map +1 -0
  687. package/dist/core/lectura/sniffer.js +106 -0
  688. package/dist/core/lectura/sniffer.js.map +1 -0
  689. package/dist/core/limpieza/comprobadores.d.ts +16 -2
  690. package/dist/core/limpieza/comprobadores.d.ts.map +1 -1
  691. package/dist/core/limpieza/comprobadores.js +200 -6
  692. package/dist/core/limpieza/comprobadores.js.map +1 -1
  693. package/dist/core/limpieza/flujo.d.ts +36 -0
  694. package/dist/core/limpieza/flujo.d.ts.map +1 -0
  695. package/dist/core/limpieza/flujo.js +89 -0
  696. package/dist/core/limpieza/flujo.js.map +1 -0
  697. package/dist/core/limpieza/parseo.d.ts.map +1 -1
  698. package/dist/core/limpieza/parseo.js.map +1 -1
  699. package/dist/core/limpieza/peso.d.ts +17 -0
  700. package/dist/core/limpieza/peso.d.ts.map +1 -0
  701. package/dist/core/limpieza/peso.js +52 -0
  702. package/dist/core/limpieza/peso.js.map +1 -0
  703. package/dist/core/limpieza/pool.d.ts +44 -0
  704. package/dist/core/limpieza/pool.d.ts.map +1 -0
  705. package/dist/core/limpieza/pool.js +123 -0
  706. package/dist/core/limpieza/pool.js.map +1 -0
  707. package/dist/core/limpieza/reparacion.d.ts +19 -2
  708. package/dist/core/limpieza/reparacion.d.ts.map +1 -1
  709. package/dist/core/limpieza/reparacion.js +95 -8
  710. package/dist/core/limpieza/reparacion.js.map +1 -1
  711. package/dist/core/limpieza/tablero.d.ts +47 -0
  712. package/dist/core/limpieza/tablero.d.ts.map +1 -0
  713. package/dist/core/limpieza/tablero.js +78 -0
  714. package/dist/core/limpieza/tablero.js.map +1 -0
  715. package/dist/core/limpieza/tipos.d.ts +25 -0
  716. package/dist/core/limpieza/tipos.d.ts.map +1 -1
  717. package/dist/core/limpieza/tipos.js.map +1 -1
  718. package/dist/core/lsp/cliente.d.ts +7 -0
  719. package/dist/core/lsp/cliente.d.ts.map +1 -1
  720. package/dist/core/lsp/cliente.js +4 -2
  721. package/dist/core/lsp/cliente.js.map +1 -1
  722. package/dist/core/lsp/descubrimiento.d.ts.map +1 -1
  723. package/dist/core/lsp/descubrimiento.js.map +1 -1
  724. package/dist/core/lsp/ediciones.d.ts.map +1 -1
  725. package/dist/core/lsp/ediciones.js.map +1 -1
  726. package/dist/core/lsp/extension.d.ts +9 -0
  727. package/dist/core/lsp/extension.d.ts.map +1 -1
  728. package/dist/core/lsp/extension.js +60 -4
  729. package/dist/core/lsp/extension.js.map +1 -1
  730. package/dist/core/lsp/formato.d.ts +72 -0
  731. package/dist/core/lsp/formato.d.ts.map +1 -0
  732. package/dist/core/lsp/formato.js +117 -0
  733. package/dist/core/lsp/formato.js.map +1 -0
  734. package/dist/core/lsp/tools.d.ts +3 -3
  735. package/dist/core/lsp/tools.d.ts.map +1 -1
  736. package/dist/core/lsp/tools.js.map +1 -1
  737. package/dist/core/lsp/writethrough.d.ts +165 -0
  738. package/dist/core/lsp/writethrough.d.ts.map +1 -0
  739. package/dist/core/lsp/writethrough.js +282 -0
  740. package/dist/core/lsp/writethrough.js.map +1 -0
  741. package/dist/core/marketplace/catalogo.d.ts +32 -0
  742. package/dist/core/marketplace/catalogo.d.ts.map +1 -0
  743. package/dist/core/marketplace/catalogo.js +122 -0
  744. package/dist/core/marketplace/catalogo.js.map +1 -0
  745. package/dist/core/marketplace/doctor.d.ts +47 -0
  746. package/dist/core/marketplace/doctor.d.ts.map +1 -0
  747. package/dist/core/marketplace/doctor.js +155 -0
  748. package/dist/core/marketplace/doctor.js.map +1 -0
  749. package/dist/core/marketplace/features.d.ts +22 -0
  750. package/dist/core/marketplace/features.d.ts.map +1 -0
  751. package/dist/core/marketplace/features.js +70 -0
  752. package/dist/core/marketplace/features.js.map +1 -0
  753. package/dist/core/marketplace/index.d.ts +33 -0
  754. package/dist/core/marketplace/index.d.ts.map +1 -0
  755. package/dist/core/marketplace/index.js +33 -0
  756. package/dist/core/marketplace/index.js.map +1 -0
  757. package/dist/core/marketplace/instalar.d.ts +27 -0
  758. package/dist/core/marketplace/instalar.d.ts.map +1 -0
  759. package/dist/core/marketplace/instalar.js +50 -0
  760. package/dist/core/marketplace/instalar.js.map +1 -0
  761. package/dist/core/mcp/client.d.ts.map +1 -1
  762. package/dist/core/mcp/client.js.map +1 -1
  763. package/dist/core/mcp/manager.d.ts.map +1 -1
  764. package/dist/core/mcp/manager.js.map +1 -1
  765. package/dist/core/mcp/oauth.d.ts +138 -0
  766. package/dist/core/mcp/oauth.d.ts.map +1 -0
  767. package/dist/core/mcp/oauth.js +348 -0
  768. package/dist/core/mcp/oauth.js.map +1 -0
  769. package/dist/core/mcp/tools.d.ts.map +1 -1
  770. package/dist/core/mcp/tools.js.map +1 -1
  771. package/dist/core/memoria/almacen.d.ts +56 -0
  772. package/dist/core/memoria/almacen.d.ts.map +1 -0
  773. package/dist/core/memoria/almacen.js +214 -0
  774. package/dist/core/memoria/almacen.js.map +1 -0
  775. package/dist/core/memoria/dr/respaldo.d.ts +34 -0
  776. package/dist/core/memoria/dr/respaldo.d.ts.map +1 -0
  777. package/dist/core/memoria/dr/respaldo.js +133 -0
  778. package/dist/core/memoria/dr/respaldo.js.map +1 -0
  779. package/dist/core/memoria/embeddings.d.ts +21 -0
  780. package/dist/core/memoria/embeddings.d.ts.map +1 -0
  781. package/dist/core/memoria/embeddings.js +87 -0
  782. package/dist/core/memoria/embeddings.js.map +1 -0
  783. package/dist/core/memoria/grafo.d.ts +56 -0
  784. package/dist/core/memoria/grafo.d.ts.map +1 -0
  785. package/dist/core/memoria/grafo.js +143 -0
  786. package/dist/core/memoria/grafo.js.map +1 -0
  787. package/dist/core/memoria/redaccion.d.ts +32 -0
  788. package/dist/core/memoria/redaccion.d.ts.map +1 -0
  789. package/dist/core/memoria/redaccion.js +76 -0
  790. package/dist/core/memoria/redaccion.js.map +1 -0
  791. package/dist/core/memoria/servidor/almacen-json.d.ts +26 -0
  792. package/dist/core/memoria/servidor/almacen-json.d.ts.map +1 -0
  793. package/dist/core/memoria/servidor/almacen-json.js +90 -0
  794. package/dist/core/memoria/servidor/almacen-json.js.map +1 -0
  795. package/dist/core/memoria/servidor/servidor.d.ts +43 -0
  796. package/dist/core/memoria/servidor/servidor.d.ts.map +1 -0
  797. package/dist/core/memoria/servidor/servidor.js +195 -0
  798. package/dist/core/memoria/servidor/servidor.js.map +1 -0
  799. package/dist/core/memoria/servidor/tipos.d.ts +44 -0
  800. package/dist/core/memoria/servidor/tipos.d.ts.map +1 -0
  801. package/dist/core/memoria/servidor/tipos.js +12 -0
  802. package/dist/core/memoria/servidor/tipos.js.map +1 -0
  803. package/dist/core/memoria/tipos.d.ts +63 -0
  804. package/dist/core/memoria/tipos.d.ts.map +1 -0
  805. package/dist/core/memoria/tipos.js +14 -0
  806. package/dist/core/memoria/tipos.js.map +1 -0
  807. package/dist/core/memory-engine/audit-export.d.ts.map +1 -1
  808. package/dist/core/memory-engine/audit-export.js.map +1 -1
  809. package/dist/core/memory-engine/audit-indice.d.ts.map +1 -1
  810. package/dist/core/memory-engine/audit-indice.js.map +1 -1
  811. package/dist/core/memory-engine/audit.d.ts.map +1 -1
  812. package/dist/core/memory-engine/audit.js.map +1 -1
  813. package/dist/core/memory-engine/engine.d.ts +7 -0
  814. package/dist/core/memory-engine/engine.d.ts.map +1 -1
  815. package/dist/core/memory-engine/engine.js.map +1 -1
  816. package/dist/core/memory-engine/inverted-index.d.ts.map +1 -1
  817. package/dist/core/memory-engine/inverted-index.js.map +1 -1
  818. package/dist/core/memory-engine/keychain.d.ts.map +1 -1
  819. package/dist/core/memory-engine/keychain.js.map +1 -1
  820. package/dist/core/memory-engine/observation-store.d.ts +1 -0
  821. package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
  822. package/dist/core/memory-engine/observation-store.js.map +1 -1
  823. package/dist/core/memory-engine/refinements.d.ts.map +1 -1
  824. package/dist/core/memory-engine/refinements.js.map +1 -1
  825. package/dist/core/memory-engine/scanner.d.ts.map +1 -1
  826. package/dist/core/memory-engine/scanner.js.map +1 -1
  827. package/dist/core/memory-engine/security.d.ts.map +1 -1
  828. package/dist/core/memory-engine/security.js.map +1 -1
  829. package/dist/core/memory-engine/session-indexer.d.ts.map +1 -1
  830. package/dist/core/memory-engine/session-indexer.js.map +1 -1
  831. package/dist/core/memory-engine/tools.d.ts.map +1 -1
  832. package/dist/core/memory-engine/tools.js.map +1 -1
  833. package/dist/core/memory-engine/types.d.ts.map +1 -1
  834. package/dist/core/memory-engine/types.js.map +1 -1
  835. package/dist/core/memory-engine/vault.d.ts.map +1 -1
  836. package/dist/core/memory-engine/vault.js.map +1 -1
  837. package/dist/core/messages.d.ts.map +1 -1
  838. package/dist/core/messages.js.map +1 -1
  839. package/dist/core/metaharness/cli.d.ts +19 -0
  840. package/dist/core/metaharness/cli.d.ts.map +1 -0
  841. package/dist/core/metaharness/cli.js +171 -0
  842. package/dist/core/metaharness/cli.js.map +1 -0
  843. package/dist/core/metaharness/comparar.d.ts +21 -0
  844. package/dist/core/metaharness/comparar.d.ts.map +1 -0
  845. package/dist/core/metaharness/comparar.js +64 -0
  846. package/dist/core/metaharness/comparar.js.map +1 -0
  847. package/dist/core/metaharness/ejecutar.d.ts +70 -0
  848. package/dist/core/metaharness/ejecutar.d.ts.map +1 -0
  849. package/dist/core/metaharness/ejecutar.js +249 -0
  850. package/dist/core/metaharness/ejecutar.js.map +1 -0
  851. package/dist/core/metaharness/tipos.d.ts +142 -0
  852. package/dist/core/metaharness/tipos.d.ts.map +1 -0
  853. package/dist/core/metaharness/tipos.js +17 -0
  854. package/dist/core/metaharness/tipos.js.map +1 -0
  855. package/dist/core/model-config.d.ts +8 -8
  856. package/dist/core/model-config.d.ts.map +1 -1
  857. package/dist/core/model-config.js.map +1 -1
  858. package/dist/core/model-registry.d.ts.map +1 -1
  859. package/dist/core/model-registry.js.map +1 -1
  860. package/dist/core/model-resolver.d.ts.map +1 -1
  861. package/dist/core/model-resolver.js.map +1 -1
  862. package/dist/core/model-runtime.d.ts.map +1 -1
  863. package/dist/core/model-runtime.js.map +1 -1
  864. package/dist/core/models-store.d.ts.map +1 -1
  865. package/dist/core/models-store.js.map +1 -1
  866. package/dist/core/muestreo-restringido.d.ts.map +1 -1
  867. package/dist/core/muestreo-restringido.js.map +1 -1
  868. package/dist/core/orphan-process-journal.d.ts.map +1 -1
  869. package/dist/core/orphan-process-journal.js.map +1 -1
  870. package/dist/core/output-guard.d.ts.map +1 -1
  871. package/dist/core/output-guard.js.map +1 -1
  872. package/dist/core/package-manager.d.ts.map +1 -1
  873. package/dist/core/package-manager.js.map +1 -1
  874. package/dist/core/parche/aplicar.d.ts +19 -0
  875. package/dist/core/parche/aplicar.d.ts.map +1 -0
  876. package/dist/core/parche/aplicar.js +243 -0
  877. package/dist/core/parche/aplicar.js.map +1 -0
  878. package/dist/core/parche/parser.d.ts +38 -0
  879. package/dist/core/parche/parser.d.ts.map +1 -0
  880. package/dist/core/parche/parser.js +217 -0
  881. package/dist/core/parche/parser.js.map +1 -0
  882. package/dist/core/parche/registro.d.ts +12 -0
  883. package/dist/core/parche/registro.d.ts.map +1 -0
  884. package/dist/core/parche/registro.js +58 -0
  885. package/dist/core/parche/registro.js.map +1 -0
  886. package/dist/core/perfiles/index.d.ts +22 -0
  887. package/dist/core/perfiles/index.d.ts.map +1 -0
  888. package/dist/core/perfiles/index.js +21 -0
  889. package/dist/core/perfiles/index.js.map +1 -0
  890. package/dist/core/perfiles/resolver.d.ts +51 -0
  891. package/dist/core/perfiles/resolver.d.ts.map +1 -0
  892. package/dist/core/perfiles/resolver.js +329 -0
  893. package/dist/core/perfiles/resolver.js.map +1 -0
  894. package/dist/core/perfiles/tipos.d.ts +69 -0
  895. package/dist/core/perfiles/tipos.d.ts.map +1 -0
  896. package/dist/core/perfiles/tipos.js +98 -0
  897. package/dist/core/perfiles/tipos.js.map +1 -0
  898. package/dist/core/pi-manifest.d.ts.map +1 -1
  899. package/dist/core/pi-manifest.js.map +1 -1
  900. package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -1
  901. package/dist/core/privacidad/categorias-especiales.js +4 -0
  902. package/dist/core/privacidad/categorias-especiales.js.map +1 -1
  903. package/dist/core/privacidad/tapar.d.ts.map +1 -1
  904. package/dist/core/privacidad/tapar.js.map +1 -1
  905. package/dist/core/project-memory.d.ts.map +1 -1
  906. package/dist/core/project-memory.js.map +1 -1
  907. package/dist/core/project-trust.d.ts.map +1 -1
  908. package/dist/core/project-trust.js.map +1 -1
  909. package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -1
  910. package/dist/core/prompt-cache/diagnostics.js.map +1 -1
  911. package/dist/core/prompt-cache/index.d.ts.map +1 -1
  912. package/dist/core/prompt-cache/index.js.map +1 -1
  913. package/dist/core/prompt-cache/payload.d.ts.map +1 -1
  914. package/dist/core/prompt-cache/payload.js.map +1 -1
  915. package/dist/core/prompt-cache/stabilize.d.ts.map +1 -1
  916. package/dist/core/prompt-cache/stabilize.js.map +1 -1
  917. package/dist/core/prompt-cache/stats.d.ts.map +1 -1
  918. package/dist/core/prompt-cache/stats.js.map +1 -1
  919. package/dist/core/prompt-eleccion.d.ts.map +1 -1
  920. package/dist/core/prompt-eleccion.js.map +1 -1
  921. package/dist/core/prompt-optimizer.d.ts.map +1 -1
  922. package/dist/core/prompt-optimizer.js.map +1 -1
  923. package/dist/core/prompt-templates.d.ts.map +1 -1
  924. package/dist/core/prompt-templates.js.map +1 -1
  925. package/dist/core/prompts/montar.d.ts.map +1 -1
  926. package/dist/core/prompts/montar.js.map +1 -1
  927. package/dist/core/prompts/plantilla.d.ts.map +1 -1
  928. package/dist/core/prompts/plantilla.js.map +1 -1
  929. package/dist/core/proveedores-registry/definiciones.d.ts +15 -0
  930. package/dist/core/proveedores-registry/definiciones.d.ts.map +1 -0
  931. package/dist/core/proveedores-registry/definiciones.js +22 -0
  932. package/dist/core/proveedores-registry/definiciones.js.map +1 -0
  933. package/dist/core/proveedores-registry/index.d.ts +14 -0
  934. package/dist/core/proveedores-registry/index.d.ts.map +1 -0
  935. package/dist/core/proveedores-registry/index.js +13 -0
  936. package/dist/core/proveedores-registry/index.js.map +1 -0
  937. package/dist/core/proveedores-registry/resolver.d.ts +25 -0
  938. package/dist/core/proveedores-registry/resolver.d.ts.map +1 -0
  939. package/dist/core/proveedores-registry/resolver.js +69 -0
  940. package/dist/core/proveedores-registry/resolver.js.map +1 -0
  941. package/dist/core/proveedores-registry/tipos.d.ts +47 -0
  942. package/dist/core/proveedores-registry/tipos.d.ts.map +1 -0
  943. package/dist/core/proveedores-registry/tipos.js +15 -0
  944. package/dist/core/proveedores-registry/tipos.js.map +1 -0
  945. package/dist/core/provider-attribution.d.ts.map +1 -1
  946. package/dist/core/provider-attribution.js.map +1 -1
  947. package/dist/core/provider-composer.d.ts.map +1 -1
  948. package/dist/core/provider-composer.js.map +1 -1
  949. package/dist/core/radius.d.ts.map +1 -1
  950. package/dist/core/radius.js.map +1 -1
  951. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  952. package/dist/core/remote-catalog-provider.js.map +1 -1
  953. package/dist/core/remoto/destino.d.ts.map +1 -1
  954. package/dist/core/remoto/destino.js.map +1 -1
  955. package/dist/core/remoto/ejecutor.d.ts.map +1 -1
  956. package/dist/core/remoto/ejecutor.js.map +1 -1
  957. package/dist/core/remoto/ficheros.d.ts.map +1 -1
  958. package/dist/core/remoto/ficheros.js.map +1 -1
  959. package/dist/core/remoto/registro-extension.d.ts.map +1 -1
  960. package/dist/core/remoto/registro-extension.js.map +1 -1
  961. package/dist/core/remoto/tools.d.ts.map +1 -1
  962. package/dist/core/remoto/tools.js.map +1 -1
  963. package/dist/core/reparacion/index.d.ts +2 -0
  964. package/dist/core/reparacion/index.d.ts.map +1 -0
  965. package/dist/core/reparacion/index.js +2 -0
  966. package/dist/core/reparacion/index.js.map +1 -0
  967. package/dist/core/reparacion/reparar-hunk.d.ts +27 -0
  968. package/dist/core/reparacion/reparar-hunk.d.ts.map +1 -0
  969. package/dist/core/reparacion/reparar-hunk.js +139 -0
  970. package/dist/core/reparacion/reparar-hunk.js.map +1 -0
  971. package/dist/core/resolve-config-value.d.ts.map +1 -1
  972. package/dist/core/resolve-config-value.js.map +1 -1
  973. package/dist/core/resource-loader.d.ts +13 -0
  974. package/dist/core/resource-loader.d.ts.map +1 -1
  975. package/dist/core/resource-loader.js +7 -4
  976. package/dist/core/resource-loader.js.map +1 -1
  977. package/dist/core/revision/dispositions.d.ts +86 -0
  978. package/dist/core/revision/dispositions.d.ts.map +1 -0
  979. package/dist/core/revision/dispositions.js +137 -0
  980. package/dist/core/revision/dispositions.js.map +1 -0
  981. package/dist/core/revision/hallazgo.d.ts.map +1 -1
  982. package/dist/core/revision/hallazgo.js.map +1 -1
  983. package/dist/core/revision/procedencia.d.ts +63 -0
  984. package/dist/core/revision/procedencia.d.ts.map +1 -0
  985. package/dist/core/revision/procedencia.js +72 -0
  986. package/dist/core/revision/procedencia.js.map +1 -0
  987. package/dist/core/revision/publicar.d.ts +26 -0
  988. package/dist/core/revision/publicar.d.ts.map +1 -0
  989. package/dist/core/revision/publicar.js +34 -0
  990. package/dist/core/revision/publicar.js.map +1 -0
  991. package/dist/core/revision/revisor.d.ts.map +1 -1
  992. package/dist/core/revision/revisor.js.map +1 -1
  993. package/dist/core/revision/sarif.d.ts.map +1 -1
  994. package/dist/core/revision/sarif.js.map +1 -1
  995. package/dist/core/router-uris/index.d.ts +12 -0
  996. package/dist/core/router-uris/index.d.ts.map +1 -0
  997. package/dist/core/router-uris/index.js +12 -0
  998. package/dist/core/router-uris/index.js.map +1 -0
  999. package/dist/core/router-uris/router.d.ts +2 -0
  1000. package/dist/core/router-uris/router.d.ts.map +1 -0
  1001. package/dist/core/router-uris/router.js +2 -0
  1002. package/dist/core/router-uris/router.js.map +1 -0
  1003. package/dist/core/runtime-credentials.d.ts.map +1 -1
  1004. package/dist/core/runtime-credentials.js.map +1 -1
  1005. package/dist/core/rutas/envoltorio.d.ts +20 -0
  1006. package/dist/core/rutas/envoltorio.d.ts.map +1 -0
  1007. package/dist/core/rutas/envoltorio.js +48 -0
  1008. package/dist/core/rutas/envoltorio.js.map +1 -0
  1009. package/dist/core/rutas/index.d.ts +11 -0
  1010. package/dist/core/rutas/index.d.ts.map +1 -0
  1011. package/dist/core/rutas/index.js +11 -0
  1012. package/dist/core/rutas/index.js.map +1 -0
  1013. package/dist/core/rutas/router.d.ts +82 -0
  1014. package/dist/core/rutas/router.d.ts.map +1 -0
  1015. package/dist/core/rutas/router.js +161 -0
  1016. package/dist/core/rutas/router.js.map +1 -0
  1017. package/dist/core/scheduler/scheduler.d.ts.map +1 -1
  1018. package/dist/core/scheduler/scheduler.js.map +1 -1
  1019. package/dist/core/sdk.d.ts.map +1 -1
  1020. package/dist/core/sdk.js.map +1 -1
  1021. package/dist/core/secretos/extension.d.ts +31 -0
  1022. package/dist/core/secretos/extension.d.ts.map +1 -0
  1023. package/dist/core/secretos/extension.js +64 -0
  1024. package/dist/core/secretos/extension.js.map +1 -0
  1025. package/dist/core/secretos/index.d.ts +75 -0
  1026. package/dist/core/secretos/index.d.ts.map +1 -0
  1027. package/dist/core/secretos/index.js +385 -0
  1028. package/dist/core/secretos/index.js.map +1 -0
  1029. package/dist/core/secretos/message-transform.d.ts +44 -0
  1030. package/dist/core/secretos/message-transform.d.ts.map +1 -0
  1031. package/dist/core/secretos/message-transform.js +246 -0
  1032. package/dist/core/secretos/message-transform.js.map +1 -0
  1033. package/dist/core/secretos/obfuscator.d.ts +30 -0
  1034. package/dist/core/secretos/obfuscator.d.ts.map +1 -0
  1035. package/dist/core/secretos/obfuscator.js +1182 -0
  1036. package/dist/core/secretos/obfuscator.js.map +1 -0
  1037. package/dist/core/secretos/placeholder-scan.d.ts +96 -0
  1038. package/dist/core/secretos/placeholder-scan.d.ts.map +1 -0
  1039. package/dist/core/secretos/placeholder-scan.js +433 -0
  1040. package/dist/core/secretos/placeholder-scan.js.map +1 -0
  1041. package/dist/core/secretos/placeholder.d.ts +95 -0
  1042. package/dist/core/secretos/placeholder.d.ts.map +1 -0
  1043. package/dist/core/secretos/placeholder.js +283 -0
  1044. package/dist/core/secretos/placeholder.js.map +1 -0
  1045. package/dist/core/secretos/regex.d.ts +3 -0
  1046. package/dist/core/secretos/regex.d.ts.map +1 -0
  1047. package/dist/core/secretos/regex.js +19 -0
  1048. package/dist/core/secretos/regex.js.map +1 -0
  1049. package/dist/core/secretos/replacement.d.ts +83 -0
  1050. package/dist/core/secretos/replacement.d.ts.map +1 -0
  1051. package/dist/core/secretos/replacement.js +211 -0
  1052. package/dist/core/secretos/replacement.js.map +1 -0
  1053. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -1
  1054. package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -1
  1055. package/dist/core/sesion/journal-tree.d.ts +73 -0
  1056. package/dist/core/sesion/journal-tree.d.ts.map +1 -0
  1057. package/dist/core/sesion/journal-tree.js +241 -0
  1058. package/dist/core/sesion/journal-tree.js.map +1 -0
  1059. package/dist/core/sesion/turn-recovery.d.ts +48 -0
  1060. package/dist/core/sesion/turn-recovery.d.ts.map +1 -0
  1061. package/dist/core/sesion/turn-recovery.js +182 -0
  1062. package/dist/core/sesion/turn-recovery.js.map +1 -0
  1063. package/dist/core/session-cwd.d.ts.map +1 -1
  1064. package/dist/core/session-cwd.js.map +1 -1
  1065. package/dist/core/session-manager.d.ts.map +1 -1
  1066. package/dist/core/session-manager.js.map +1 -1
  1067. package/dist/core/settings-diagnostics.d.ts.map +1 -1
  1068. package/dist/core/settings-diagnostics.js.map +1 -1
  1069. package/dist/core/settings-manager.d.ts +2 -2
  1070. package/dist/core/settings-manager.d.ts.map +1 -1
  1071. package/dist/core/settings-manager.js.map +1 -1
  1072. package/dist/core/share/cifrado.d.ts +39 -0
  1073. package/dist/core/share/cifrado.d.ts.map +1 -0
  1074. package/dist/core/share/cifrado.js +81 -0
  1075. package/dist/core/share/cifrado.js.map +1 -0
  1076. package/dist/core/share/exportar.d.ts +69 -0
  1077. package/dist/core/share/exportar.d.ts.map +1 -0
  1078. package/dist/core/share/exportar.js +247 -0
  1079. package/dist/core/share/exportar.js.map +1 -0
  1080. package/dist/core/skills.d.ts.map +1 -1
  1081. package/dist/core/skills.js.map +1 -1
  1082. package/dist/core/slash-commands.d.ts.map +1 -1
  1083. package/dist/core/slash-commands.js.map +1 -1
  1084. package/dist/core/source-info.d.ts.map +1 -1
  1085. package/dist/core/source-info.js.map +1 -1
  1086. package/dist/core/stream-guard/guardia.d.ts +45 -0
  1087. package/dist/core/stream-guard/guardia.d.ts.map +1 -0
  1088. package/dist/core/stream-guard/guardia.js +100 -0
  1089. package/dist/core/stream-guard/guardia.js.map +1 -0
  1090. package/dist/core/stream-guard/index.d.ts +9 -0
  1091. package/dist/core/stream-guard/index.d.ts.map +1 -0
  1092. package/dist/core/stream-guard/index.js +7 -0
  1093. package/dist/core/stream-guard/index.js.map +1 -0
  1094. package/dist/core/stream-guard/replay.d.ts +39 -0
  1095. package/dist/core/stream-guard/replay.d.ts.map +1 -0
  1096. package/dist/core/stream-guard/replay.js +68 -0
  1097. package/dist/core/stream-guard/replay.js.map +1 -0
  1098. package/dist/core/system-prompt.d.ts.map +1 -1
  1099. package/dist/core/system-prompt.js.map +1 -1
  1100. package/dist/core/telemetria/otlp.d.ts.map +1 -1
  1101. package/dist/core/telemetria/otlp.js.map +1 -1
  1102. package/dist/core/telemetry/otel-genai.d.ts +44 -0
  1103. package/dist/core/telemetry/otel-genai.d.ts.map +1 -0
  1104. package/dist/core/telemetry/otel-genai.js +124 -0
  1105. package/dist/core/telemetry/otel-genai.js.map +1 -0
  1106. package/dist/core/telemetry.d.ts.map +1 -1
  1107. package/dist/core/telemetry.js.map +1 -1
  1108. package/dist/core/terminal/backlog-guard.d.ts +53 -0
  1109. package/dist/core/terminal/backlog-guard.d.ts.map +1 -0
  1110. package/dist/core/terminal/backlog-guard.js +122 -0
  1111. package/dist/core/terminal/backlog-guard.js.map +1 -0
  1112. package/dist/core/terminal/conpty.d.ts +29 -0
  1113. package/dist/core/terminal/conpty.d.ts.map +1 -0
  1114. package/dist/core/terminal/conpty.js +67 -0
  1115. package/dist/core/terminal/conpty.js.map +1 -0
  1116. package/dist/core/terminal/conptyChunking.d.ts +2 -0
  1117. package/dist/core/terminal/conptyChunking.d.ts.map +1 -0
  1118. package/dist/core/terminal/conptyChunking.js +2 -0
  1119. package/dist/core/terminal/conptyChunking.js.map +1 -0
  1120. package/dist/core/terminal/index.d.ts +5 -0
  1121. package/dist/core/terminal/index.d.ts.map +1 -0
  1122. package/dist/core/terminal/index.js +5 -0
  1123. package/dist/core/terminal/index.js.map +1 -0
  1124. package/dist/core/terminal/loop-watchdog.d.ts +43 -0
  1125. package/dist/core/terminal/loop-watchdog.d.ts.map +1 -0
  1126. package/dist/core/terminal/loop-watchdog.js +117 -0
  1127. package/dist/core/terminal/loop-watchdog.js.map +1 -0
  1128. package/dist/core/terminal/runner.d.ts +55 -0
  1129. package/dist/core/terminal/runner.d.ts.map +1 -0
  1130. package/dist/core/terminal/runner.js +102 -0
  1131. package/dist/core/terminal/runner.js.map +1 -0
  1132. package/dist/core/timings.d.ts.map +1 -1
  1133. package/dist/core/timings.js.map +1 -1
  1134. package/dist/core/tools/apply_patch.d.ts +29 -0
  1135. package/dist/core/tools/apply_patch.d.ts.map +1 -0
  1136. package/dist/core/tools/apply_patch.js +54 -0
  1137. package/dist/core/tools/apply_patch.js.map +1 -0
  1138. package/dist/core/tools/bash.d.ts.map +1 -1
  1139. package/dist/core/tools/bash.js.map +1 -1
  1140. package/dist/core/tools/coercion-argumentos.d.ts.map +1 -1
  1141. package/dist/core/tools/coercion-argumentos.js.map +1 -1
  1142. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  1143. package/dist/core/tools/edit-diff.js.map +1 -1
  1144. package/dist/core/tools/edit.d.ts.map +1 -1
  1145. package/dist/core/tools/edit.js +43 -1
  1146. package/dist/core/tools/edit.js.map +1 -1
  1147. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  1148. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  1149. package/dist/core/tools/find.d.ts.map +1 -1
  1150. package/dist/core/tools/find.js.map +1 -1
  1151. package/dist/core/tools/grep.d.ts.map +1 -1
  1152. package/dist/core/tools/grep.js.map +1 -1
  1153. package/dist/core/tools/index.d.ts.map +1 -1
  1154. package/dist/core/tools/index.js.map +1 -1
  1155. package/dist/core/tools/json-tolerante.d.ts.map +1 -1
  1156. package/dist/core/tools/json-tolerante.js.map +1 -1
  1157. package/dist/core/tools/ls.d.ts.map +1 -1
  1158. package/dist/core/tools/ls.js.map +1 -1
  1159. package/dist/core/tools/noop-loop-guard.d.ts +46 -0
  1160. package/dist/core/tools/noop-loop-guard.d.ts.map +1 -0
  1161. package/dist/core/tools/noop-loop-guard.js +57 -0
  1162. package/dist/core/tools/noop-loop-guard.js.map +1 -0
  1163. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  1164. package/dist/core/tools/output-accumulator.js.map +1 -1
  1165. package/dist/core/tools/path-utils.d.ts.map +1 -1
  1166. package/dist/core/tools/path-utils.js.map +1 -1
  1167. package/dist/core/tools/project-memory-tool.d.ts.map +1 -1
  1168. package/dist/core/tools/project-memory-tool.js.map +1 -1
  1169. package/dist/core/tools/read.d.ts.map +1 -1
  1170. package/dist/core/tools/read.js.map +1 -1
  1171. package/dist/core/tools/render-utils.d.ts.map +1 -1
  1172. package/dist/core/tools/render-utils.js.map +1 -1
  1173. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  1174. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  1175. package/dist/core/tools/truncate.d.ts.map +1 -1
  1176. package/dist/core/tools/truncate.js.map +1 -1
  1177. package/dist/core/tools/write.d.ts.map +1 -1
  1178. package/dist/core/tools/write.js.map +1 -1
  1179. package/dist/core/trust-manager.d.ts.map +1 -1
  1180. package/dist/core/trust-manager.js.map +1 -1
  1181. package/dist/core/ttsr/captura.d.ts +72 -0
  1182. package/dist/core/ttsr/captura.d.ts.map +1 -0
  1183. package/dist/core/ttsr/captura.js +183 -0
  1184. package/dist/core/ttsr/captura.js.map +1 -0
  1185. package/dist/core/ttsr/index.d.ts +24 -0
  1186. package/dist/core/ttsr/index.d.ts.map +1 -0
  1187. package/dist/core/ttsr/index.js +57 -0
  1188. package/dist/core/ttsr/index.js.map +1 -0
  1189. package/dist/core/ttsr/preview.d.ts +48 -0
  1190. package/dist/core/ttsr/preview.d.ts.map +1 -0
  1191. package/dist/core/ttsr/preview.js +83 -0
  1192. package/dist/core/ttsr/preview.js.map +1 -0
  1193. package/dist/core/turno-vacio/detectar.d.ts.map +1 -1
  1194. package/dist/core/turno-vacio/detectar.js.map +1 -1
  1195. package/dist/core/undo/journal.d.ts.map +1 -1
  1196. package/dist/core/undo/journal.js.map +1 -1
  1197. package/dist/core/urls-internas/auditoria.d.ts.map +1 -1
  1198. package/dist/core/urls-internas/auditoria.js.map +1 -1
  1199. package/dist/core/urls-internas/boveda.d.ts.map +1 -1
  1200. package/dist/core/urls-internas/boveda.js.map +1 -1
  1201. package/dist/core/urls-internas/lector.d.ts +14 -10
  1202. package/dist/core/urls-internas/lector.d.ts.map +1 -1
  1203. package/dist/core/urls-internas/lector.js +50 -36
  1204. package/dist/core/urls-internas/lector.js.map +1 -1
  1205. package/dist/core/urls-internas/memoria.d.ts.map +1 -1
  1206. package/dist/core/urls-internas/memoria.js.map +1 -1
  1207. package/dist/core/urls-internas/parse.d.ts +6 -13
  1208. package/dist/core/urls-internas/parse.d.ts.map +1 -1
  1209. package/dist/core/urls-internas/parse.js +6 -17
  1210. package/dist/core/urls-internas/parse.js.map +1 -1
  1211. package/dist/core/urls-internas/reglas.d.ts.map +1 -1
  1212. package/dist/core/urls-internas/reglas.js.map +1 -1
  1213. package/dist/core/usage/aggregate.d.ts +1 -0
  1214. package/dist/core/usage/aggregate.d.ts.map +1 -1
  1215. package/dist/core/usage/aggregate.js +1 -1
  1216. package/dist/core/usage/aggregate.js.map +1 -1
  1217. package/dist/core/usage/cuota/anthropic.d.ts.map +1 -1
  1218. package/dist/core/usage/cuota/anthropic.js.map +1 -1
  1219. package/dist/core/usage/cuota/cache.d.ts.map +1 -1
  1220. package/dist/core/usage/cuota/cache.js.map +1 -1
  1221. package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -1
  1222. package/dist/core/usage/cuota/github-copilot.js.map +1 -1
  1223. package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -1
  1224. package/dist/core/usage/cuota/google-gemini.js.map +1 -1
  1225. package/dist/core/usage/cuota/index.d.ts.map +1 -1
  1226. package/dist/core/usage/cuota/index.js.map +1 -1
  1227. package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -1
  1228. package/dist/core/usage/cuota/openai-codex.js.map +1 -1
  1229. package/dist/core/usage/cuota/openrouter.d.ts.map +1 -1
  1230. package/dist/core/usage/cuota/openrouter.js.map +1 -1
  1231. package/dist/core/usage/cuota/tipos.d.ts.map +1 -1
  1232. package/dist/core/usage/cuota/tipos.js.map +1 -1
  1233. package/dist/core/usage/index.d.ts +11 -0
  1234. package/dist/core/usage/index.d.ts.map +1 -0
  1235. package/dist/core/usage/index.js +11 -0
  1236. package/dist/core/usage/index.js.map +1 -0
  1237. package/dist/core/usage/multi.d.ts +62 -0
  1238. package/dist/core/usage/multi.d.ts.map +1 -0
  1239. package/dist/core/usage/multi.js +122 -0
  1240. package/dist/core/usage/multi.js.map +1 -0
  1241. package/dist/core/usage/redaccion.d.ts +48 -0
  1242. package/dist/core/usage/redaccion.d.ts.map +1 -0
  1243. package/dist/core/usage/redaccion.js +72 -0
  1244. package/dist/core/usage/redaccion.js.map +1 -0
  1245. package/dist/core/usage-totals.d.ts.map +1 -1
  1246. package/dist/core/usage-totals.js.map +1 -1
  1247. package/dist/core/utils/atomic-write.d.ts +55 -0
  1248. package/dist/core/utils/atomic-write.d.ts.map +1 -0
  1249. package/dist/core/utils/atomic-write.js +293 -0
  1250. package/dist/core/utils/atomic-write.js.map +1 -0
  1251. package/dist/core/utils/git.d.ts +24 -0
  1252. package/dist/core/utils/git.d.ts.map +1 -0
  1253. package/dist/core/utils/git.js +107 -0
  1254. package/dist/core/utils/git.js.map +1 -0
  1255. package/dist/core/utils/logger.d.ts +26 -0
  1256. package/dist/core/utils/logger.d.ts.map +1 -0
  1257. package/dist/core/utils/logger.js +104 -0
  1258. package/dist/core/utils/logger.js.map +1 -0
  1259. package/dist/core/utils/shell-snapshot.d.ts +21 -0
  1260. package/dist/core/utils/shell-snapshot.d.ts.map +1 -0
  1261. package/dist/core/utils/shell-snapshot.js +32 -0
  1262. package/dist/core/utils/shell-snapshot.js.map +1 -0
  1263. package/dist/core/utils/startup-watchdog.d.ts +11 -0
  1264. package/dist/core/utils/startup-watchdog.d.ts.map +1 -0
  1265. package/dist/core/utils/startup-watchdog.js +34 -0
  1266. package/dist/core/utils/startup-watchdog.js.map +1 -0
  1267. package/dist/core/utils/tls-ca-shim.d.ts +17 -0
  1268. package/dist/core/utils/tls-ca-shim.d.ts.map +1 -0
  1269. package/dist/core/utils/tls-ca-shim.js +33 -0
  1270. package/dist/core/utils/tls-ca-shim.js.map +1 -0
  1271. package/dist/core/web/agregador.d.ts +67 -0
  1272. package/dist/core/web/agregador.d.ts.map +1 -0
  1273. package/dist/core/web/agregador.js +182 -0
  1274. package/dist/core/web/agregador.js.map +1 -0
  1275. package/dist/core/web/busqueda-nativa.d.ts.map +1 -1
  1276. package/dist/core/web/busqueda-nativa.js.map +1 -1
  1277. package/dist/core/web/consulta.d.ts +53 -0
  1278. package/dist/core/web/consulta.d.ts.map +1 -0
  1279. package/dist/core/web/consulta.js +213 -0
  1280. package/dist/core/web/consulta.js.map +1 -0
  1281. package/dist/core/web/destino.d.ts +11 -0
  1282. package/dist/core/web/destino.d.ts.map +1 -1
  1283. package/dist/core/web/destino.js +35 -0
  1284. package/dist/core/web/destino.js.map +1 -1
  1285. package/dist/core/web/load-page.d.ts +52 -0
  1286. package/dist/core/web/load-page.d.ts.map +1 -0
  1287. package/dist/core/web/load-page.js +221 -0
  1288. package/dist/core/web/load-page.js.map +1 -0
  1289. package/dist/core/web/proveedores/brave.d.ts.map +1 -1
  1290. package/dist/core/web/proveedores/brave.js.map +1 -1
  1291. package/dist/core/web/proveedores/claves.d.ts.map +1 -1
  1292. package/dist/core/web/proveedores/claves.js.map +1 -1
  1293. package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -1
  1294. package/dist/core/web/proveedores/duckduckgo.js.map +1 -1
  1295. package/dist/core/web/proveedores/ecosia.d.ts.map +1 -1
  1296. package/dist/core/web/proveedores/ecosia.js.map +1 -1
  1297. package/dist/core/web/proveedores/exa.d.ts.map +1 -1
  1298. package/dist/core/web/proveedores/exa.js.map +1 -1
  1299. package/dist/core/web/proveedores/mojeek.d.ts.map +1 -1
  1300. package/dist/core/web/proveedores/mojeek.js.map +1 -1
  1301. package/dist/core/web/proveedores/navegador.d.ts.map +1 -1
  1302. package/dist/core/web/proveedores/navegador.js.map +1 -1
  1303. package/dist/core/web/proveedores/registro.d.ts.map +1 -1
  1304. package/dist/core/web/proveedores/registro.js.map +1 -1
  1305. package/dist/core/web/proveedores/searxng.d.ts.map +1 -1
  1306. package/dist/core/web/proveedores/searxng.js.map +1 -1
  1307. package/dist/core/web/proveedores/serper.d.ts.map +1 -1
  1308. package/dist/core/web/proveedores/serper.js.map +1 -1
  1309. package/dist/core/web/proveedores/tavily.d.ts.map +1 -1
  1310. package/dist/core/web/proveedores/tavily.js.map +1 -1
  1311. package/dist/core/web/proveedores/tipos.d.ts.map +1 -1
  1312. package/dist/core/web/proveedores/tipos.js.map +1 -1
  1313. package/dist/core/web/registro-red.d.ts.map +1 -1
  1314. package/dist/core/web/registro-red.js.map +1 -1
  1315. package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -1
  1316. package/dist/core/web/scrapers/cisa-kev.js.map +1 -1
  1317. package/dist/core/web/scrapers/crates-io.d.ts.map +1 -1
  1318. package/dist/core/web/scrapers/crates-io.js.map +1 -1
  1319. package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -1
  1320. package/dist/core/web/scrapers/docs-rs.js.map +1 -1
  1321. package/dist/core/web/scrapers/github.d.ts.map +1 -1
  1322. package/dist/core/web/scrapers/github.js.map +1 -1
  1323. package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -1
  1324. package/dist/core/web/scrapers/go-pkg.js.map +1 -1
  1325. package/dist/core/web/scrapers/hex.d.ts.map +1 -1
  1326. package/dist/core/web/scrapers/hex.js.map +1 -1
  1327. package/dist/core/web/scrapers/maven.d.ts.map +1 -1
  1328. package/dist/core/web/scrapers/maven.js.map +1 -1
  1329. package/dist/core/web/scrapers/mdn.d.ts.map +1 -1
  1330. package/dist/core/web/scrapers/mdn.js.map +1 -1
  1331. package/dist/core/web/scrapers/npm.d.ts.map +1 -1
  1332. package/dist/core/web/scrapers/npm.js.map +1 -1
  1333. package/dist/core/web/scrapers/nuget.d.ts.map +1 -1
  1334. package/dist/core/web/scrapers/nuget.js.map +1 -1
  1335. package/dist/core/web/scrapers/nvd.d.ts.map +1 -1
  1336. package/dist/core/web/scrapers/nvd.js.map +1 -1
  1337. package/dist/core/web/scrapers/pypi.d.ts.map +1 -1
  1338. package/dist/core/web/scrapers/pypi.js.map +1 -1
  1339. package/dist/core/web/scrapers/registro.d.ts.map +1 -1
  1340. package/dist/core/web/scrapers/registro.js.map +1 -1
  1341. package/dist/core/web/scrapers/rubygems.d.ts.map +1 -1
  1342. package/dist/core/web/scrapers/rubygems.js.map +1 -1
  1343. package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -1
  1344. package/dist/core/web/scrapers/stackoverflow.js.map +1 -1
  1345. package/dist/core/web/scrapers/tipos.d.ts.map +1 -1
  1346. package/dist/core/web/scrapers/tipos.js.map +1 -1
  1347. package/dist/core/web/texto.d.ts.map +1 -1
  1348. package/dist/core/web/texto.js.map +1 -1
  1349. package/dist/core/web/tools.d.ts +1 -8
  1350. package/dist/core/web/tools.d.ts.map +1 -1
  1351. package/dist/core/web/tools.js +2 -33
  1352. package/dist/core/web/tools.js.map +1 -1
  1353. package/dist/core/wiki/almacen.d.ts.map +1 -1
  1354. package/dist/core/wiki/almacen.js.map +1 -1
  1355. package/dist/core/wiki/citas.d.ts.map +1 -1
  1356. package/dist/core/wiki/citas.js.map +1 -1
  1357. package/dist/core/workflows/agent-runner.d.ts.map +1 -1
  1358. package/dist/core/workflows/agent-runner.js.map +1 -1
  1359. package/dist/core/workflows/builtins.d.ts.map +1 -1
  1360. package/dist/core/workflows/builtins.js.map +1 -1
  1361. package/dist/core/workflows/contrato/esquema.d.ts.map +1 -1
  1362. package/dist/core/workflows/contrato/esquema.js.map +1 -1
  1363. package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -1
  1364. package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -1
  1365. package/dist/core/workflows/contrato/validador.d.ts.map +1 -1
  1366. package/dist/core/workflows/contrato/validador.js.map +1 -1
  1367. package/dist/core/workflows/contrato/yield.d.ts.map +1 -1
  1368. package/dist/core/workflows/contrato/yield.js.map +1 -1
  1369. package/dist/core/workflows/goal-engine/engine.d.ts +5 -0
  1370. package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -1
  1371. package/dist/core/workflows/goal-engine/engine.js.map +1 -1
  1372. package/dist/core/workflows/goal-engine/errors.d.ts.map +1 -1
  1373. package/dist/core/workflows/goal-engine/errors.js.map +1 -1
  1374. package/dist/core/workflows/goal-engine/index.d.ts.map +1 -1
  1375. package/dist/core/workflows/goal-engine/index.js.map +1 -1
  1376. package/dist/core/workflows/goal-engine/persistence.d.ts.map +1 -1
  1377. package/dist/core/workflows/goal-engine/persistence.js.map +1 -1
  1378. package/dist/core/workflows/goal-engine/prompts.d.ts.map +1 -1
  1379. package/dist/core/workflows/goal-engine/prompts.js.map +1 -1
  1380. package/dist/core/workflows/goal-engine/state.d.ts.map +1 -1
  1381. package/dist/core/workflows/goal-engine/state.js.map +1 -1
  1382. package/dist/core/workflows/goal-engine/tools.d.ts.map +1 -1
  1383. package/dist/core/workflows/goal-engine/tools.js.map +1 -1
  1384. package/dist/core/workflows/goal-engine/types.d.ts.map +1 -1
  1385. package/dist/core/workflows/goal-engine/types.js.map +1 -1
  1386. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts.map +1 -1
  1387. package/dist/core/workflows/goal-engine/worktree-fingerprint.js.map +1 -1
  1388. package/dist/core/workflows/graph-sync.d.ts.map +1 -1
  1389. package/dist/core/workflows/graph-sync.js.map +1 -1
  1390. package/dist/core/workflows/graph.d.ts.map +1 -1
  1391. package/dist/core/workflows/graph.js.map +1 -1
  1392. package/dist/core/workflows/index.d.ts +6 -0
  1393. package/dist/core/workflows/index.d.ts.map +1 -1
  1394. package/dist/core/workflows/index.js +3 -0
  1395. package/dist/core/workflows/index.js.map +1 -1
  1396. package/dist/core/workflows/journal.d.ts.map +1 -1
  1397. package/dist/core/workflows/journal.js.map +1 -1
  1398. package/dist/core/workflows/manager.d.ts.map +1 -1
  1399. package/dist/core/workflows/manager.js.map +1 -1
  1400. package/dist/core/workflows/provider-caps.d.ts +103 -0
  1401. package/dist/core/workflows/provider-caps.d.ts.map +1 -0
  1402. package/dist/core/workflows/provider-caps.js +235 -0
  1403. package/dist/core/workflows/provider-caps.js.map +1 -0
  1404. package/dist/core/workflows/resolve-script.d.ts.map +1 -1
  1405. package/dist/core/workflows/resolve-script.js.map +1 -1
  1406. package/dist/core/workflows/runtime.d.ts.map +1 -1
  1407. package/dist/core/workflows/runtime.js.map +1 -1
  1408. package/dist/core/workflows/save-as-skill.d.ts.map +1 -1
  1409. package/dist/core/workflows/save-as-skill.js.map +1 -1
  1410. package/dist/core/workflows/shared-store.d.ts.map +1 -1
  1411. package/dist/core/workflows/shared-store.js.map +1 -1
  1412. package/dist/core/workflows/soft-budget.d.ts +27 -0
  1413. package/dist/core/workflows/soft-budget.d.ts.map +1 -0
  1414. package/dist/core/workflows/soft-budget.js +47 -0
  1415. package/dist/core/workflows/soft-budget.js.map +1 -0
  1416. package/dist/core/workflows/subagent-host.d.ts.map +1 -1
  1417. package/dist/core/workflows/subagent-host.js.map +1 -1
  1418. package/dist/core/workflows/tool-scheduling.d.ts +47 -0
  1419. package/dist/core/workflows/tool-scheduling.d.ts.map +1 -0
  1420. package/dist/core/workflows/tool-scheduling.js +102 -0
  1421. package/dist/core/workflows/tool-scheduling.js.map +1 -0
  1422. package/dist/core/workflows/tool-workflow.d.ts.map +1 -1
  1423. package/dist/core/workflows/tool-workflow.js.map +1 -1
  1424. package/dist/core/workflows/types.d.ts.map +1 -1
  1425. package/dist/core/workflows/types.js.map +1 -1
  1426. package/dist/core/workflows/worktree.d.ts.map +1 -1
  1427. package/dist/core/workflows/worktree.js.map +1 -1
  1428. package/dist/extensions/index.d.ts.map +1 -1
  1429. package/dist/extensions/index.js.map +1 -1
  1430. package/dist/extensions/llama/client.d.ts.map +1 -1
  1431. package/dist/extensions/llama/client.js.map +1 -1
  1432. package/dist/extensions/llama/huggingface.d.ts.map +1 -1
  1433. package/dist/extensions/llama/huggingface.js.map +1 -1
  1434. package/dist/extensions/llama/index.d.ts.map +1 -1
  1435. package/dist/extensions/llama/index.js.map +1 -1
  1436. package/dist/extensions/llama/provider.d.ts.map +1 -1
  1437. package/dist/extensions/llama/provider.js.map +1 -1
  1438. package/dist/extensions/llama/ui.d.ts.map +1 -1
  1439. package/dist/extensions/llama/ui.js.map +1 -1
  1440. package/dist/extensions/remoto/index.d.ts.map +1 -1
  1441. package/dist/extensions/remoto/index.js.map +1 -1
  1442. package/dist/index.d.ts.map +1 -1
  1443. package/dist/index.js.map +1 -1
  1444. package/dist/main.d.ts.map +1 -1
  1445. package/dist/main.js +71 -3
  1446. package/dist/main.js.map +1 -1
  1447. package/dist/migrations.d.ts.map +1 -1
  1448. package/dist/migrations.js.map +1 -1
  1449. package/dist/modes/acp/acp-mode.d.ts.map +1 -1
  1450. package/dist/modes/acp/acp-mode.js.map +1 -1
  1451. package/dist/modes/acp/events.d.ts.map +1 -1
  1452. package/dist/modes/acp/events.js.map +1 -1
  1453. package/dist/modes/index.d.ts.map +1 -1
  1454. package/dist/modes/index.js.map +1 -1
  1455. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  1456. package/dist/modes/interactive/components/armin.js.map +1 -1
  1457. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  1458. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  1459. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  1460. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  1461. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  1462. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  1463. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  1464. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  1465. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  1466. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  1467. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  1468. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  1469. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  1470. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  1471. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  1472. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  1473. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  1474. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  1475. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  1476. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  1477. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  1478. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  1479. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  1480. package/dist/modes/interactive/components/diff.js.map +1 -1
  1481. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  1482. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  1483. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  1484. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  1485. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  1486. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  1487. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  1488. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  1489. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  1490. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  1491. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  1492. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  1493. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  1494. package/dist/modes/interactive/components/footer.js.map +1 -1
  1495. package/dist/modes/interactive/components/home-screen.d.ts +2 -0
  1496. package/dist/modes/interactive/components/home-screen.d.ts.map +1 -1
  1497. package/dist/modes/interactive/components/home-screen.js +5 -6
  1498. package/dist/modes/interactive/components/home-screen.js.map +1 -1
  1499. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  1500. package/dist/modes/interactive/components/index.js.map +1 -1
  1501. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  1502. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  1503. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  1504. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  1505. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  1506. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  1507. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  1508. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  1509. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  1510. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  1511. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  1512. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  1513. package/dist/modes/interactive/components/prompt-optimization.d.ts.map +1 -1
  1514. package/dist/modes/interactive/components/prompt-optimization.js.map +1 -1
  1515. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  1516. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  1517. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  1518. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  1519. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  1520. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  1521. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1522. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1523. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  1524. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  1525. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  1526. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  1527. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  1528. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  1529. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  1530. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  1531. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  1532. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  1533. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  1534. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  1535. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  1536. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  1537. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  1538. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  1539. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  1540. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  1541. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  1542. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  1543. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  1544. package/dist/modes/interactive/components/user-message.js.map +1 -1
  1545. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  1546. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  1547. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  1548. package/dist/modes/interactive/external-editor.js.map +1 -1
  1549. package/dist/modes/interactive/interactive-mode.d.ts +19 -0
  1550. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1551. package/dist/modes/interactive/interactive-mode.js +29 -0
  1552. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1553. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -1
  1554. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -1
  1555. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  1556. package/dist/modes/interactive/model-search.js.map +1 -1
  1557. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  1558. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  1559. package/dist/modes/interactive/theme/theme.d.ts +2 -2
  1560. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  1561. package/dist/modes/interactive/theme/theme.js.map +1 -1
  1562. package/dist/modes/json-event.d.ts.map +1 -1
  1563. package/dist/modes/json-event.js.map +1 -1
  1564. package/dist/modes/print-mode.d.ts.map +1 -1
  1565. package/dist/modes/print-mode.js.map +1 -1
  1566. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  1567. package/dist/modes/rpc/jsonl.js.map +1 -1
  1568. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  1569. package/dist/modes/rpc/rpc-client.js.map +1 -1
  1570. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  1571. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  1572. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  1573. package/dist/modes/rpc/rpc-types.js.map +1 -1
  1574. package/dist/package-manager-cli.d.ts.map +1 -1
  1575. package/dist/package-manager-cli.js.map +1 -1
  1576. package/dist/rpc-entry.d.ts.map +1 -1
  1577. package/dist/rpc-entry.js +0 -0
  1578. package/dist/rpc-entry.js.map +1 -1
  1579. package/dist/server/attach.d.ts.map +1 -1
  1580. package/dist/server/attach.js.map +1 -1
  1581. package/dist/server/create-harness.d.ts.map +1 -1
  1582. package/dist/server/create-harness.js.map +1 -1
  1583. package/dist/server/extension-ops.d.ts.map +1 -1
  1584. package/dist/server/extension-ops.js.map +1 -1
  1585. package/dist/server/pi-server-service.d.ts.map +1 -1
  1586. package/dist/server/pi-server-service.js.map +1 -1
  1587. package/dist/server/scheduler-tick.d.ts.map +1 -1
  1588. package/dist/server/scheduler-tick.js.map +1 -1
  1589. package/dist/server/serve.d.ts.map +1 -1
  1590. package/dist/server/serve.js.map +1 -1
  1591. package/dist/server/transcript.d.ts.map +1 -1
  1592. package/dist/server/transcript.js.map +1 -1
  1593. package/dist/telegram/api.d.ts +6 -0
  1594. package/dist/telegram/api.d.ts.map +1 -1
  1595. package/dist/telegram/api.js.map +1 -1
  1596. package/dist/telegram/bridge.d.ts.map +1 -1
  1597. package/dist/telegram/bridge.js.map +1 -1
  1598. package/dist/telegram/journal.d.ts.map +1 -1
  1599. package/dist/telegram/journal.js.map +1 -1
  1600. package/dist/telegram/servidor.d.ts.map +1 -1
  1601. package/dist/telegram/servidor.js.map +1 -1
  1602. package/dist/utils/abort.d.ts.map +1 -1
  1603. package/dist/utils/abort.js.map +1 -1
  1604. package/dist/utils/ansi.d.ts.map +1 -1
  1605. package/dist/utils/ansi.js.map +1 -1
  1606. package/dist/utils/changelog.d.ts.map +1 -1
  1607. package/dist/utils/changelog.js.map +1 -1
  1608. package/dist/utils/child-process.d.ts.map +1 -1
  1609. package/dist/utils/child-process.js.map +1 -1
  1610. package/dist/utils/clipboard-image.d.ts.map +1 -1
  1611. package/dist/utils/clipboard-image.js.map +1 -1
  1612. package/dist/utils/clipboard-native.d.ts.map +1 -1
  1613. package/dist/utils/clipboard-native.js.map +1 -1
  1614. package/dist/utils/clipboard.d.ts.map +1 -1
  1615. package/dist/utils/clipboard.js.map +1 -1
  1616. package/dist/utils/deprecation.d.ts.map +1 -1
  1617. package/dist/utils/deprecation.js.map +1 -1
  1618. package/dist/utils/exif-orientation.d.ts.map +1 -1
  1619. package/dist/utils/exif-orientation.js.map +1 -1
  1620. package/dist/utils/frontmatter.d.ts.map +1 -1
  1621. package/dist/utils/frontmatter.js.map +1 -1
  1622. package/dist/utils/fs-watch.d.ts.map +1 -1
  1623. package/dist/utils/fs-watch.js.map +1 -1
  1624. package/dist/utils/git.d.ts.map +1 -1
  1625. package/dist/utils/git.js.map +1 -1
  1626. package/dist/utils/html.d.ts.map +1 -1
  1627. package/dist/utils/html.js.map +1 -1
  1628. package/dist/utils/image-convert.d.ts.map +1 -1
  1629. package/dist/utils/image-convert.js.map +1 -1
  1630. package/dist/utils/image-process.d.ts.map +1 -1
  1631. package/dist/utils/image-process.js.map +1 -1
  1632. package/dist/utils/image-resize-core.d.ts.map +1 -1
  1633. package/dist/utils/image-resize-core.js.map +1 -1
  1634. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  1635. package/dist/utils/image-resize-worker.js.map +1 -1
  1636. package/dist/utils/image-resize.d.ts.map +1 -1
  1637. package/dist/utils/image-resize.js.map +1 -1
  1638. package/dist/utils/json.d.ts.map +1 -1
  1639. package/dist/utils/json.js.map +1 -1
  1640. package/dist/utils/management-http.d.ts.map +1 -1
  1641. package/dist/utils/management-http.js.map +1 -1
  1642. package/dist/utils/mime.d.ts.map +1 -1
  1643. package/dist/utils/mime.js.map +1 -1
  1644. package/dist/utils/open-browser.d.ts.map +1 -1
  1645. package/dist/utils/open-browser.js.map +1 -1
  1646. package/dist/utils/paths.d.ts.map +1 -1
  1647. package/dist/utils/paths.js.map +1 -1
  1648. package/dist/utils/photon.d.ts.map +1 -1
  1649. package/dist/utils/photon.js.map +1 -1
  1650. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  1651. package/dist/utils/pi-user-agent.js.map +1 -1
  1652. package/dist/utils/shell.d.ts.map +1 -1
  1653. package/dist/utils/shell.js.map +1 -1
  1654. package/dist/utils/sleep.d.ts.map +1 -1
  1655. package/dist/utils/sleep.js.map +1 -1
  1656. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  1657. package/dist/utils/syntax-highlight.js.map +1 -1
  1658. package/dist/utils/text.d.ts.map +1 -1
  1659. package/dist/utils/text.js.map +1 -1
  1660. package/dist/utils/tool-result-images.d.ts.map +1 -1
  1661. package/dist/utils/tool-result-images.js.map +1 -1
  1662. package/dist/utils/tools-manager.d.ts.map +1 -1
  1663. package/dist/utils/tools-manager.js.map +1 -1
  1664. package/dist/utils/version-check.d.ts.map +1 -1
  1665. package/dist/utils/version-check.js.map +1 -1
  1666. package/dist/utils/windows-self-update.d.ts.map +1 -1
  1667. package/dist/utils/windows-self-update.js.map +1 -1
  1668. package/docs/development-fork.md +170 -0
  1669. package/docs/docs.json +25 -0
  1670. package/docs/modules-infraestructura.md +115 -0
  1671. package/docs/modules-motor.md +160 -0
  1672. package/docs/modules-producto.md +179 -0
  1673. package/docs/modules-seguridad.md +158 -0
  1674. package/package.json +113 -113
  1675. package/dist/core/commit/diff.d.ts.map +0 -1
  1676. package/dist/core/commit/diff.js.map +0 -1
  1677. package/dist/core/commit/mensaje.d.ts +0 -80
  1678. package/dist/core/commit/mensaje.d.ts.map +0 -1
  1679. package/dist/core/commit/mensaje.js +0 -207
  1680. package/dist/core/commit/mensaje.js.map +0 -1
  1681. /package/dist/core/{commit → commits}/diff.d.ts +0 -0
  1682. /package/dist/core/{commit → commits}/diff.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"exportacion.js","sourceRoot":"","sources":["../../../src/core/audit/exportacion.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * El libro de sesión convertido en un documento que un DPO puede archivar.\n *\n * El libro (`libro.ts`) es JSONL encadenado: perfecto para verificar, ilegible\n * para quien tiene que responder a una inspección. Un delegado de protección de\n * datos hace dos preguntas concretas y ninguna se contesta leyendo hashes:\n *\n * · ¿QUÉ FICHEROS se trataron? (art. 30 RGPD, registro de actividades)\n * · ¿QUÉ SALIÓ DE LA MÁQUINA y hacia dónde? (art. 44 y siguientes)\n *\n * Sale Markdown y no JSON a propósito: el requisito es \"un fichero que se pueda\n * releer sin nuestro CLI\", y un JSONL con hashes no lo cumple aunque\n * técnicamente se pueda abrir. Texto plano, tablas, y las limitaciones escritas\n * dentro del propio documento.\n *\n * Dos cosas que conviene no deshacer:\n *\n * 1. **Minimización.** Aquí no se reconstruye nada que el libro no guarde ya. El\n * libro guarda del fichero su hash antes y después, nunca el texto, así que\n * este informe tampoco puede tenerlo. Y por si acaso se vuelve a pasar\n * `redactSensitive` sobre el documento entero: es el artefacto que SALE de la\n * máquina y se archiva, y una entrada escrita antes de que existiera un patrón\n * de redacción no puede convertirse en una fuga al exportarla.\n * 2. **Tres estados, no dos.** \"No hubo transferencias\" y \"no se pudo\n * determinar\" no son lo mismo, y un informe que saliera vacío en los dos casos\n * haría pasar por limpia una sesión cuya cadena está rota. La ausencia de un\n * registro solo prueba algo si el registro es completo y verificable: si la\n * cadena no verifica, si el libro está vacío o si la lectura se topó con el\n * tope, este informe dice que no lo sabe en vez de afirmar que no pasó nada.\n */\n\nimport { redactSensitive } from \"../memory-engine/security.ts\";\nimport type { EntradaDelLibro, Veredicto } from \"./libro.ts\";\n\n/**\n * ¿Podemos afirmar que algo NO ocurrió?\n *\n * Es el tipo que impide colapsar los tres estados en dos. Solo con\n * `{ sabemos: true }` tiene sentido escribir \"no hubo transferencias\"; en los\n * demás casos el informe dice qué le falta para saberlo.\n */\nexport type Certeza = { sabemos: true } | { sabemos: false; porque: string };\n\nexport function certezaDe(veredicto: Veredicto, truncado: boolean): Certeza {\n\tif (truncado) {\n\t\treturn {\n\t\t\tsabemos: false,\n\t\t\tporque:\n\t\t\t\t\"la lectura del libro alcanzó su tope de entradas, así que hay registros anteriores que este informe no ha mirado.\",\n\t\t};\n\t}\n\tif (!veredicto.valido) {\n\t\treturn {\n\t\t\tsabemos: false,\n\t\t\tporque:\n\t\t\t\t`la cadena de hashes NO verifica${veredicto.alteradaEn ? ` (falla en la entrada del ${fecha(veredicto.alteradaEn)})` : \"\"}. ` +\n\t\t\t\t\"Sobre un libro alterado, la ausencia de un registro no prueba que el hecho no ocurriera: puede haberse borrado.\",\n\t\t};\n\t}\n\tif (veredicto.comprobadas === 0) {\n\t\treturn {\n\t\t\tsabemos: false,\n\t\t\tporque:\n\t\t\t\t\"el libro está vacío. No hay registro de actividad, que no es lo mismo que un registro de que no hubo actividad.\",\n\t\t};\n\t}\n\treturn { sabemos: true };\n}\n\n/** Escapa lo que va dentro de una celda para que no rompa la tabla. */\nfunction celda(valor: unknown): string {\n\tif (valor === null || valor === undefined || valor === \"\") return \"—\";\n\treturn String(valor)\n\t\t.replace(/\\|/g, \"\\\\|\")\n\t\t.replace(/[\\r\\n]+/g, \" \");\n}\n\nfunction tabla(cabeceras: string[], filas: string[][]): string {\n\treturn [\n\t\t`| ${cabeceras.join(\" | \")} |`,\n\t\t`| ${cabeceras.map(() => \"---\").join(\" | \")} |`,\n\t\t...filas.map((f) => `| ${f.map(celda).join(\" | \")} |`),\n\t].join(\"\\n\");\n}\n\n/**\n * Una sección con su tercer estado.\n *\n * `nadaOcurrio` es la frase afirmativa (\"No hubo transferencias\"); solo se\n * imprime cuando la certeza lo permite. Si no, se imprime por qué no se sabe.\n */\nfunction seccion(\n\ttitulo: string,\n\tbase: string,\n\tcabeceras: string[],\n\tfilas: string[][],\n\tnadaOcurrio: string,\n\tcerteza: Certeza,\n\t/**\n\t * Hasta dónde llega la observación de esta sección. Se rinde SIEMPRE.\n\t *\n\t * Antes el alcance viajaba dentro de `nadaOcurrio`, que solo se imprime\n\t * cuando la tabla está vacía. Es decir: la advertencia de «hay caminos que no\n\t * miro» desaparecía justo cuando había datos, y el DPO leía una tabla de\n\t * transferencias con pinta de completa y ninguna salvedad. La salvedad\n\t * importa MÁS con filas que sin ellas: sin filas se está afirmando una\n\t * ausencia, con filas se está insinuando una lista exhaustiva.\n\t */\n\talcance?: string,\n): string {\n\tconst cuerpo =\n\t\tfilas.length > 0\n\t\t\t? tabla(cabeceras, filas)\n\t\t\t: certeza.sabemos\n\t\t\t\t? `**${nadaOcurrio}.** El libro está completo y su cadena verifica, así que esta ausencia es un dato, no un hueco.`\n\t\t\t\t: `**No se pudo determinar.** No se puede afirmar que ${nadaOcurrio.toLowerCase()}: ${certeza.porque}`;\n\treturn `## ${titulo}\\n\\n_${base}_\\n\\n${cuerpo}${alcance ? `\\n\\n> **Alcance de esta sección.** ${alcance}` : \"\"}`;\n}\n\n/** Fecha y hora sin la parte de milisegundos, que a un DPO no le dice nada. */\nfunction fecha(ts: string): string {\n\treturn ts.replace(\"T\", \" \").replace(/\\.\\d+Z$/, \"Z\");\n}\n\ntype Suceso = Record<string, unknown>;\n\nfunction esTipo(e: EntradaDelLibro, tipo: string): boolean {\n\treturn e.suceso.tipo === tipo;\n}\n\n/**\n * Rinde el informe.\n *\n * `entradas` debe venir de más antigua a más reciente (`libro.leer` las da al\n * revés). `truncado` es true si la lectura se topó con su límite, porque\n * entonces no se puede afirmar ninguna ausencia.\n */\nexport function informeParaDpo(\n\tentradas: EntradaDelLibro[],\n\tveredicto: Veredicto,\n\ttruncado: boolean,\n\tahora = new Date().toISOString(),\n): string {\n\tconst certeza = certezaDe(veredicto, truncado);\n\tconst sesiones = [...new Set(entradas.map((e) => e.sesion))];\n\n\tconst integridad = veredicto.valido\n\t\t? `**Cadena de hashes ÍNTEGRA** — ${veredicto.comprobadas} entrada(s) reverificadas de punta a punta.`\n\t\t: `**CADENA ALTERADA** tras ${veredicto.comprobadas} entrada(s) correctas` +\n\t\t\t(veredicto.alteradaEn ? `, en la del ${fecha(veredicto.alteradaEn)}` : \"\") +\n\t\t\t(veredicto.ficheroAlterado ? ` (fichero \\`sesion/${veredicto.ficheroAlterado}\\`)` : \"\") +\n\t\t\t\". Las entradas anteriores a esa siguen siendo fiables; a partir de ahí, no.\";\n\n\tconst partes: string[] = [\n\t\t\"# Registro de actividades de tratamiento — Ada\",\n\t\t[\n\t\t\t`- **Generado:** ${fecha(ahora)}`,\n\t\t\t`- **Entradas del libro:** ${entradas.length}${truncado ? \" (lectura truncada por el tope)\" : \"\"}`,\n\t\t\t`- **Sesiones cubiertas:** ${sesiones.length > 0 ? sesiones.map((s) => `\\`${s}\\``).join(\", \") : \"ninguna\"}`,\n\t\t\t`- **Periodo:** ${entradas.length > 0 ? `${fecha(entradas[0].ts)} → ${fecha(entradas[entradas.length - 1].ts)}` : \"—\"}`,\n\t\t].join(\"\\n\"),\n\t\t`## Prueba de integridad\\n\\n${integridad}`,\n\n\t\tseccion(\n\t\t\t\"1. Ficheros tratados\",\n\t\t\t\"Art. 30 RGPD — registro de actividades de tratamiento. Del fichero consta su HASH antes y después, nunca su contenido.\",\n\t\t\t[\"Fecha\", \"Fichero\", \"Hash antes\", \"Hash después\", \"Vía\", \"Base\"],\n\t\t\tentradas\n\t\t\t\t.filter((e) => esTipo(e, \"fichero\"))\n\t\t\t\t.map((e) => {\n\t\t\t\t\tconst s = e.suceso as Suceso;\n\t\t\t\t\treturn [\n\t\t\t\t\t\tfecha(e.ts),\n\t\t\t\t\t\tString(s.ruta ?? \"\"),\n\t\t\t\t\t\ts.antes === null ? \"(no existía)\" : celda(s.antes),\n\t\t\t\t\t\ts.despues === null ? \"(borrado)\" : celda(s.despues),\n\t\t\t\t\t\tcelda(s.tool),\n\t\t\t\t\t\t\"ejecución solicitada por el usuario en la sesión\",\n\t\t\t\t\t];\n\t\t\t\t}),\n\t\t\t\"No se trató ningún fichero\",\n\t\t\tcerteza,\n\t\t),\n\n\t\tseccion(\n\t\t\t\"2. Transferencias de datos fuera de la máquina\",\n\t\t\t\"Art. 44 y ss. RGPD — destinatarios. Consta el DOMINIO de destino; nunca la ruta ni los parámetros, que es donde viajan los tokens.\",\n\t\t\t[\"Fecha\", \"Destino\", \"Resultado\", \"Motivo\"],\n\t\t\tentradas\n\t\t\t\t.filter((e) => esTipo(e, \"red\"))\n\t\t\t\t.map((e) => {\n\t\t\t\t\tconst s = e.suceso as Suceso;\n\t\t\t\t\treturn [fecha(e.ts), String(s.dominio ?? \"\"), s.permitido ? \"permitida\" : \"BLOQUEADA\", celda(s.motivo)];\n\t\t\t\t}),\n\t\t\t// La frase dice su ALCANCE, y no es un matiz de estilo.\n\t\t\t//\n\t\t\t// El `fetchImpl` vigilado que produce estos sucesos lo reciben el fetch\n\t\t\t// genérico, los scrapers y los proveedores de búsqueda — las tools web.\n\t\t\t// NO lo reciben (comprobado con `grep -c anotarRed`, cero en los tres):\n\t\t\t// el cliente MCP (`core/mcp/client.ts`, que sí acepta `fetchImpl` y hoy\n\t\t\t// no se le pasa), el broker de blobs y la API de Telegram.\n\t\t\t//\n\t\t\t// Un DPO estricto diría que hablar con un MCP remoto ES una\n\t\t\t// transferencia, y tendría razón. Escribir \"No hubo transferencias\" a\n\t\t\t// secas sería afirmar una ausencia que este registro no puede sostener:\n\t\t\t// «no lo he mirado» vendido como «no hay», en el documento donde eso se\n\t\t\t// paga más caro. Mientras la cobertura no sea completa, la frase nombra\n\t\t\t// lo que sí cubre y quien lea el informe puede juzgar el resto.\n\t\t\t// La frase sigue diciendo su ALCANCE, y sigue sin ser un matiz de estilo.\n\t\t\t//\n\t\t\t// Cubierto: el fetch genérico, los scrapers, los proveedores de búsqueda\n\t\t\t// y —desde `core/web/registro-red.ts`— el cliente MCP, que es el que un\n\t\t\t// DPO preguntaría primero porque habla con servidores de terceros.\n\t\t\t//\n\t\t\t// Fuera todavía, MEDIDO recorriendo cada `fetch(` del código y no\n\t\t\t// copiado del comentario anterior —que decía «el broker de ficheros\n\t\t\t// grandes y Telegram» y no era la lista real—:\n\t\t\t//\n\t\t\t// modes/interactive/interactive-mode.ts:1326 aviso a pi.dev\n\t\t\t// extensions/llama/huggingface.ts:76 descarga de modelos\n\t\t\t// extensions/llama/client.ts:171,216 servidor llama\n\t\t\t// core/credenciales/cliente.ts:62,79 broker de credenciales\n\t\t\t// cli/telemetria-command.ts colector OTLP (--enviar)\n\t\t\t//\n\t\t\t// (`computer/motor/{bridge,cdp}.ts` y `utils/management-http.ts` van a\n\t\t\t// 127.0.0.1: no salen de la máquina y no son transferencias.)\n\t\t\t//\n\t\t\t// Mientras queden caminos sin cubrir, la salvedad nombra lo que sí\n\t\t\t// sostiene, y se rinde TAMBIÉN cuando la tabla tiene filas: con datos\n\t\t\t// se está insinuando una lista exhaustiva, que es peor que declarar una\n\t\t\t// ausencia.\n\t\t\t\"No hubo transferencias por los caminos que este registro observa\",\n\t\t\tcerteza,\n\t\t\t\"esta tabla cubre las herramientas web (fetch, scrapers y buscadores) y los servidores \" +\n\t\t\t\t\"MCP. Quedan FUERA, medido recorriendo cada llamada a `fetch` del código: el aviso de \" +\n\t\t\t\t\"instalación a `pi.dev` (activado por defecto; se apaga con `PI_OFFLINE`, `PI_TELEMETRY=0` \" +\n\t\t\t\t\"o `enableInstallTelemetry: false`), las descargas de modelos de Hugging Face, el \" +\n\t\t\t\t\"servidor llama, el broker de credenciales y el envío al colector OTLP de \" +\n\t\t\t\t\"`ada-cli telemetria --enviar` (que manda forma y nunca contenido, pero sale igual de \" +\n\t\t\t\t\"esta máquina). Sobre esos caminos este informe no afirma \" +\n\t\t\t\t\"nada, ni que hubo transferencias ni que no las hubo. Una lista que parece exhaustiva y \" +\n\t\t\t\t\"no lo es engaña más que una ausencia declarada.\",\n\t\t),\n\n\t\tseccion(\n\t\t\t\"3. Modelos invocados (encargados del tratamiento)\",\n\t\t\t\"Art. 28 RGPD — cada llamada a un modelo remoto es un tratamiento por cuenta de un tercero. Consta el proveedor y el volumen, nunca el contenido del prompt.\",\n\t\t\t[\"Fecha\", \"Proveedor\", \"Modelo\", \"Tokens entrada\", \"Tokens salida\", \"Fin\"],\n\t\t\tentradas\n\t\t\t\t.filter((e) => esTipo(e, \"modelo\"))\n\t\t\t\t.map((e) => {\n\t\t\t\t\tconst s = e.suceso as Suceso;\n\t\t\t\t\treturn [\n\t\t\t\t\t\tfecha(e.ts),\n\t\t\t\t\t\tcelda(s.proveedor),\n\t\t\t\t\t\tcelda(s.modelo),\n\t\t\t\t\t\tcelda(s.entrada),\n\t\t\t\t\t\tcelda(s.salida),\n\t\t\t\t\t\tcelda(s.motivoParada),\n\t\t\t\t\t];\n\t\t\t\t}),\n\t\t\t\"No se invocó ningún modelo\",\n\t\t\tcerteza,\n\t\t),\n\n\t\tseccion(\n\t\t\t\"4. Comandos ejecutados\",\n\t\t\t\"Trazabilidad de la actuación automatizada. `origen` distingue lo que decidió el agente de lo que tecleó la persona.\",\n\t\t\t[\"Fecha\", \"Comando\", \"Código\", \"Origen\", \"Encierro\"],\n\t\t\tentradas\n\t\t\t\t.filter((e) => esTipo(e, \"comando\"))\n\t\t\t\t.map((e) => {\n\t\t\t\t\tconst s = e.suceso as Suceso;\n\t\t\t\t\tconst argv = Array.isArray(s.argv) ? s.argv.join(\" \") : \"\";\n\t\t\t\t\treturn [\n\t\t\t\t\t\tfecha(e.ts),\n\t\t\t\t\t\t`\\`${celda(argv.slice(0, 120))}\\``,\n\t\t\t\t\t\tcelda(s.codigo),\n\t\t\t\t\t\ts.origen === \"usuario\" ? \"usuario\" : \"agente\",\n\t\t\t\t\t\tcelda(s.sandbox),\n\t\t\t\t\t];\n\t\t\t\t}),\n\t\t\t\"No se ejecutó ningún comando\",\n\t\t\tcerteza,\n\t\t),\n\n\t\tseccion(\n\t\t\t\"5. Herramientas y decisiones de política\",\n\t\t\t\"Art. 12 AI Act — qué se permitió y con qué base. `Base` es la regla de la política de aprobación que dejó pasar la llamada.\",\n\t\t\t[\"Fecha\", \"Herramienta\", \"Resultado\", \"Decisión\", \"Base\"],\n\t\t\tentradas\n\t\t\t\t.filter((e) => esTipo(e, \"tool\"))\n\t\t\t\t.map((e) => {\n\t\t\t\t\tconst s = e.suceso as Suceso;\n\t\t\t\t\treturn [fecha(e.ts), celda(s.nombre), s.ok ? \"ok\" : \"ERROR\", celda(s.decision), celda(s.motivo)];\n\t\t\t\t}),\n\t\t\t\"No se ejecutó ninguna herramienta\",\n\t\t\tcerteza,\n\t\t),\n\n\t\tseccion(\n\t\t\t\"6. Credenciales utilizadas\",\n\t\t\t\"Quién usó qué cuenta y cuándo. Consta el identificador de la credencial, jamás su valor.\",\n\t\t\t[\"Fecha\", \"Acción\", \"Proveedor\", \"Credencial\", \"Resultado\", \"Cliente\"],\n\t\t\tentradas\n\t\t\t\t.filter((e) => esTipo(e, \"credencial\"))\n\t\t\t\t.map((e) => {\n\t\t\t\t\tconst s = e.suceso as Suceso;\n\t\t\t\t\treturn [\n\t\t\t\t\t\tfecha(e.ts),\n\t\t\t\t\t\tcelda(s.accion),\n\t\t\t\t\t\tcelda(s.proveedor),\n\t\t\t\t\t\ts.credencialId === null ? \"(ninguna activa)\" : celda(s.credencialId),\n\t\t\t\t\t\tcelda(s.resultado),\n\t\t\t\t\t\tcelda(s.cliente),\n\t\t\t\t\t];\n\t\t\t\t}),\n\t\t\t\"No se utilizó ninguna credencial\",\n\t\t\tcerteza,\n\t\t),\n\n\t\t[\n\t\t\t\"## Minimización de datos\",\n\t\t\t\"\",\n\t\t\t\"Este documento contiene la FORMA de lo que ocurrió, no su contenido. En concreto NO incluye:\",\n\t\t\t\"\",\n\t\t\t\"- el contenido de ningún fichero del usuario (solo el hash SHA-256 truncado de antes y después);\",\n\t\t\t\"- el texto de ningún prompt ni respuesta del modelo (solo el recuento de tokens);\",\n\t\t\t\"- ninguna credencial, clave ni token (solo el identificador de la credencial usada);\",\n\t\t\t\"- ninguna ruta ni parámetro de las URL a las que se salió (solo el dominio de destino).\",\n\t\t\t\"\",\n\t\t\t\"Un registro de cumplimiento que copiara los datos tratados sería un segundo almacén de justo\",\n\t\t\t\"aquello que el RGPD manda minimizar.\",\n\t\t].join(\"\\n\"),\n\n\t\t[\n\t\t\t\"## Qué NO prueba este documento\",\n\t\t\t\"\",\n\t\t\t\"- La cadena de hashes prueba **integridad interna** (que el libro no se editó ni reordenó), no **procedencia**:\",\n\t\t\t\" no acredita quién lo generó ni en qué máquina. Para no-repudio hace falta firma con clave gestionada (HSM).\",\n\t\t\t\"- Borrar el fichero de una sesión completa no lo detecta la cadena; sí detecta cualquier modificación dentro de una sesión.\",\n\t\t\t\"- El informe refleja lo que el agente registró. No es una auditoría independiente del código resultante.\",\n\t\t].join(\"\\n\"),\n\t];\n\n\t// Segunda pasada de redacción sobre el documento ya rendido. El libro ya\n\t// redacta al escribir, pero este es el artefacto que SALE de la máquina y se\n\t// archiva: una entrada anotada antes de que existiera un patrón no puede\n\t// convertirse en una fuga al exportarla. Sobre Markdown no hay nada que\n\t// romper, así que lo peor que puede pasar es que redacte de más.\n\treturn redactSensitive(`${partes.join(\"\\n\\n\")}\\n`, \"strict\");\n}\n"]}
1
+ {"version":3,"file":"exportacion.js","sourceRoot":"","sources":["../../../src/core/audit/exportacion.ts"],"names":[],"mappings":"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"}
@@ -295,6 +295,13 @@ export declare class LibroDeSesion {
295
295
  anotar(suceso: SucesoDeSesion): Promise<void>;
296
296
  private escribir;
297
297
  private listar;
298
+ /**
299
+ * Los ficheros del libro vistos desde los DOS directorios.
300
+ *
301
+ * Esta es la comparación que antes no existía: `readdir(sesion/)` solo puede
302
+ * contestar «lo que hay», nunca «lo que debería haber», y por eso un borrado
303
+ * salía como un libro vacío.
304
+ */
298
305
  private inventario;
299
306
  /** Las últimas entradas, de la más reciente hacia atrás. */
300
307
  leer(limite?: number): Promise<EntradaDelLibro[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"libro.d.ts","sourceRoot":"","sources":["../../../src/core/audit/libro.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Libro de sesión — qué HIZO el agente, en una cadena de hashes verificable.\n *\n * `memory-engine/audit.ts` ya tenía el mecanismo: JSONL append-only donde cada\n * entrada lleva el hash de la anterior, de modo que alterar un registro se\n * detecta reverificando la cadena. Lo que no tenía era ALCANCE: solo lo usaba\n * el motor de memoria, así que auditábamos escrituras de memoria y no\n * ejecuciones de tool, llamadas al modelo, ficheros tocados ni comandos.\n *\n * Este módulo aplica el mismo mecanismo a lo que un DPO pregunta de verdad, que\n * es el registro del artículo 12 del AI Act y el 30 del RGPD.\n *\n * Dos decisiones de diseño que conviene no deshacer sin pensarlo:\n *\n * 1. **Minimización por defecto.** El libro guarda la FORMA de lo que pasó, no\n * su contenido: del fichero, su hash antes y después, nunca el texto. Un\n * registro de cumplimiento que copiara los datos sería un segundo almacén de\n * justo aquello que el RGPD quiere minimizar.\n * 2. **Una sola canonicalización.** `memory-engine/audit.ts` construye la carga\n * a hashear dos veces, en `append` y en `verify`, con dos listas de campos\n * escritas a mano. Añadir un campo a una y olvidar la otra rompe la\n * verificación en silencio y solo para las entradas nuevas. Aquí la\n * verificación reconstruye la carga con un rest (`{hash, prevHash, ...resto}`),\n * así que un campo nuevo entra solo y las dos caras no pueden divergir.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { appendFileSync, linkSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { taparAntesDeEscribir } from \"../privacidad/tapar.ts\";\nimport { ficherosPurgados } from \"./retencion.ts\";\nimport { DIR_INDICE, DIR_SESION } from \"./rutas.ts\";\n\n/** Lo que se le puede pedir al libro que anote. */\nexport type SucesoDeSesion =\n\t| { tipo: \"tool\"; nombre: string; ok: boolean; decision?: string; motivo?: string }\n\t| {\n\t\t\ttipo: \"modelo\";\n\t\t\tproveedor: string;\n\t\t\tmodelo: string;\n\t\t\tentrada: number;\n\t\t\tsalida: number;\n\t\t\tcoste?: number;\n\t\t\t/** `stop`, `toolUse`, `error`, `aborted`… Un fallo del modelo también es auditable. */\n\t\t\tmotivoParada?: string;\n\t }\n\t| {\n\t\t\ttipo: \"comando\";\n\t\t\targv: string[];\n\t\t\tcodigo: number;\n\t\t\tsandbox?: \"permitido\" | \"bloqueado\";\n\t\t\tviolaciones?: string[];\n\t\t\t/**\n\t\t\t * Quién escribió el comando: el agente (por defecto, si se omite), el\n\t\t\t * usuario desde la terminal integrada del escritorio, o una extensión\n\t\t\t * a través de `pi.exec`.\n\t\t\t *\n\t\t\t * La terminal ejecuta lo que el usuario teclea SIN pasar por la\n\t\t\t * política de aprobación — es su shell, no la del agente — así que este\n\t\t\t * campo es lo único que evita que un registro de cumplimiento confunda\n\t\t\t * \"lo que decidió el agente\" con \"lo que tecleó la persona\". Omitirlo\n\t\t\t * en vez de dar por defecto \"agente\" habría dejado pasar en silencio\n\t\t\t * una terminal que se le olvida anotarse.\n\t\t\t *\n\t\t\t * `extension` es el tercer estado, y hasta hoy faltaba: `pi.exec` no\n\t\t\t * pasaba por la política NI dejaba rastro, así que una extensión leía\n\t\t\t * el vault y el libro no lo sabía. Atribuirlo al \"agente\" habría sido\n\t\t\t * peor que no anotarlo: quien audite tiene que poder distinguir lo que\n\t\t\t * decidió el modelo de lo que hizo código de terceros cargado en el\n\t\t\t * proceso.\n\t\t\t */\n\t\t\torigen?: \"agente\" | \"usuario\" | \"extension\";\n\t\t\t/** Ruta de la extensión, cuando `origen` es `extension`. Sin ella el aviso no es accionable. */\n\t\t\textension?: string;\n\t }\n\t| {\n\t\t\t/**\n\t\t\t * Una purga por retención, anotada como HECHO en vez de dejada como\n\t\t\t * hueco. Sin esto, cumplir el art. 5.1.e del RGPD hacía que\n\t\t\t * `verificar` acusara de manipulación; y borrar también el índice\n\t\t\t * hacía desaparecer la purga sin rastro. Ver `audit/retencion.ts`.\n\t\t\t */\n\t\t\ttipo: \"purga\";\n\t\t\tfichero: string;\n\t\t\tentradas: number;\n\t\t\tdesde: string;\n\t\t\thasta: string;\n\t\t\thashDeCierre: string;\n\t\t\tpolitica: string;\n\t }\n\t| { tipo: \"fichero\"; ruta: string; antes: string | null; despues: string | null; tool: string }\n\t| { tipo: \"red\"; dominio: string; permitido: boolean; motivo?: string }\n\t| {\n\t\t\t/** El broker de credenciales (core/credenciales/) es lo que oh-my-pi no\n\t\t\t * tiene: un registro de quién usó qué cuenta y cuándo. `accion` distingue\n\t\t\t * PEDIR una credencial de REPORTAR cómo fue usarla. */\n\t\t\ttipo: \"credencial\";\n\t\t\taccion: \"resuelta\" | \"uso\";\n\t\t\tproveedor: string;\n\t\t\t/** `null` en \"resuelta\" = no había ninguna credencial activa (no es que fallara el libro). */\n\t\t\tcredencialId: string | null;\n\t\t\t/** \"ok\" | \"sin-credencial-activa\" | una `ClaseDeError` de errores/proveedor.ts. */\n\t\t\tresultado: string;\n\t\t\tcliente?: string;\n\t };\n\nexport interface EntradaDelLibro {\n\tseq: number;\n\tts: string;\n\tsesion: string;\n\tsuceso: Record<string, unknown>;\n\thash: string;\n\tprevHash: string | null;\n}\n\nexport interface Veredicto {\n\tvalido: boolean;\n\tcomprobadas: number;\n\t/** Sello de tiempo de la primera entrada que no cuadra. */\n\talteradaEn?: string;\n\t/**\n\t * Fichero donde está esa entrada.\n\t *\n\t * Sin esto el veredicto decía «alterada en la del 03:09:55» sobre un\n\t * directorio con 26 ficheros de sesión: cierto, verificable y no accionable.\n\t * Quien recibe un aviso de manipulación necesita saber DÓNDE mirar, o el\n\t * aviso se queda en susto.\n\t */\n\tficheroAlterado?: string;\n\t/**\n\t * Por qué no verifica, en una frase estable.\n\t *\n\t * Existe para no confundir «lo he mirado y no cuadra» con «no lo he podido\n\t * mirar»: un fichero ilegible y un hash que no coincide daban el mismo\n\t * veredicto y el mismo mensaje, y son dos cosas distintas para quien\n\t * responde a una auditoría.\n\t */\n\tmotivo?: string;\n\t/**\n\t * Lo que FALTA: ficheros que el índice recuerda y que ya no están en\n\t * `sesion/`, con cuántas entradas tenía cada uno.\n\t *\n\t * Es el tercer estado, y es el que faltaba. Antes de esto la cadena\n\t * distinguía «íntegra» de «alterada» y nada más, así que borrar el fichero\n\t * entero —lo que haría un agente tapando sus pasos— salía como\n\t * `{valido: true, comprobadas: 0}`: un fallo que se lee como éxito en la\n\t * pieza que se vende como prueba. Medido ejecutando el CLI: con tres\n\t * comandos anotados decía «cadena íntegra: 3 entradas», y tras un `rm`\n\t * decía «el libro está vacío» y salía con código 0.\n\t */\n\tfaltan?: { fichero: string; entradas: number }[];\n\t/**\n\t * Ficheros que ya no están y cuya ausencia el libro EXPLICA con una lápida\n\t * de purga. No cuentan como manipulación: son el art. 5.1.e cumplido.\n\t */\n\tpurgados?: { fichero: string; entradas: number; politica: string }[];\n\t/**\n\t * Sitios donde la cadena vuelve a empezar dentro de un mismo fichero.\n\t *\n\t * Ni íntegro ni alterado: el TERCER estado. Un reinicio del proceso lo\n\t * produce, y quien quite entradas del medio y escriba una cadena nueva\n\t * produce exactamente lo mismo. Desde el fichero no se distinguen, así que se\n\t * dice dónde está y se deja que lo juzgue quien audita, en vez de acusar o de\n\t * absolver por nuestra cuenta.\n\t */\n\treinicios?: { fichero: string; ts: string; entradasAntes: number }[];\n\t/**\n\t * Ficheros presentes en `sesion/` sin ancla en el índice.\n\t *\n\t * NO cuenta como manipulación y por eso va aparte de `faltan`: son los\n\t * libros escritos antes de que el índice existiera, y también lo que queda\n\t * en un sistema de ficheros sin enlaces duros. Meterlo en `valido: false`\n\t * habría hecho que toda instalación ya existente gritara «manipulado» el\n\t * día de la actualización — un detector que grita siempre no vale, y\n\t * además volvería indistinguible la manipulación real.\n\t */\n\tsinAncla?: string[];\n}\n\n/** Un fichero del libro, mirado desde los dos directorios a la vez. */\ninterface FicheroDelLibro {\n\tnombre: string;\n\t/** De dónde se leen las entradas: la copia que exista. */\n\truta: string;\n\t/** Está en el índice y ya NO en `sesion/`: alguien lo borró. */\n\tfalta: boolean;\n\t/** Está en `sesion/` y no en el índice: libro antiguo o FS sin enlaces duros. */\n\tsinAncla: boolean;\n\t/** Están los dos nombres pero NO son el mismo fichero: sustitución. */\n\tsuplantado: boolean;\n}\n\n/** Hash de un contenido de fichero. `null` = el fichero no existía. */\nfunction hashContenido(texto: string | null): string | null {\n\treturn texto === null ? null : createHash(\"sha256\").update(texto).digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Redacta cada hoja de texto por separado.\n *\n * Se hace hoja a hoja y no sobre el JSON ya serializado a propósito: un patrón\n * que se pasara de largo sobre el texto serializado podría comerse una comilla\n * y dejar el registro sin parsear. Sobre la hoja, lo peor que puede pasar es\n * que redacte de más.\n */\nfunction redactarHoja(valor: unknown): unknown {\n\tif (typeof valor === \"string\") return taparAntesDeEscribir(valor, \"strict\");\n\tif (Array.isArray(valor)) return valor.map(redactarHoja);\n\tif (valor && typeof valor === \"object\") {\n\t\treturn Object.fromEntries(Object.entries(valor).map(([k, v]) => [k, redactarHoja(v)]));\n\t}\n\treturn valor;\n}\n\n/** Pasa del suceso que da quien llama al registro que se guarda. */\nfunction aRegistro(suceso: SucesoDeSesion): Record<string, unknown> {\n\tconst base =\n\t\tsuceso.tipo === \"fichero\"\n\t\t\t? { ...suceso, antes: hashContenido(suceso.antes), despues: hashContenido(suceso.despues) }\n\t\t\t: suceso;\n\treturn redactarHoja(base) as Record<string, unknown>;\n}\n\nfunction hashDe(prevHash: string | null, carga: Omit<EntradaDelLibro, \"hash\" | \"prevHash\">): string {\n\treturn createHash(\"sha256\")\n\t\t.update(JSON.stringify({ prevHash, ...carga }))\n\t\t.digest(\"hex\");\n}\n\nexport class LibroDeSesion {\n\tprivate readonly dir: string;\n\t/** El índice: un enlace duro por fichero de sesión. Ver `DIR_INDICE`. */\n\tprivate readonly dirIndice: string;\n\tprivate readonly sesion: string;\n\tprivate seq = 0;\n\tprivate ultimoHash: string | null = null;\n\t/** Fijado en la primera escritura por `reservarFichero`; no cambia despues. */\n\tprivate rutaFichero: string | null = null;\n\n\tconstructor(raiz: string, sesionId: string) {\n\t\tthis.dir = join(raiz, DIR_SESION);\n\t\tthis.dirIndice = join(raiz, DIR_INDICE);\n\t\tthis.sesion = sesionId;\n\t}\n\n\t/**\n\t * Un fichero por sesión, no uno por día.\n\t *\n\t * Compartir fichero entre sesiones parecía más ordenado y hacía el libro\n\t * INVERIFICABLE, cosa que solo se vio ejecutando: cada proceso arranca su\n\t * `seq` en 1 y su hash anterior en `null`, así que tres sesiones seguidas\n\t * dejaban tres cadenas encadenadas dentro del mismo fichero y `verificar`\n\t * fallaba en la primera entrada de la segunda.\n\t *\n\t * Arreglarlo cargando el último hash al abrir no habría bastado: el CLI y el\n\t * escritorio corren a la vez, y dos procesos que leyeran el mismo hash\n\t * anterior escribirían dos entradas con el mismo `prevHash`.\n\t *\n\t * El límite que esto dejaba, y que era el agujero: borrar el fichero de una\n\t * sesión entera no lo detecta la cadena, que solo ve la modificación DENTRO\n\t * de una sesión. Se documentaba aquí mientras el veredicto seguía diciendo\n\t * `valido: true` — o sea, un fallo que se leía como éxito en la pieza que se\n\t * vende como prueba. Lo cierra el índice de `reservarFichero`.\n\t *\n\t * «Un fichero, un escritor» es la PRECONDICIÓN de todo lo anterior, y por eso\n\t * `reservarFichero` la impone en vez de confiar en ella. Se rompía por dos\n\t * caminos distintos, los dos encontrados sobre el libro real de esta máquina:\n\t *\n\t * 1. Dos escritores en un fichero. El escritorio usa el id fijo `desktop`,\n\t * así que cada encarnación del proceso —cada recompilación de Next—\n\t * abría el MISMO fichero creyéndose la primera y escribía otra entrada\n\t * con `seq 1` y `prevHash null`. Encontrado en\n\t * `sesion-2026-08-24-desktop.jsonl`: dos entradas, las dos `seq 1`.\n\t * 2. Un escritor que cruza la medianoche. El nombre salía de la fecha de\n\t * CADA entrada, así que a las 00:00 la sesión saltaba a un fichero nuevo\n\t * cuya primera entrada llevaba el `prevHash` del fichero anterior —\n\t * mientras `verificar` arranca cada fichero esperando `null`.\n\t *\n\t * Los dos daban `CADENA ALTERADA` sobre un libro que nadie había tocado. Y el\n\t * daño no es el ruido: es que una alteración de verdad queda indistinguible\n\t * del caso benigno, y un medidor que grita siempre deja de leerse.\n\t */\n\tprivate nombreBase(fecha: string): string {\n\t\tconst id = this.sesion.replace(/[^a-zA-Z0-9-]/g, \"_\").slice(0, 40);\n\t\treturn `sesion-${fecha}-${id}.jsonl`;\n\t}\n\n\t/**\n\t * Reserva el fichero de ESTA instancia, una sola vez, y no lo suelta.\n\t *\n\t * Fijarlo en la primera escritura mata el caso 2 de golpe: la sesión se queda\n\t * en su fichero aunque cambie el día.\n\t *\n\t * Para el caso 1 se reclama el nombre con `wx` —crear-o-fallar—, que es\n\t * atómico en el sistema de ficheros. Quien lo gana lo tiene; quien lo pierde\n\t * prueba el siguiente. Así el «un escritor por fichero» deja de ser un\n\t * acuerdo entre quienes llaman y pasa a ser cierto por construcción, incluso\n\t * entre procesos distintos que no se conocen.\n\t *\n\t * Se prefiere partir en dos ficheros antes que leer la cola del ajeno y\n\t * continuarlo: dos procesos que leyeran el mismo último hash escribirían dos\n\t * entradas con el mismo `prevHash`, que es otra vez una cadena rota sin nadie\n\t * manipulando nada. Dos ficheros íntegros son mejor que uno dudoso, y\n\t * `verificar` ya los trata por separado.\n\t *\n\t * EL ANCLA. El nombre se reclama en el ÍNDICE y el fichero de `sesion/` es un\n\t * ENLACE DURO al del índice, no una copia. Tres propiedades que hacen falta\n\t * las tres:\n\t *\n\t * 1. `rm -rf sesion/` —el movimiento del agente que quiere tapar sus\n\t * pasos— borra un NOMBRE, no el fichero: los bytes siguen ahí bajo el\n\t * otro nombre, así que `verificar` no solo detecta la desaparición sino\n\t * que puede seguir leyendo lo que se quiso esconder.\n\t * 2. El ancla no puede desincronizarse del libro, porque no es un\n\t * resumen que haya que mantener al día: es el mismo inodo. Un índice\n\t * con su propio contador tendría que escribirse en cada anotación, y\n\t * dos procesos escribiendo el mismo índice es la carrera que ya nos\n\t * dejó el libro inverificable una vez.\n\t * 3. El nombre se reclama en el índice y no en `sesion/`, así que un\n\t * nombre gastado no se puede reutilizar aunque su fichero de sesión\n\t * haya desaparecido. Sin esto, borrar y reescribir con una entrada\n\t * dejaba el libro con el mismo aspecto que uno legítimo de una entrada.\n\t *\n\t * Hasta dónde llega, dicho sin adornos: quien borre los DOS directorios deja\n\t * un libro vacío indistinguible de una instalación nueva. Contra eso está la\n\t * otra mitad del trabajo —la política, que deniega la carpeta al agente\n\t * incluso en `yolo`— y no un tercer ancla, porque un ancla que viva en el\n\t * mismo disco y con los mismos permisos siempre se puede borrar igual. Lo que\n\t * esto elimina es que un solo `rm` pase desapercibido.\n\t */\n\t/**\n\t * El fichero que esta sesión está escribiendo, o `null` si aún no ha escrito.\n\t *\n\t * La purga lo necesita para no llevarse el suelo de un libro vivo, y tiene que\n\t * saberlo por IDENTIDAD, no por fecha: fiarlo a «su última entrada es de hoy»\n\t * deja el caso raro —un reloj movido, una sesión larga— rompiendo la cadena en\n\t * memoria sin avisar.\n\t */\n\tget ficheroEnCurso(): string | null {\n\t\treturn this.rutaFichero ? basename(this.rutaFichero) : null;\n\t}\n\n\tprivate reservarFichero(fecha: string): string {\n\t\tif (this.rutaFichero) return this.rutaFichero;\n\t\tmkdirSync(this.dirIndice, { recursive: true });\n\t\tconst base = this.nombreBase(fecha);\n\t\tfor (let n = 1; ; n++) {\n\t\t\tconst nombre = n === 1 ? base : base.replace(/\\.jsonl$/, `-${n}.jsonl`);\n\t\t\tconst ancla = join(this.dirIndice, nombre);\n\t\t\ttry {\n\t\t\t\twriteFileSync(ancla, \"\", { flag: \"wx\" });\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n\t\t\t\tcontinue; // nombre gastado (otro escritor, u otra ejecución): el siguiente\n\t\t\t}\n\t\t\tconst ruta = join(this.dir, nombre);\n\t\t\ttry {\n\t\t\t\tlinkSync(ancla, ruta);\n\t\t\t} catch (error) {\n\t\t\t\t// El nombre estaba libre en el índice pero ocupado en `sesion/`: es un\n\t\t\t\t// libro escrito ANTES de que el índice existiera. Se suelta el ancla\n\t\t\t\t// vacía y se prueba el siguiente nombre. Soltarla no es cosmético:\n\t\t\t\t// dejar un ancla de 0 bytes junto a un fichero de sesión con\n\t\t\t\t// contenido son dos inodos con el mismo nombre, y `verificar` lo\n\t\t\t\t// leería como suplantación en toda instalación que se actualice.\n\t\t\t\trmSync(ancla, { force: true });\n\t\t\t\tif ((error as NodeJS.ErrnoException).code === \"EEXIST\") continue;\n\t\t\t\t// Sin enlaces duros (FS exótico, montaje raro) el libro sigue\n\t\t\t\t// funcionando SIN ancla, porque un libro que no se escribe es peor\n\t\t\t\t// que uno sin ancla; `verificar` lo dirá como `sinAncla`, que es un\n\t\t\t\t// tercer estado y no una acusación.\n\t\t\t\twriteFileSync(ruta, \"\", { flag: \"wx\" });\n\t\t\t}\n\t\t\tthis.rutaFichero = ruta;\n\t\t\treturn ruta;\n\t\t}\n\t}\n\n\t/**\n\t * Anota un suceso. Nunca lanza: un fallo del libro no puede tumbar la\n\t * conversación, igual que en el audit del motor de memoria.\n\t */\n\tanotar(suceso: SucesoDeSesion): Promise<void> {\n\t\t// SÍNCRONO, y no es una simplificación perezosa: es lo correcto aquí.\n\t\t//\n\t\t// Antes esto encolaba una escritura asíncrona y devolvía la promesa, y casi\n\t\t// todos los llamantes hacen `void libro.anotar(...)` — no la esperan, porque\n\t\t// un fallo del libro no puede tumbar la conversación. Eso deja dos agujeros:\n\t\t//\n\t\t// 1. Las últimas entradas se pierden si el proceso termina antes de que\n\t\t// la cola se vacíe. En un registro de cumplimiento, perder justo lo\n\t\t// último que hizo el agente es perder lo que más se va a mirar.\n\t\t// 2. Escrituras que aterrizan DESPUÉS de que la sesión se haya cerrado.\n\t\t// Salió en una prueba de regresión de upstream: al borrar su\n\t\t// directorio temporal, el libro seguía creando ficheros dentro y\n\t\t// `rmSync` fallaba con ENOTEMPTY. La prueba pasaba en HEAD~1 y falló\n\t\t// al fusionar el índice — el ancla ensanchó una carrera que ya existía.\n\t\t//\n\t\t// El coste está MEDIDO, y sale a favor: 40 µs por entrada en síncrono\n\t\t// frente a 56 µs en asíncrono (1.000 escrituras de 268 bytes). Es más\n\t\t// rápido porque para una escritura tan pequeña la promesa pesa más que el\n\t\t// `write`. Y 40 µs contra una llamada a herramienta que tarda milisegundos\n\t\t// o segundos no se nota.\n\t\t//\n\t\t// Además desaparece la cola entera: JavaScript es de un solo hilo, así que\n\t\t// dos `anotar` seguidos ya no pueden leer el mismo `ultimoHash`. La carrera\n\t\t// que la cola existía para evitar deja de ser posible por construcción, que\n\t\t// es mejor que evitarla con disciplina.\n\t\t//\n\t\t// Se mantiene la firma `Promise<void>` para no tocar a los llamantes.\n\t\tthis.escribir(suceso);\n\t\treturn Promise.resolve();\n\t}\n\n\tprivate escribir(suceso: SucesoDeSesion): void {\n\t\ttry {\n\t\t\tmkdirSync(this.dir, { recursive: true });\n\t\t\tconst carga = {\n\t\t\t\tseq: ++this.seq,\n\t\t\t\tts: new Date().toISOString(),\n\t\t\t\tsesion: this.sesion,\n\t\t\t\tsuceso: aRegistro(suceso),\n\t\t\t};\n\t\t\tconst hash = hashDe(this.ultimoHash, carga);\n\t\t\tconst entrada: EntradaDelLibro = { ...carga, hash, prevHash: this.ultimoHash };\n\t\t\tthis.ultimoHash = hash;\n\t\t\tconst ruta = this.reservarFichero(carga.ts.slice(0, 10));\n\t\t\tappendFileSync(ruta, `${JSON.stringify(entrada)}\\n`, \"utf-8\");\n\t\t} catch {\n\t\t\t// El libro nunca rompe la sesión.\n\t\t}\n\t}\n\n\tprivate async listar(dir: string): Promise<string[]> {\n\t\ttry {\n\t\t\treturn (await readdir(dir)).filter((f) => /^sesion-.*\\.jsonl$/.test(f)).sort();\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Los ficheros del libro vistos desde los DOS directorios.\n\t *\n\t * Esta es la comparación que antes no existía: `readdir(sesion/)` solo puede\n\t * contestar «lo que hay», nunca «lo que debería haber», y por eso un borrado\n\t * salía como un libro vacío.\n\t */\n\tprivate async inventario(): Promise<FicheroDelLibro[]> {\n\t\tconst enSesion = new Set(await this.listar(this.dir));\n\t\tconst enIndice = new Set(await this.listar(this.dirIndice));\n\t\tconst out: FicheroDelLibro[] = [];\n\t\tfor (const nombre of [...new Set([...enSesion, ...enIndice])].sort()) {\n\t\t\tconst s = enSesion.has(nombre);\n\t\t\tconst i = enIndice.has(nombre);\n\t\t\t// Con los dos nombres presentes tienen que ser el MISMO inodo, porque\n\t\t\t// así los creó `reservarFichero`. Si no lo son, alguien borró el de\n\t\t\t// `sesion/` y puso otro en su sitio — y como el algoritmo de la cadena\n\t\t\t// es público, ese otro puede tener una cadena interna perfecta. Sin\n\t\t\t// esta comprobación la suplantación se leería como «cadena íntegra».\n\t\t\tlet suplantado = false;\n\t\t\tif (s && i) {\n\t\t\t\ttry {\n\t\t\t\t\tconst [a, b] = await Promise.all([stat(join(this.dir, nombre)), stat(join(this.dirIndice, nombre))]);\n\t\t\t\t\tsuplantado = a.ino !== b.ino;\n\t\t\t\t} catch {\n\t\t\t\t\t// No se pudo mirar: no se acusa. «No lo he podido comprobar» no es\n\t\t\t\t\t// «está manipulado», y el fichero se verifica igual más abajo.\n\t\t\t\t}\n\t\t\t}\n\t\t\tout.push({\n\t\t\t\tnombre,\n\t\t\t\t// Se lee del índice cuando el de `sesion/` no está (es el caso del\n\t\t\t\t// borrado) o cuando no coincide con él: el índice es el ancla.\n\t\t\t\truta: s && !suplantado ? join(this.dir, nombre) : join(this.dirIndice, nombre),\n\t\t\t\tfalta: i && !s,\n\t\t\t\tsinAncla: s && !i,\n\t\t\t\tsuplantado,\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Las últimas entradas, de la más reciente hacia atrás. */\n\tasync leer(limite = 50): Promise<EntradaDelLibro[]> {\n\t\tconst out: EntradaDelLibro[] = [];\n\t\tfor (const f of (await this.inventario()).reverse()) {\n\t\t\tlet crudo: string;\n\t\t\ttry {\n\t\t\t\t// Por `f.ruta` y no por `sesion/`: las entradas de un fichero borrado\n\t\t\t\t// sobreviven en el índice y quien investiga tiene que poder verlas.\n\t\t\t\tcrudo = await readFile(f.ruta, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const linea of crudo.split(\"\\n\").filter(Boolean).reverse()) {\n\t\t\t\ttry {\n\t\t\t\t\tout.push(JSON.parse(linea) as EntradaDelLibro);\n\t\t\t\t\tif (out.length >= limite) return out;\n\t\t\t\t} catch {\n\t\t\t\t\t// Línea ilegible: la verificación es quien lo denuncia, no la lectura.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\t/**\n\t * Reverifica la cadena entera y contesta TRES estados, no dos.\n\t *\n\t * «Íntegra», «alterada» y «FALTA algo que debería estar». El tercero es el\n\t * que faltaba: la cadena de hashes detecta la modificación DENTRO de un\n\t * fichero y no puede, por construcción, notar la desaparición del fichero —\n\t * para eso hace falta saber qué debería haber, que es lo que aporta el índice\n\t * (ver `reservarFichero`).\n\t *\n\t * De la cadena rota devuelve en la PRIMERA entrada que no cuadra, y\n\t * `comprobadas` cuenta las que sí cuadraban antes de ella — así el número\n\t * dice dónde empieza la manipulación, no cuántas hay en total. Lo que ya se\n\t * hubiera detectado como ausente viaja con esa respuesta: no se pierde por\n\t * salir antes.\n\t */\n\tasync verificar(): Promise<Veredicto> {\n\t\tlet comprobadas = 0;\n\t\tconst faltan: { fichero: string; entradas: number }[] = [];\n\t\tconst reinicios: { fichero: string; ts: string; entradasAntes: number }[] = [];\n\t\tconst sinAncla: string[] = [];\n\t\t// Las lápidas se leen ANTES de recorrer: una purga anotada en el fichero de\n\t\t// hoy explica un hueco de un fichero de hace un año.\n\t\tconst purgados = ficherosPurgados(await this.leer());\n\t\tfor (const f of await this.inventario()) {\n\t\t\tif (f.suplantado) {\n\t\t\t\treturn {\n\t\t\t\t\tvalido: false,\n\t\t\t\t\tcomprobadas,\n\t\t\t\t\tficheroAlterado: f.nombre,\n\t\t\t\t\tmotivo: \"el fichero de sesión ya no es el mismo que el del índice: lo han sustituido\",\n\t\t\t\t\t...(faltan.length ? { faltan } : {}),\n\t\t\t\t\t...(sinAncla.length ? { sinAncla } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t\t// La cadena empieza de cero en CADA fichero, porque cada fichero es una\n\t\t\t// sesión y su primera entrada lleva `prevHash: null`. Arrastrar el hash\n\t\t\t// de un fichero al siguiente es lo que hacía fallar la verificación en\n\t\t\t// cuanto había más de una sesión.\n\t\t\tlet prevHash: string | null = null;\n\t\t\tlet enEste = 0;\n\t\t\tlet crudo: string;\n\t\t\ttry {\n\t\t\t\tcrudo = await readFile(f.ruta, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tvalido: false,\n\t\t\t\t\tcomprobadas,\n\t\t\t\t\tficheroAlterado: f.nombre,\n\t\t\t\t\tmotivo: \"no se ha podido leer el fichero: no es «está bien», es «no lo sé»\",\n\t\t\t\t\t...(faltan.length ? { faltan } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t\tfor (const linea of crudo.split(\"\\n\").filter(Boolean)) {\n\t\t\t\tlet entrada: EntradaDelLibro;\n\t\t\t\ttry {\n\t\t\t\t\tentrada = JSON.parse(linea) as EntradaDelLibro;\n\t\t\t\t} catch {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalido: false,\n\t\t\t\t\t\tcomprobadas,\n\t\t\t\t\t\tficheroAlterado: f.nombre,\n\t\t\t\t\t\tmotivo: \"hay una línea que no es JSON válido\",\n\t\t\t\t\t\t...(faltan.length ? { faltan } : {}),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// El rest es lo que impide que esta lista y la de `escribir`\n\t\t\t\t// se separen: aquí no hay lista.\n\t\t\t\tconst { hash, prevHash: declarado, ...resto } = entrada;\n\t\t\t\t// Se separan DOS preguntas que antes iban juntas y contestaban lo\n\t\t\t\t// mismo, acusando siempre de lo primero:\n\t\t\t\t//\n\t\t\t\t// · ¿el hash cuadra con SU PROPIO contenido? Si no, alguien editó la\n\t\t\t\t// entrada. Eso es manipulación y se dice así.\n\t\t\t\t// · ¿su `prevHash` apunta a la entrada anterior? Si no, el enlace\n\t\t\t\t// está roto, que es otra cosa: faltan entradas o están cambiadas\n\t\t\t\t// de orden.\n\t\t\t\t//\n\t\t\t\t// Medido sobre el libro real de esta máquina: un fichero de dos\n\t\t\t\t// entradas, las dos con `seq: 1` y `prevHash: null`, salía como «el\n\t\t\t\t// hash de una entrada no cuadra con su contenido». Cuadraba\n\t\t\t\t// perfectamente. Eran dos procesos del escritorio escribiendo el mismo\n\t\t\t\t// fichero antes de que `reservarFichero` diera nombres distintos.\n\t\t\t\tif (hash !== hashDe(declarado, resto)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalido: false,\n\t\t\t\t\t\tcomprobadas,\n\t\t\t\t\t\talteradaEn: entrada.ts,\n\t\t\t\t\t\tficheroAlterado: f.nombre,\n\t\t\t\t\t\tmotivo: \"el hash de una entrada no cuadra con su contenido: la han editado\",\n\t\t\t\t\t\t...(faltan.length ? { faltan } : {}),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (declarado !== prevHash) {\n\t\t\t\t\t// Una cadena que vuelve a empezar dentro del mismo fichero. Lo\n\t\t\t\t\t// produce un reinicio del proceso —y lo produce igual quien quite\n\t\t\t\t\t// entradas del medio y escriba una cadena nueva—. Desde el fichero\n\t\t\t\t\t// no se distinguen, así que NO se llama manipulación ni se da por\n\t\t\t\t\t// bueno: es el tercer estado, y se dice entero en `reinicios`.\n\t\t\t\t\tif (declarado === null && prevHash !== null) {\n\t\t\t\t\t\treinicios.push({ fichero: f.nombre, ts: entrada.ts, entradasAntes: enEste });\n\t\t\t\t\t\tprevHash = hash;\n\t\t\t\t\t\tcomprobadas++;\n\t\t\t\t\t\tenEste++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalido: false,\n\t\t\t\t\t\tcomprobadas,\n\t\t\t\t\t\talteradaEn: entrada.ts,\n\t\t\t\t\t\tficheroAlterado: f.nombre,\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\t...(faltan.length ? { faltan } : {}),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tprevHash = hash;\n\t\t\t\tcomprobadas++;\n\t\t\t\tenEste++;\n\t\t\t}\n\t\t\t// Un fichero VACÍO que falta no es una ausencia: es una reserva de\n\t\t\t// nombre que nunca llegó a escribirse (la sesión murió entre reservar y\n\t\t\t// anotar). Contarlo habría hecho que una sesión nueva y legítima, sin\n\t\t\t// una sola entrada todavía, se reportara como manipulada — la mitad que\n\t\t\t// decide, porque un detector que grita siempre no distingue nada.\n\t\t\tif (enEste === 0) continue;\n\t\t\t// Un hueco EXPLICADO no es una manipulación.\n\t\t\t//\n\t\t\t// Si el propio libro lleva una lápida diciendo que ese fichero se purgó\n\t\t\t// —cuándo, cuántas entradas, bajo qué política y con qué hash de\n\t\t\t// cierre—, la ausencia es un hecho declarado y no una desaparición. Sin\n\t\t\t// esto, cumplir el art. 5.1.e del RGPD hacía que `verificar` contestara\n\t\t\t// «alguien los ha borrado»: la ley nos acusaba de manipular. Ver\n\t\t\t// `audit/retencion.ts`.\n\t\t\tif (f.falta && !purgados.has(f.nombre)) faltan.push({ fichero: f.nombre, entradas: enEste });\n\t\t\tif (f.sinAncla) sinAncla.push(f.nombre);\n\t\t}\n\t\t// Las lápidas se enseñan TODAS, no solo las que tapan un hueco del\n\t\t// inventario. Una purga completa se lleva el fichero Y su ancla, así que no\n\t\t// deja hueco ninguno: si solo se informara de las que explican una ausencia,\n\t\t// el caso normal —el que de verdad ocurre— saldría mudo y el DPO leería\n\t\t// «cadena íntegra, 1 entrada» sin enterarse de que se purgaron tres. Que es\n\t\t// exactamente el «desaparece sin rastro» que este mecanismo existe para\n\t\t// impedir.\n\t\tconst explicados = [...purgados.values()].map((l) => ({\n\t\t\tfichero: l.fichero,\n\t\t\tentradas: l.entradas,\n\t\t\tpolitica: l.politica,\n\t\t}));\n\t\treturn {\n\t\t\tvalido: faltan.length === 0,\n\t\t\t...(explicados.length ? { purgados: explicados } : {}),\n\t\t\t...(reinicios.length ? { reinicios } : {}),\n\t\t\tcomprobadas,\n\t\t\t...(faltan.length ? { faltan } : {}),\n\t\t\t...(sinAncla.length ? { sinAncla } : {}),\n\t\t};\n\t}\n}\n"]}
1
+ {"version":3,"file":"libro.d.ts","sourceRoot":"","sources":["../../../src/core/audit/libro.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"libro.js","sourceRoot":"","sources":["../../../src/core/audit/libro.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Libro de sesión — qué HIZO el agente, en una cadena de hashes verificable.\n *\n * `memory-engine/audit.ts` ya tenía el mecanismo: JSONL append-only donde cada\n * entrada lleva el hash de la anterior, de modo que alterar un registro se\n * detecta reverificando la cadena. Lo que no tenía era ALCANCE: solo lo usaba\n * el motor de memoria, así que auditábamos escrituras de memoria y no\n * ejecuciones de tool, llamadas al modelo, ficheros tocados ni comandos.\n *\n * Este módulo aplica el mismo mecanismo a lo que un DPO pregunta de verdad, que\n * es el registro del artículo 12 del AI Act y el 30 del RGPD.\n *\n * Dos decisiones de diseño que conviene no deshacer sin pensarlo:\n *\n * 1. **Minimización por defecto.** El libro guarda la FORMA de lo que pasó, no\n * su contenido: del fichero, su hash antes y después, nunca el texto. Un\n * registro de cumplimiento que copiara los datos sería un segundo almacén de\n * justo aquello que el RGPD quiere minimizar.\n * 2. **Una sola canonicalización.** `memory-engine/audit.ts` construye la carga\n * a hashear dos veces, en `append` y en `verify`, con dos listas de campos\n * escritas a mano. Añadir un campo a una y olvidar la otra rompe la\n * verificación en silencio y solo para las entradas nuevas. Aquí la\n * verificación reconstruye la carga con un rest (`{hash, prevHash, ...resto}`),\n * así que un campo nuevo entra solo y las dos caras no pueden divergir.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { appendFileSync, linkSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { taparAntesDeEscribir } from \"../privacidad/tapar.ts\";\nimport { ficherosPurgados } from \"./retencion.ts\";\nimport { DIR_INDICE, DIR_SESION } from \"./rutas.ts\";\n\n/** Lo que se le puede pedir al libro que anote. */\nexport type SucesoDeSesion =\n\t| { tipo: \"tool\"; nombre: string; ok: boolean; decision?: string; motivo?: string }\n\t| {\n\t\t\ttipo: \"modelo\";\n\t\t\tproveedor: string;\n\t\t\tmodelo: string;\n\t\t\tentrada: number;\n\t\t\tsalida: number;\n\t\t\tcoste?: number;\n\t\t\t/** `stop`, `toolUse`, `error`, `aborted`… Un fallo del modelo también es auditable. */\n\t\t\tmotivoParada?: string;\n\t }\n\t| {\n\t\t\ttipo: \"comando\";\n\t\t\targv: string[];\n\t\t\tcodigo: number;\n\t\t\tsandbox?: \"permitido\" | \"bloqueado\";\n\t\t\tviolaciones?: string[];\n\t\t\t/**\n\t\t\t * Quién escribió el comando: el agente (por defecto, si se omite), el\n\t\t\t * usuario desde la terminal integrada del escritorio, o una extensión\n\t\t\t * a través de `pi.exec`.\n\t\t\t *\n\t\t\t * La terminal ejecuta lo que el usuario teclea SIN pasar por la\n\t\t\t * política de aprobación — es su shell, no la del agente — así que este\n\t\t\t * campo es lo único que evita que un registro de cumplimiento confunda\n\t\t\t * \"lo que decidió el agente\" con \"lo que tecleó la persona\". Omitirlo\n\t\t\t * en vez de dar por defecto \"agente\" habría dejado pasar en silencio\n\t\t\t * una terminal que se le olvida anotarse.\n\t\t\t *\n\t\t\t * `extension` es el tercer estado, y hasta hoy faltaba: `pi.exec` no\n\t\t\t * pasaba por la política NI dejaba rastro, así que una extensión leía\n\t\t\t * el vault y el libro no lo sabía. Atribuirlo al \"agente\" habría sido\n\t\t\t * peor que no anotarlo: quien audite tiene que poder distinguir lo que\n\t\t\t * decidió el modelo de lo que hizo código de terceros cargado en el\n\t\t\t * proceso.\n\t\t\t */\n\t\t\torigen?: \"agente\" | \"usuario\" | \"extension\";\n\t\t\t/** Ruta de la extensión, cuando `origen` es `extension`. Sin ella el aviso no es accionable. */\n\t\t\textension?: string;\n\t }\n\t| {\n\t\t\t/**\n\t\t\t * Una purga por retención, anotada como HECHO en vez de dejada como\n\t\t\t * hueco. Sin esto, cumplir el art. 5.1.e del RGPD hacía que\n\t\t\t * `verificar` acusara de manipulación; y borrar también el índice\n\t\t\t * hacía desaparecer la purga sin rastro. Ver `audit/retencion.ts`.\n\t\t\t */\n\t\t\ttipo: \"purga\";\n\t\t\tfichero: string;\n\t\t\tentradas: number;\n\t\t\tdesde: string;\n\t\t\thasta: string;\n\t\t\thashDeCierre: string;\n\t\t\tpolitica: string;\n\t }\n\t| { tipo: \"fichero\"; ruta: string; antes: string | null; despues: string | null; tool: string }\n\t| { tipo: \"red\"; dominio: string; permitido: boolean; motivo?: string }\n\t| {\n\t\t\t/** El broker de credenciales (core/credenciales/) es lo que oh-my-pi no\n\t\t\t * tiene: un registro de quién usó qué cuenta y cuándo. `accion` distingue\n\t\t\t * PEDIR una credencial de REPORTAR cómo fue usarla. */\n\t\t\ttipo: \"credencial\";\n\t\t\taccion: \"resuelta\" | \"uso\";\n\t\t\tproveedor: string;\n\t\t\t/** `null` en \"resuelta\" = no había ninguna credencial activa (no es que fallara el libro). */\n\t\t\tcredencialId: string | null;\n\t\t\t/** \"ok\" | \"sin-credencial-activa\" | una `ClaseDeError` de errores/proveedor.ts. */\n\t\t\tresultado: string;\n\t\t\tcliente?: string;\n\t };\n\nexport interface EntradaDelLibro {\n\tseq: number;\n\tts: string;\n\tsesion: string;\n\tsuceso: Record<string, unknown>;\n\thash: string;\n\tprevHash: string | null;\n}\n\nexport interface Veredicto {\n\tvalido: boolean;\n\tcomprobadas: number;\n\t/** Sello de tiempo de la primera entrada que no cuadra. */\n\talteradaEn?: string;\n\t/**\n\t * Fichero donde está esa entrada.\n\t *\n\t * Sin esto el veredicto decía «alterada en la del 03:09:55» sobre un\n\t * directorio con 26 ficheros de sesión: cierto, verificable y no accionable.\n\t * Quien recibe un aviso de manipulación necesita saber DÓNDE mirar, o el\n\t * aviso se queda en susto.\n\t */\n\tficheroAlterado?: string;\n\t/**\n\t * Por qué no verifica, en una frase estable.\n\t *\n\t * Existe para no confundir «lo he mirado y no cuadra» con «no lo he podido\n\t * mirar»: un fichero ilegible y un hash que no coincide daban el mismo\n\t * veredicto y el mismo mensaje, y son dos cosas distintas para quien\n\t * responde a una auditoría.\n\t */\n\tmotivo?: string;\n\t/**\n\t * Lo que FALTA: ficheros que el índice recuerda y que ya no están en\n\t * `sesion/`, con cuántas entradas tenía cada uno.\n\t *\n\t * Es el tercer estado, y es el que faltaba. Antes de esto la cadena\n\t * distinguía «íntegra» de «alterada» y nada más, así que borrar el fichero\n\t * entero —lo que haría un agente tapando sus pasos— salía como\n\t * `{valido: true, comprobadas: 0}`: un fallo que se lee como éxito en la\n\t * pieza que se vende como prueba. Medido ejecutando el CLI: con tres\n\t * comandos anotados decía «cadena íntegra: 3 entradas», y tras un `rm`\n\t * decía «el libro está vacío» y salía con código 0.\n\t */\n\tfaltan?: { fichero: string; entradas: number }[];\n\t/**\n\t * Ficheros que ya no están y cuya ausencia el libro EXPLICA con una lápida\n\t * de purga. No cuentan como manipulación: son el art. 5.1.e cumplido.\n\t */\n\tpurgados?: { fichero: string; entradas: number; politica: string }[];\n\t/**\n\t * Sitios donde la cadena vuelve a empezar dentro de un mismo fichero.\n\t *\n\t * Ni íntegro ni alterado: el TERCER estado. Un reinicio del proceso lo\n\t * produce, y quien quite entradas del medio y escriba una cadena nueva\n\t * produce exactamente lo mismo. Desde el fichero no se distinguen, así que se\n\t * dice dónde está y se deja que lo juzgue quien audita, en vez de acusar o de\n\t * absolver por nuestra cuenta.\n\t */\n\treinicios?: { fichero: string; ts: string; entradasAntes: number }[];\n\t/**\n\t * Ficheros presentes en `sesion/` sin ancla en el índice.\n\t *\n\t * NO cuenta como manipulación y por eso va aparte de `faltan`: son los\n\t * libros escritos antes de que el índice existiera, y también lo que queda\n\t * en un sistema de ficheros sin enlaces duros. Meterlo en `valido: false`\n\t * habría hecho que toda instalación ya existente gritara «manipulado» el\n\t * día de la actualización — un detector que grita siempre no vale, y\n\t * además volvería indistinguible la manipulación real.\n\t */\n\tsinAncla?: string[];\n}\n\n/** Un fichero del libro, mirado desde los dos directorios a la vez. */\ninterface FicheroDelLibro {\n\tnombre: string;\n\t/** De dónde se leen las entradas: la copia que exista. */\n\truta: string;\n\t/** Está en el índice y ya NO en `sesion/`: alguien lo borró. */\n\tfalta: boolean;\n\t/** Está en `sesion/` y no en el índice: libro antiguo o FS sin enlaces duros. */\n\tsinAncla: boolean;\n\t/** Están los dos nombres pero NO son el mismo fichero: sustitución. */\n\tsuplantado: boolean;\n}\n\n/** Hash de un contenido de fichero. `null` = el fichero no existía. */\nfunction hashContenido(texto: string | null): string | null {\n\treturn texto === null ? null : createHash(\"sha256\").update(texto).digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Redacta cada hoja de texto por separado.\n *\n * Se hace hoja a hoja y no sobre el JSON ya serializado a propósito: un patrón\n * que se pasara de largo sobre el texto serializado podría comerse una comilla\n * y dejar el registro sin parsear. Sobre la hoja, lo peor que puede pasar es\n * que redacte de más.\n */\nfunction redactarHoja(valor: unknown): unknown {\n\tif (typeof valor === \"string\") return taparAntesDeEscribir(valor, \"strict\");\n\tif (Array.isArray(valor)) return valor.map(redactarHoja);\n\tif (valor && typeof valor === \"object\") {\n\t\treturn Object.fromEntries(Object.entries(valor).map(([k, v]) => [k, redactarHoja(v)]));\n\t}\n\treturn valor;\n}\n\n/** Pasa del suceso que da quien llama al registro que se guarda. */\nfunction aRegistro(suceso: SucesoDeSesion): Record<string, unknown> {\n\tconst base =\n\t\tsuceso.tipo === \"fichero\"\n\t\t\t? { ...suceso, antes: hashContenido(suceso.antes), despues: hashContenido(suceso.despues) }\n\t\t\t: suceso;\n\treturn redactarHoja(base) as Record<string, unknown>;\n}\n\nfunction hashDe(prevHash: string | null, carga: Omit<EntradaDelLibro, \"hash\" | \"prevHash\">): string {\n\treturn createHash(\"sha256\")\n\t\t.update(JSON.stringify({ prevHash, ...carga }))\n\t\t.digest(\"hex\");\n}\n\nexport class LibroDeSesion {\n\tprivate readonly dir: string;\n\t/** El índice: un enlace duro por fichero de sesión. Ver `DIR_INDICE`. */\n\tprivate readonly dirIndice: string;\n\tprivate readonly sesion: string;\n\tprivate seq = 0;\n\tprivate ultimoHash: string | null = null;\n\t/** Fijado en la primera escritura por `reservarFichero`; no cambia despues. */\n\tprivate rutaFichero: string | null = null;\n\n\tconstructor(raiz: string, sesionId: string) {\n\t\tthis.dir = join(raiz, DIR_SESION);\n\t\tthis.dirIndice = join(raiz, DIR_INDICE);\n\t\tthis.sesion = sesionId;\n\t}\n\n\t/**\n\t * Un fichero por sesión, no uno por día.\n\t *\n\t * Compartir fichero entre sesiones parecía más ordenado y hacía el libro\n\t * INVERIFICABLE, cosa que solo se vio ejecutando: cada proceso arranca su\n\t * `seq` en 1 y su hash anterior en `null`, así que tres sesiones seguidas\n\t * dejaban tres cadenas encadenadas dentro del mismo fichero y `verificar`\n\t * fallaba en la primera entrada de la segunda.\n\t *\n\t * Arreglarlo cargando el último hash al abrir no habría bastado: el CLI y el\n\t * escritorio corren a la vez, y dos procesos que leyeran el mismo hash\n\t * anterior escribirían dos entradas con el mismo `prevHash`.\n\t *\n\t * El límite que esto dejaba, y que era el agujero: borrar el fichero de una\n\t * sesión entera no lo detecta la cadena, que solo ve la modificación DENTRO\n\t * de una sesión. Se documentaba aquí mientras el veredicto seguía diciendo\n\t * `valido: true` — o sea, un fallo que se leía como éxito en la pieza que se\n\t * vende como prueba. Lo cierra el índice de `reservarFichero`.\n\t *\n\t * «Un fichero, un escritor» es la PRECONDICIÓN de todo lo anterior, y por eso\n\t * `reservarFichero` la impone en vez de confiar en ella. Se rompía por dos\n\t * caminos distintos, los dos encontrados sobre el libro real de esta máquina:\n\t *\n\t * 1. Dos escritores en un fichero. El escritorio usa el id fijo `desktop`,\n\t * así que cada encarnación del proceso —cada recompilación de Next—\n\t * abría el MISMO fichero creyéndose la primera y escribía otra entrada\n\t * con `seq 1` y `prevHash null`. Encontrado en\n\t * `sesion-2026-08-24-desktop.jsonl`: dos entradas, las dos `seq 1`.\n\t * 2. Un escritor que cruza la medianoche. El nombre salía de la fecha de\n\t * CADA entrada, así que a las 00:00 la sesión saltaba a un fichero nuevo\n\t * cuya primera entrada llevaba el `prevHash` del fichero anterior —\n\t * mientras `verificar` arranca cada fichero esperando `null`.\n\t *\n\t * Los dos daban `CADENA ALTERADA` sobre un libro que nadie había tocado. Y el\n\t * daño no es el ruido: es que una alteración de verdad queda indistinguible\n\t * del caso benigno, y un medidor que grita siempre deja de leerse.\n\t */\n\tprivate nombreBase(fecha: string): string {\n\t\tconst id = this.sesion.replace(/[^a-zA-Z0-9-]/g, \"_\").slice(0, 40);\n\t\treturn `sesion-${fecha}-${id}.jsonl`;\n\t}\n\n\t/**\n\t * Reserva el fichero de ESTA instancia, una sola vez, y no lo suelta.\n\t *\n\t * Fijarlo en la primera escritura mata el caso 2 de golpe: la sesión se queda\n\t * en su fichero aunque cambie el día.\n\t *\n\t * Para el caso 1 se reclama el nombre con `wx` —crear-o-fallar—, que es\n\t * atómico en el sistema de ficheros. Quien lo gana lo tiene; quien lo pierde\n\t * prueba el siguiente. Así el «un escritor por fichero» deja de ser un\n\t * acuerdo entre quienes llaman y pasa a ser cierto por construcción, incluso\n\t * entre procesos distintos que no se conocen.\n\t *\n\t * Se prefiere partir en dos ficheros antes que leer la cola del ajeno y\n\t * continuarlo: dos procesos que leyeran el mismo último hash escribirían dos\n\t * entradas con el mismo `prevHash`, que es otra vez una cadena rota sin nadie\n\t * manipulando nada. Dos ficheros íntegros son mejor que uno dudoso, y\n\t * `verificar` ya los trata por separado.\n\t *\n\t * EL ANCLA. El nombre se reclama en el ÍNDICE y el fichero de `sesion/` es un\n\t * ENLACE DURO al del índice, no una copia. Tres propiedades que hacen falta\n\t * las tres:\n\t *\n\t * 1. `rm -rf sesion/` —el movimiento del agente que quiere tapar sus\n\t * pasos— borra un NOMBRE, no el fichero: los bytes siguen ahí bajo el\n\t * otro nombre, así que `verificar` no solo detecta la desaparición sino\n\t * que puede seguir leyendo lo que se quiso esconder.\n\t * 2. El ancla no puede desincronizarse del libro, porque no es un\n\t * resumen que haya que mantener al día: es el mismo inodo. Un índice\n\t * con su propio contador tendría que escribirse en cada anotación, y\n\t * dos procesos escribiendo el mismo índice es la carrera que ya nos\n\t * dejó el libro inverificable una vez.\n\t * 3. El nombre se reclama en el índice y no en `sesion/`, así que un\n\t * nombre gastado no se puede reutilizar aunque su fichero de sesión\n\t * haya desaparecido. Sin esto, borrar y reescribir con una entrada\n\t * dejaba el libro con el mismo aspecto que uno legítimo de una entrada.\n\t *\n\t * Hasta dónde llega, dicho sin adornos: quien borre los DOS directorios deja\n\t * un libro vacío indistinguible de una instalación nueva. Contra eso está la\n\t * otra mitad del trabajo —la política, que deniega la carpeta al agente\n\t * incluso en `yolo`— y no un tercer ancla, porque un ancla que viva en el\n\t * mismo disco y con los mismos permisos siempre se puede borrar igual. Lo que\n\t * esto elimina es que un solo `rm` pase desapercibido.\n\t */\n\t/**\n\t * El fichero que esta sesión está escribiendo, o `null` si aún no ha escrito.\n\t *\n\t * La purga lo necesita para no llevarse el suelo de un libro vivo, y tiene que\n\t * saberlo por IDENTIDAD, no por fecha: fiarlo a «su última entrada es de hoy»\n\t * deja el caso raro —un reloj movido, una sesión larga— rompiendo la cadena en\n\t * memoria sin avisar.\n\t */\n\tget ficheroEnCurso(): string | null {\n\t\treturn this.rutaFichero ? basename(this.rutaFichero) : null;\n\t}\n\n\tprivate reservarFichero(fecha: string): string {\n\t\tif (this.rutaFichero) return this.rutaFichero;\n\t\tmkdirSync(this.dirIndice, { recursive: true });\n\t\tconst base = this.nombreBase(fecha);\n\t\tfor (let n = 1; ; n++) {\n\t\t\tconst nombre = n === 1 ? base : base.replace(/\\.jsonl$/, `-${n}.jsonl`);\n\t\t\tconst ancla = join(this.dirIndice, nombre);\n\t\t\ttry {\n\t\t\t\twriteFileSync(ancla, \"\", { flag: \"wx\" });\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n\t\t\t\tcontinue; // nombre gastado (otro escritor, u otra ejecución): el siguiente\n\t\t\t}\n\t\t\tconst ruta = join(this.dir, nombre);\n\t\t\ttry {\n\t\t\t\tlinkSync(ancla, ruta);\n\t\t\t} catch (error) {\n\t\t\t\t// El nombre estaba libre en el índice pero ocupado en `sesion/`: es un\n\t\t\t\t// libro escrito ANTES de que el índice existiera. Se suelta el ancla\n\t\t\t\t// vacía y se prueba el siguiente nombre. Soltarla no es cosmético:\n\t\t\t\t// dejar un ancla de 0 bytes junto a un fichero de sesión con\n\t\t\t\t// contenido son dos inodos con el mismo nombre, y `verificar` lo\n\t\t\t\t// leería como suplantación en toda instalación que se actualice.\n\t\t\t\trmSync(ancla, { force: true });\n\t\t\t\tif ((error as NodeJS.ErrnoException).code === \"EEXIST\") continue;\n\t\t\t\t// Sin enlaces duros (FS exótico, montaje raro) el libro sigue\n\t\t\t\t// funcionando SIN ancla, porque un libro que no se escribe es peor\n\t\t\t\t// que uno sin ancla; `verificar` lo dirá como `sinAncla`, que es un\n\t\t\t\t// tercer estado y no una acusación.\n\t\t\t\twriteFileSync(ruta, \"\", { flag: \"wx\" });\n\t\t\t}\n\t\t\tthis.rutaFichero = ruta;\n\t\t\treturn ruta;\n\t\t}\n\t}\n\n\t/**\n\t * Anota un suceso. Nunca lanza: un fallo del libro no puede tumbar la\n\t * conversación, igual que en el audit del motor de memoria.\n\t */\n\tanotar(suceso: SucesoDeSesion): Promise<void> {\n\t\t// SÍNCRONO, y no es una simplificación perezosa: es lo correcto aquí.\n\t\t//\n\t\t// Antes esto encolaba una escritura asíncrona y devolvía la promesa, y casi\n\t\t// todos los llamantes hacen `void libro.anotar(...)` — no la esperan, porque\n\t\t// un fallo del libro no puede tumbar la conversación. Eso deja dos agujeros:\n\t\t//\n\t\t// 1. Las últimas entradas se pierden si el proceso termina antes de que\n\t\t// la cola se vacíe. En un registro de cumplimiento, perder justo lo\n\t\t// último que hizo el agente es perder lo que más se va a mirar.\n\t\t// 2. Escrituras que aterrizan DESPUÉS de que la sesión se haya cerrado.\n\t\t// Salió en una prueba de regresión de upstream: al borrar su\n\t\t// directorio temporal, el libro seguía creando ficheros dentro y\n\t\t// `rmSync` fallaba con ENOTEMPTY. La prueba pasaba en HEAD~1 y falló\n\t\t// al fusionar el índice — el ancla ensanchó una carrera que ya existía.\n\t\t//\n\t\t// El coste está MEDIDO, y sale a favor: 40 µs por entrada en síncrono\n\t\t// frente a 56 µs en asíncrono (1.000 escrituras de 268 bytes). Es más\n\t\t// rápido porque para una escritura tan pequeña la promesa pesa más que el\n\t\t// `write`. Y 40 µs contra una llamada a herramienta que tarda milisegundos\n\t\t// o segundos no se nota.\n\t\t//\n\t\t// Además desaparece la cola entera: JavaScript es de un solo hilo, así que\n\t\t// dos `anotar` seguidos ya no pueden leer el mismo `ultimoHash`. La carrera\n\t\t// que la cola existía para evitar deja de ser posible por construcción, que\n\t\t// es mejor que evitarla con disciplina.\n\t\t//\n\t\t// Se mantiene la firma `Promise<void>` para no tocar a los llamantes.\n\t\tthis.escribir(suceso);\n\t\treturn Promise.resolve();\n\t}\n\n\tprivate escribir(suceso: SucesoDeSesion): void {\n\t\ttry {\n\t\t\tmkdirSync(this.dir, { recursive: true });\n\t\t\tconst carga = {\n\t\t\t\tseq: ++this.seq,\n\t\t\t\tts: new Date().toISOString(),\n\t\t\t\tsesion: this.sesion,\n\t\t\t\tsuceso: aRegistro(suceso),\n\t\t\t};\n\t\t\tconst hash = hashDe(this.ultimoHash, carga);\n\t\t\tconst entrada: EntradaDelLibro = { ...carga, hash, prevHash: this.ultimoHash };\n\t\t\tthis.ultimoHash = hash;\n\t\t\tconst ruta = this.reservarFichero(carga.ts.slice(0, 10));\n\t\t\tappendFileSync(ruta, `${JSON.stringify(entrada)}\\n`, \"utf-8\");\n\t\t} catch {\n\t\t\t// El libro nunca rompe la sesión.\n\t\t}\n\t}\n\n\tprivate async listar(dir: string): Promise<string[]> {\n\t\ttry {\n\t\t\treturn (await readdir(dir)).filter((f) => /^sesion-.*\\.jsonl$/.test(f)).sort();\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Los ficheros del libro vistos desde los DOS directorios.\n\t *\n\t * Esta es la comparación que antes no existía: `readdir(sesion/)` solo puede\n\t * contestar «lo que hay», nunca «lo que debería haber», y por eso un borrado\n\t * salía como un libro vacío.\n\t */\n\tprivate async inventario(): Promise<FicheroDelLibro[]> {\n\t\tconst enSesion = new Set(await this.listar(this.dir));\n\t\tconst enIndice = new Set(await this.listar(this.dirIndice));\n\t\tconst out: FicheroDelLibro[] = [];\n\t\tfor (const nombre of [...new Set([...enSesion, ...enIndice])].sort()) {\n\t\t\tconst s = enSesion.has(nombre);\n\t\t\tconst i = enIndice.has(nombre);\n\t\t\t// Con los dos nombres presentes tienen que ser el MISMO inodo, porque\n\t\t\t// así los creó `reservarFichero`. Si no lo son, alguien borró el de\n\t\t\t// `sesion/` y puso otro en su sitio — y como el algoritmo de la cadena\n\t\t\t// es público, ese otro puede tener una cadena interna perfecta. Sin\n\t\t\t// esta comprobación la suplantación se leería como «cadena íntegra».\n\t\t\tlet suplantado = false;\n\t\t\tif (s && i) {\n\t\t\t\ttry {\n\t\t\t\t\tconst [a, b] = await Promise.all([stat(join(this.dir, nombre)), stat(join(this.dirIndice, nombre))]);\n\t\t\t\t\tsuplantado = a.ino !== b.ino;\n\t\t\t\t} catch {\n\t\t\t\t\t// No se pudo mirar: no se acusa. «No lo he podido comprobar» no es\n\t\t\t\t\t// «está manipulado», y el fichero se verifica igual más abajo.\n\t\t\t\t}\n\t\t\t}\n\t\t\tout.push({\n\t\t\t\tnombre,\n\t\t\t\t// Se lee del índice cuando el de `sesion/` no está (es el caso del\n\t\t\t\t// borrado) o cuando no coincide con él: el índice es el ancla.\n\t\t\t\truta: s && !suplantado ? join(this.dir, nombre) : join(this.dirIndice, nombre),\n\t\t\t\tfalta: i && !s,\n\t\t\t\tsinAncla: s && !i,\n\t\t\t\tsuplantado,\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Las últimas entradas, de la más reciente hacia atrás. */\n\tasync leer(limite = 50): Promise<EntradaDelLibro[]> {\n\t\tconst out: EntradaDelLibro[] = [];\n\t\tfor (const f of (await this.inventario()).reverse()) {\n\t\t\tlet crudo: string;\n\t\t\ttry {\n\t\t\t\t// Por `f.ruta` y no por `sesion/`: las entradas de un fichero borrado\n\t\t\t\t// sobreviven en el índice y quien investiga tiene que poder verlas.\n\t\t\t\tcrudo = await readFile(f.ruta, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const linea of crudo.split(\"\\n\").filter(Boolean).reverse()) {\n\t\t\t\ttry {\n\t\t\t\t\tout.push(JSON.parse(linea) as EntradaDelLibro);\n\t\t\t\t\tif (out.length >= limite) return out;\n\t\t\t\t} catch {\n\t\t\t\t\t// Línea ilegible: la verificación es quien lo denuncia, no la lectura.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\t/**\n\t * Reverifica la cadena entera y contesta TRES estados, no dos.\n\t *\n\t * «Íntegra», «alterada» y «FALTA algo que debería estar». El tercero es el\n\t * que faltaba: la cadena de hashes detecta la modificación DENTRO de un\n\t * fichero y no puede, por construcción, notar la desaparición del fichero —\n\t * para eso hace falta saber qué debería haber, que es lo que aporta el índice\n\t * (ver `reservarFichero`).\n\t *\n\t * De la cadena rota devuelve en la PRIMERA entrada que no cuadra, y\n\t * `comprobadas` cuenta las que sí cuadraban antes de ella — así el número\n\t * dice dónde empieza la manipulación, no cuántas hay en total. Lo que ya se\n\t * hubiera detectado como ausente viaja con esa respuesta: no se pierde por\n\t * salir antes.\n\t */\n\tasync verificar(): Promise<Veredicto> {\n\t\tlet comprobadas = 0;\n\t\tconst faltan: { fichero: string; entradas: number }[] = [];\n\t\tconst reinicios: { fichero: string; ts: string; entradasAntes: number }[] = [];\n\t\tconst sinAncla: string[] = [];\n\t\t// Las lápidas se leen ANTES de recorrer: una purga anotada en el fichero de\n\t\t// hoy explica un hueco de un fichero de hace un año.\n\t\tconst purgados = ficherosPurgados(await this.leer());\n\t\tfor (const f of await this.inventario()) {\n\t\t\tif (f.suplantado) {\n\t\t\t\treturn {\n\t\t\t\t\tvalido: false,\n\t\t\t\t\tcomprobadas,\n\t\t\t\t\tficheroAlterado: f.nombre,\n\t\t\t\t\tmotivo: \"el fichero de sesión ya no es el mismo que el del índice: lo han sustituido\",\n\t\t\t\t\t...(faltan.length ? { faltan } : {}),\n\t\t\t\t\t...(sinAncla.length ? { sinAncla } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t\t// La cadena empieza de cero en CADA fichero, porque cada fichero es una\n\t\t\t// sesión y su primera entrada lleva `prevHash: null`. Arrastrar el hash\n\t\t\t// de un fichero al siguiente es lo que hacía fallar la verificación en\n\t\t\t// cuanto había más de una sesión.\n\t\t\tlet prevHash: string | null = null;\n\t\t\tlet enEste = 0;\n\t\t\tlet crudo: string;\n\t\t\ttry {\n\t\t\t\tcrudo = await readFile(f.ruta, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tvalido: false,\n\t\t\t\t\tcomprobadas,\n\t\t\t\t\tficheroAlterado: f.nombre,\n\t\t\t\t\tmotivo: \"no se ha podido leer el fichero: no es «está bien», es «no lo sé»\",\n\t\t\t\t\t...(faltan.length ? { faltan } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t\tfor (const linea of crudo.split(\"\\n\").filter(Boolean)) {\n\t\t\t\tlet entrada: EntradaDelLibro;\n\t\t\t\ttry {\n\t\t\t\t\tentrada = JSON.parse(linea) as EntradaDelLibro;\n\t\t\t\t} catch {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalido: false,\n\t\t\t\t\t\tcomprobadas,\n\t\t\t\t\t\tficheroAlterado: f.nombre,\n\t\t\t\t\t\tmotivo: \"hay una línea que no es JSON válido\",\n\t\t\t\t\t\t...(faltan.length ? { faltan } : {}),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// El rest es lo que impide que esta lista y la de `escribir`\n\t\t\t\t// se separen: aquí no hay lista.\n\t\t\t\tconst { hash, prevHash: declarado, ...resto } = entrada;\n\t\t\t\t// Se separan DOS preguntas que antes iban juntas y contestaban lo\n\t\t\t\t// mismo, acusando siempre de lo primero:\n\t\t\t\t//\n\t\t\t\t// · ¿el hash cuadra con SU PROPIO contenido? Si no, alguien editó la\n\t\t\t\t// entrada. Eso es manipulación y se dice así.\n\t\t\t\t// · ¿su `prevHash` apunta a la entrada anterior? Si no, el enlace\n\t\t\t\t// está roto, que es otra cosa: faltan entradas o están cambiadas\n\t\t\t\t// de orden.\n\t\t\t\t//\n\t\t\t\t// Medido sobre el libro real de esta máquina: un fichero de dos\n\t\t\t\t// entradas, las dos con `seq: 1` y `prevHash: null`, salía como «el\n\t\t\t\t// hash de una entrada no cuadra con su contenido». Cuadraba\n\t\t\t\t// perfectamente. Eran dos procesos del escritorio escribiendo el mismo\n\t\t\t\t// fichero antes de que `reservarFichero` diera nombres distintos.\n\t\t\t\tif (hash !== hashDe(declarado, resto)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalido: false,\n\t\t\t\t\t\tcomprobadas,\n\t\t\t\t\t\talteradaEn: entrada.ts,\n\t\t\t\t\t\tficheroAlterado: f.nombre,\n\t\t\t\t\t\tmotivo: \"el hash de una entrada no cuadra con su contenido: la han editado\",\n\t\t\t\t\t\t...(faltan.length ? { faltan } : {}),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (declarado !== prevHash) {\n\t\t\t\t\t// Una cadena que vuelve a empezar dentro del mismo fichero. Lo\n\t\t\t\t\t// produce un reinicio del proceso —y lo produce igual quien quite\n\t\t\t\t\t// entradas del medio y escriba una cadena nueva—. Desde el fichero\n\t\t\t\t\t// no se distinguen, así que NO se llama manipulación ni se da por\n\t\t\t\t\t// bueno: es el tercer estado, y se dice entero en `reinicios`.\n\t\t\t\t\tif (declarado === null && prevHash !== null) {\n\t\t\t\t\t\treinicios.push({ fichero: f.nombre, ts: entrada.ts, entradasAntes: enEste });\n\t\t\t\t\t\tprevHash = hash;\n\t\t\t\t\t\tcomprobadas++;\n\t\t\t\t\t\tenEste++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalido: false,\n\t\t\t\t\t\tcomprobadas,\n\t\t\t\t\t\talteradaEn: entrada.ts,\n\t\t\t\t\t\tficheroAlterado: f.nombre,\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\t...(faltan.length ? { faltan } : {}),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tprevHash = hash;\n\t\t\t\tcomprobadas++;\n\t\t\t\tenEste++;\n\t\t\t}\n\t\t\t// Un fichero VACÍO que falta no es una ausencia: es una reserva de\n\t\t\t// nombre que nunca llegó a escribirse (la sesión murió entre reservar y\n\t\t\t// anotar). Contarlo habría hecho que una sesión nueva y legítima, sin\n\t\t\t// una sola entrada todavía, se reportara como manipulada — la mitad que\n\t\t\t// decide, porque un detector que grita siempre no distingue nada.\n\t\t\tif (enEste === 0) continue;\n\t\t\t// Un hueco EXPLICADO no es una manipulación.\n\t\t\t//\n\t\t\t// Si el propio libro lleva una lápida diciendo que ese fichero se purgó\n\t\t\t// —cuándo, cuántas entradas, bajo qué política y con qué hash de\n\t\t\t// cierre—, la ausencia es un hecho declarado y no una desaparición. Sin\n\t\t\t// esto, cumplir el art. 5.1.e del RGPD hacía que `verificar` contestara\n\t\t\t// «alguien los ha borrado»: la ley nos acusaba de manipular. Ver\n\t\t\t// `audit/retencion.ts`.\n\t\t\tif (f.falta && !purgados.has(f.nombre)) faltan.push({ fichero: f.nombre, entradas: enEste });\n\t\t\tif (f.sinAncla) sinAncla.push(f.nombre);\n\t\t}\n\t\t// Las lápidas se enseñan TODAS, no solo las que tapan un hueco del\n\t\t// inventario. Una purga completa se lleva el fichero Y su ancla, así que no\n\t\t// deja hueco ninguno: si solo se informara de las que explican una ausencia,\n\t\t// el caso normal —el que de verdad ocurre— saldría mudo y el DPO leería\n\t\t// «cadena íntegra, 1 entrada» sin enterarse de que se purgaron tres. Que es\n\t\t// exactamente el «desaparece sin rastro» que este mecanismo existe para\n\t\t// impedir.\n\t\tconst explicados = [...purgados.values()].map((l) => ({\n\t\t\tfichero: l.fichero,\n\t\t\tentradas: l.entradas,\n\t\t\tpolitica: l.politica,\n\t\t}));\n\t\treturn {\n\t\t\tvalido: faltan.length === 0,\n\t\t\t...(explicados.length ? { purgados: explicados } : {}),\n\t\t\t...(reinicios.length ? { reinicios } : {}),\n\t\t\tcomprobadas,\n\t\t\t...(faltan.length ? { faltan } : {}),\n\t\t\t...(sinAncla.length ? { sinAncla } : {}),\n\t\t};\n\t}\n}\n"]}
1
+ {"version":3,"file":"libro.js","sourceRoot":"","sources":["../../../src/core/audit/libro.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registro-sesion.d.ts","sourceRoot":"","sources":["../../../src/core/audit/registro-sesion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,KAAK,QAAQ,EAA0B,MAAM,2BAA2B,CAAC;AAIlF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,qEAAoE;AACpE,UAAU,iBAAiB;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACpC;AAED,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IACnD,wEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAC1D;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,MAAM,CAAC,CAAgB;IAW/B,YACC,QAAQ,EAAE,MAAM,MAAM,EACtB,QAAQ,EAAE,MAAM,MAAM,EACtB,GAAG,EAAE,MAAM,MAAM,EACjB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAatD;IAED;;;;;;OAMG;IACH,KAAK,IAAI,aAAa,CAGrB;IAED;;;;;OAKG;IACG,cAAc,CACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,iBAAiB,GACvB,OAAO,CAAC,QAAQ,CAAC,CA6BnB;IAED;;;OAGG;IACG,WAAW,CAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,OAAO,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+CxB;IAED;;;;;;;OAOG;IACH,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAqC9C;CACD","sourcesContent":["/**\n * Todo lo que Ada añade alrededor de una llamada a herramienta, en una pieza.\n *\n * Reúne tres cosas que empezaron sueltas dentro de `agent-session.ts` —el libro\n * de sesión, la política de aprobación y el observador de ediciones— porque las\n * tres cuelgan de los mismos dos ganchos y comparten el ciclo de vida de la\n * llamada.\n *\n * El motivo de agruparlas no es estético. `agent-session.ts` es de upstream y\n * cada región nuestra que vive ahí es un hunk que se reaplica en cada\n * sincronización y se rompe cuando upstream refactoriza. Tres campos y un\n * método sueltos partían el hunk de declaraciones en dos y se pasaban del\n * presupuesto; un campo y dos llamadas, no. La regla está escrita en\n * `core/ada.ts`: si vas a tocar `agent-session.ts`, mira antes si lo tuyo cabe\n * en un módulo propio.\n */\n\nimport type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport { type Decision, decidir, leerDenegadas } from \"../aprobacion/politica.ts\";\nimport { ObservadorDeEdiciones } from \"../edicion/observador.ts\";\nimport { publicarLibroDeSesion } from \"../extensiones/vigilancia.ts\";\nimport { nivelDesdeConfig } from \"../hooks/session-hooks.ts\";\nimport { LibroDeSesion } from \"./libro.ts\";\n\n/** El trozo de configuración del motor que le hace falta a esto. */\ninterface ConfigConPermisos {\n\tpermissions?: Record<string, unknown>;\n\tgoalEngine?: { planOnly?: boolean };\n}\n\nexport class RegistroDeSesion {\n\tprivate readonly agentDir: () => string;\n\tprivate readonly sesionId: () => string;\n\tprivate readonly observador: ObservadorDeEdiciones;\n\t/** Decisión de cada llamada, de `beforeToolCall` a `afterToolCall`. */\n\tprivate readonly decisiones = new Map<string, Decision>();\n\t/**\n\t * Llamadas que el modelo ANUNCIÓ y de las que el libro aún no sabe nada.\n\t *\n\t * Existe porque había un hueco medido: `validateToolArguments` corre ANTES\n\t * que `beforeToolCall`, así que una llamada rechazada por sus argumentos\n\t * —el error más común de los modelos pequeños— no llegaba a ninguno de\n\t * nuestros dos enganches y desaparecía del libro. Ocurrió de verdad en una\n\t * comparación contra un modelo gratuito: el transcript tenía dos `edit` y el\n\t * libro solo una. Un registro que se vende como «qué hizo el agente» no puede\n\t * callarse lo que el agente intentó hacer.\n\t */\n\tprivate readonly anunciadas = new Map<string, string>();\n\tprivate _libro?: LibroDeSesion;\n\n\t// Los tres primeros son funciones y no valores: este objeto se construye en\n\t// un inicializador de campo de `AgentSession`, que corre ANTES del cuerpo\n\t// del constructor. `this.sessionId` es un getter sobre estado que todavía\n\t// no existe ahí, y leerlo en ese momento reventaba la sesión entera —76\n\t// ficheros de prueba en rojo— sin que los tipos dijeran nada.\n\t//\n\t// `completar` es opcional: sin modelo (sesiones de prueba, subagentes sin\n\t// auth) la auto-reparación de ediciones rotas queda \"no-aplicable\" en vez\n\t// de intentarlo con `undefined` y reventar.\n\tconstructor(\n\t\tagentDir: () => string,\n\t\tsesionId: () => string,\n\t\tcwd: () => string,\n\t\tcompletar?: (prompt: string) => Promise<string | null>,\n\t) {\n\t\tthis.agentDir = agentDir;\n\t\tthis.sesionId = sesionId;\n\t\tthis.observador = new ObservadorDeEdiciones(cwd, agentDir, completar);\n\t\t// `pi.exec` de una extensión escribe en el MISMO libro que las llamadas\n\t\t// del agente. Sin esto, la extensión abriría su propio fichero de sesión\n\t\t// y quien auditara el de la conversación no vería nada — que es el mismo\n\t\t// agujero de antes con un rastro más difícil de encontrar.\n\t\t//\n\t\t// Se publica un getter para no forzar la creación del libro aquí: sigue\n\t\t// siendo perezoso, y una sesión que no hace nada no deja directorio.\n\t\tpublicarLibroDeSesion(() => this.libro());\n\t}\n\n\t/**\n\t * El libro, creado en la primera anotación.\n\t *\n\t * Perezoso a propósito: abrirlo al construir la sesión crearía el directorio\n\t * incluso para sesiones que no llegan a hacer nada, y entonces \"no hay\n\t * registro\" y \"no hizo nada\" dejarían de distinguirse.\n\t */\n\tlibro(): LibroDeSesion {\n\t\tthis._libro ??= new LibroDeSesion(this.agentDir(), this.sesionId());\n\t\treturn this._libro;\n\t}\n\n\t/**\n\t * Antes de ejecutar: decide si se permite y guarda la preimagen del fichero.\n\t *\n\t * Devuelve la decisión. Quien llama corta si es `denegada`; la denegación ya\n\t * queda anotada aquí.\n\t */\n\tasync antesDeLlamada(\n\t\tidLlamada: string,\n\t\ttool: string,\n\t\targs: Record<string, unknown>,\n\t\tconfig: ConfigConPermisos,\n\t): Promise<Decision> {\n\t\tconst decision = decidir({\n\t\t\ttool,\n\t\t\targs,\n\t\t\tmodo: nivelDesdeConfig(config),\n\t\t\tagentDir: this.agentDir(),\n\t\t\tdenegadas: leerDenegadas(config),\n\t\t});\n\n\t\tif (decision.veredicto === \"denegada\") {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"tool\",\n\t\t\t\tnombre: tool,\n\t\t\t\tok: false,\n\t\t\t\tdecision: \"denegada\",\n\t\t\t\tmotivo: decision.politica,\n\t\t\t});\n\t\t\t// Una llamada bloqueada no llega a `trasLlamada`, así que no se guarda\n\t\t\t// nada que luego nadie recogería. Y ya está anotada arriba: se saca de\n\t\t\t// las pendientes para que la reconciliación no la cuente dos veces.\n\t\t\tthis.anunciadas.delete(idLlamada);\n\t\t\treturn decision;\n\t\t}\n\n\t\t// Tope por si alguna llamada muere antes de consumirse.\n\t\tif (this.decisiones.size > 256) this.decisiones.clear();\n\t\tthis.decisiones.set(idLlamada, decision);\n\t\tawait this.observador.antesDe(idLlamada, tool, args);\n\t\treturn decision;\n\t}\n\n\t/**\n\t * Después de ejecutar: anota lo ocurrido y devuelve el aviso de edición rota,\n\t * o `null` si no hay nada que decir — que es el caso de casi todas.\n\t */\n\tasync trasLlamada(\n\t\tidLlamada: string,\n\t\ttool: string,\n\t\targs: Record<string, unknown>,\n\t\thuboError: boolean,\n\t): Promise<string | null> {\n\t\tconst aprobacion = this.decisiones.get(idLlamada);\n\t\tthis.decisiones.delete(idLlamada);\n\t\tthis.anunciadas.delete(idLlamada);\n\n\t\tconst comando = (args as { command?: unknown } | undefined)?.command;\n\t\tvoid this.libro().anotar(\n\t\t\ttool === \"bash\" && typeof comando === \"string\"\n\t\t\t\t? { tipo: \"comando\", argv: [comando], codigo: huboError ? 1 : 0, origen: \"agente\" }\n\t\t\t\t: {\n\t\t\t\t\t\ttipo: \"tool\",\n\t\t\t\t\t\tnombre: tool,\n\t\t\t\t\t\tok: !huboError,\n\t\t\t\t\t\t// Qué regla la dejó pasar. Sin esto el libro dice que algo\n\t\t\t\t\t\t// ocurrió pero no por qué se permitió, que es justo la mitad\n\t\t\t\t\t\t// que pregunta una auditoría.\n\t\t\t\t\t\tdecision: aprobacion?.veredicto,\n\t\t\t\t\t\tmotivo: aprobacion?.politica,\n\t\t\t\t\t},\n\t\t);\n\n\t\tconst aviso = await this.observador.despuesDe(idLlamada, huboError);\n\n\t\t// El suceso `fichero` del libro: art. 30 RGPD, qué ficheros se trataron.\n\t\t//\n\t\t// El tipo existía en `libro.ts` desde el primer día y NADIE lo anotaba: el\n\t\t// comentario de `agent-session.ts` decía \"los hashes de fichero llegan con\n\t\t// el observador de ediciones\", en futuro, y nunca llegaron. La auditoría\n\t\t// enterprise lo encontró preguntando lo que pregunta un DPO. Es el defecto\n\t\t// número uno de esta casa: capacidad construida y desenchufada, con el tipo\n\t\t// compilando y las pruebas en verde porque las pruebas anotaban a mano.\n\t\t//\n\t\t// Se toma del observador, que ya leyó las dos versiones, en vez de releer el\n\t\t// fichero aquí. El libro hashea `antes` y `despues` al escribir, así que el\n\t\t// contenido pasa por aquí pero no llega a disco.\n\t\tconst cambio = this.observador.ultimoCambio(idLlamada);\n\t\tif (cambio) {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"fichero\",\n\t\t\t\truta: cambio.ruta,\n\t\t\t\tantes: cambio.antes,\n\t\t\t\tdespues: cambio.despues,\n\t\t\t\ttool,\n\t\t\t});\n\t\t}\n\n\t\treturn aviso;\n\t}\n\n\t/**\n\t * Una llamada al modelo.\n\t *\n\t * Se anota por llamada y no por turno porque un turno puede gastar varias, y\n\t * \"qué modelo se usó y cuánto costó\" hay que poder responderlo con ese grano.\n\t * Las que fallan también: `motivoParada: \"error\"` es justo lo que hay que\n\t * poder enseñar.\n\t */\n\tanotarModelo(asistente: AssistantMessage): void {\n\t\t// RECONCILIAR PRIMERO. Para cuando llega este mensaje, las herramientas del\n\t\t// anterior ya se ejecutaron —el bucle las espera—, así que todo lo que siga\n\t\t// pendiente es una llamada que el modelo pidió y que nunca llegó a\n\t\t// ejecutarse: argumentos que no validaron, o una herramienta inexistente.\n\t\tfor (const [id, nombre] of this.anunciadas) {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"tool\",\n\t\t\t\tnombre,\n\t\t\t\tok: false,\n\t\t\t\tdecision: \"no-ejecutada\",\n\t\t\t\t// El motivo no se inventa: desde aquí no se ve la causa exacta, y\n\t\t\t\t// escribir una supuesta sería peor que nombrar lo que sí se sabe.\n\t\t\t\tmotivo: \"el modelo la pidió y no llegó a ejecutarse (argumentos inválidos o herramienta inexistente)\",\n\t\t\t});\n\t\t\tthis.anunciadas.delete(id);\n\t\t}\n\n\t\tif (!asistente.usage) return;\n\n\t\t// Y se apuntan las de ESTE mensaje, para poder reconciliarlas en el\n\t\t// siguiente.\n\t\tfor (const bloque of asistente.content) {\n\t\t\tif (bloque.type === \"toolCall\") this.anunciadas.set(bloque.id, bloque.name);\n\t\t}\n\t\tvoid this.libro().anotar({\n\t\t\ttipo: \"modelo\",\n\t\t\tproveedor: asistente.provider,\n\t\t\t// `responseModel` es el modelo CONCRETO cuando lo pedido era un alias\n\t\t\t// (el `auto` de OpenRouter, por ejemplo). Para un registro de\n\t\t\t// cumplimiento importa el que respondió, no el que se pidió.\n\t\t\tmodelo: asistente.responseModel ?? asistente.model,\n\t\t\tentrada: asistente.usage.input,\n\t\t\tsalida: asistente.usage.output,\n\t\t\tcoste: asistente.usage.cost?.total,\n\t\t\tmotivoParada: asistente.stopReason,\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"registro-sesion.d.ts","sourceRoot":"","sources":["../../../src/core/audit/registro-sesion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,KAAK,QAAQ,EAA0B,MAAM,2BAA2B,CAAC;AAIlF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,oEAAoE;AACpE,UAAU,iBAAiB;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACpC;AAED,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IACnD,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAC1D;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,MAAM,CAAC,CAAgB;gBAY9B,QAAQ,EAAE,MAAM,MAAM,EACtB,QAAQ,EAAE,MAAM,MAAM,EACtB,GAAG,EAAE,MAAM,MAAM,EACjB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAevD;;;;;;OAMG;IACH,KAAK,IAAI,aAAa;IAKtB;;;;;OAKG;IACG,cAAc,CACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,iBAAiB,GACvB,OAAO,CAAC,QAAQ,CAAC;IA+BpB;;;OAGG;IACG,WAAW,CAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,OAAO,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiDzB;;;;;;;OAOG;IACH,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;CAsC/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"registro-sesion.js","sourceRoot":"","sources":["../../../src/core/audit/registro-sesion.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Todo lo que Ada añade alrededor de una llamada a herramienta, en una pieza.\n *\n * Reúne tres cosas que empezaron sueltas dentro de `agent-session.ts` —el libro\n * de sesión, la política de aprobación y el observador de ediciones— porque las\n * tres cuelgan de los mismos dos ganchos y comparten el ciclo de vida de la\n * llamada.\n *\n * El motivo de agruparlas no es estético. `agent-session.ts` es de upstream y\n * cada región nuestra que vive ahí es un hunk que se reaplica en cada\n * sincronización y se rompe cuando upstream refactoriza. Tres campos y un\n * método sueltos partían el hunk de declaraciones en dos y se pasaban del\n * presupuesto; un campo y dos llamadas, no. La regla está escrita en\n * `core/ada.ts`: si vas a tocar `agent-session.ts`, mira antes si lo tuyo cabe\n * en un módulo propio.\n */\n\nimport type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport { type Decision, decidir, leerDenegadas } from \"../aprobacion/politica.ts\";\nimport { ObservadorDeEdiciones } from \"../edicion/observador.ts\";\nimport { publicarLibroDeSesion } from \"../extensiones/vigilancia.ts\";\nimport { nivelDesdeConfig } from \"../hooks/session-hooks.ts\";\nimport { LibroDeSesion } from \"./libro.ts\";\n\n/** El trozo de configuración del motor que le hace falta a esto. */\ninterface ConfigConPermisos {\n\tpermissions?: Record<string, unknown>;\n\tgoalEngine?: { planOnly?: boolean };\n}\n\nexport class RegistroDeSesion {\n\tprivate readonly agentDir: () => string;\n\tprivate readonly sesionId: () => string;\n\tprivate readonly observador: ObservadorDeEdiciones;\n\t/** Decisión de cada llamada, de `beforeToolCall` a `afterToolCall`. */\n\tprivate readonly decisiones = new Map<string, Decision>();\n\t/**\n\t * Llamadas que el modelo ANUNCIÓ y de las que el libro aún no sabe nada.\n\t *\n\t * Existe porque había un hueco medido: `validateToolArguments` corre ANTES\n\t * que `beforeToolCall`, así que una llamada rechazada por sus argumentos\n\t * —el error más común de los modelos pequeños— no llegaba a ninguno de\n\t * nuestros dos enganches y desaparecía del libro. Ocurrió de verdad en una\n\t * comparación contra un modelo gratuito: el transcript tenía dos `edit` y el\n\t * libro solo una. Un registro que se vende como «qué hizo el agente» no puede\n\t * callarse lo que el agente intentó hacer.\n\t */\n\tprivate readonly anunciadas = new Map<string, string>();\n\tprivate _libro?: LibroDeSesion;\n\n\t// Los tres primeros son funciones y no valores: este objeto se construye en\n\t// un inicializador de campo de `AgentSession`, que corre ANTES del cuerpo\n\t// del constructor. `this.sessionId` es un getter sobre estado que todavía\n\t// no existe ahí, y leerlo en ese momento reventaba la sesión entera —76\n\t// ficheros de prueba en rojo— sin que los tipos dijeran nada.\n\t//\n\t// `completar` es opcional: sin modelo (sesiones de prueba, subagentes sin\n\t// auth) la auto-reparación de ediciones rotas queda \"no-aplicable\" en vez\n\t// de intentarlo con `undefined` y reventar.\n\tconstructor(\n\t\tagentDir: () => string,\n\t\tsesionId: () => string,\n\t\tcwd: () => string,\n\t\tcompletar?: (prompt: string) => Promise<string | null>,\n\t) {\n\t\tthis.agentDir = agentDir;\n\t\tthis.sesionId = sesionId;\n\t\tthis.observador = new ObservadorDeEdiciones(cwd, agentDir, completar);\n\t\t// `pi.exec` de una extensión escribe en el MISMO libro que las llamadas\n\t\t// del agente. Sin esto, la extensión abriría su propio fichero de sesión\n\t\t// y quien auditara el de la conversación no vería nada — que es el mismo\n\t\t// agujero de antes con un rastro más difícil de encontrar.\n\t\t//\n\t\t// Se publica un getter para no forzar la creación del libro aquí: sigue\n\t\t// siendo perezoso, y una sesión que no hace nada no deja directorio.\n\t\tpublicarLibroDeSesion(() => this.libro());\n\t}\n\n\t/**\n\t * El libro, creado en la primera anotación.\n\t *\n\t * Perezoso a propósito: abrirlo al construir la sesión crearía el directorio\n\t * incluso para sesiones que no llegan a hacer nada, y entonces \"no hay\n\t * registro\" y \"no hizo nada\" dejarían de distinguirse.\n\t */\n\tlibro(): LibroDeSesion {\n\t\tthis._libro ??= new LibroDeSesion(this.agentDir(), this.sesionId());\n\t\treturn this._libro;\n\t}\n\n\t/**\n\t * Antes de ejecutar: decide si se permite y guarda la preimagen del fichero.\n\t *\n\t * Devuelve la decisión. Quien llama corta si es `denegada`; la denegación ya\n\t * queda anotada aquí.\n\t */\n\tasync antesDeLlamada(\n\t\tidLlamada: string,\n\t\ttool: string,\n\t\targs: Record<string, unknown>,\n\t\tconfig: ConfigConPermisos,\n\t): Promise<Decision> {\n\t\tconst decision = decidir({\n\t\t\ttool,\n\t\t\targs,\n\t\t\tmodo: nivelDesdeConfig(config),\n\t\t\tagentDir: this.agentDir(),\n\t\t\tdenegadas: leerDenegadas(config),\n\t\t});\n\n\t\tif (decision.veredicto === \"denegada\") {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"tool\",\n\t\t\t\tnombre: tool,\n\t\t\t\tok: false,\n\t\t\t\tdecision: \"denegada\",\n\t\t\t\tmotivo: decision.politica,\n\t\t\t});\n\t\t\t// Una llamada bloqueada no llega a `trasLlamada`, así que no se guarda\n\t\t\t// nada que luego nadie recogería. Y ya está anotada arriba: se saca de\n\t\t\t// las pendientes para que la reconciliación no la cuente dos veces.\n\t\t\tthis.anunciadas.delete(idLlamada);\n\t\t\treturn decision;\n\t\t}\n\n\t\t// Tope por si alguna llamada muere antes de consumirse.\n\t\tif (this.decisiones.size > 256) this.decisiones.clear();\n\t\tthis.decisiones.set(idLlamada, decision);\n\t\tawait this.observador.antesDe(idLlamada, tool, args);\n\t\treturn decision;\n\t}\n\n\t/**\n\t * Después de ejecutar: anota lo ocurrido y devuelve el aviso de edición rota,\n\t * o `null` si no hay nada que decir — que es el caso de casi todas.\n\t */\n\tasync trasLlamada(\n\t\tidLlamada: string,\n\t\ttool: string,\n\t\targs: Record<string, unknown>,\n\t\thuboError: boolean,\n\t): Promise<string | null> {\n\t\tconst aprobacion = this.decisiones.get(idLlamada);\n\t\tthis.decisiones.delete(idLlamada);\n\t\tthis.anunciadas.delete(idLlamada);\n\n\t\tconst comando = (args as { command?: unknown } | undefined)?.command;\n\t\tvoid this.libro().anotar(\n\t\t\ttool === \"bash\" && typeof comando === \"string\"\n\t\t\t\t? { tipo: \"comando\", argv: [comando], codigo: huboError ? 1 : 0, origen: \"agente\" }\n\t\t\t\t: {\n\t\t\t\t\t\ttipo: \"tool\",\n\t\t\t\t\t\tnombre: tool,\n\t\t\t\t\t\tok: !huboError,\n\t\t\t\t\t\t// Qué regla la dejó pasar. Sin esto el libro dice que algo\n\t\t\t\t\t\t// ocurrió pero no por qué se permitió, que es justo la mitad\n\t\t\t\t\t\t// que pregunta una auditoría.\n\t\t\t\t\t\tdecision: aprobacion?.veredicto,\n\t\t\t\t\t\tmotivo: aprobacion?.politica,\n\t\t\t\t\t},\n\t\t);\n\n\t\tconst aviso = await this.observador.despuesDe(idLlamada, huboError);\n\n\t\t// El suceso `fichero` del libro: art. 30 RGPD, qué ficheros se trataron.\n\t\t//\n\t\t// El tipo existía en `libro.ts` desde el primer día y NADIE lo anotaba: el\n\t\t// comentario de `agent-session.ts` decía \"los hashes de fichero llegan con\n\t\t// el observador de ediciones\", en futuro, y nunca llegaron. La auditoría\n\t\t// enterprise lo encontró preguntando lo que pregunta un DPO. Es el defecto\n\t\t// número uno de esta casa: capacidad construida y desenchufada, con el tipo\n\t\t// compilando y las pruebas en verde porque las pruebas anotaban a mano.\n\t\t//\n\t\t// Se toma del observador, que ya leyó las dos versiones, en vez de releer el\n\t\t// fichero aquí. El libro hashea `antes` y `despues` al escribir, así que el\n\t\t// contenido pasa por aquí pero no llega a disco.\n\t\tconst cambio = this.observador.ultimoCambio(idLlamada);\n\t\tif (cambio) {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"fichero\",\n\t\t\t\truta: cambio.ruta,\n\t\t\t\tantes: cambio.antes,\n\t\t\t\tdespues: cambio.despues,\n\t\t\t\ttool,\n\t\t\t});\n\t\t}\n\n\t\treturn aviso;\n\t}\n\n\t/**\n\t * Una llamada al modelo.\n\t *\n\t * Se anota por llamada y no por turno porque un turno puede gastar varias, y\n\t * \"qué modelo se usó y cuánto costó\" hay que poder responderlo con ese grano.\n\t * Las que fallan también: `motivoParada: \"error\"` es justo lo que hay que\n\t * poder enseñar.\n\t */\n\tanotarModelo(asistente: AssistantMessage): void {\n\t\t// RECONCILIAR PRIMERO. Para cuando llega este mensaje, las herramientas del\n\t\t// anterior ya se ejecutaron —el bucle las espera—, así que todo lo que siga\n\t\t// pendiente es una llamada que el modelo pidió y que nunca llegó a\n\t\t// ejecutarse: argumentos que no validaron, o una herramienta inexistente.\n\t\tfor (const [id, nombre] of this.anunciadas) {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"tool\",\n\t\t\t\tnombre,\n\t\t\t\tok: false,\n\t\t\t\tdecision: \"no-ejecutada\",\n\t\t\t\t// El motivo no se inventa: desde aquí no se ve la causa exacta, y\n\t\t\t\t// escribir una supuesta sería peor que nombrar lo que sí se sabe.\n\t\t\t\tmotivo: \"el modelo la pidió y no llegó a ejecutarse (argumentos inválidos o herramienta inexistente)\",\n\t\t\t});\n\t\t\tthis.anunciadas.delete(id);\n\t\t}\n\n\t\tif (!asistente.usage) return;\n\n\t\t// Y se apuntan las de ESTE mensaje, para poder reconciliarlas en el\n\t\t// siguiente.\n\t\tfor (const bloque of asistente.content) {\n\t\t\tif (bloque.type === \"toolCall\") this.anunciadas.set(bloque.id, bloque.name);\n\t\t}\n\t\tvoid this.libro().anotar({\n\t\t\ttipo: \"modelo\",\n\t\t\tproveedor: asistente.provider,\n\t\t\t// `responseModel` es el modelo CONCRETO cuando lo pedido era un alias\n\t\t\t// (el `auto` de OpenRouter, por ejemplo). Para un registro de\n\t\t\t// cumplimiento importa el que respondió, no el que se pidió.\n\t\t\tmodelo: asistente.responseModel ?? asistente.model,\n\t\t\tentrada: asistente.usage.input,\n\t\t\tsalida: asistente.usage.output,\n\t\t\tcoste: asistente.usage.cost?.total,\n\t\t\tmotivoParada: asistente.stopReason,\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"registro-sesion.js","sourceRoot":"","sources":["../../../src/core/audit/registro-sesion.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"retencion.d.ts","sourceRoot":"","sources":["../../../src/core/audit/retencion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGjE,8EAA6E;AAC7E,MAAM,WAAW,MAAM;IACtB,sCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,gEAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,2EAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,iFAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0DAA0D;IAC1D,WAAW,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAcD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,MAAM;AAChB,sEAAsE;AACtE,OAAO,UAAQ,GACb,OAAO,CAAC,gBAAgB,CAAC,CAiE3B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAe1F","sourcesContent":["/**\n * Purgar el libro sin que la purga parezca una manipulación.\n *\n * EL CALLEJÓN SIN SALIDA, medido antes de escribir nada. El artículo 5.1.e del\n * RGPD obliga a no conservar los datos más de lo necesario, así que un DPO\n * TIENE que poder borrar lo viejo. Pero hoy:\n *\n * · Si borra los ficheros de `sesion/`, el ancla del índice los sigue\n * esperando y `verificar` contesta\n * «FALTAN 1 fichero(s) con 3 entrada(s): alguien los ha borrado». Cumplir\n * la ley nos acusa de manipular.\n * · Si borra también el índice, el libro queda «íntegro» con menos entradas y\n * la purga desaparece sin rastro. Es indistinguible de un borrado hostil.\n *\n * Las dos salidas son malas, y el subcomando ni siquiera existe: `audit purge`,\n * `audit purgar`, `audit retencion` → «Subcomando desconocido». El único camino\n * era `rm`.\n *\n * LA IDEA: una purga no es una ausencia, es un HECHO. Y un hecho se anota.\n *\n * En vez de borrar y callar, se escribe una LÁPIDA en el libro —encadenada como\n * cualquier otra entrada— que dice qué periodo se purgó, cuántas entradas\n * había, bajo qué política, y el hash de cierre del tramo que se va. Con eso:\n *\n * · `verificar` distingue «esto se purgó el día D bajo la política P» de\n * «esto ha desaparecido», que es la diferencia entre cumplir y encubrir.\n * · El artículo 5.2 —responsabilidad proactiva: hay que poder DEMOSTRAR que\n * se cumple— queda cubierto por el propio mecanismo.\n * · Y quien reciba el libro años después puede reconstruir qué pasó con lo\n * que ya no está.\n *\n * LO QUE LA LÁPIDA NO ES. No es una prueba de que lo purgado fuera lo que dice\n * la lápida: quien controla el disco puede escribir la lápida que quiera. Es\n * una prueba de INTENCIÓN DECLARADA, y sirve para lo que sirve — que un borrado\n * legítimo no se confunda con uno hostil, y que uno hostil tenga que mentir por\n * escrito en vez de limitarse a borrar. Contra un adversario con acceso al\n * disco no hay defensa local; para eso hace falta un ancla externa.\n */\n\nimport { readFileSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { EntradaDelLibro, LibroDeSesion } from \"./libro.ts\";\nimport { DIR_INDICE, DIR_SESION } from \"./rutas.ts\";\n\n/** Lo que la lápida deja escrito. Todo es dato de forma, nunca contenido. */\nexport interface Lapida {\n\t/** Qué fichero de sesión se fue. */\n\tfichero: string;\n\t/** Cuántas entradas tenía, para que el hueco sea contable. */\n\tentradas: number;\n\t/** El sello de tiempo de la primera y la última, que delimitan el periodo. */\n\tdesde: string;\n\thasta: string;\n\t/** Hash del último eslabón del tramo purgado: ancla de lo que se fue. */\n\thashDeCierre: string;\n\t/** Bajo qué regla. Un texto libre que el DPO reconozca en su documentación. */\n\tpolitica: string;\n}\n\nexport interface ResultadoDePurga {\n\tpurgados: Lapida[];\n\t/** Los que se miraron y NO se purgaron, con su motivo. */\n\tconservados: Array<{ fichero: string; porque: string }>;\n}\n\n/** Un fichero del libro leído, o `null` si no se pudo. */\nfunction leerEntradas(ruta: string): EntradaDelLibro[] | null {\n\ttry {\n\t\treturn readFileSync(ruta, \"utf-8\")\n\t\t\t.split(\"\\n\")\n\t\t\t.filter(Boolean)\n\t\t\t.map((l) => JSON.parse(l) as EntradaDelLibro);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Purga los ficheros de sesión anteriores a `antesDe`, dejando una lápida.\n *\n * `antesDe` se compara contra el sello de la ÚLTIMA entrada del fichero: una\n * sesión que empezó en enero y terminó en marzo se conserva si el corte está en\n * febrero. Purgar por la fecha de inicio borraría actividad posterior al corte,\n * que es justo lo que no se puede hacer.\n *\n * No purga el fichero de la sesión EN CURSO aunque cumpla la fecha: quitarle el\n * suelo a un libro que se está escribiendo rompería su cadena en memoria.\n */\nexport async function purgarAntesDe(\n\tlibro: LibroDeSesion,\n\tagentDir: string,\n\tantesDe: Date,\n\tpolitica: string,\n\t/** Con `true` se decide igual pero no se escribe ni se borra nada. */\n\tsimular = false,\n): Promise<ResultadoDePurga> {\n\tconst purgados: Lapida[] = [];\n\tconst conservados: Array<{ fichero: string; porque: string }> = [];\n\n\tconst { readdirSync } = await import(\"node:fs\");\n\tlet nombres: string[];\n\ttry {\n\t\tnombres = readdirSync(join(agentDir, DIR_SESION)).filter((f) => f.endsWith(\".jsonl\"));\n\t} catch {\n\t\treturn { purgados, conservados };\n\t}\n\n\tfor (const nombre of nombres) {\n\t\t// Se pregunta DENTRO del bucle: la primera lápida es la que da nombre al\n\t\t// fichero de esta sesión, así que antes de escribirla el libro todavía no\n\t\t// tiene ninguno —y si no tiene, tampoco está en `nombres`—.\n\t\tif (nombre === libro.ficheroEnCurso) {\n\t\t\tconservados.push({ fichero: nombre, porque: \"es la sesión en curso\" });\n\t\t\tcontinue;\n\t\t}\n\t\tconst ruta = join(agentDir, DIR_SESION, nombre);\n\t\tconst entradas = leerEntradas(ruta);\n\t\t// No se borra lo que no se ha podido leer: sin saber qué había, la lápida\n\t\t// sería una declaración inventada, que es peor que no purgar.\n\t\tif (!entradas || entradas.length === 0) {\n\t\t\tconservados.push({\n\t\t\t\tfichero: nombre,\n\t\t\t\tporque: \"no se ha podido leer, y no se purga lo que no se puede describir\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst ultima = entradas[entradas.length - 1];\n\t\tif (new Date(ultima.ts) >= antesDe) {\n\t\t\tconservados.push({\n\t\t\t\tfichero: nombre,\n\t\t\t\tporque: `su última entrada (${ultima.ts.slice(0, 10)}) es posterior al corte`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst lapida: Lapida = {\n\t\t\tfichero: nombre,\n\t\t\tentradas: entradas.length,\n\t\t\tdesde: entradas[0].ts,\n\t\t\thasta: ultima.ts,\n\t\t\thashDeCierre: ultima.hash,\n\t\t\tpolitica,\n\t\t};\n\t\t// La lápida PRIMERO, el borrado después. Si el proceso muere en medio, el\n\t\t// libro tiene una lápida de más y el fichero todavía ahí — un estado\n\t\t// incómodo pero legible. Al revés quedaría un hueco sin explicación, que\n\t\t// es exactamente lo que este módulo existe para no producir.\n\t\t//\n\t\t// Con `simular` se decide EXACTAMENTE igual y no se toca nada: lo que se\n\t\t// enseña antes de un borrado irreversible tiene que salir del mismo camino\n\t\t// que lo ejecuta, o es una promesa sobre otro código.\n\t\tif (!simular) {\n\t\t\tawait libro.anotar({ tipo: \"purga\", ...lapida } as never);\n\t\t\trmSync(ruta, { force: true });\n\t\t\trmSync(join(agentDir, DIR_INDICE, nombre), { force: true });\n\t\t}\n\t\tpurgados.push(lapida);\n\t}\n\n\treturn { purgados, conservados };\n}\n\n/**\n * Los ficheros que una lápida declara purgados, leídos del propio libro.\n *\n * `verificar` lo usa para distinguir un hueco explicado de uno que no lo está.\n */\nexport function ficherosPurgados(entradas: readonly EntradaDelLibro[]): Map<string, Lapida> {\n\tconst mapa = new Map<string, Lapida>();\n\tfor (const e of entradas) {\n\t\tconst s = e.suceso as Record<string, unknown>;\n\t\tif (s.tipo !== \"purga\" || typeof s.fichero !== \"string\") continue;\n\t\tmapa.set(s.fichero, {\n\t\t\tfichero: s.fichero,\n\t\t\tentradas: Number(s.entradas ?? 0),\n\t\t\tdesde: String(s.desde ?? \"\"),\n\t\t\thasta: String(s.hasta ?? \"\"),\n\t\t\thashDeCierre: String(s.hashDeCierre ?? \"\"),\n\t\t\tpolitica: String(s.politica ?? \"\"),\n\t\t});\n\t}\n\treturn mapa;\n}\n"]}
1
+ {"version":3,"file":"retencion.d.ts","sourceRoot":"","sources":["../../../src/core/audit/retencion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGjE,6EAA6E;AAC7E,MAAM,WAAW,MAAM;IACtB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0DAA0D;IAC1D,WAAW,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAcD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,MAAM;AAChB,sEAAsE;AACtE,OAAO,UAAQ,GACb,OAAO,CAAC,gBAAgB,CAAC,CAiE3B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAe1F"}
@@ -1 +1 @@
1
- {"version":3,"file":"retencion.js","sourceRoot":"","sources":["../../../src/core/audit/retencion.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Purgar el libro sin que la purga parezca una manipulación.\n *\n * EL CALLEJÓN SIN SALIDA, medido antes de escribir nada. El artículo 5.1.e del\n * RGPD obliga a no conservar los datos más de lo necesario, así que un DPO\n * TIENE que poder borrar lo viejo. Pero hoy:\n *\n * · Si borra los ficheros de `sesion/`, el ancla del índice los sigue\n * esperando y `verificar` contesta\n * «FALTAN 1 fichero(s) con 3 entrada(s): alguien los ha borrado». Cumplir\n * la ley nos acusa de manipular.\n * · Si borra también el índice, el libro queda «íntegro» con menos entradas y\n * la purga desaparece sin rastro. Es indistinguible de un borrado hostil.\n *\n * Las dos salidas son malas, y el subcomando ni siquiera existe: `audit purge`,\n * `audit purgar`, `audit retencion` → «Subcomando desconocido». El único camino\n * era `rm`.\n *\n * LA IDEA: una purga no es una ausencia, es un HECHO. Y un hecho se anota.\n *\n * En vez de borrar y callar, se escribe una LÁPIDA en el libro —encadenada como\n * cualquier otra entrada— que dice qué periodo se purgó, cuántas entradas\n * había, bajo qué política, y el hash de cierre del tramo que se va. Con eso:\n *\n * · `verificar` distingue «esto se purgó el día D bajo la política P» de\n * «esto ha desaparecido», que es la diferencia entre cumplir y encubrir.\n * · El artículo 5.2 —responsabilidad proactiva: hay que poder DEMOSTRAR que\n * se cumple— queda cubierto por el propio mecanismo.\n * · Y quien reciba el libro años después puede reconstruir qué pasó con lo\n * que ya no está.\n *\n * LO QUE LA LÁPIDA NO ES. No es una prueba de que lo purgado fuera lo que dice\n * la lápida: quien controla el disco puede escribir la lápida que quiera. Es\n * una prueba de INTENCIÓN DECLARADA, y sirve para lo que sirve — que un borrado\n * legítimo no se confunda con uno hostil, y que uno hostil tenga que mentir por\n * escrito en vez de limitarse a borrar. Contra un adversario con acceso al\n * disco no hay defensa local; para eso hace falta un ancla externa.\n */\n\nimport { readFileSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { EntradaDelLibro, LibroDeSesion } from \"./libro.ts\";\nimport { DIR_INDICE, DIR_SESION } from \"./rutas.ts\";\n\n/** Lo que la lápida deja escrito. Todo es dato de forma, nunca contenido. */\nexport interface Lapida {\n\t/** Qué fichero de sesión se fue. */\n\tfichero: string;\n\t/** Cuántas entradas tenía, para que el hueco sea contable. */\n\tentradas: number;\n\t/** El sello de tiempo de la primera y la última, que delimitan el periodo. */\n\tdesde: string;\n\thasta: string;\n\t/** Hash del último eslabón del tramo purgado: ancla de lo que se fue. */\n\thashDeCierre: string;\n\t/** Bajo qué regla. Un texto libre que el DPO reconozca en su documentación. */\n\tpolitica: string;\n}\n\nexport interface ResultadoDePurga {\n\tpurgados: Lapida[];\n\t/** Los que se miraron y NO se purgaron, con su motivo. */\n\tconservados: Array<{ fichero: string; porque: string }>;\n}\n\n/** Un fichero del libro leído, o `null` si no se pudo. */\nfunction leerEntradas(ruta: string): EntradaDelLibro[] | null {\n\ttry {\n\t\treturn readFileSync(ruta, \"utf-8\")\n\t\t\t.split(\"\\n\")\n\t\t\t.filter(Boolean)\n\t\t\t.map((l) => JSON.parse(l) as EntradaDelLibro);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Purga los ficheros de sesión anteriores a `antesDe`, dejando una lápida.\n *\n * `antesDe` se compara contra el sello de la ÚLTIMA entrada del fichero: una\n * sesión que empezó en enero y terminó en marzo se conserva si el corte está en\n * febrero. Purgar por la fecha de inicio borraría actividad posterior al corte,\n * que es justo lo que no se puede hacer.\n *\n * No purga el fichero de la sesión EN CURSO aunque cumpla la fecha: quitarle el\n * suelo a un libro que se está escribiendo rompería su cadena en memoria.\n */\nexport async function purgarAntesDe(\n\tlibro: LibroDeSesion,\n\tagentDir: string,\n\tantesDe: Date,\n\tpolitica: string,\n\t/** Con `true` se decide igual pero no se escribe ni se borra nada. */\n\tsimular = false,\n): Promise<ResultadoDePurga> {\n\tconst purgados: Lapida[] = [];\n\tconst conservados: Array<{ fichero: string; porque: string }> = [];\n\n\tconst { readdirSync } = await import(\"node:fs\");\n\tlet nombres: string[];\n\ttry {\n\t\tnombres = readdirSync(join(agentDir, DIR_SESION)).filter((f) => f.endsWith(\".jsonl\"));\n\t} catch {\n\t\treturn { purgados, conservados };\n\t}\n\n\tfor (const nombre of nombres) {\n\t\t// Se pregunta DENTRO del bucle: la primera lápida es la que da nombre al\n\t\t// fichero de esta sesión, así que antes de escribirla el libro todavía no\n\t\t// tiene ninguno —y si no tiene, tampoco está en `nombres`—.\n\t\tif (nombre === libro.ficheroEnCurso) {\n\t\t\tconservados.push({ fichero: nombre, porque: \"es la sesión en curso\" });\n\t\t\tcontinue;\n\t\t}\n\t\tconst ruta = join(agentDir, DIR_SESION, nombre);\n\t\tconst entradas = leerEntradas(ruta);\n\t\t// No se borra lo que no se ha podido leer: sin saber qué había, la lápida\n\t\t// sería una declaración inventada, que es peor que no purgar.\n\t\tif (!entradas || entradas.length === 0) {\n\t\t\tconservados.push({\n\t\t\t\tfichero: nombre,\n\t\t\t\tporque: \"no se ha podido leer, y no se purga lo que no se puede describir\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst ultima = entradas[entradas.length - 1];\n\t\tif (new Date(ultima.ts) >= antesDe) {\n\t\t\tconservados.push({\n\t\t\t\tfichero: nombre,\n\t\t\t\tporque: `su última entrada (${ultima.ts.slice(0, 10)}) es posterior al corte`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst lapida: Lapida = {\n\t\t\tfichero: nombre,\n\t\t\tentradas: entradas.length,\n\t\t\tdesde: entradas[0].ts,\n\t\t\thasta: ultima.ts,\n\t\t\thashDeCierre: ultima.hash,\n\t\t\tpolitica,\n\t\t};\n\t\t// La lápida PRIMERO, el borrado después. Si el proceso muere en medio, el\n\t\t// libro tiene una lápida de más y el fichero todavía ahí — un estado\n\t\t// incómodo pero legible. Al revés quedaría un hueco sin explicación, que\n\t\t// es exactamente lo que este módulo existe para no producir.\n\t\t//\n\t\t// Con `simular` se decide EXACTAMENTE igual y no se toca nada: lo que se\n\t\t// enseña antes de un borrado irreversible tiene que salir del mismo camino\n\t\t// que lo ejecuta, o es una promesa sobre otro código.\n\t\tif (!simular) {\n\t\t\tawait libro.anotar({ tipo: \"purga\", ...lapida } as never);\n\t\t\trmSync(ruta, { force: true });\n\t\t\trmSync(join(agentDir, DIR_INDICE, nombre), { force: true });\n\t\t}\n\t\tpurgados.push(lapida);\n\t}\n\n\treturn { purgados, conservados };\n}\n\n/**\n * Los ficheros que una lápida declara purgados, leídos del propio libro.\n *\n * `verificar` lo usa para distinguir un hueco explicado de uno que no lo está.\n */\nexport function ficherosPurgados(entradas: readonly EntradaDelLibro[]): Map<string, Lapida> {\n\tconst mapa = new Map<string, Lapida>();\n\tfor (const e of entradas) {\n\t\tconst s = e.suceso as Record<string, unknown>;\n\t\tif (s.tipo !== \"purga\" || typeof s.fichero !== \"string\") continue;\n\t\tmapa.set(s.fichero, {\n\t\t\tfichero: s.fichero,\n\t\t\tentradas: Number(s.entradas ?? 0),\n\t\t\tdesde: String(s.desde ?? \"\"),\n\t\t\thasta: String(s.hasta ?? \"\"),\n\t\t\thashDeCierre: String(s.hashDeCierre ?? \"\"),\n\t\t\tpolitica: String(s.politica ?? \"\"),\n\t\t});\n\t}\n\treturn mapa;\n}\n"]}
1
+ {"version":3,"file":"retencion.js","sourceRoot":"","sources":["../../../src/core/audit/retencion.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rutas.d.ts","sourceRoot":"","sources":["../../../src/core/audit/rutas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,wDAAwD;AACxD,eAAO,MAAM,UAAU,WAAW,CAAC;AAEnC;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,iBAAiB,CAAC","sourcesContent":["/**\n * Los dos directorios del libro de auditoría, en un sitio que puedan importar\n * tanto quien ESCRIBE el libro (`audit/libro.ts`) como quien lo PROTEGE\n * (`aprobacion/politica.ts`).\n *\n * Están aquí y no en `libro.ts` para que la política no arrastre el módulo del\n * libro entero, y sobre todo para que los dos nombres no puedan divergir:\n * renombrar el directorio en el libro y olvidarlo en la política dejaría la\n * carpeta desprotegida sin que nada fallara, que es exactamente la forma de\n * defecto que perseguimos —una guarda que sigue en verde mirando a un sitio\n * donde ya no hay nada.\n */\n\n/** Donde vive el libro: `<agentDir>/sesion/*.jsonl`. */\nexport const DIR_SESION = \"sesion\";\n\n/**\n * El índice: el ancla que sobrevive a `rm -rf sesion/`.\n *\n * No es una copia de metadatos sino un ENLACE DURO a cada fichero de sesión\n * (ver `LibroDeSesion.reservarFichero`), así que no puede desincronizarse del\n * libro: son los mismos bytes con dos nombres.\n */\nexport const DIR_INDICE = \"libro-indice\";\n"]}
1
+ {"version":3,"file":"rutas.d.ts","sourceRoot":"","sources":["../../../src/core/audit/rutas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,wDAAwD;AACxD,eAAO,MAAM,UAAU,WAAW,CAAC;AAEnC;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rutas.js","sourceRoot":"","sources":["../../../src/core/audit/rutas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,wDAAwD;AACxD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAC","sourcesContent":["/**\n * Los dos directorios del libro de auditoría, en un sitio que puedan importar\n * tanto quien ESCRIBE el libro (`audit/libro.ts`) como quien lo PROTEGE\n * (`aprobacion/politica.ts`).\n *\n * Están aquí y no en `libro.ts` para que la política no arrastre el módulo del\n * libro entero, y sobre todo para que los dos nombres no puedan divergir:\n * renombrar el directorio en el libro y olvidarlo en la política dejaría la\n * carpeta desprotegida sin que nada fallara, que es exactamente la forma de\n * defecto que perseguimos —una guarda que sigue en verde mirando a un sitio\n * donde ya no hay nada.\n */\n\n/** Donde vive el libro: `<agentDir>/sesion/*.jsonl`. */\nexport const DIR_SESION = \"sesion\";\n\n/**\n * El índice: el ancla que sobrevive a `rm -rf sesion/`.\n *\n * No es una copia de metadatos sino un ENLACE DURO a cada fichero de sesión\n * (ver `LibroDeSesion.reservarFichero`), así que no puede desincronizarse del\n * libro: son los mismos bytes con dos nombres.\n */\nexport const DIR_INDICE = \"libro-indice\";\n"]}
1
+ {"version":3,"file":"rutas.js","sourceRoot":"","sources":["../../../src/core/audit/rutas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,wDAAwD;AACxD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-guidance.d.ts","sourceRoot":"","sources":["../../src/core/auth-guidance.ts"],"names":[],"mappings":"AAKA,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED,wBAAgB,8BAA8B,IAAI,MAAM,CAEvD;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGnE","sourcesContent":["import { join } from \"node:path\";\nimport { getDocsPath } from \"../config.ts\";\n\nconst UNKNOWN_PROVIDER = \"unknown\";\n\nexport function getProviderLoginHelp(): string {\n\treturn [\n\t\t\"Use /login to log into a provider via OAuth or API key. See:\",\n\t\t` ${join(getDocsPath(), \"providers.md\")}`,\n\t\t` ${join(getDocsPath(), \"models.md\")}`,\n\t].join(\"\\n\");\n}\n\nexport function formatNoModelsAvailableMessage(): string {\n\treturn `No models available. ${getProviderLoginHelp()}`;\n}\n\nexport function formatNoModelSelectedMessage(): string {\n\treturn `No model selected.\\n\\n${getProviderLoginHelp()}\\n\\nThen use /model to select a model.`;\n}\n\nexport function formatNoApiKeyFoundMessage(provider: string): string {\n\tconst providerDisplay = provider === UNKNOWN_PROVIDER ? \"the selected model\" : provider;\n\treturn `No API key found for ${providerDisplay}.\\n\\n${getProviderLoginHelp()}`;\n}\n"]}
1
+ {"version":3,"file":"auth-guidance.d.ts","sourceRoot":"","sources":["../../src/core/auth-guidance.ts"],"names":[],"mappings":"AAKA,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED,wBAAgB,8BAA8B,IAAI,MAAM,CAEvD;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGnE"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-guidance.js","sourceRoot":"","sources":["../../src/core/auth-guidance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAEnC,MAAM,UAAU,oBAAoB,GAAW;IAC9C,OAAO;QACN,8DAA8D;QAC9D,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,EAAE;QAC1C,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,EAAE;KACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACb;AAED,MAAM,UAAU,8BAA8B,GAAW;IACxD,OAAO,wBAAwB,oBAAoB,EAAE,EAAE,CAAC;AAAA,CACxD;AAED,MAAM,UAAU,4BAA4B,GAAW;IACtD,OAAO,yBAAyB,oBAAoB,EAAE,wCAAwC,CAAC;AAAA,CAC/F;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAgB,EAAU;IACpE,MAAM,eAAe,GAAG,QAAQ,KAAK,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxF,OAAO,wBAAwB,eAAe,QAAQ,oBAAoB,EAAE,EAAE,CAAC;AAAA,CAC/E","sourcesContent":["import { join } from \"node:path\";\nimport { getDocsPath } from \"../config.ts\";\n\nconst UNKNOWN_PROVIDER = \"unknown\";\n\nexport function getProviderLoginHelp(): string {\n\treturn [\n\t\t\"Use /login to log into a provider via OAuth or API key. See:\",\n\t\t` ${join(getDocsPath(), \"providers.md\")}`,\n\t\t` ${join(getDocsPath(), \"models.md\")}`,\n\t].join(\"\\n\");\n}\n\nexport function formatNoModelsAvailableMessage(): string {\n\treturn `No models available. ${getProviderLoginHelp()}`;\n}\n\nexport function formatNoModelSelectedMessage(): string {\n\treturn `No model selected.\\n\\n${getProviderLoginHelp()}\\n\\nThen use /model to select a model.`;\n}\n\nexport function formatNoApiKeyFoundMessage(provider: string): string {\n\tconst providerDisplay = provider === UNKNOWN_PROVIDER ? \"the selected model\" : provider;\n\treturn `No API key found for ${providerDisplay}.\\n\\n${getProviderLoginHelp()}`;\n}\n"]}
1
+ {"version":3,"file":"auth-guidance.js","sourceRoot":"","sources":["../../src/core/auth-guidance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAEnC,MAAM,UAAU,oBAAoB;IACnC,OAAO;QACN,8DAA8D;QAC9D,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,EAAE;QAC1C,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,EAAE;KACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC7C,OAAO,wBAAwB,oBAAoB,EAAE,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC3C,OAAO,yBAAyB,oBAAoB,EAAE,wCAAwC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IAC1D,MAAM,eAAe,GAAG,QAAQ,KAAK,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxF,OAAO,wBAAwB,eAAe,QAAQ,oBAAoB,EAAE,EAAE,CAAC;AAChF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-storage.d.ts","sourceRoot":"","sources":["../../src/core/auth-storage.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CredentialStore implementation backed by auth.json.\n * Provider auth orchestration belongs to ModelRuntime and pi-ai Models.\n */\n\nimport type { AuthOperationOptions, Credential, CredentialInfo, CredentialStore } from \"@earendil-works/pi-ai\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport lockfile from \"proper-lockfile\";\nimport { setTimeout as sleep } from \"timers/promises\";\nimport { getAgentDir } from \"../config.ts\";\nimport { raceWithAbortSignal } from \"../utils/abort.ts\";\nimport { getFileRevision, normalizePath } from \"../utils/paths.ts\";\nimport { stripBom } from \"../utils/text.ts\";\nimport { isCommandConfigValue, resolveConfigValue } from \"./resolve-config-value.ts\";\n\ntype AuthStorageData = Record<string, Credential>;\n\ntype LockResult<T> = {\n\tresult: T;\n\tnext?: string;\n};\n\n// The mode applies only on creation so administrator-managed modes and ACLs remain intact.\nconst AUTH_FILE_WRITE_OPTIONS = { encoding: \"utf-8\", mode: 0o600 } as const;\n\ntype AuthFileReload = {\n\tcontroller: AbortController;\n\tpromise: Promise<AuthStorageData>;\n\treaders: number;\n};\n\ntype AuthFileReadState = {\n\tdata: AuthStorageData;\n\trevision?: string;\n\treload?: AuthFileReload;\n};\n\nlet sharedAuthFileReadState: { authPath: string; readState: AuthFileReadState } | undefined;\n\nexport interface AuthStorageBackend {\n\twithLock<T>(fn: (current: string | undefined) => LockResult<T>): T;\n\twithLockAsync<T>(\n\t\tfn: (current: string | undefined) => Promise<LockResult<T>>,\n\t\toptions?: AuthOperationOptions,\n\t): Promise<T>;\n}\n\nexport class FileAuthStorageBackend implements AuthStorageBackend {\n\tprivate authPath: string;\n\n\tconstructor(authPath: string = join(getAgentDir(), \"auth.json\")) {\n\t\tthis.authPath = normalizePath(authPath);\n\t}\n\n\tprivate ensureParentDir(): void {\n\t\tconst dir = dirname(this.authPath);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t\t}\n\t}\n\n\tprivate ensureFileExists(): void {\n\t\tif (!existsSync(this.authPath)) {\n\t\t\twriteFileSync(this.authPath, \"{}\", AUTH_FILE_WRITE_OPTIONS);\n\t\t}\n\t}\n\n\tprivate acquireLockSyncWithRetry(path: string): () => void {\n\t\tconst maxAttempts = 10;\n\t\tconst delayMs = 20;\n\t\tlet lastError: unknown;\n\n\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\ttry {\n\t\t\t\treturn lockfile.lockSync(path, { realpath: false });\n\t\t\t} catch (error) {\n\t\t\t\tconst code =\n\t\t\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error\n\t\t\t\t\t\t? String((error as { code?: unknown }).code)\n\t\t\t\t\t\t: undefined;\n\t\t\t\tif (code !== \"ELOCKED\" || attempt === maxAttempts) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tlastError = error;\n\t\t\t\tconst start = Date.now();\n\t\t\t\twhile (Date.now() - start < delayMs) {\n\t\t\t\t\t// Sleep synchronously to avoid changing callers to async.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthrow (lastError as Error) ?? new Error(\"Failed to acquire auth storage lock\");\n\t}\n\n\twithLock<T>(fn: (current: string | undefined) => LockResult<T>): T {\n\t\tthis.ensureParentDir();\n\t\tthis.ensureFileExists();\n\n\t\tlet release: (() => void) | undefined;\n\t\ttry {\n\t\t\trelease = this.acquireLockSyncWithRetry(this.authPath);\n\t\t\tconst current = existsSync(this.authPath) ? readFileSync(this.authPath, \"utf-8\") : undefined;\n\t\t\tconst { result, next } = fn(current);\n\t\t\tif (next !== undefined) {\n\t\t\t\twriteFileSync(this.authPath, next, AUTH_FILE_WRITE_OPTIONS);\n\t\t\t}\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tif (release) {\n\t\t\t\trelease();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async acquireLockAsync(\n\t\tsignal: AbortSignal | undefined,\n\t\tonCompromised: (error: Error) => void,\n\t): Promise<() => Promise<void>> {\n\t\tconst staleMs = 30_000;\n\t\tconst maxDelayMs = 2_000;\n\t\tconst deadline = Date.now() + staleMs;\n\t\tlet retry = 0;\n\t\twhile (true) {\n\t\t\tsignal?.throwIfAborted();\n\t\t\tlet release: (() => Promise<void>) | undefined;\n\t\t\ttry {\n\t\t\t\trelease = await lockfile.lock(this.authPath, {\n\t\t\t\t\trealpath: false,\n\t\t\t\t\tretries: 0,\n\t\t\t\t\tstale: staleMs,\n\t\t\t\t\tonCompromised,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tsignal?.throwIfAborted();\n\t\t\t\tconst code =\n\t\t\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error\n\t\t\t\t\t\t? String((error as { code?: unknown }).code)\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst remainingMs = deadline - Date.now();\n\t\t\t\tif (code !== \"ELOCKED\" || remainingMs <= 0) throw error;\n\t\t\t\tconst baseDelayMs = Math.min(10 * 2 ** retry, maxDelayMs / 2);\n\t\t\t\tretry++;\n\t\t\t\tconst delayMs = Math.min(Math.round(baseDelayMs * (1 + Math.random())), remainingMs);\n\t\t\t\tif (signal) await sleep(delayMs, undefined, { signal });\n\t\t\t\telse await sleep(delayMs);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (signal?.aborted) {\n\t\t\t\tawait release();\n\t\t\t\tsignal.throwIfAborted();\n\t\t\t}\n\t\t\treturn release;\n\t\t}\n\t}\n\n\tasync withLockAsync<T>(\n\t\tfn: (current: string | undefined) => Promise<LockResult<T>>,\n\t\toptions?: AuthOperationOptions,\n\t): Promise<T> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tthis.ensureParentDir();\n\t\tthis.ensureFileExists();\n\n\t\tlet release: (() => Promise<void>) | undefined;\n\t\tlet lockCompromised = false;\n\t\tlet lockCompromisedError: Error | undefined;\n\t\tconst throwIfCompromised = () => {\n\t\t\tif (lockCompromised) {\n\t\t\t\tthrow lockCompromisedError ?? new Error(\"Auth storage lock was compromised\");\n\t\t\t}\n\t\t};\n\n\t\ttry {\n\t\t\trelease = await this.acquireLockAsync(options?.signal, (error) => {\n\t\t\t\tlockCompromised = true;\n\t\t\t\tlockCompromisedError = error;\n\t\t\t});\n\n\t\t\tthrowIfCompromised();\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tconst current = existsSync(this.authPath) ? readFileSync(this.authPath, \"utf-8\") : undefined;\n\t\t\tconst { result, next } = await fn(current);\n\t\t\tthrowIfCompromised();\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tif (next !== undefined) {\n\t\t\t\twriteFileSync(this.authPath, next, AUTH_FILE_WRITE_OPTIONS);\n\t\t\t}\n\t\t\tthrowIfCompromised();\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tif (release) {\n\t\t\t\ttry {\n\t\t\t\t\tawait release();\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore unlock errors when lock is compromised.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport class ReadOnlyAuthStorage implements CredentialStore {\n\tprivate readonly authPath: string;\n\tprivate data: AuthStorageData | undefined;\n\n\tconstructor(authPath: string = join(getAgentDir(), \"auth.json\")) {\n\t\tthis.authPath = normalizePath(authPath);\n\t}\n\n\tprivate load(): AuthStorageData {\n\t\tif (this.data) return this.data;\n\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(stripBom(readFileSync(this.authPath, \"utf-8\")));\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\t\tthis.data = {};\n\t\t\t\treturn this.data;\n\t\t\t}\n\t\t\tthrow new Error(`Failed to read auth.json: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\n\t\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"Invalid auth.json: expected an object\");\n\t\t}\n\t\tfor (const [providerId, credential] of Object.entries(parsed)) {\n\t\t\tif (typeof credential !== \"object\" || credential === null || Array.isArray(credential)) {\n\t\t\t\tthrow new Error(`Invalid auth.json credential for provider \"${providerId}\"`);\n\t\t\t}\n\t\t\tconst value = credential as Record<string, unknown>;\n\t\t\tif (value.type === \"api_key\") {\n\t\t\t\tconst validKey = value.key === undefined || typeof value.key === \"string\";\n\t\t\t\tconst validEnv =\n\t\t\t\t\tvalue.env === undefined ||\n\t\t\t\t\t(typeof value.env === \"object\" &&\n\t\t\t\t\t\tvalue.env !== null &&\n\t\t\t\t\t\t!Array.isArray(value.env) &&\n\t\t\t\t\t\tObject.values(value.env).every((entry) => typeof entry === \"string\"));\n\t\t\t\tif (validKey && validEnv) continue;\n\t\t\t} else if (\n\t\t\t\tvalue.type === \"oauth\" &&\n\t\t\t\ttypeof value.access === \"string\" &&\n\t\t\t\ttypeof value.refresh === \"string\" &&\n\t\t\t\ttypeof value.expires === \"number\" &&\n\t\t\t\tNumber.isFinite(value.expires)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthrow new Error(`Invalid auth.json credential for provider \"${providerId}\"`);\n\t\t}\n\n\t\tthis.data = parsed as AuthStorageData;\n\t\treturn this.data;\n\t}\n\n\tasync read(providerId: string, options?: AuthOperationOptions): Promise<Credential | undefined> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tconst credential = this.load()[providerId];\n\t\toptions?.signal?.throwIfAborted();\n\t\tif (!credential) return undefined;\n\t\tif (credential.type !== \"api_key\" || !credential.key || isCommandConfigValue(credential.key)) {\n\t\t\treturn structuredClone(credential);\n\t\t}\n\t\treturn { ...credential, key: resolveConfigValue(credential.key, credential.env) };\n\t}\n\n\tasync list(options?: AuthOperationOptions): Promise<readonly CredentialInfo[]> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tconst credentials = Object.entries(this.load()).map(([providerId, credential]) => ({\n\t\t\tproviderId,\n\t\t\ttype: credential.type,\n\t\t}));\n\t\toptions?.signal?.throwIfAborted();\n\t\treturn credentials;\n\t}\n\n\tasync modify(\n\t\t_providerId: string,\n\t\t_fn: (current: Credential | undefined) => Promise<Credential | undefined>,\n\t\t_options?: AuthOperationOptions,\n\t): Promise<Credential | undefined> {\n\t\tthrow new Error(\"Read-only credential storage cannot modify auth.json\");\n\t}\n\n\tasync delete(_providerId: string, _options?: AuthOperationOptions): Promise<void> {\n\t\tthrow new Error(\"Read-only credential storage cannot modify auth.json\");\n\t}\n}\n\nexport class InMemoryAuthStorageBackend implements AuthStorageBackend {\n\tprivate value: string | undefined;\n\tprivate asyncChain: Promise<unknown> = Promise.resolve();\n\n\twithLock<T>(fn: (current: string | undefined) => LockResult<T>): T {\n\t\tconst { result, next } = fn(this.value);\n\t\tif (next !== undefined) {\n\t\t\tthis.value = next;\n\t\t}\n\t\treturn result;\n\t}\n\n\twithLockAsync<T>(\n\t\tfn: (current: string | undefined) => Promise<LockResult<T>>,\n\t\toptions?: AuthOperationOptions,\n\t): Promise<T> {\n\t\tconst previous = this.asyncChain;\n\t\tconst operation = (async () => {\n\t\t\tawait previous.catch(() => {});\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tconst { result, next } = await fn(this.value);\n\t\t\toptions?.signal?.throwIfAborted();\n\t\t\tif (next !== undefined) {\n\t\t\t\tthis.value = next;\n\t\t\t}\n\t\t\treturn result;\n\t\t})();\n\t\tthis.asyncChain = operation.catch(() => {});\n\t\treturn raceWithAbortSignal(operation, options?.signal);\n\t}\n}\n\n/**\n * Credential storage backed by a JSON file.\n */\n// Import a media altura (no arriba del todo con el resto): junto al único\n// punto que lo usa, para que el diff de fork quede en un solo hunk en vez de\n// dos separados por 300 líneas. Ver el comentario del constructor.\nimport { envolverBackendCifrado } from \"./credenciales/reposo.ts\";\nexport class AuthStorage implements CredentialStore {\n\tprivate storage: AuthStorageBackend;\n\tprivate authPath: string | undefined;\n\tprivate readState: AuthFileReadState;\n\n\tprivate constructor(storage: AuthStorageBackend, authPath?: string) {\n\t\t// Cifrado en reposo (packages/coding-agent/src/core/credenciales/reposo.ts):\n\t\t// solo se aplica cuando hay authPath Y storage es el backend de fichero de\n\t\t// verdad (nunca a `fromStorage`/`inMemory`, que usan backends sintéticos\n\t\t// para pruebas). Se envuelve aquí — un único punto — porque este fichero\n\t\t// es de upstream y el presupuesto de fork (sync-ada.sh --check) está\n\t\t// agotado: mover la lógica a un fichero nuestro y dejar aquí una sola\n\t\t// llamada es lo que exige esa regla.\n\t\tthis.storage =\n\t\t\tauthPath !== undefined && storage instanceof FileAuthStorageBackend\n\t\t\t\t? envolverBackendCifrado(storage, authPath)\n\t\t\t\t: storage;\n\t\tthis.authPath = authPath;\n\t\tthis.readState =\n\t\t\tauthPath && sharedAuthFileReadState?.authPath === authPath ? sharedAuthFileReadState.readState : { data: {} };\n\t\tif (authPath && !sharedAuthFileReadState) {\n\t\t\tsharedAuthFileReadState = { authPath, readState: this.readState };\n\t\t}\n\t\tif (authPath) {\n\t\t\tconst revision = getFileRevision(authPath);\n\t\t\tif (revision !== undefined && revision === this.readState.revision) return;\n\t\t}\n\t\tthis.reload();\n\t}\n\n\tstatic create(authPath: string = join(getAgentDir(), \"auth.json\")): AuthStorage {\n\t\tconst normalizedAuthPath = normalizePath(authPath);\n\t\treturn new AuthStorage(new FileAuthStorageBackend(normalizedAuthPath), normalizedAuthPath);\n\t}\n\n\tstatic fromStorage(storage: AuthStorageBackend): AuthStorage {\n\t\treturn new AuthStorage(storage);\n\t}\n\n\tstatic inMemory(data: AuthStorageData = {}): AuthStorage {\n\t\tconst storage = new InMemoryAuthStorageBackend();\n\t\tstorage.withLock(() => ({ result: undefined, next: JSON.stringify(data, null, 2) }));\n\t\treturn AuthStorage.fromStorage(storage);\n\t}\n\n\tprivate parseStorageData(content: string | undefined): AuthStorageData {\n\t\tif (!content) {\n\t\t\treturn {};\n\t\t}\n\t\treturn JSON.parse(stripBom(content)) as AuthStorageData;\n\t}\n\n\tprivate updateReadState(data: AuthStorageData, revision?: string): void {\n\t\tthis.readState.data = data;\n\t\tthis.readState.revision = revision;\n\t}\n\n\t/**\n\t * Reload credentials from storage.\n\t */\n\treload(): void {\n\t\tlet content: string | undefined;\n\t\tlet revision: string | undefined;\n\t\ttry {\n\t\t\tthis.storage.withLock((current) => {\n\t\t\t\tcontent = current;\n\t\t\t\trevision = this.authPath ? getFileRevision(this.authPath) : undefined;\n\t\t\t\treturn { result: undefined };\n\t\t\t});\n\t\t\tthis.updateReadState(this.parseStorageData(content), revision);\n\t\t} catch {\n\t\t\t// Preserve the last valid in-memory snapshot.\n\t\t}\n\t}\n\n\tprivate async reloadFromStorageAsync(options?: AuthOperationOptions): Promise<AuthStorageData> {\n\t\treturn this.storage.withLockAsync(async (content) => {\n\t\t\tconst currentData = this.parseStorageData(content);\n\t\t\tconst revision = this.authPath ? getFileRevision(this.authPath) : undefined;\n\t\t\tthis.updateReadState(currentData, revision);\n\t\t\treturn { result: currentData };\n\t\t}, options);\n\t}\n\n\tprivate async readLatestData(options?: AuthOperationOptions): Promise<AuthStorageData> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tif (!this.authPath) {\n\t\t\tconst reload = this.reloadFromStorageAsync(options);\n\t\t\treturn options?.signal ? reload : reload.catch(() => this.readState.data);\n\t\t}\n\t\tconst revision = getFileRevision(this.authPath);\n\t\tif (revision !== undefined && revision === this.readState.revision) return this.readState.data;\n\t\tif (!this.readState.reload) {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst reload: AuthFileReload = {\n\t\t\t\tcontroller,\n\t\t\t\tpromise: this.reloadFromStorageAsync({ signal: controller.signal }),\n\t\t\t\treaders: 0,\n\t\t\t};\n\t\t\tthis.readState.reload = reload;\n\t\t\tvoid reload.promise.then(\n\t\t\t\t() => {\n\t\t\t\t\tif (this.readState.reload === reload) this.readState.reload = undefined;\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tif (this.readState.reload === reload) this.readState.reload = undefined;\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tconst reload = this.readState.reload;\n\t\treload.readers++;\n\t\ttry {\n\t\t\tconst result = raceWithAbortSignal(reload.promise, options?.signal);\n\t\t\treturn options?.signal ? await result : await result.catch(() => this.readState.data);\n\t\t} finally {\n\t\t\treload.readers--;\n\t\t\tif (reload.readers === 0 && this.readState.reload === reload) {\n\t\t\t\tthis.readState.reload = undefined;\n\t\t\t\treload.controller.abort();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync read(provider: string, options?: AuthOperationOptions): Promise<Credential | undefined> {\n\t\tconst credential = (await this.readLatestData(options))[provider];\n\t\toptions?.signal?.throwIfAborted();\n\t\tif (credential?.type !== \"api_key\") return credential;\n\t\tif (credential.key === undefined) return credential;\n\t\treturn { ...credential, key: resolveConfigValue(credential.key, credential.env) };\n\t}\n\n\tasync modify(\n\t\tprovider: string,\n\t\tfn: (current: Credential | undefined) => Promise<Credential | undefined>,\n\t\toptions?: AuthOperationOptions,\n\t): Promise<Credential | undefined> {\n\t\tlet latestData = this.readState.data;\n\t\tlet revision: string | undefined;\n\t\tconst result = await this.storage.withLockAsync(async (content) => {\n\t\t\tconst currentData = this.parseStorageData(content);\n\t\t\tconst next = await fn(currentData[provider]);\n\t\t\tif (next === undefined) {\n\t\t\t\tlatestData = currentData;\n\t\t\t\trevision = this.authPath ? getFileRevision(this.authPath) : undefined;\n\t\t\t\treturn { result: currentData[provider] };\n\t\t\t}\n\n\t\t\tconst merged: AuthStorageData = { ...currentData, [provider]: next };\n\t\t\tlatestData = merged;\n\t\t\treturn { result: next, next: JSON.stringify(merged, null, 2) };\n\t\t}, options);\n\t\tthis.updateReadState(latestData, revision);\n\t\treturn result;\n\t}\n\n\tasync delete(provider: string, options?: AuthOperationOptions): Promise<void> {\n\t\tlet latestData = this.readState.data;\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst currentData = this.parseStorageData(content);\n\t\t\tdelete currentData[provider];\n\t\t\tlatestData = currentData;\n\t\t\treturn { result: undefined, next: JSON.stringify(currentData, null, 2) };\n\t\t}, options);\n\t\tthis.updateReadState(latestData);\n\t}\n\n\t/** List credential metadata without resolving configured key values. */\n\tasync list(options?: AuthOperationOptions): Promise<readonly CredentialInfo[]> {\n\t\tconst entries = Object.entries(await this.readLatestData(options));\n\t\toptions?.signal?.throwIfAborted();\n\t\treturn entries.map(([providerId, credential]) => ({ providerId, type: credential.type }));\n\t}\n}\n\n/**\n * One-off synchronous read of a stored credential from an auth.json file,\n * without instantiating a store or resolving configured key values.\n */\nexport function readStoredCredential(\n\tproviderId: string,\n\tauthPath: string = join(getAgentDir(), \"auth.json\"),\n): Credential | undefined {\n\ttry {\n\t\tconst data = JSON.parse(stripBom(readFileSync(normalizePath(authPath), \"utf-8\"))) as AuthStorageData;\n\t\treturn data[providerId];\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"auth-storage.d.ts","sourceRoot":"","sources":["../../src/core/auth-storage.ts"],"names":[],"mappings":"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"}