@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":"pi-manifest.js","sourceRoot":"","sources":["../../src/core/pi-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAS5C,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAE/E,SAAS,QAAQ,CAAC,KAAc,EAAoC;IACnE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAAA,CAC5E;AAED,MAAM,UAAU,cAAc,CAAC,eAAuB,EAAqB;IAC1E,IAAI,CAAC;QACJ,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACnF,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YAC3B,CAAC;QACF,CAAC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AAAA,CACD","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { stripBom } from \"../utils/text.ts\";\n\nexport interface PiManifest {\n\textensions?: string[];\n\tskills?: string[];\n\tprompts?: string[];\n\tthemes?: string[];\n}\n\nconst RESOURCE_FIELDS = [\"extensions\", \"skills\", \"prompts\", \"themes\"] as const;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function readPiManifest(packageJsonPath: string): PiManifest | null {\n\ttry {\n\t\tconst pkg: unknown = JSON.parse(stripBom(readFileSync(packageJsonPath, \"utf-8\")));\n\t\tif (!isObject(pkg) || !isObject(pkg.pi)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst manifest: PiManifest = {};\n\t\tfor (const field of RESOURCE_FIELDS) {\n\t\t\tconst entries = pkg.pi[field];\n\t\t\tif (Array.isArray(entries) && entries.every((entry) => typeof entry === \"string\")) {\n\t\t\t\tmanifest[field] = entries;\n\t\t\t}\n\t\t}\n\t\treturn manifest;\n\t} catch {\n\t\treturn null;\n\t}\n}\n"]}
1
+ {"version":3,"file":"pi-manifest.js","sourceRoot":"","sources":["../../src/core/pi-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAS5C,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAE/E,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,eAAuB;IACrD,IAAI,CAAC;QACJ,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACnF,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YAC3B,CAAC;QACF,CAAC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"categorias-especiales.d.ts","sourceRoot":"","sources":["../../../src/core/privacidad/categorias-especiales.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAEH,0DAAwD;AACxD,MAAM,MAAM,iBAAiB,GAC1B,OAAO,GACP,UAAU,GACV,eAAe,GACf,UAAU,GACV,kBAAkB,GAClB,aAAa,GACb,YAAY,GACZ,UAAU,GACV,UAAU,GACV,wBAAwB,CAAC;AAE5B,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,iBAAiB,CAAC;IAC7B;;;;;;;;;OASG;IACH,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IACrB,0EAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,mCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,iBAAiB,CAAC;IACpD,YAAY,MAAM,EAAE,cAAc,GAAG,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAItE;CACD;AAED,qFAAmF;AACnF,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC,kFAAgF;AAChF,eAAO,MAAM,OAAO,KAAK,CAAC;AA2D1B;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAmB5C;AAQD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIhE;AAED,uEAAsE;AACtE,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIjF;AASD,qFAAiF;AACjF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAShD;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKrF;AA8aD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAkFtE;AAKD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiB/D","sourcesContent":["/**\n * Detectar las CATEGORÍAS ESPECIALES del artículo 9 del RGPD (y las condenas\n * del artículo 10) en un texto, sin repetir el texto en el hallazgo.\n *\n * POR QUÉ EXISTE, medido antes de escribir nada. El escáner de\n * `memory-engine/security.ts` tiene cinco patrones de datos personales\n * (correo, teléfono, DNI/NIE, IBAN, fecha de nacimiento) y CERO del artículo 9.\n * Sobre un corpus de 24 cadenas que sí deberían saltar, en nivel `strict`\n * fallaban 20. Entre las 20: «baja por depresión», «afiliado a CCOO»,\n * «HIV positive», «huella dactilar registrada», «tiene antecedentes penales».\n * Ninguna de ellas tiene hoy categoría en `SensitiveCategory`, así que\n * `redactSensitive` las devuelve idénticas, sin un solo bloque: hoy una\n * categoría especial se escribe EN CLARO en el libro de auditoría\n * (`audit/libro.ts`), en la exportación y en el diario de edición.\n *\n * El coste no es simétrico con el de un correo. Tratar datos de salud,\n * afiliación sindical, origen étnico, religión, opinión política, vida sexual,\n * biometría o genética está PROHIBIDO salvo excepción tasada (art. 9.1 y 9.2),\n * y las condenas penales sólo pueden tratarse bajo control de la autoridad\n * (art. 10). Filtrar uno de estos no es un incidente de privacidad: es un\n * tratamiento ilícito.\n *\n * LAS DOS MITADES. Un detector de vocabulario ingenuo es peor que ninguno.\n * «diagnóstico» sale de cualquier compilador, «union» de cualquier SQL,\n * «race» de cualquier `race condition`, y un identificador interno de ocho\n * cifras no es un DNI. Un detector que grita sobre todo se desactiva en una\n * semana y entonces no protege de nada. Por eso aquí hay dos mecanismos, y\n * los dos se miden contra el corpus benigno:\n *\n * 1. Los IDENTIFICADORES se VALIDAN, no se reconocen por su forma. DNI y NIE\n * por la letra de control (módulo 23 sobre TRWAGMYFPDXBNJZSQVHLCKE), IBAN\n * y número de la Seguridad Social por módulo 97. Esto no es sólo rigor:\n * es lo que hace desaparecer el único falso positivo medido del escáner\n * actual —el UUID `550e8400-e29b-41d4-a716-446655440000`, cuyo fragmento\n * `446655440000` tiene forma de NSS pero da 56 donde debería dar 00—.\n *\n * 2. El VOCABULARIO ambiguo exige CO-OCURRENCIA con un marcador de persona.\n * «diagnóstico» solo no dispara; «su diagnóstico» sí. Ver `VENTANA`.\n *\n * LA VENTANA es de 60 caracteres entre los bordes más cercanos del término y\n * del marcador. Una oración simple en español ronda las 10-12 palabras, unos\n * 60-70 caracteres; dentro de eso el marcador y el término suelen compartir\n * sujeto. Más allá ya son dos frases distintas y la co-ocurrencia deja de\n * significar nada: el marcador habla de una persona y el término, de otra cosa.\n * Medido sobre el corpus: con 60 caracteres las 12 cadenas benignas salen\n * limpias y las 19 sensibles por vocabulario salen todas.\n *\n * QUÉ NO HACE, y conviene que conste:\n *\n * · No entiende negación ni hipótesis. «no está de baja por depresión» y\n * «si estuviera de baja por depresión» disparan igual. Es deliberado: en\n * un detector de fugas el falso negativo se paga más caro que el falso\n * positivo POR CADA CASO, y la negación en texto libre no se resuelve con\n * una lista de palabras.\n * · No cubre `fingerprint` ni `huella digital` como biometría, porque en\n * este repositorio son la huella de un certificado o de un fichero. Sí\n * cubre «huella dactilar», que no tiene lectura técnica.\n * · La matrícula española no tiene dígito de control: es la única forma sin\n * validar de las cinco. Se compensa exigiendo el alfabeto real de las\n * placas (consonantes, sin vocales ni Ñ ni Q), que descarta casi cualquier\n * token accidental de cuatro cifras y tres letras.\n * · No sustituye a `classifySensitive`: es complementario. Aquí no hay\n * correos, ni teléfonos, ni tarjetas.\n */\n\n/** Las diez categorías que este módulo sabe nombrar. */\nexport type CategoriaEspecial =\n\t| \"salud\"\n\t| \"sindical\"\n\t| \"origen-etnico\"\n\t| \"religion\"\n\t| \"opinion-politica\"\n\t| \"vida-sexual\"\n\t| \"biometrico\"\n\t| \"genetico\"\n\t| \"condenas\"\n\t| \"identificador-nacional\";\n\nexport interface HallazgoEspecial {\n\tcategoria: CategoriaEspecial;\n\t/**\n\t * El artículo del RGPD que hace especial al dato. Es lo que el DPO necesita\n\t * en su informe: el 9 exige una de las excepciones del 9.2, el 10 exige\n\t * control de la autoridad pública.\n\t *\n\t * `identificador-nacional` se marca como \"9\" porque la API sólo admite dos\n\t * valores, pero su base real es el art. 87 (número de identificación\n\t * nacional, condiciones específicas de cada Estado miembro). Quien redacte\n\t * el informe debe leerlo así.\n\t */\n\tarticulo: \"9\" | \"10\";\n\t/** Posición inicial en el texto, para poder redactar sólo ese trozo. */\n\tdesde: number;\n\t/** Posición final (exclusiva). */\n\thasta: number;\n\t/**\n\t * La FORMA que lo disparó. NUNCA el texto detectado: un informe de fuga que\n\t * cita la fuga es otra fuga, y estos hallazgos van a un libro de auditoría\n\t * que se exporta.\n\t */\n\tporque: string;\n}\n\n/**\n * El tercer estado: «no he podido mirar».\n *\n * Una lista vacía significa «he mirado el texto entero y no hay nada». Si el\n * módulo no puede analizar, devolver `[]` convertiría un fallo en un permiso:\n * quien llama guardaría la nota creyendo que está limpia. Por eso se LANZA.\n *\n * Se lanza en dos casos, y sólo en dos:\n * · `no-es-cadena`: llega algo que no es `string` (un `null` de una API, un\n * objeto que alguien esperaba serializado).\n * · `demasiado-largo`: por encima de `LIMITE_CARACTERES`. El barrido es\n * lineal por patrón, pero son ~80 patrones y la búsqueda de marcadores es\n * cuadrática en el número de coincidencias; con un volcado de megabytes el\n * detector deja de responder y quien llama se queda colgado sin saber por\n * qué. Falla rápido y explícito.\n */\nexport class TextoNoAnalizable extends Error {\n\treadonly motivo: \"no-es-cadena\" | \"demasiado-largo\";\n\tconstructor(motivo: \"no-es-cadena\" | \"demasiado-largo\", detalle: string) {\n\t\tsuper(`No se pudo analizar el texto (${motivo}): ${detalle}`);\n\t\tthis.name = \"TextoNoAnalizable\";\n\t\tthis.motivo = motivo;\n\t}\n}\n\n/** 200.000 caracteres ≈ 200 KB. Una nota de memoria razonable no llega a 10 KB. */\nexport const LIMITE_CARACTERES = 200_000;\n\n/** Caracteres de distancia máxima entre el término y su marcador de persona. */\nexport const VENTANA = 60;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plegado: quitar acentos y mayúsculas SIN mover ni un índice\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * `NFD` + quitar diacríticos cambiaría la longitud y con ella `desde`/`hasta`,\n * que dejarían de servir para redactar el original. Aquí se mapea carácter a\n * carácter, uno a uno, para que el texto plegado y el original compartan\n * índices exactamente.\n */\nconst EQUIVALENTES: Record<string, string> = {\n\tá: \"a\",\n\tà: \"a\",\n\tä: \"a\",\n\tâ: \"a\",\n\té: \"e\",\n\tè: \"e\",\n\të: \"e\",\n\tê: \"e\",\n\tí: \"i\",\n\tì: \"i\",\n\tï: \"i\",\n\tî: \"i\",\n\tó: \"o\",\n\tò: \"o\",\n\tö: \"o\",\n\tô: \"o\",\n\tú: \"u\",\n\tù: \"u\",\n\tü: \"u\",\n\tû: \"u\",\n\tñ: \"n\",\n\tç: \"c\",\n\tÁ: \"a\",\n\tÀ: \"a\",\n\tÄ: \"a\",\n\tÂ: \"a\",\n\tÉ: \"e\",\n\tÈ: \"e\",\n\tË: \"e\",\n\tÊ: \"e\",\n\tÍ: \"i\",\n\tÌ: \"i\",\n\tÏ: \"i\",\n\tÎ: \"i\",\n\tÓ: \"o\",\n\tÒ: \"o\",\n\tÖ: \"o\",\n\tÔ: \"o\",\n\tÚ: \"u\",\n\tÙ: \"u\",\n\tÜ: \"u\",\n\tÛ: \"u\",\n\tÑ: \"n\",\n\tÇ: \"c\",\n};\n\n/**\n * Devuelve el texto en minúsculas, sin acentos y con TODO espacio en blanco\n * convertido en un espacio simple, con la MISMA longitud.\n *\n * Lo del salto de línea no es cosmético y se midió: con el salto intacto,\n * «perfil\\ngenético» y «trade\\nunion» salían LIMPIOS —los patrones de varias\n * palabras llevan un espacio literal— y un dato de categoría especial partido\n * por un ajuste de línea es exactamente lo que produce cualquier editor, todo\n * correo citado y todo comentario de código. Se arregla aquí, en el plegado,\n * y no patrón a patrón: son ~30 patrones de varias palabras y arreglar sólo\n * los que uno recuerda deja el resto igual de ciegos.\n */\nexport function plegar(texto: string): string {\n\tlet salida = \"\";\n\tfor (let i = 0; i < texto.length; i++) {\n\t\tconst c = texto[i] as string;\n\t\tif (c === \"\\n\" || c === \"\\r\" || c === \"\\t\" || c === \"\\f\" || c === \"\\v\") {\n\t\t\tsalida += \" \";\n\t\t\tcontinue;\n\t\t}\n\t\tconst equivalente = EQUIVALENTES[c];\n\t\tif (equivalente !== undefined) {\n\t\t\tsalida += equivalente;\n\t\t\tcontinue;\n\t\t}\n\t\tconst minuscula = c.toLowerCase();\n\t\t// Hay caracteres cuya minúscula ocupa dos unidades ('İ' → 'i̇'). Ésos se\n\t\t// dejan como están: mover un índice cuesta más que perder una coincidencia.\n\t\tsalida += minuscula.length === 1 ? minuscula : c;\n\t}\n\treturn salida;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Validación de identificadores\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst LETRAS_DNI = \"TRWAGMYFPDXBNJZSQVHLCKE\";\n\n/**\n * Letra de control del DNI: módulo 23 sobre la tabla oficial.\n *\n * Acepta los puntos de millar («12.345.678»), que es como se imprime en la\n * tarjeta y como lo teclea la mitad de la gente.\n */\nexport function dniValido(numero: string, letra: string): boolean {\n\tconst digitos = numero.replace(/\\./g, \"\");\n\tif (!/^\\d{8}$/.test(digitos)) return false;\n\treturn LETRAS_DNI[Number(digitos) % 23] === letra.toUpperCase();\n}\n\n/** NIE: la inicial X/Y/Z vale 0/1/2 y luego es el mismo módulo 23. */\nexport function nieValido(inicial: string, numero: string, letra: string): boolean {\n\tconst prefijo = { X: \"0\", Y: \"1\", Z: \"2\" }[inicial.toUpperCase()];\n\tif (prefijo === undefined) return false;\n\treturn dniValido(prefijo + numero, letra);\n}\n\n/** Resto módulo 97 de una cadena de dígitos, sin desbordar el entero. */\nfunction modulo97(digitos: string): number {\n\tlet resto = 0;\n\tfor (const d of digitos) resto = (resto * 10 + Number(d)) % 97;\n\treturn resto;\n}\n\n/** IBAN: mover los cuatro primeros al final, letra → número, y módulo 97 = 1. */\nexport function ibanValido(iban: string): boolean {\n\tconst limpio = iban.replace(/\\s/g, \"\").toUpperCase();\n\tif (!/^[A-Z]{2}\\d{2}[A-Z0-9]{10,30}$/.test(limpio)) return false;\n\tconst rotado = limpio.slice(4) + limpio.slice(0, 4);\n\tlet digitos = \"\";\n\tfor (const c of rotado) {\n\t\tdigitos += c >= \"A\" && c <= \"Z\" ? String(c.charCodeAt(0) - 55) : c;\n\t}\n\treturn modulo97(digitos) === 1;\n}\n\n/**\n * Número de la Seguridad Social: provincia (2) + número (8) + control (2),\n * donde el control es el módulo 97 de los diez primeros dígitos.\n *\n * La excepción documentada: cuando el número de afiliación es menor que\n * 10.000.000 —es decir, empieza por cero— el código de provincia se coloca\n * DETRÁS. Se prueban las dos lecturas y basta con que una cuadre; probar sólo\n * la principal perdería a todos los afiliados antiguos.\n */\nexport function nssValido(provincia: string, numero: string, control: string): boolean {\n\tconst esperado = Number(control);\n\tif (modulo97(provincia + numero) === esperado) return true;\n\tif (numero.startsWith(\"0\")) return modulo97(numero + provincia) === esperado;\n\treturn false;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Marcadores de persona\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Lo que sitúa un dato EN UNA PERSONA. Sin uno de éstos cerca, el vocabulario\n * ambiguo no dispara.\n *\n * No están los artículos («el», «la», «los»): son tan frecuentes que\n * convertirían la co-ocurrencia en un adorno —todo texto en español tiene un\n * artículo a menos de 60 caracteres de cualquier cosa—. Sí están los posesivos\n * y los pronombres, que es lo que atribuye el dato a alguien.\n *\n * «de baja» / «baja por» entran porque una baja es siempre de una persona; es\n * el marcador que sostiene «baja por depresión», donde no hay ningún pronombre.\n */\nconst MARCADORES: RegExp[] = [\n\t/\\b(?:yo|tu|ella|ellos|ellas|nosotros|nosotras|vosotros|usted|ustedes)\\b/g,\n\t// SIN `su` ni `sus`, y es una corrección medida. En español el posesivo de\n\t// tercera persona vale para CUALQUIER antecedente, animado o no: «agrega sus\n\t// diagnósticos» habla de un comprobador, no de un paciente. Con `su`/`sus`\n\t// dentro, 7 de los 10 falsos positivos que quedaban sobre `src` venían de\n\t// ahí. Los de primera y segunda persona sí implican a alguien.\n\t/\\b(?:mi|mis|tus|nuestro|nuestra|nuestros|nuestras)\\b/g,\n\t// SIN `i`: es la variable de bucle de todo el código escrito jamás, y sobre\n\t// el plegado no hay forma de distinguirla del pronombre inglés.\n\t/\\b(?:he|she|they|we|my|his|her|their|our|your|him|them)\\b/g,\n\t/\\b(?:paciente|pacientes|enfermo|enferma|empleado|empleada|empleados|empleadas)\\b/g,\n\t/\\b(?:trabajador|trabajadora|trabajadores|usuario|usuaria|usuarios|cliente|clientes)\\b/g,\n\t/\\b(?:candidato|candidata|afiliado|afiliada|socio|socia|miembro|companero|companera|colega)\\b/g,\n\t/\\b(?:patient|employee|employees|worker|workers|user|users|customer|member|colleague)\\b/g,\n\t/\\b(?:don|dona|sr|sra|senor|senora|mr|mrs|ms)\\b/g,\n\t/\\bde baja\\b|\\bbaja por\\b|\\bsick leave\\b|\\bon leave\\b/g,\n];\n\n/**\n * Nombre y apellido SEGUIDOS: dos palabras capitalizadas pegadas, ni al\n * principio del texto ni tras un punto.\n *\n * MEDIDO, y es la corrección más cara de este módulo. Antes bastaba UNA palabra\n * capitalizada. Sobre los 469 ficheros `.ts` reales de `src` eso daba 20.272\n * marcadores: en un repositorio documentado en español toda palabra que abre\n * frase dentro de un bloque de documentación y todo nombre de tipo\n * (`Comprobador`, `Deteccion`, `Diagnostico`) valía por «una persona». El\n * resultado era que la co-ocurrencia no filtraba nada y el detector marcaba 51\n * veces palabras como `diagnóstico` y `positivo` —la segunda dentro de la\n * expresión «falso positivo», que es justo lo que este módulo intenta evitar—.\n * Exigiendo las dos palabras seguidas quedan 351 candidatos sobre el mismo\n * corpus, y ninguno acaba produciendo un hallazgo.\n *\n * Lo que se paga: «Ana padece esclerosis» ya no tiene marcador por el nombre.\n * Se acepta a sabiendas —un nombre de pila suelto es indistinguible de un\n * identificador de código— y se compensa con el vocabulario sin marcador.\n */\nconst NOMBRE_COMPLETO = /\\b[A-ZÁÉÍÓÚÑ][a-záéíóúñ]{2,} [A-ZÁÉÍÓÚÑ][a-záéíóúñ]{2,}\\b/g;\n\ninterface Tramo {\n\tdesde: number;\n\thasta: number;\n}\n\nfunction marcadoresDe(plegado: string, original: string): Tramo[] {\n\tconst tramos: Tramo[] = [];\n\tfor (const patron of MARCADORES) {\n\t\tfor (const m of plegado.matchAll(patron)) {\n\t\t\ttramos.push({ desde: m.index, hasta: m.index + m[0].length });\n\t\t}\n\t}\n\tfor (const m of original.matchAll(NOMBRE_COMPLETO)) {\n\t\tconst antes = original.slice(0, m.index).trimEnd();\n\t\tif (antes.length === 0) continue; // primera palabra del texto\n\t\tif (/[.!?¿¡:]$/.test(antes)) continue; // primera palabra de la oración\n\t\ttramos.push({ desde: m.index, hasta: m.index + m[0].length });\n\t}\n\treturn tramos;\n}\n\n/** ¿Hay algún marcador a menos de `VENTANA` del término, sin solaparlo? */\nfunction tieneMarcadorCerca(termino: Tramo, marcadores: Tramo[]): boolean {\n\tfor (const m of marcadores) {\n\t\tif (m.desde < termino.hasta && termino.desde < m.hasta) continue; // se solapan: es el propio término\n\t\tconst distancia = m.desde >= termino.hasta ? m.desde - termino.hasta : termino.desde - m.hasta;\n\t\tif (distancia <= VENTANA) return true;\n\t}\n\treturn false;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Vocabulario\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface Termino {\n\tcategoria: CategoriaEspecial;\n\tpatron: RegExp;\n\t/** `true` = ambiguo fuera de contexto, exige marcador de persona cerca. */\n\texigeMarcador: boolean;\n\t/**\n\t * `true` = el patrón corre sobre el texto ORIGINAL, no sobre el plegado.\n\t *\n\t * Es para las siglas: un sindicato se escribe SIEMPRE en mayúsculas, y sobre\n\t * el plegado `USO` es indistinguible de «uso» y `LAB` de «lab». Medido: la\n\t * lista de siglas sobre el plegado producía 64 hallazgos sobre los ficheros\n\t * reales de `src` —todos «uso» y «usó»—; la misma lista en mayúsculas sobre\n\t * el original produce CERO, sin perder «afiliado a CCOO».\n\t */\n\tsobreOriginal?: boolean;\n}\n\n/**\n * Español e inglés en la misma tabla. Lo que entra sin marcador es lo que no\n * tiene otra lectura en un repositorio de software: `diabetes` no sale de un\n * compilador. Lo que exige marcador es lo que sí sale: `diagnostico`,\n * `depresion`, `positivo`.\n *\n * Ausencias deliberadas, cada una por un falso positivo concreto:\n * · `union` a secas → `union type`, `UNION ALL`. Sólo entra en locuciones\n * («union member», «trade union»).\n * · `race` a secas → `race condition`. Sólo entra «racial origin».\n * · `podemos` como partido → es la primera persona del plural de «poder».\n * Se cubre por la locución «votante de», que revela la opinión política\n * sea cual sea el partido.\n * · `master`, `slave`, `blacklist` → vocabulario técnico, no étnico.\n */\nconst TERMINOS: Termino[] = [\n\t// ── Salud (art. 9) ──\n\t{ categoria: \"salud\", patron: /\\bdiabetes\\b|\\bdiabetic(?:o|a|os|as)?\\b/g, exigeMarcador: false },\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\balergi(?:a|as)\\b|\\balergic(?:o|a)\\b|\\ballerg(?:y|ic|ies)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{ categoria: \"salud\", patron: /\\b(?:vih|hiv|sida|aids|hepatitis|tuberculosis)\\b/g, exigeMarcador: false },\n\t{ categoria: \"salud\", patron: /\\bcancer\\b|\\bleucemia\\b|\\bleukemia\\b|\\btumor(?:es)?\\b/g, exigeMarcador: false },\n\t{ categoria: \"salud\", patron: /\\bgrupo sanguineo\\b|\\bblood (?:type|group)\\b/g, exigeMarcador: false },\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\ben tratamiento (?:con|por|de)\\b|\\bunder treatment for\\b|\\bon medication\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\b(?:sertralina|fluoxetina|paroxetina|litio|insulina|metformina|antidepresiv(?:o|os)|antirretroviral(?:es)?|quimioterapia|chemotherapy)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\bhistoria clinica\\b|\\bhistorial medico\\b|\\bmedical (?:record|history)\\b|\\binforme medico\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\bembarazad(?:a|as)\\b|\\bpregnan(?:t|cy)\\b|\\bdiscapacidad\\b|\\bminusvalia\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t// `diagnostico` PARTIDO EN DOS, y es la lección más cara del módulo. En un\n\t// agente de programación «diagnóstico» es lo que escupe el compilador: sobre\n\t// `src` aparece 46 veces y ninguna habla de la salud de nadie. La forma que\n\t// sí es art. 9 no es la palabra suelta, es la CONSTRUCCIÓN: a alguien se le\n\t// diagnostica ALGO. Ésa no exige marcador porque ya lo lleva dentro.\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\bdiagnosticad(?:o|a|os|as) (?:de|con)\\b|\\bdiagnos(?:ed with|is of)\\b|\\bdiagnostico (?:medico|clinico|psiquiatrico|psicologico|de cancer)\\b|\\bmedical diagnosis\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\bdiagnostic(?:o|os|ado|ada|ados|adas)\\b|\\bdiagnos(?:is|ed)\\b/g,\n\t\texigeMarcador: true,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\bdepresion\\b|\\bansiedad\\b|\\bdepression\\b|\\banxiety\\b|\\bburnout\\b/g,\n\t\texigeMarcador: true,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\benfermedad(?:es)?\\b|\\bdolencia\\b|\\billness\\b|\\bdisease\\b|\\bsintomas\\b/g,\n\t\texigeMarcador: true,\n\t},\n\t// `positivo` va sin «falso» ni «false» delante: «falso positivo» es la\n\t// expresión de oficio de este repositorio —medido, 5 hallazgos en `src`, uno\n\t// de ellos en un comentario que explica cómo evitar falsos positivos— y no\n\t// habla de la serología de nadie.\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /(?<!\\bfals[oa]s? )(?<!\\bfalse )(?:\\bpositiv(?:o|a)\\b|\\bpositive\\b|\\bseropositiv(?:o|a)\\b)/g,\n\t\texigeMarcador: true,\n\t},\n\t// Patologías sin lectura técnica: no salen de un compilador, así que no\n\t// exigen marcador. Coste medido sobre los 469 ficheros de `src` y sobre 200\n\t// commits: CERO hallazgos.\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\besquizofrenia\\b|\\bbipolar\\b|\\bepilep(?:sia|tic(?:o|a))\\b|\\balzheimer\\b|\\bparkinson\\b|\\bdialisis\\b|\\besclerosis\\b|\\bfibromialgia\\b|\\bcelia(?:co|ca)\\b|\\basma\\b|\\bictus\\b|\\binfarto\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\bsuicidi(?:o|os|arse)\\b|\\bautolesion(?:es)?\\b|\\bsalud mental\\b|\\bmental health\\b|\\bingreso psiquiatric(?:o|a)\\b|\\bpsiquiatric(?:o|a)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\badict(?:o|a) a\\b|\\balcoholi(?:co|ca|smo)\\b|\\bdrogodependien\\w*\\b|\\bdesintoxicacion\\b|\\brehabilitacion\\b|\\btoxicoman\\w*\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\bbaja medica\\b|\\bbaja laboral\\b|\\bincapacidad (?:temporal|permanente|laboral)\\b|\\bsick leave\\b|\\bmedical leave\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\babortion\\b|\\binterrupcion (?:voluntaria )?del embarazo\\b|\\btratamiento de fertilidad\\b|\\bmiscarriage\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t// Siglas clínicas, en mayúsculas y sobre el original. Sólo las que no\n\t// colisionan con vocabulario técnico: fuera `IAM` (AWS), `ACV`, `TOC` (tabla\n\t// de contenidos) y `SNS`, que en un repositorio son otra cosa.\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\b(?:TDAH|TEPT|EPOC|VHC|VHB)\\b/g,\n\t\texigeMarcador: false,\n\t\tsobreOriginal: true,\n\t},\n\n\t// ── Afiliación sindical (art. 9) ──\n\t// EN MAYÚSCULAS y sobre el original: ver `sobreOriginal`. `uso`, `lab`, `cnt`\n\t// y `ela` en minúsculas son palabras corrientes, no sindicatos.\n\t{\n\t\tcategoria: \"sindical\",\n\t\tpatron: /\\b(?:CCOO|UGT|CGT|CNT|USO|ELA|LAB|CIG|SATSE|CSIF)\\b/g,\n\t\texigeMarcador: false,\n\t\tsobreOriginal: true,\n\t},\n\t// `liberado sindical` y `seccion sindical` llevan la palabra dentro: no hay\n\t// otra lectura. `huelga` sí la tiene —«huelga decir»— y además una huelga\n\t// convocada no es un dato de nadie; lo que revela afiliación es que una\n\t// PERSONA aparezca al lado. De ahí el marcador sólo en la segunda.\n\t{\n\t\tcategoria: \"sindical\",\n\t\tpatron: /\\bliberad(?:o|a) sindical\\b|\\bseccion sindical\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{ categoria: \"sindical\", patron: /\\bhuelga\\b|\\bpiquete\\b/g, exigeMarcador: true },\n\t{\n\t\tcategoria: \"sindical\",\n\t\tpatron:\n\t\t\t/\\bsindicat(?:o|os)\\b|\\bsindicalista\\b|\\bafiliacion sindical\\b|\\bdelegad(?:o|a) sindical\\b|\\bcomite de empresa\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"sindical\",\n\t\tpatron: /\\bunion member(?:ship)?\\b|\\btrade union\\b|\\blabou?r union\\b|\\bunioni[sz]ed\\b|\\bshop steward\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Origen étnico o racial (art. 9) ──\n\t{\n\t\tcategoria: \"origen-etnico\",\n\t\tpatron:\n\t\t\t/\\bde origen (?:marroqui|gitan(?:o|a)|magrebi|subsaharian(?:o|a)|arabe|bereber|judi(?:o|a)|latin(?:o|a)|rumen(?:o|a)|rumano|rumana|chin(?:o|a)|african(?:o|a)|asiatic(?:o|a)|indi(?:o|a)|turc(?:o|a)|paquistani|senegales|ecuatorian(?:o|a)|bolivian(?:o|a)|etnic(?:o|a))\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"origen-etnico\",\n\t\tpatron:\n\t\t\t/\\betnia\\b|\\bgitan(?:o|a|os|as)\\b|\\bracial origin\\b|\\bethnic (?:origin|group|background|minority)\\b|\\bethnicity\\b|\\borigen racial\\b|\\bminoria etnica\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Religión o creencias (art. 9) ──\n\t{\n\t\tcategoria: \"religion\",\n\t\tpatron:\n\t\t\t/\\bmusulman(?:a|es|as)?\\b|\\bmuslim\\b|\\bislamic(?:o|a)?\\b|\\bcatolic(?:o|a|os|as)\\b|\\bcatholic\\b|\\bevangelic(?:o|a)\\b|\\bprotestante\\b|\\bjudi(?:o|a)\\b|\\bjewish\\b|\\bhindu\\b|\\bbudista\\b|\\bbuddhist\\b|\\btestigo de jehova\\b|\\bate(?:o|a)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t// `agnostico` sale de la lista: medido, en `src` aparece una vez y es\n\t// «agnóstico de proveedor». La creencia religiosa que hay que cazar es la\n\t// que se declara, no la que se niega con una palabra que además es jerga.\n\t{\n\t\tcategoria: \"religion\",\n\t\tpatron:\n\t\t\t/\\bcreencias religiosas\\b|\\breligious belief(?:s)?\\b|\\bconviccion religiosa\\b|\\bpractica religiosa\\b|\\bmotivos religiosos\\b|\\bramadan\\b|\\bkosher\\b|\\bhalal\\b|\\bva a misa\\b|\\bbautizad(?:o|a)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Opiniones políticas (art. 9) ──\n\t{\n\t\tcategoria: \"opinion-politica\",\n\t\tpatron:\n\t\t\t/\\bvotante de\\b|\\bvot(?:a|o|e) a\\b|\\bvoted for\\b|\\bmilitante de\\b|\\bsimpatizante de\\b|\\bafiliad(?:o|a) al partido\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"opinion-politica\",\n\t\tpatron:\n\t\t\t/\\bpartido popular\\b|\\bpsoe\\b|\\bizquierda unida\\b|\\bpartido comunista\\b|\\bideologia politica\\b|\\bpolitical (?:opinion|affiliation|party)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Vida sexual u orientación sexual (art. 9) ──\n\t{\n\t\tcategoria: \"vida-sexual\",\n\t\tpatron:\n\t\t\t/\\bgay\\b|\\blesbian(?:a|as)?\\b|\\bbisexual\\b|\\bhomosexual\\b|\\bheterosexual\\b|\\btransexual\\b|\\btransgener(?:o|a)\\b|\\btransgender\\b|\\bqueer\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"vida-sexual\",\n\t\tpatron:\n\t\t\t/\\borientacion sexual\\b|\\bsexual orientation\\b|\\bidentidad de genero\\b|\\bgender identity\\b|\\bpareja de hecho\\b|\\bcivil partnership\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Datos biométricos (art. 9) ──\n\t{\n\t\tcategoria: \"biometrico\",\n\t\tpatron:\n\t\t\t/\\bhuella(?:s)? dactilar(?:es)?\\b|\\breconocimiento facial\\b|\\bfacial recognition\\b|\\bfingerprint scan(?:ner)?\\b|\\biris scan\\b|\\bescaneo de iris\\b|\\bvoiceprint\\b|\\bhuella de voz\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"biometrico\",\n\t\tpatron: /\\bdatos biometricos\\b|\\bbiometric data\\b|\\bplantilla biometrica\\b|\\bbiometric template\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Datos genéticos (art. 9) ──\n\t{\n\t\tcategoria: \"genetico\",\n\t\tpatron:\n\t\t\t/\\bperfil genetic(?:o|a)\\b|\\bgenetic (?:profile|test|testing|data|marker)\\b|\\btest genetico\\b|\\bsecuenciacion (?:genetica|del genoma)\\b|\\bgenoma\\b|\\bcariotipo\\b|\\bbrca[12]\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Condenas e infracciones penales (art. 10) ──\n\t{\n\t\tcategoria: \"condenas\",\n\t\tpatron: /\\bantecedentes penales\\b|\\bcriminal record\\b|\\bcertificado de penales\\b|\\bregistro de delincuentes\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"condenas\",\n\t\tpatron:\n\t\t\t/\\bcondenad(?:o|a) por\\b|\\bconvicted of\\b|\\bsentenciad(?:o|a) a\\b|\\bsentenced to\\b|\\bimputad(?:o|a) por\\b|\\bproceso penal\\b|\\ben prision por\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t// Las formas que faltaban, medidas: «cumplió condena por robo», «detenido\n\t// por», «orden de alejamiento» y «violencia de género» salían LIMPIAS. Coste\n\t// sobre los 469 ficheros de `src` y 200 commits: CERO.\n\t{\n\t\tcategoria: \"condenas\",\n\t\tpatron:\n\t\t\t/\\bcondena por\\b|\\bcumplio condena\\b|\\bdetenid(?:o|a) por\\b|\\borden de alejamiento\\b|\\bdelito de\\b|\\bviolencia de genero\\b|\\bjuicio penal\\b|\\barrested for\\b|\\bon probation\\b|\\bparole\\b/g,\n\t\texigeMarcador: false,\n\t},\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Identificadores\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Van sobre el texto ORIGINAL, no sobre el plegado —el plegado ya no distingue\n * `X` de `x`— pero SÍ aceptan minúsculas y los puntos de millar.\n *\n * MEDIDO, y era un agujero de los grandes: `dni 12345678z`, `nie z1234567r`,\n * `es9121000418450200051332` y `DNI 12.345.678-Z` salían LIMPIOS. Las cuatro\n * son formas que produce cualquiera: el punto de millar es como se imprime un\n * DNI en España, y la minúscula es lo que sale de un `toLowerCase()` en\n * cualquier campo de formulario, de un `JSON` normalizado o de una URL.\n *\n * El coste se midió, y no salió gratis: `/Users/31017423z/...` —un directorio\n * de trabajo real, citado en dos ficheros de `src`— tiene ocho cifras y una\n * letra, y PASA el módulo 23. De ahí el `(?<![/\\\\])` y el `(?![/\\\\])`: un token\n * pegado a una barra es un segmento de ruta, no un documento. Con ese guardián\n * la forma insensible a mayúsculas produce CERO hallazgos sobre los 469\n * ficheros `.ts` de `src` y sobre 200 commits.\n */\nconst DNI = /(?<![/\\\\])\\b(\\d{2}\\.?\\d{3}\\.?\\d{3})[ .-]?([A-Za-z])\\b(?![/\\\\])/g;\nconst NIE = /(?<![/\\\\])\\b([XYZxyz])[ .-]?(\\d{7})[ .-]?([A-Za-z])\\b(?![/\\\\])/g;\nconst IBAN = /\\b([A-Za-z]{2}\\d{2}(?:[ ]?[A-Za-z0-9]{4}){3,7}[ ]?[A-Za-z0-9]{0,4})\\b/g;\nconst NSS = /\\b(\\d{2})[ -]?(\\d{8})[ -]?(\\d{2})\\b/g;\n/** Matrícula española desde 2000: cuatro cifras y tres consonantes, sin Ñ ni Q. */\nconst MATRICULA = /\\b\\d{4}[ -]?[BCDFGHJKLMNPRSTVWXYZ]{3}\\b/g;\n\nconst PORQUE_MODULO_23 = \"identificador nacional con letra de control correcta (comprobada, modulo 23)\";\nconst PORQUE_MODULO_97 = \"identificador nacional con digito de control correcto (comprobado, modulo 97)\";\nconst PORQUE_FORMA_PLACA =\n\t\"identificador nacional con la forma exacta de una placa (cuatro cifras y tres consonantes; sin control que comprobar)\";\nconst PORQUE_VOCABULARIO = \"vocabulario de categoria especial sin otra lectura tecnica\";\nconst PORQUE_CON_MARCADOR = `vocabulario ambiguo con un marcador de persona a menos de ${VENTANA} caracteres`;\n\nfunction articuloDe(categoria: CategoriaEspecial): \"9\" | \"10\" {\n\treturn categoria === \"condenas\" ? \"10\" : \"9\";\n}\n\n/**\n * Funde los hallazgos de la MISMA categoría que se solapan.\n *\n * «afiliado al partido popular» dispara dos patrones políticos sobre tramos\n * que se pisan; dos hallazgos para un solo dato inflan el informe del DPO y\n * hacen que redactar sea redactar dos veces lo mismo.\n */\nfunction fundir(hallazgos: HallazgoEspecial[]): HallazgoEspecial[] {\n\tconst ordenados = [...hallazgos].sort((a, b) => a.desde - b.desde || a.hasta - b.hasta);\n\tconst salida: HallazgoEspecial[] = [];\n\tfor (const h of ordenados) {\n\t\tconst previo = salida.find((p) => p.categoria === h.categoria && h.desde < p.hasta && p.desde < h.hasta);\n\t\tif (previo) {\n\t\t\tprevio.desde = Math.min(previo.desde, h.desde);\n\t\t\tprevio.hasta = Math.max(previo.hasta, h.hasta);\n\t\t\tcontinue;\n\t\t}\n\t\tsalida.push({ ...h });\n\t}\n\treturn salida.sort((a, b) => a.desde - b.desde);\n}\n\n/**\n * Busca categorías especiales del art. 9 y condenas del art. 10.\n *\n * TRES ESTADOS, no dos:\n * · lista con hallazgos → hay datos de categoría especial;\n * · lista vacía → he mirado el texto entero y no hay;\n * · `TextoNoAnalizable` → no he podido mirar. Nunca se confunde con la vacía.\n *\n * Ningún campo del hallazgo lleva el texto detectado; sólo su posición y la\n * forma que lo disparó.\n */\nexport function categoriasEspeciales(texto: string): HallazgoEspecial[] {\n\tif (typeof texto !== \"string\") {\n\t\tthrow new TextoNoAnalizable(\"no-es-cadena\", `llego un ${texto === null ? \"null\" : typeof texto}`);\n\t}\n\tif (texto.length > LIMITE_CARACTERES) {\n\t\tthrow new TextoNoAnalizable(\"demasiado-largo\", `${texto.length} caracteres, el limite es ${LIMITE_CARACTERES}`);\n\t}\n\n\tconst hallazgos: HallazgoEspecial[] = [];\n\tconst plegado = plegar(texto);\n\tconst marcadores = marcadoresDe(plegado, texto);\n\n\tfor (const termino of TERMINOS) {\n\t\t// Plegado y original tienen la MISMA longitud, así que los índices de uno\n\t\t// sirven para el otro y para el cálculo de distancia al marcador.\n\t\tconst donde = termino.sobreOriginal ? texto : plegado;\n\t\tfor (const m of donde.matchAll(termino.patron)) {\n\t\t\tconst tramo = { desde: m.index, hasta: m.index + m[0].length };\n\t\t\tif (termino.exigeMarcador && !tieneMarcadorCerca(tramo, marcadores)) continue;\n\t\t\thallazgos.push({\n\t\t\t\tcategoria: termino.categoria,\n\t\t\t\tarticulo: articuloDe(termino.categoria),\n\t\t\t\tdesde: tramo.desde,\n\t\t\t\thasta: tramo.hasta,\n\t\t\t\tporque: termino.exigeMarcador ? PORQUE_CON_MARCADOR : PORQUE_VOCABULARIO,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Identificadores: la forma sólo abre la puerta; entra el que valida.\n\tfor (const m of texto.matchAll(DNI)) {\n\t\tif (!dniValido(m[1] as string, m[2] as string)) continue;\n\t\thallazgos.push({\n\t\t\tcategoria: \"identificador-nacional\",\n\t\t\tarticulo: \"9\",\n\t\t\tdesde: m.index,\n\t\t\thasta: m.index + m[0].length,\n\t\t\tporque: PORQUE_MODULO_23,\n\t\t});\n\t}\n\tfor (const m of texto.matchAll(NIE)) {\n\t\tif (!nieValido(m[1] as string, m[2] as string, m[3] as string)) continue;\n\t\thallazgos.push({\n\t\t\tcategoria: \"identificador-nacional\",\n\t\t\tarticulo: \"9\",\n\t\t\tdesde: m.index,\n\t\t\thasta: m.index + m[0].length,\n\t\t\tporque: PORQUE_MODULO_23,\n\t\t});\n\t}\n\tfor (const m of texto.matchAll(IBAN)) {\n\t\tconst candidato = (m[1] as string).trimEnd();\n\t\tif (!ibanValido(candidato)) continue;\n\t\thallazgos.push({\n\t\t\tcategoria: \"identificador-nacional\",\n\t\t\tarticulo: \"9\",\n\t\t\tdesde: m.index,\n\t\t\thasta: m.index + candidato.length,\n\t\t\tporque: PORQUE_MODULO_97,\n\t\t});\n\t}\n\tfor (const m of texto.matchAll(NSS)) {\n\t\tif (!nssValido(m[1] as string, m[2] as string, m[3] as string)) continue;\n\t\thallazgos.push({\n\t\t\tcategoria: \"identificador-nacional\",\n\t\t\tarticulo: \"9\",\n\t\t\tdesde: m.index,\n\t\t\thasta: m.index + m[0].length,\n\t\t\tporque: PORQUE_MODULO_97,\n\t\t});\n\t}\n\tfor (const m of texto.matchAll(MATRICULA)) {\n\t\thallazgos.push({\n\t\t\tcategoria: \"identificador-nacional\",\n\t\t\tarticulo: \"9\",\n\t\t\tdesde: m.index,\n\t\t\thasta: m.index + m[0].length,\n\t\t\tporque: PORQUE_FORMA_PLACA,\n\t\t});\n\t}\n\n\treturn fundir(hallazgos);\n}\n\n/** Con lo que se sustituye cada tramo. El mismo bloque que usa `redactSensitive`. */\nconst BLOQUE = \"█\";\n\n/**\n * Devuelve el texto con los tramos hallados —y SÓLO ésos— sustituidos por\n * bloques.\n *\n * Es lo que le falta hoy a `redactSensitive`: medido,\n * `redactSensitive(\"baja por depresión, afiliado a CCOO, HIV positive\",\n * \"strict\")` devuelve la cadena idéntica, y esa función alimenta el libro de\n * auditoría y el diario de edición.\n *\n * DOS DECISIONES, las dos deliberadas:\n *\n * · El bloque tiene la MISMA longitud que el tramo. Un texto tapado que\n * encoge delata dónde estaba el dato al comparar con el original, y además\n * rompe cualquier índice que alguien haya guardado sobre el texto.\n * · No se escribe la categoría en el hueco. Poner «[salud]» taparía el dato y\n * publicaría el diagnóstico: que hay información de salud sobre esta\n * persona ya es, por sí solo, una categoría especial. La categoría va en el\n * hallazgo, que es para el DPO; el texto tapado es para todos los demás.\n *\n * Un texto sin hallazgos sale idéntico byte a byte —se devuelve el mismo\n * objeto—, y `TextoNoAnalizable` sube igual que en `categoriasEspeciales`:\n * devolver aquí el texto sin tocar sería devolver el original en claro\n * creyendo haberlo tapado.\n */\nexport function taparCategoriasEspeciales(texto: string): string {\n\tconst hallazgos = categoriasEspeciales(texto);\n\tif (hallazgos.length === 0) return texto;\n\n\t// Los hallazgos vienen ordenados por `desde`, pero `fundir` sólo une los de\n\t// la MISMA categoría: dos categorías distintas pueden pisarse («judío» es\n\t// origen étnico y religión a la vez). El cursor evita tapar dos veces el\n\t// mismo trozo, que duplicaría bloques y alargaría el texto.\n\tlet salida = \"\";\n\tlet cursor = 0;\n\tfor (const h of hallazgos) {\n\t\tif (h.hasta <= cursor) continue;\n\t\tconst desde = Math.max(h.desde, cursor);\n\t\tsalida += texto.slice(cursor, desde) + BLOQUE.repeat(h.hasta - desde);\n\t\tcursor = h.hasta;\n\t}\n\treturn salida + texto.slice(cursor);\n}\n"]}
1
+ {"version":3,"file":"categorias-especiales.d.ts","sourceRoot":"","sources":["../../../src/core/privacidad/categorias-especiales.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAEH,wDAAwD;AACxD,MAAM,MAAM,iBAAiB,GAC1B,OAAO,GACP,UAAU,GACV,eAAe,GACf,UAAU,GACV,kBAAkB,GAClB,aAAa,GACb,YAAY,GACZ,UAAU,GACV,UAAU,GACV,wBAAwB,CAAC;AAE5B,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,iBAAiB,CAAC;IAC7B;;;;;;;;;OASG;IACH,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IACrB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,iBAAiB,CAAC;gBACxC,MAAM,EAAE,cAAc,GAAG,iBAAiB,EAAE,OAAO,EAAE,MAAM;CAKvE;AAED,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC,gFAAgF;AAChF,eAAO,MAAM,OAAO,KAAK,CAAC;AA2D1B;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAmB5C;AAQD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIhE;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIjF;AASD,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAShD;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKrF;AA0bD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAuFtE;AAKD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiB/D"}
@@ -377,6 +377,7 @@ const TERMINOS = [
377
377
  categoria: "salud",
378
378
  patron: /\bdiagnostic(?:o|os|ado|ada|ados|adas)\b|\bdiagnos(?:is|ed)\b/g,
379
379
  exigeMarcador: true,
380
+ cancelablePor: /\b(?:LSP|lsp|compilador(?:es)?|compilers?|linters?|checkers?|comprobador(?:es)?|TypeScript|eslint|biome|servidor de lenguaje|tree-sitter|workers?|streaming|stderr|stdout|IRC)\b|\bdiagn\w*\s*:\s*(?:number|string|boolean)\b|\bdiagn\w*\.\w+/g,
380
381
  },
381
382
  {
382
383
  categoria: "salud",
@@ -631,6 +632,9 @@ export function categoriasEspeciales(texto) {
631
632
  const tramo = { desde: m.index, hasta: m.index + m[0].length };
632
633
  if (termino.exigeMarcador && !tieneMarcadorCerca(tramo, marcadores))
633
634
  continue;
635
+ if (termino.cancelablePor &&
636
+ texto.slice(Math.max(0, tramo.desde - VENTANA), tramo.hasta + VENTANA).match(termino.cancelablePor))
637
+ continue;
634
638
  hallazgos.push({
635
639
  categoria: termino.categoria,
636
640
  articulo: articuloDe(termino.categoria),
@@ -1 +1 @@
1
- {"version":3,"file":"categorias-especiales.js","sourceRoot":"","sources":["../../../src/core/privacidad/categorias-especiales.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Detectar las CATEGORÍAS ESPECIALES del artículo 9 del RGPD (y las condenas\n * del artículo 10) en un texto, sin repetir el texto en el hallazgo.\n *\n * POR QUÉ EXISTE, medido antes de escribir nada. El escáner de\n * `memory-engine/security.ts` tiene cinco patrones de datos personales\n * (correo, teléfono, DNI/NIE, IBAN, fecha de nacimiento) y CERO del artículo 9.\n * Sobre un corpus de 24 cadenas que sí deberían saltar, en nivel `strict`\n * fallaban 20. Entre las 20: «baja por depresión», «afiliado a CCOO»,\n * «HIV positive», «huella dactilar registrada», «tiene antecedentes penales».\n * Ninguna de ellas tiene hoy categoría en `SensitiveCategory`, así que\n * `redactSensitive` las devuelve idénticas, sin un solo bloque: hoy una\n * categoría especial se escribe EN CLARO en el libro de auditoría\n * (`audit/libro.ts`), en la exportación y en el diario de edición.\n *\n * El coste no es simétrico con el de un correo. Tratar datos de salud,\n * afiliación sindical, origen étnico, religión, opinión política, vida sexual,\n * biometría o genética está PROHIBIDO salvo excepción tasada (art. 9.1 y 9.2),\n * y las condenas penales sólo pueden tratarse bajo control de la autoridad\n * (art. 10). Filtrar uno de estos no es un incidente de privacidad: es un\n * tratamiento ilícito.\n *\n * LAS DOS MITADES. Un detector de vocabulario ingenuo es peor que ninguno.\n * «diagnóstico» sale de cualquier compilador, «union» de cualquier SQL,\n * «race» de cualquier `race condition`, y un identificador interno de ocho\n * cifras no es un DNI. Un detector que grita sobre todo se desactiva en una\n * semana y entonces no protege de nada. Por eso aquí hay dos mecanismos, y\n * los dos se miden contra el corpus benigno:\n *\n * 1. Los IDENTIFICADORES se VALIDAN, no se reconocen por su forma. DNI y NIE\n * por la letra de control (módulo 23 sobre TRWAGMYFPDXBNJZSQVHLCKE), IBAN\n * y número de la Seguridad Social por módulo 97. Esto no es sólo rigor:\n * es lo que hace desaparecer el único falso positivo medido del escáner\n * actual —el UUID `550e8400-e29b-41d4-a716-446655440000`, cuyo fragmento\n * `446655440000` tiene forma de NSS pero da 56 donde debería dar 00—.\n *\n * 2. El VOCABULARIO ambiguo exige CO-OCURRENCIA con un marcador de persona.\n * «diagnóstico» solo no dispara; «su diagnóstico» sí. Ver `VENTANA`.\n *\n * LA VENTANA es de 60 caracteres entre los bordes más cercanos del término y\n * del marcador. Una oración simple en español ronda las 10-12 palabras, unos\n * 60-70 caracteres; dentro de eso el marcador y el término suelen compartir\n * sujeto. Más allá ya son dos frases distintas y la co-ocurrencia deja de\n * significar nada: el marcador habla de una persona y el término, de otra cosa.\n * Medido sobre el corpus: con 60 caracteres las 12 cadenas benignas salen\n * limpias y las 19 sensibles por vocabulario salen todas.\n *\n * QUÉ NO HACE, y conviene que conste:\n *\n * · No entiende negación ni hipótesis. «no está de baja por depresión» y\n * «si estuviera de baja por depresión» disparan igual. Es deliberado: en\n * un detector de fugas el falso negativo se paga más caro que el falso\n * positivo POR CADA CASO, y la negación en texto libre no se resuelve con\n * una lista de palabras.\n * · No cubre `fingerprint` ni `huella digital` como biometría, porque en\n * este repositorio son la huella de un certificado o de un fichero. Sí\n * cubre «huella dactilar», que no tiene lectura técnica.\n * · La matrícula española no tiene dígito de control: es la única forma sin\n * validar de las cinco. Se compensa exigiendo el alfabeto real de las\n * placas (consonantes, sin vocales ni Ñ ni Q), que descarta casi cualquier\n * token accidental de cuatro cifras y tres letras.\n * · No sustituye a `classifySensitive`: es complementario. Aquí no hay\n * correos, ni teléfonos, ni tarjetas.\n */\n\n/** Las diez categorías que este módulo sabe nombrar. */\nexport type CategoriaEspecial =\n\t| \"salud\"\n\t| \"sindical\"\n\t| \"origen-etnico\"\n\t| \"religion\"\n\t| \"opinion-politica\"\n\t| \"vida-sexual\"\n\t| \"biometrico\"\n\t| \"genetico\"\n\t| \"condenas\"\n\t| \"identificador-nacional\";\n\nexport interface HallazgoEspecial {\n\tcategoria: CategoriaEspecial;\n\t/**\n\t * El artículo del RGPD que hace especial al dato. Es lo que el DPO necesita\n\t * en su informe: el 9 exige una de las excepciones del 9.2, el 10 exige\n\t * control de la autoridad pública.\n\t *\n\t * `identificador-nacional` se marca como \"9\" porque la API sólo admite dos\n\t * valores, pero su base real es el art. 87 (número de identificación\n\t * nacional, condiciones específicas de cada Estado miembro). Quien redacte\n\t * el informe debe leerlo así.\n\t */\n\tarticulo: \"9\" | \"10\";\n\t/** Posición inicial en el texto, para poder redactar sólo ese trozo. */\n\tdesde: number;\n\t/** Posición final (exclusiva). */\n\thasta: number;\n\t/**\n\t * La FORMA que lo disparó. NUNCA el texto detectado: un informe de fuga que\n\t * cita la fuga es otra fuga, y estos hallazgos van a un libro de auditoría\n\t * que se exporta.\n\t */\n\tporque: string;\n}\n\n/**\n * El tercer estado: «no he podido mirar».\n *\n * Una lista vacía significa «he mirado el texto entero y no hay nada». Si el\n * módulo no puede analizar, devolver `[]` convertiría un fallo en un permiso:\n * quien llama guardaría la nota creyendo que está limpia. Por eso se LANZA.\n *\n * Se lanza en dos casos, y sólo en dos:\n * · `no-es-cadena`: llega algo que no es `string` (un `null` de una API, un\n * objeto que alguien esperaba serializado).\n * · `demasiado-largo`: por encima de `LIMITE_CARACTERES`. El barrido es\n * lineal por patrón, pero son ~80 patrones y la búsqueda de marcadores es\n * cuadrática en el número de coincidencias; con un volcado de megabytes el\n * detector deja de responder y quien llama se queda colgado sin saber por\n * qué. Falla rápido y explícito.\n */\nexport class TextoNoAnalizable extends Error {\n\treadonly motivo: \"no-es-cadena\" | \"demasiado-largo\";\n\tconstructor(motivo: \"no-es-cadena\" | \"demasiado-largo\", detalle: string) {\n\t\tsuper(`No se pudo analizar el texto (${motivo}): ${detalle}`);\n\t\tthis.name = \"TextoNoAnalizable\";\n\t\tthis.motivo = motivo;\n\t}\n}\n\n/** 200.000 caracteres ≈ 200 KB. Una nota de memoria razonable no llega a 10 KB. */\nexport const LIMITE_CARACTERES = 200_000;\n\n/** Caracteres de distancia máxima entre el término y su marcador de persona. */\nexport const VENTANA = 60;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plegado: quitar acentos y mayúsculas SIN mover ni un índice\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * `NFD` + quitar diacríticos cambiaría la longitud y con ella `desde`/`hasta`,\n * que dejarían de servir para redactar el original. Aquí se mapea carácter a\n * carácter, uno a uno, para que el texto plegado y el original compartan\n * índices exactamente.\n */\nconst EQUIVALENTES: Record<string, string> = {\n\tá: \"a\",\n\tà: \"a\",\n\tä: \"a\",\n\tâ: \"a\",\n\té: \"e\",\n\tè: \"e\",\n\të: \"e\",\n\tê: \"e\",\n\tí: \"i\",\n\tì: \"i\",\n\tï: \"i\",\n\tî: \"i\",\n\tó: \"o\",\n\tò: \"o\",\n\tö: \"o\",\n\tô: \"o\",\n\tú: \"u\",\n\tù: \"u\",\n\tü: \"u\",\n\tû: \"u\",\n\tñ: \"n\",\n\tç: \"c\",\n\tÁ: \"a\",\n\tÀ: \"a\",\n\tÄ: \"a\",\n\tÂ: \"a\",\n\tÉ: \"e\",\n\tÈ: \"e\",\n\tË: \"e\",\n\tÊ: \"e\",\n\tÍ: \"i\",\n\tÌ: \"i\",\n\tÏ: \"i\",\n\tÎ: \"i\",\n\tÓ: \"o\",\n\tÒ: \"o\",\n\tÖ: \"o\",\n\tÔ: \"o\",\n\tÚ: \"u\",\n\tÙ: \"u\",\n\tÜ: \"u\",\n\tÛ: \"u\",\n\tÑ: \"n\",\n\tÇ: \"c\",\n};\n\n/**\n * Devuelve el texto en minúsculas, sin acentos y con TODO espacio en blanco\n * convertido en un espacio simple, con la MISMA longitud.\n *\n * Lo del salto de línea no es cosmético y se midió: con el salto intacto,\n * «perfil\\ngenético» y «trade\\nunion» salían LIMPIOS —los patrones de varias\n * palabras llevan un espacio literal— y un dato de categoría especial partido\n * por un ajuste de línea es exactamente lo que produce cualquier editor, todo\n * correo citado y todo comentario de código. Se arregla aquí, en el plegado,\n * y no patrón a patrón: son ~30 patrones de varias palabras y arreglar sólo\n * los que uno recuerda deja el resto igual de ciegos.\n */\nexport function plegar(texto: string): string {\n\tlet salida = \"\";\n\tfor (let i = 0; i < texto.length; i++) {\n\t\tconst c = texto[i] as string;\n\t\tif (c === \"\\n\" || c === \"\\r\" || c === \"\\t\" || c === \"\\f\" || c === \"\\v\") {\n\t\t\tsalida += \" \";\n\t\t\tcontinue;\n\t\t}\n\t\tconst equivalente = EQUIVALENTES[c];\n\t\tif (equivalente !== undefined) {\n\t\t\tsalida += equivalente;\n\t\t\tcontinue;\n\t\t}\n\t\tconst minuscula = c.toLowerCase();\n\t\t// Hay caracteres cuya minúscula ocupa dos unidades ('İ' → 'i̇'). Ésos se\n\t\t// dejan como están: mover un índice cuesta más que perder una coincidencia.\n\t\tsalida += minuscula.length === 1 ? minuscula : c;\n\t}\n\treturn salida;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Validación de identificadores\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst LETRAS_DNI = \"TRWAGMYFPDXBNJZSQVHLCKE\";\n\n/**\n * Letra de control del DNI: módulo 23 sobre la tabla oficial.\n *\n * Acepta los puntos de millar («12.345.678»), que es como se imprime en la\n * tarjeta y como lo teclea la mitad de la gente.\n */\nexport function dniValido(numero: string, letra: string): boolean {\n\tconst digitos = numero.replace(/\\./g, \"\");\n\tif (!/^\\d{8}$/.test(digitos)) return false;\n\treturn LETRAS_DNI[Number(digitos) % 23] === letra.toUpperCase();\n}\n\n/** NIE: la inicial X/Y/Z vale 0/1/2 y luego es el mismo módulo 23. */\nexport function nieValido(inicial: string, numero: string, letra: string): boolean {\n\tconst prefijo = { X: \"0\", Y: \"1\", Z: \"2\" }[inicial.toUpperCase()];\n\tif (prefijo === undefined) return false;\n\treturn dniValido(prefijo + numero, letra);\n}\n\n/** Resto módulo 97 de una cadena de dígitos, sin desbordar el entero. */\nfunction modulo97(digitos: string): number {\n\tlet resto = 0;\n\tfor (const d of digitos) resto = (resto * 10 + Number(d)) % 97;\n\treturn resto;\n}\n\n/** IBAN: mover los cuatro primeros al final, letra → número, y módulo 97 = 1. */\nexport function ibanValido(iban: string): boolean {\n\tconst limpio = iban.replace(/\\s/g, \"\").toUpperCase();\n\tif (!/^[A-Z]{2}\\d{2}[A-Z0-9]{10,30}$/.test(limpio)) return false;\n\tconst rotado = limpio.slice(4) + limpio.slice(0, 4);\n\tlet digitos = \"\";\n\tfor (const c of rotado) {\n\t\tdigitos += c >= \"A\" && c <= \"Z\" ? String(c.charCodeAt(0) - 55) : c;\n\t}\n\treturn modulo97(digitos) === 1;\n}\n\n/**\n * Número de la Seguridad Social: provincia (2) + número (8) + control (2),\n * donde el control es el módulo 97 de los diez primeros dígitos.\n *\n * La excepción documentada: cuando el número de afiliación es menor que\n * 10.000.000 —es decir, empieza por cero— el código de provincia se coloca\n * DETRÁS. Se prueban las dos lecturas y basta con que una cuadre; probar sólo\n * la principal perdería a todos los afiliados antiguos.\n */\nexport function nssValido(provincia: string, numero: string, control: string): boolean {\n\tconst esperado = Number(control);\n\tif (modulo97(provincia + numero) === esperado) return true;\n\tif (numero.startsWith(\"0\")) return modulo97(numero + provincia) === esperado;\n\treturn false;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Marcadores de persona\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Lo que sitúa un dato EN UNA PERSONA. Sin uno de éstos cerca, el vocabulario\n * ambiguo no dispara.\n *\n * No están los artículos («el», «la», «los»): son tan frecuentes que\n * convertirían la co-ocurrencia en un adorno —todo texto en español tiene un\n * artículo a menos de 60 caracteres de cualquier cosa—. Sí están los posesivos\n * y los pronombres, que es lo que atribuye el dato a alguien.\n *\n * «de baja» / «baja por» entran porque una baja es siempre de una persona; es\n * el marcador que sostiene «baja por depresión», donde no hay ningún pronombre.\n */\nconst MARCADORES: RegExp[] = [\n\t/\\b(?:yo|tu|ella|ellos|ellas|nosotros|nosotras|vosotros|usted|ustedes)\\b/g,\n\t// SIN `su` ni `sus`, y es una corrección medida. En español el posesivo de\n\t// tercera persona vale para CUALQUIER antecedente, animado o no: «agrega sus\n\t// diagnósticos» habla de un comprobador, no de un paciente. Con `su`/`sus`\n\t// dentro, 7 de los 10 falsos positivos que quedaban sobre `src` venían de\n\t// ahí. Los de primera y segunda persona sí implican a alguien.\n\t/\\b(?:mi|mis|tus|nuestro|nuestra|nuestros|nuestras)\\b/g,\n\t// SIN `i`: es la variable de bucle de todo el código escrito jamás, y sobre\n\t// el plegado no hay forma de distinguirla del pronombre inglés.\n\t/\\b(?:he|she|they|we|my|his|her|their|our|your|him|them)\\b/g,\n\t/\\b(?:paciente|pacientes|enfermo|enferma|empleado|empleada|empleados|empleadas)\\b/g,\n\t/\\b(?:trabajador|trabajadora|trabajadores|usuario|usuaria|usuarios|cliente|clientes)\\b/g,\n\t/\\b(?:candidato|candidata|afiliado|afiliada|socio|socia|miembro|companero|companera|colega)\\b/g,\n\t/\\b(?:patient|employee|employees|worker|workers|user|users|customer|member|colleague)\\b/g,\n\t/\\b(?:don|dona|sr|sra|senor|senora|mr|mrs|ms)\\b/g,\n\t/\\bde baja\\b|\\bbaja por\\b|\\bsick leave\\b|\\bon leave\\b/g,\n];\n\n/**\n * Nombre y apellido SEGUIDOS: dos palabras capitalizadas pegadas, ni al\n * principio del texto ni tras un punto.\n *\n * MEDIDO, y es la corrección más cara de este módulo. Antes bastaba UNA palabra\n * capitalizada. Sobre los 469 ficheros `.ts` reales de `src` eso daba 20.272\n * marcadores: en un repositorio documentado en español toda palabra que abre\n * frase dentro de un bloque de documentación y todo nombre de tipo\n * (`Comprobador`, `Deteccion`, `Diagnostico`) valía por «una persona». El\n * resultado era que la co-ocurrencia no filtraba nada y el detector marcaba 51\n * veces palabras como `diagnóstico` y `positivo` —la segunda dentro de la\n * expresión «falso positivo», que es justo lo que este módulo intenta evitar—.\n * Exigiendo las dos palabras seguidas quedan 351 candidatos sobre el mismo\n * corpus, y ninguno acaba produciendo un hallazgo.\n *\n * Lo que se paga: «Ana padece esclerosis» ya no tiene marcador por el nombre.\n * Se acepta a sabiendas —un nombre de pila suelto es indistinguible de un\n * identificador de código— y se compensa con el vocabulario sin marcador.\n */\nconst NOMBRE_COMPLETO = /\\b[A-ZÁÉÍÓÚÑ][a-záéíóúñ]{2,} [A-ZÁÉÍÓÚÑ][a-záéíóúñ]{2,}\\b/g;\n\ninterface Tramo {\n\tdesde: number;\n\thasta: number;\n}\n\nfunction marcadoresDe(plegado: string, original: string): Tramo[] {\n\tconst tramos: Tramo[] = [];\n\tfor (const patron of MARCADORES) {\n\t\tfor (const m of plegado.matchAll(patron)) {\n\t\t\ttramos.push({ desde: m.index, hasta: m.index + m[0].length });\n\t\t}\n\t}\n\tfor (const m of original.matchAll(NOMBRE_COMPLETO)) {\n\t\tconst antes = original.slice(0, m.index).trimEnd();\n\t\tif (antes.length === 0) continue; // primera palabra del texto\n\t\tif (/[.!?¿¡:]$/.test(antes)) continue; // primera palabra de la oración\n\t\ttramos.push({ desde: m.index, hasta: m.index + m[0].length });\n\t}\n\treturn tramos;\n}\n\n/** ¿Hay algún marcador a menos de `VENTANA` del término, sin solaparlo? */\nfunction tieneMarcadorCerca(termino: Tramo, marcadores: Tramo[]): boolean {\n\tfor (const m of marcadores) {\n\t\tif (m.desde < termino.hasta && termino.desde < m.hasta) continue; // se solapan: es el propio término\n\t\tconst distancia = m.desde >= termino.hasta ? m.desde - termino.hasta : termino.desde - m.hasta;\n\t\tif (distancia <= VENTANA) return true;\n\t}\n\treturn false;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Vocabulario\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface Termino {\n\tcategoria: CategoriaEspecial;\n\tpatron: RegExp;\n\t/** `true` = ambiguo fuera de contexto, exige marcador de persona cerca. */\n\texigeMarcador: boolean;\n\t/**\n\t * `true` = el patrón corre sobre el texto ORIGINAL, no sobre el plegado.\n\t *\n\t * Es para las siglas: un sindicato se escribe SIEMPRE en mayúsculas, y sobre\n\t * el plegado `USO` es indistinguible de «uso» y `LAB` de «lab». Medido: la\n\t * lista de siglas sobre el plegado producía 64 hallazgos sobre los ficheros\n\t * reales de `src` —todos «uso» y «usó»—; la misma lista en mayúsculas sobre\n\t * el original produce CERO, sin perder «afiliado a CCOO».\n\t */\n\tsobreOriginal?: boolean;\n}\n\n/**\n * Español e inglés en la misma tabla. Lo que entra sin marcador es lo que no\n * tiene otra lectura en un repositorio de software: `diabetes` no sale de un\n * compilador. Lo que exige marcador es lo que sí sale: `diagnostico`,\n * `depresion`, `positivo`.\n *\n * Ausencias deliberadas, cada una por un falso positivo concreto:\n * · `union` a secas → `union type`, `UNION ALL`. Sólo entra en locuciones\n * («union member», «trade union»).\n * · `race` a secas → `race condition`. Sólo entra «racial origin».\n * · `podemos` como partido → es la primera persona del plural de «poder».\n * Se cubre por la locución «votante de», que revela la opinión política\n * sea cual sea el partido.\n * · `master`, `slave`, `blacklist` → vocabulario técnico, no étnico.\n */\nconst TERMINOS: Termino[] = [\n\t// ── Salud (art. 9) ──\n\t{ categoria: \"salud\", patron: /\\bdiabetes\\b|\\bdiabetic(?:o|a|os|as)?\\b/g, exigeMarcador: false },\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\balergi(?:a|as)\\b|\\balergic(?:o|a)\\b|\\ballerg(?:y|ic|ies)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{ categoria: \"salud\", patron: /\\b(?:vih|hiv|sida|aids|hepatitis|tuberculosis)\\b/g, exigeMarcador: false },\n\t{ categoria: \"salud\", patron: /\\bcancer\\b|\\bleucemia\\b|\\bleukemia\\b|\\btumor(?:es)?\\b/g, exigeMarcador: false },\n\t{ categoria: \"salud\", patron: /\\bgrupo sanguineo\\b|\\bblood (?:type|group)\\b/g, exigeMarcador: false },\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\ben tratamiento (?:con|por|de)\\b|\\bunder treatment for\\b|\\bon medication\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\b(?:sertralina|fluoxetina|paroxetina|litio|insulina|metformina|antidepresiv(?:o|os)|antirretroviral(?:es)?|quimioterapia|chemotherapy)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\bhistoria clinica\\b|\\bhistorial medico\\b|\\bmedical (?:record|history)\\b|\\binforme medico\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\bembarazad(?:a|as)\\b|\\bpregnan(?:t|cy)\\b|\\bdiscapacidad\\b|\\bminusvalia\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t// `diagnostico` PARTIDO EN DOS, y es la lección más cara del módulo. En un\n\t// agente de programación «diagnóstico» es lo que escupe el compilador: sobre\n\t// `src` aparece 46 veces y ninguna habla de la salud de nadie. La forma que\n\t// sí es art. 9 no es la palabra suelta, es la CONSTRUCCIÓN: a alguien se le\n\t// diagnostica ALGO. Ésa no exige marcador porque ya lo lleva dentro.\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\bdiagnosticad(?:o|a|os|as) (?:de|con)\\b|\\bdiagnos(?:ed with|is of)\\b|\\bdiagnostico (?:medico|clinico|psiquiatrico|psicologico|de cancer)\\b|\\bmedical diagnosis\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\bdiagnostic(?:o|os|ado|ada|ados|adas)\\b|\\bdiagnos(?:is|ed)\\b/g,\n\t\texigeMarcador: true,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\bdepresion\\b|\\bansiedad\\b|\\bdepression\\b|\\banxiety\\b|\\bburnout\\b/g,\n\t\texigeMarcador: true,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\benfermedad(?:es)?\\b|\\bdolencia\\b|\\billness\\b|\\bdisease\\b|\\bsintomas\\b/g,\n\t\texigeMarcador: true,\n\t},\n\t// `positivo` va sin «falso» ni «false» delante: «falso positivo» es la\n\t// expresión de oficio de este repositorio —medido, 5 hallazgos en `src`, uno\n\t// de ellos en un comentario que explica cómo evitar falsos positivos— y no\n\t// habla de la serología de nadie.\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /(?<!\\bfals[oa]s? )(?<!\\bfalse )(?:\\bpositiv(?:o|a)\\b|\\bpositive\\b|\\bseropositiv(?:o|a)\\b)/g,\n\t\texigeMarcador: true,\n\t},\n\t// Patologías sin lectura técnica: no salen de un compilador, así que no\n\t// exigen marcador. Coste medido sobre los 469 ficheros de `src` y sobre 200\n\t// commits: CERO hallazgos.\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\besquizofrenia\\b|\\bbipolar\\b|\\bepilep(?:sia|tic(?:o|a))\\b|\\balzheimer\\b|\\bparkinson\\b|\\bdialisis\\b|\\besclerosis\\b|\\bfibromialgia\\b|\\bcelia(?:co|ca)\\b|\\basma\\b|\\bictus\\b|\\binfarto\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\bsuicidi(?:o|os|arse)\\b|\\bautolesion(?:es)?\\b|\\bsalud mental\\b|\\bmental health\\b|\\bingreso psiquiatric(?:o|a)\\b|\\bpsiquiatric(?:o|a)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\badict(?:o|a) a\\b|\\balcoholi(?:co|ca|smo)\\b|\\bdrogodependien\\w*\\b|\\bdesintoxicacion\\b|\\brehabilitacion\\b|\\btoxicoman\\w*\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\bbaja medica\\b|\\bbaja laboral\\b|\\bincapacidad (?:temporal|permanente|laboral)\\b|\\bsick leave\\b|\\bmedical leave\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron:\n\t\t\t/\\babortion\\b|\\binterrupcion (?:voluntaria )?del embarazo\\b|\\btratamiento de fertilidad\\b|\\bmiscarriage\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t// Siglas clínicas, en mayúsculas y sobre el original. Sólo las que no\n\t// colisionan con vocabulario técnico: fuera `IAM` (AWS), `ACV`, `TOC` (tabla\n\t// de contenidos) y `SNS`, que en un repositorio son otra cosa.\n\t{\n\t\tcategoria: \"salud\",\n\t\tpatron: /\\b(?:TDAH|TEPT|EPOC|VHC|VHB)\\b/g,\n\t\texigeMarcador: false,\n\t\tsobreOriginal: true,\n\t},\n\n\t// ── Afiliación sindical (art. 9) ──\n\t// EN MAYÚSCULAS y sobre el original: ver `sobreOriginal`. `uso`, `lab`, `cnt`\n\t// y `ela` en minúsculas son palabras corrientes, no sindicatos.\n\t{\n\t\tcategoria: \"sindical\",\n\t\tpatron: /\\b(?:CCOO|UGT|CGT|CNT|USO|ELA|LAB|CIG|SATSE|CSIF)\\b/g,\n\t\texigeMarcador: false,\n\t\tsobreOriginal: true,\n\t},\n\t// `liberado sindical` y `seccion sindical` llevan la palabra dentro: no hay\n\t// otra lectura. `huelga` sí la tiene —«huelga decir»— y además una huelga\n\t// convocada no es un dato de nadie; lo que revela afiliación es que una\n\t// PERSONA aparezca al lado. De ahí el marcador sólo en la segunda.\n\t{\n\t\tcategoria: \"sindical\",\n\t\tpatron: /\\bliberad(?:o|a) sindical\\b|\\bseccion sindical\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{ categoria: \"sindical\", patron: /\\bhuelga\\b|\\bpiquete\\b/g, exigeMarcador: true },\n\t{\n\t\tcategoria: \"sindical\",\n\t\tpatron:\n\t\t\t/\\bsindicat(?:o|os)\\b|\\bsindicalista\\b|\\bafiliacion sindical\\b|\\bdelegad(?:o|a) sindical\\b|\\bcomite de empresa\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"sindical\",\n\t\tpatron: /\\bunion member(?:ship)?\\b|\\btrade union\\b|\\blabou?r union\\b|\\bunioni[sz]ed\\b|\\bshop steward\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Origen étnico o racial (art. 9) ──\n\t{\n\t\tcategoria: \"origen-etnico\",\n\t\tpatron:\n\t\t\t/\\bde origen (?:marroqui|gitan(?:o|a)|magrebi|subsaharian(?:o|a)|arabe|bereber|judi(?:o|a)|latin(?:o|a)|rumen(?:o|a)|rumano|rumana|chin(?:o|a)|african(?:o|a)|asiatic(?:o|a)|indi(?:o|a)|turc(?:o|a)|paquistani|senegales|ecuatorian(?:o|a)|bolivian(?:o|a)|etnic(?:o|a))\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"origen-etnico\",\n\t\tpatron:\n\t\t\t/\\betnia\\b|\\bgitan(?:o|a|os|as)\\b|\\bracial origin\\b|\\bethnic (?:origin|group|background|minority)\\b|\\bethnicity\\b|\\borigen racial\\b|\\bminoria etnica\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Religión o creencias (art. 9) ──\n\t{\n\t\tcategoria: \"religion\",\n\t\tpatron:\n\t\t\t/\\bmusulman(?:a|es|as)?\\b|\\bmuslim\\b|\\bislamic(?:o|a)?\\b|\\bcatolic(?:o|a|os|as)\\b|\\bcatholic\\b|\\bevangelic(?:o|a)\\b|\\bprotestante\\b|\\bjudi(?:o|a)\\b|\\bjewish\\b|\\bhindu\\b|\\bbudista\\b|\\bbuddhist\\b|\\btestigo de jehova\\b|\\bate(?:o|a)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t// `agnostico` sale de la lista: medido, en `src` aparece una vez y es\n\t// «agnóstico de proveedor». La creencia religiosa que hay que cazar es la\n\t// que se declara, no la que se niega con una palabra que además es jerga.\n\t{\n\t\tcategoria: \"religion\",\n\t\tpatron:\n\t\t\t/\\bcreencias religiosas\\b|\\breligious belief(?:s)?\\b|\\bconviccion religiosa\\b|\\bpractica religiosa\\b|\\bmotivos religiosos\\b|\\bramadan\\b|\\bkosher\\b|\\bhalal\\b|\\bva a misa\\b|\\bbautizad(?:o|a)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Opiniones políticas (art. 9) ──\n\t{\n\t\tcategoria: \"opinion-politica\",\n\t\tpatron:\n\t\t\t/\\bvotante de\\b|\\bvot(?:a|o|e) a\\b|\\bvoted for\\b|\\bmilitante de\\b|\\bsimpatizante de\\b|\\bafiliad(?:o|a) al partido\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"opinion-politica\",\n\t\tpatron:\n\t\t\t/\\bpartido popular\\b|\\bpsoe\\b|\\bizquierda unida\\b|\\bpartido comunista\\b|\\bideologia politica\\b|\\bpolitical (?:opinion|affiliation|party)\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Vida sexual u orientación sexual (art. 9) ──\n\t{\n\t\tcategoria: \"vida-sexual\",\n\t\tpatron:\n\t\t\t/\\bgay\\b|\\blesbian(?:a|as)?\\b|\\bbisexual\\b|\\bhomosexual\\b|\\bheterosexual\\b|\\btransexual\\b|\\btransgener(?:o|a)\\b|\\btransgender\\b|\\bqueer\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"vida-sexual\",\n\t\tpatron:\n\t\t\t/\\borientacion sexual\\b|\\bsexual orientation\\b|\\bidentidad de genero\\b|\\bgender identity\\b|\\bpareja de hecho\\b|\\bcivil partnership\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Datos biométricos (art. 9) ──\n\t{\n\t\tcategoria: \"biometrico\",\n\t\tpatron:\n\t\t\t/\\bhuella(?:s)? dactilar(?:es)?\\b|\\breconocimiento facial\\b|\\bfacial recognition\\b|\\bfingerprint scan(?:ner)?\\b|\\biris scan\\b|\\bescaneo de iris\\b|\\bvoiceprint\\b|\\bhuella de voz\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"biometrico\",\n\t\tpatron: /\\bdatos biometricos\\b|\\bbiometric data\\b|\\bplantilla biometrica\\b|\\bbiometric template\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Datos genéticos (art. 9) ──\n\t{\n\t\tcategoria: \"genetico\",\n\t\tpatron:\n\t\t\t/\\bperfil genetic(?:o|a)\\b|\\bgenetic (?:profile|test|testing|data|marker)\\b|\\btest genetico\\b|\\bsecuenciacion (?:genetica|del genoma)\\b|\\bgenoma\\b|\\bcariotipo\\b|\\bbrca[12]\\b/g,\n\t\texigeMarcador: false,\n\t},\n\n\t// ── Condenas e infracciones penales (art. 10) ──\n\t{\n\t\tcategoria: \"condenas\",\n\t\tpatron: /\\bantecedentes penales\\b|\\bcriminal record\\b|\\bcertificado de penales\\b|\\bregistro de delincuentes\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t{\n\t\tcategoria: \"condenas\",\n\t\tpatron:\n\t\t\t/\\bcondenad(?:o|a) por\\b|\\bconvicted of\\b|\\bsentenciad(?:o|a) a\\b|\\bsentenced to\\b|\\bimputad(?:o|a) por\\b|\\bproceso penal\\b|\\ben prision por\\b/g,\n\t\texigeMarcador: false,\n\t},\n\t// Las formas que faltaban, medidas: «cumplió condena por robo», «detenido\n\t// por», «orden de alejamiento» y «violencia de género» salían LIMPIAS. Coste\n\t// sobre los 469 ficheros de `src` y 200 commits: CERO.\n\t{\n\t\tcategoria: \"condenas\",\n\t\tpatron:\n\t\t\t/\\bcondena por\\b|\\bcumplio condena\\b|\\bdetenid(?:o|a) por\\b|\\borden de alejamiento\\b|\\bdelito de\\b|\\bviolencia de genero\\b|\\bjuicio penal\\b|\\barrested for\\b|\\bon probation\\b|\\bparole\\b/g,\n\t\texigeMarcador: false,\n\t},\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Identificadores\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Van sobre el texto ORIGINAL, no sobre el plegado —el plegado ya no distingue\n * `X` de `x`— pero SÍ aceptan minúsculas y los puntos de millar.\n *\n * MEDIDO, y era un agujero de los grandes: `dni 12345678z`, `nie z1234567r`,\n * `es9121000418450200051332` y `DNI 12.345.678-Z` salían LIMPIOS. Las cuatro\n * son formas que produce cualquiera: el punto de millar es como se imprime un\n * DNI en España, y la minúscula es lo que sale de un `toLowerCase()` en\n * cualquier campo de formulario, de un `JSON` normalizado o de una URL.\n *\n * El coste se midió, y no salió gratis: `/Users/31017423z/...` —un directorio\n * de trabajo real, citado en dos ficheros de `src`— tiene ocho cifras y una\n * letra, y PASA el módulo 23. De ahí el `(?<![/\\\\])` y el `(?![/\\\\])`: un token\n * pegado a una barra es un segmento de ruta, no un documento. Con ese guardián\n * la forma insensible a mayúsculas produce CERO hallazgos sobre los 469\n * ficheros `.ts` de `src` y sobre 200 commits.\n */\nconst DNI = /(?<![/\\\\])\\b(\\d{2}\\.?\\d{3}\\.?\\d{3})[ .-]?([A-Za-z])\\b(?![/\\\\])/g;\nconst NIE = /(?<![/\\\\])\\b([XYZxyz])[ .-]?(\\d{7})[ .-]?([A-Za-z])\\b(?![/\\\\])/g;\nconst IBAN = /\\b([A-Za-z]{2}\\d{2}(?:[ ]?[A-Za-z0-9]{4}){3,7}[ ]?[A-Za-z0-9]{0,4})\\b/g;\nconst NSS = /\\b(\\d{2})[ -]?(\\d{8})[ -]?(\\d{2})\\b/g;\n/** Matrícula española desde 2000: cuatro cifras y tres consonantes, sin Ñ ni Q. */\nconst MATRICULA = /\\b\\d{4}[ -]?[BCDFGHJKLMNPRSTVWXYZ]{3}\\b/g;\n\nconst PORQUE_MODULO_23 = \"identificador nacional con letra de control correcta (comprobada, modulo 23)\";\nconst PORQUE_MODULO_97 = \"identificador nacional con digito de control correcto (comprobado, modulo 97)\";\nconst PORQUE_FORMA_PLACA =\n\t\"identificador nacional con la forma exacta de una placa (cuatro cifras y tres consonantes; sin control que comprobar)\";\nconst PORQUE_VOCABULARIO = \"vocabulario de categoria especial sin otra lectura tecnica\";\nconst PORQUE_CON_MARCADOR = `vocabulario ambiguo con un marcador de persona a menos de ${VENTANA} caracteres`;\n\nfunction articuloDe(categoria: CategoriaEspecial): \"9\" | \"10\" {\n\treturn categoria === \"condenas\" ? \"10\" : \"9\";\n}\n\n/**\n * Funde los hallazgos de la MISMA categoría que se solapan.\n *\n * «afiliado al partido popular» dispara dos patrones políticos sobre tramos\n * que se pisan; dos hallazgos para un solo dato inflan el informe del DPO y\n * hacen que redactar sea redactar dos veces lo mismo.\n */\nfunction fundir(hallazgos: HallazgoEspecial[]): HallazgoEspecial[] {\n\tconst ordenados = [...hallazgos].sort((a, b) => a.desde - b.desde || a.hasta - b.hasta);\n\tconst salida: HallazgoEspecial[] = [];\n\tfor (const h of ordenados) {\n\t\tconst previo = salida.find((p) => p.categoria === h.categoria && h.desde < p.hasta && p.desde < h.hasta);\n\t\tif (previo) {\n\t\t\tprevio.desde = Math.min(previo.desde, h.desde);\n\t\t\tprevio.hasta = Math.max(previo.hasta, h.hasta);\n\t\t\tcontinue;\n\t\t}\n\t\tsalida.push({ ...h });\n\t}\n\treturn salida.sort((a, b) => a.desde - b.desde);\n}\n\n/**\n * Busca categorías especiales del art. 9 y condenas del art. 10.\n *\n * TRES ESTADOS, no dos:\n * · lista con hallazgos → hay datos de categoría especial;\n * · lista vacía → he mirado el texto entero y no hay;\n * · `TextoNoAnalizable` → no he podido mirar. Nunca se confunde con la vacía.\n *\n * Ningún campo del hallazgo lleva el texto detectado; sólo su posición y la\n * forma que lo disparó.\n */\nexport function categoriasEspeciales(texto: string): HallazgoEspecial[] {\n\tif (typeof texto !== \"string\") {\n\t\tthrow new TextoNoAnalizable(\"no-es-cadena\", `llego un ${texto === null ? \"null\" : typeof texto}`);\n\t}\n\tif (texto.length > LIMITE_CARACTERES) {\n\t\tthrow new TextoNoAnalizable(\"demasiado-largo\", `${texto.length} caracteres, el limite es ${LIMITE_CARACTERES}`);\n\t}\n\n\tconst hallazgos: HallazgoEspecial[] = [];\n\tconst plegado = plegar(texto);\n\tconst marcadores = marcadoresDe(plegado, texto);\n\n\tfor (const termino of TERMINOS) {\n\t\t// Plegado y original tienen la MISMA longitud, así que los índices de uno\n\t\t// sirven para el otro y para el cálculo de distancia al marcador.\n\t\tconst donde = termino.sobreOriginal ? texto : plegado;\n\t\tfor (const m of donde.matchAll(termino.patron)) {\n\t\t\tconst tramo = { desde: m.index, hasta: m.index + m[0].length };\n\t\t\tif (termino.exigeMarcador && !tieneMarcadorCerca(tramo, marcadores)) continue;\n\t\t\thallazgos.push({\n\t\t\t\tcategoria: termino.categoria,\n\t\t\t\tarticulo: articuloDe(termino.categoria),\n\t\t\t\tdesde: tramo.desde,\n\t\t\t\thasta: tramo.hasta,\n\t\t\t\tporque: termino.exigeMarcador ? PORQUE_CON_MARCADOR : PORQUE_VOCABULARIO,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Identificadores: la forma sólo abre la puerta; entra el que valida.\n\tfor (const m of texto.matchAll(DNI)) {\n\t\tif (!dniValido(m[1] as string, m[2] as string)) continue;\n\t\thallazgos.push({\n\t\t\tcategoria: \"identificador-nacional\",\n\t\t\tarticulo: \"9\",\n\t\t\tdesde: m.index,\n\t\t\thasta: m.index + m[0].length,\n\t\t\tporque: PORQUE_MODULO_23,\n\t\t});\n\t}\n\tfor (const m of texto.matchAll(NIE)) {\n\t\tif (!nieValido(m[1] as string, m[2] as string, m[3] as string)) continue;\n\t\thallazgos.push({\n\t\t\tcategoria: \"identificador-nacional\",\n\t\t\tarticulo: \"9\",\n\t\t\tdesde: m.index,\n\t\t\thasta: m.index + m[0].length,\n\t\t\tporque: PORQUE_MODULO_23,\n\t\t});\n\t}\n\tfor (const m of texto.matchAll(IBAN)) {\n\t\tconst candidato = (m[1] as string).trimEnd();\n\t\tif (!ibanValido(candidato)) continue;\n\t\thallazgos.push({\n\t\t\tcategoria: \"identificador-nacional\",\n\t\t\tarticulo: \"9\",\n\t\t\tdesde: m.index,\n\t\t\thasta: m.index + candidato.length,\n\t\t\tporque: PORQUE_MODULO_97,\n\t\t});\n\t}\n\tfor (const m of texto.matchAll(NSS)) {\n\t\tif (!nssValido(m[1] as string, m[2] as string, m[3] as string)) continue;\n\t\thallazgos.push({\n\t\t\tcategoria: \"identificador-nacional\",\n\t\t\tarticulo: \"9\",\n\t\t\tdesde: m.index,\n\t\t\thasta: m.index + m[0].length,\n\t\t\tporque: PORQUE_MODULO_97,\n\t\t});\n\t}\n\tfor (const m of texto.matchAll(MATRICULA)) {\n\t\thallazgos.push({\n\t\t\tcategoria: \"identificador-nacional\",\n\t\t\tarticulo: \"9\",\n\t\t\tdesde: m.index,\n\t\t\thasta: m.index + m[0].length,\n\t\t\tporque: PORQUE_FORMA_PLACA,\n\t\t});\n\t}\n\n\treturn fundir(hallazgos);\n}\n\n/** Con lo que se sustituye cada tramo. El mismo bloque que usa `redactSensitive`. */\nconst BLOQUE = \"█\";\n\n/**\n * Devuelve el texto con los tramos hallados —y SÓLO ésos— sustituidos por\n * bloques.\n *\n * Es lo que le falta hoy a `redactSensitive`: medido,\n * `redactSensitive(\"baja por depresión, afiliado a CCOO, HIV positive\",\n * \"strict\")` devuelve la cadena idéntica, y esa función alimenta el libro de\n * auditoría y el diario de edición.\n *\n * DOS DECISIONES, las dos deliberadas:\n *\n * · El bloque tiene la MISMA longitud que el tramo. Un texto tapado que\n * encoge delata dónde estaba el dato al comparar con el original, y además\n * rompe cualquier índice que alguien haya guardado sobre el texto.\n * · No se escribe la categoría en el hueco. Poner «[salud]» taparía el dato y\n * publicaría el diagnóstico: que hay información de salud sobre esta\n * persona ya es, por sí solo, una categoría especial. La categoría va en el\n * hallazgo, que es para el DPO; el texto tapado es para todos los demás.\n *\n * Un texto sin hallazgos sale idéntico byte a byte —se devuelve el mismo\n * objeto—, y `TextoNoAnalizable` sube igual que en `categoriasEspeciales`:\n * devolver aquí el texto sin tocar sería devolver el original en claro\n * creyendo haberlo tapado.\n */\nexport function taparCategoriasEspeciales(texto: string): string {\n\tconst hallazgos = categoriasEspeciales(texto);\n\tif (hallazgos.length === 0) return texto;\n\n\t// Los hallazgos vienen ordenados por `desde`, pero `fundir` sólo une los de\n\t// la MISMA categoría: dos categorías distintas pueden pisarse («judío» es\n\t// origen étnico y religión a la vez). El cursor evita tapar dos veces el\n\t// mismo trozo, que duplicaría bloques y alargaría el texto.\n\tlet salida = \"\";\n\tlet cursor = 0;\n\tfor (const h of hallazgos) {\n\t\tif (h.hasta <= cursor) continue;\n\t\tconst desde = Math.max(h.desde, cursor);\n\t\tsalida += texto.slice(cursor, desde) + BLOQUE.repeat(h.hasta - desde);\n\t\tcursor = h.hasta;\n\t}\n\treturn salida + texto.slice(cursor);\n}\n"]}
1
+ {"version":3,"file":"categorias-especiales.js","sourceRoot":"","sources":["../../../src/core/privacidad/categorias-especiales.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tapar.d.ts","sourceRoot":"","sources":["../../../src/core/privacidad/tapar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAKH,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,CAYxG","sourcesContent":["/**\n * El punto único donde se tapa antes de escribir a disco.\n *\n * POR QUÉ EXISTE. `redactSensitive` cubre correos, teléfonos, DNI, IBAN y\n * fechas de nacimiento, y es lo que usan `audit/libro.ts` y `edicion/diario.ts`\n * antes de tocar disco. Pero medido ejecutando:\n *\n * una frase con un diagnóstico psiquiátrico, un sindicato y una serología\n * pasada por redactSensitive(..., \"strict\")\n * -> devuelve la cadena IDÉNTICA, sin un solo carácter tapado\n *\n * (La frase concreta vive en la prueba, no aquí: citar los términos en un\n * comentario los mete en el corpus que la propia guarda de falsos positivos\n * barre, y el módulo acaba acusándose a sí mismo.)\n *\n * Es decir: hoy una categoría especial del art. 9 del RGPD —salud, afiliación\n * sindical, origen étnico, religión, opinión política, vida sexual, biometría,\n * genética— se escribe EN CLARO en el libro de auditoría y en el diario de\n * edición. Y son justamente los datos cuyo tratamiento está prohibido salvo\n * excepción tasada, y cuya fuga cuesta mucho más cara que la de un correo.\n *\n * Este módulo compone las dos pasadas en una sola función, para que no haya que\n * acordarse de llamar a las dos en cada sitio: acordarse es lo que falla.\n *\n * LA DECISIÓN QUE HABÍA QUE TOMAR AQUÍ Y NO ESCONDER. `categoriasEspeciales`\n * lanza `TextoNoAnalizable` cuando no puede mirar —no es una cadena, o es\n * absurdamente larga— en vez de devolver una lista vacía, precisamente para que\n * «no he podido» no se confunda con «no hay». Tragarse esa excepción aquí\n * anularía el invariante entero: escribiríamos en claro un texto que nadie ha\n * mirado, y el registro diría que se revisó.\n *\n * Así que no se traga: si no se puede analizar, se tapa el texto ENTERO. Un\n * registro con un campo ilegible es un inconveniente; un registro con datos de\n * salud en claro es una infracción. Y se deja constancia del motivo, para que\n * quien audite sepa distinguir un campo tapado por precaución de uno tapado por\n * un hallazgo.\n */\n\nimport { redactSensitive } from \"../memory-engine/security.ts\";\nimport { TextoNoAnalizable, taparCategoriasEspeciales } from \"./categorias-especiales.ts\";\n\n/** Lo que se escribe cuando no se ha podido mirar el texto. */\nexport function marcaDeNoAnalizable(motivo: string): string {\n\treturn `[tapado entero: no se pudo analizar (${motivo})]`;\n}\n\n/**\n * Tapa un texto antes de que toque disco: identificadores y art. 9.\n *\n * `nivel` se pasa tal cual a `redactSensitive`; el barrido de categorías\n * especiales no depende del nivel, porque el art. 9 no es una preferencia del\n * usuario sino una prohibición legal.\n */\nexport function taparAntesDeEscribir(texto: string, nivel?: \"strict\" | \"balanced\" | \"permissive\"): string {\n\tlet conCategorias: string;\n\ttry {\n\t\tconCategorias = taparCategoriasEspeciales(texto);\n\t} catch (error) {\n\t\tif (error instanceof TextoNoAnalizable) return marcaDeNoAnalizable(error.motivo);\n\t\tthrow error;\n\t}\n\t// El orden importa poco porque las dos pasadas sustituyen tramos por bloques\n\t// opacos, pero se hace primero el art. 9: si un DNI vive dentro de una frase\n\t// de salud, taparla entera es más seguro que dejar el contexto.\n\treturn nivel ? redactSensitive(conCategorias, nivel) : redactSensitive(conCategorias);\n}\n"]}
1
+ {"version":3,"file":"tapar.d.ts","sourceRoot":"","sources":["../../../src/core/privacidad/tapar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAKH,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,CAYxG"}
@@ -1 +1 @@
1
- {"version":3,"file":"tapar.js","sourceRoot":"","sources":["../../../src/core/privacidad/tapar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAE1F,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAU;IAC3D,OAAO,wCAAwC,MAAM,IAAI,CAAC;AAAA,CAC1D;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,KAA4C,EAAU;IACzG,IAAI,aAAqB,CAAC;IAC1B,IAAI,CAAC;QACJ,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,iBAAiB;YAAE,OAAO,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjF,MAAM,KAAK,CAAC;IACb,CAAC;IACD,6EAA6E;IAC7E,6EAA6E;IAC7E,iEAAgE;IAChE,OAAO,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;AAAA,CACtF","sourcesContent":["/**\n * El punto único donde se tapa antes de escribir a disco.\n *\n * POR QUÉ EXISTE. `redactSensitive` cubre correos, teléfonos, DNI, IBAN y\n * fechas de nacimiento, y es lo que usan `audit/libro.ts` y `edicion/diario.ts`\n * antes de tocar disco. Pero medido ejecutando:\n *\n * una frase con un diagnóstico psiquiátrico, un sindicato y una serología\n * pasada por redactSensitive(..., \"strict\")\n * -> devuelve la cadena IDÉNTICA, sin un solo carácter tapado\n *\n * (La frase concreta vive en la prueba, no aquí: citar los términos en un\n * comentario los mete en el corpus que la propia guarda de falsos positivos\n * barre, y el módulo acaba acusándose a sí mismo.)\n *\n * Es decir: hoy una categoría especial del art. 9 del RGPD —salud, afiliación\n * sindical, origen étnico, religión, opinión política, vida sexual, biometría,\n * genética— se escribe EN CLARO en el libro de auditoría y en el diario de\n * edición. Y son justamente los datos cuyo tratamiento está prohibido salvo\n * excepción tasada, y cuya fuga cuesta mucho más cara que la de un correo.\n *\n * Este módulo compone las dos pasadas en una sola función, para que no haya que\n * acordarse de llamar a las dos en cada sitio: acordarse es lo que falla.\n *\n * LA DECISIÓN QUE HABÍA QUE TOMAR AQUÍ Y NO ESCONDER. `categoriasEspeciales`\n * lanza `TextoNoAnalizable` cuando no puede mirar —no es una cadena, o es\n * absurdamente larga— en vez de devolver una lista vacía, precisamente para que\n * «no he podido» no se confunda con «no hay». Tragarse esa excepción aquí\n * anularía el invariante entero: escribiríamos en claro un texto que nadie ha\n * mirado, y el registro diría que se revisó.\n *\n * Así que no se traga: si no se puede analizar, se tapa el texto ENTERO. Un\n * registro con un campo ilegible es un inconveniente; un registro con datos de\n * salud en claro es una infracción. Y se deja constancia del motivo, para que\n * quien audite sepa distinguir un campo tapado por precaución de uno tapado por\n * un hallazgo.\n */\n\nimport { redactSensitive } from \"../memory-engine/security.ts\";\nimport { TextoNoAnalizable, taparCategoriasEspeciales } from \"./categorias-especiales.ts\";\n\n/** Lo que se escribe cuando no se ha podido mirar el texto. */\nexport function marcaDeNoAnalizable(motivo: string): string {\n\treturn `[tapado entero: no se pudo analizar (${motivo})]`;\n}\n\n/**\n * Tapa un texto antes de que toque disco: identificadores y art. 9.\n *\n * `nivel` se pasa tal cual a `redactSensitive`; el barrido de categorías\n * especiales no depende del nivel, porque el art. 9 no es una preferencia del\n * usuario sino una prohibición legal.\n */\nexport function taparAntesDeEscribir(texto: string, nivel?: \"strict\" | \"balanced\" | \"permissive\"): string {\n\tlet conCategorias: string;\n\ttry {\n\t\tconCategorias = taparCategoriasEspeciales(texto);\n\t} catch (error) {\n\t\tif (error instanceof TextoNoAnalizable) return marcaDeNoAnalizable(error.motivo);\n\t\tthrow error;\n\t}\n\t// El orden importa poco porque las dos pasadas sustituyen tramos por bloques\n\t// opacos, pero se hace primero el art. 9: si un DNI vive dentro de una frase\n\t// de salud, taparla entera es más seguro que dejar el contexto.\n\treturn nivel ? redactSensitive(conCategorias, nivel) : redactSensitive(conCategorias);\n}\n"]}
1
+ {"version":3,"file":"tapar.js","sourceRoot":"","sources":["../../../src/core/privacidad/tapar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAE1F,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,MAAc;IACjD,OAAO,wCAAwC,MAAM,IAAI,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,KAA4C;IAC/F,IAAI,aAAqB,CAAC;IAC1B,IAAI,CAAC;QACJ,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,iBAAiB;YAAE,OAAO,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjF,MAAM,KAAK,CAAC;IACb,CAAC;IACD,6EAA6E;IAC7E,6EAA6E;IAC7E,gEAAgE;IAChE,OAAO,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;AACvF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"project-memory.d.ts","sourceRoot":"","sources":["../../src/core/project-memory.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI3D;AAUD,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,+EAA+E;AAC/E,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAQpG;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQzF;AAED,+EAA+E;AAC/E,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAK9G;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvE","sourcesContent":["import { createHash } from \"crypto\";\nimport { existsSync, readFileSync, realpathSync } from \"fs\";\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { dirname, join } from \"path\";\n\n/**\n * Shared project memory.\n *\n * Every project (identified by the realpath of its working directory) gets a\n * persistent memory file that is included in the context of ALL sessions of\n * that project — like Claude Code's project memory. The agent can update it\n * with the `update_project_memory` tool, and it survives across conversations.\n *\n * Location: <agentDir>/projects-memory/<sha256(cwd)[..12]>/memory.md\n * (outside the repo, never committed, shared by CLI and desktop).\n */\n\nexport interface ProjectMemory {\n\tpath: string;\n\tcontent: string;\n}\n\n/** Stable, short hash of a project working directory (resolves symlinks). */\nexport function getProjectMemoryDirName(cwd: string): string {\n\tconst real = realpathSafe(cwd);\n\tconst hash = createHash(\"sha256\").update(real).digest(\"hex\").slice(0, 12);\n\treturn `${hash}`;\n}\n\nfunction realpathSafe(p: string): string {\n\ttry {\n\t\treturn realpathSync(p);\n\t} catch {\n\t\treturn p;\n\t}\n}\n\n/** Absolute path of the project memory file for a working directory. */\nexport function getProjectMemoryPath(cwd: string, agentDir: string): string {\n\treturn join(agentDir, \"projects-memory\", getProjectMemoryDirName(cwd), \"memory.md\");\n}\n\n/** Load the shared memory of a project, or null when it does not exist yet. */\nexport async function loadProjectMemory(cwd: string, agentDir: string): Promise<ProjectMemory | null> {\n\tconst path = getProjectMemoryPath(cwd, agentDir);\n\ttry {\n\t\tconst content = await readFile(path, \"utf-8\");\n\t\treturn { path, content };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Synchronous variant used when building the system prompt context. */\nexport function loadProjectMemorySync(cwd: string, agentDir: string): ProjectMemory | null {\n\tconst path = getProjectMemoryPath(cwd, agentDir);\n\ttry {\n\t\tif (!existsSync(path)) return null;\n\t\treturn { path, content: readFileSync(path, \"utf-8\") };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Persist the shared memory of a project (creates the file/dir as needed). */\nexport async function saveProjectMemory(cwd: string, agentDir: string, content: string): Promise<ProjectMemory> {\n\tconst path = getProjectMemoryPath(cwd, agentDir);\n\tawait mkdir(dirname(path), { recursive: true });\n\tawait writeFile(path, content, \"utf-8\");\n\treturn { path, content };\n}\n\n/** Whether a memory file already exists for this project. */\nexport function hasProjectMemory(cwd: string, agentDir: string): boolean {\n\treturn existsSync(getProjectMemoryPath(cwd, agentDir));\n}\n"]}
1
+ {"version":3,"file":"project-memory.d.ts","sourceRoot":"","sources":["../../src/core/project-memory.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI3D;AAUD,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,+EAA+E;AAC/E,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAQpG;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQzF;AAED,+EAA+E;AAC/E,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAK9G;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvE"}
@@ -1 +1 @@
1
- {"version":3,"file":"project-memory.js","sourceRoot":"","sources":["../../src/core/project-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAmBrC,6EAA6E;AAC7E,MAAM,UAAU,uBAAuB,CAAC,GAAW,EAAU;IAC5D,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1E,OAAO,GAAG,IAAI,EAAE,CAAC;AAAA,CACjB;AAED,SAAS,YAAY,CAAC,CAAS,EAAU;IACxC,IAAI,CAAC;QACJ,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,CAAC;IACV,CAAC;AAAA,CACD;AAED,wEAAwE;AACxE,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,QAAgB,EAAU;IAC3E,OAAO,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,uBAAuB,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;AAAA,CACpF;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,QAAgB,EAAiC;IACrG,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AAAA,CACD;AAED,wEAAwE;AACxE,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,QAAgB,EAAwB;IAC1F,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC;QACJ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AAAA,CACD;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,QAAgB,EAAE,OAAe,EAA0B;IAC/G,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAAA,CACzB;AAED,6DAA6D;AAC7D,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAgB,EAAW;IACxE,OAAO,UAAU,CAAC,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA,CACvD","sourcesContent":["import { createHash } from \"crypto\";\nimport { existsSync, readFileSync, realpathSync } from \"fs\";\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { dirname, join } from \"path\";\n\n/**\n * Shared project memory.\n *\n * Every project (identified by the realpath of its working directory) gets a\n * persistent memory file that is included in the context of ALL sessions of\n * that project — like Claude Code's project memory. The agent can update it\n * with the `update_project_memory` tool, and it survives across conversations.\n *\n * Location: <agentDir>/projects-memory/<sha256(cwd)[..12]>/memory.md\n * (outside the repo, never committed, shared by CLI and desktop).\n */\n\nexport interface ProjectMemory {\n\tpath: string;\n\tcontent: string;\n}\n\n/** Stable, short hash of a project working directory (resolves symlinks). */\nexport function getProjectMemoryDirName(cwd: string): string {\n\tconst real = realpathSafe(cwd);\n\tconst hash = createHash(\"sha256\").update(real).digest(\"hex\").slice(0, 12);\n\treturn `${hash}`;\n}\n\nfunction realpathSafe(p: string): string {\n\ttry {\n\t\treturn realpathSync(p);\n\t} catch {\n\t\treturn p;\n\t}\n}\n\n/** Absolute path of the project memory file for a working directory. */\nexport function getProjectMemoryPath(cwd: string, agentDir: string): string {\n\treturn join(agentDir, \"projects-memory\", getProjectMemoryDirName(cwd), \"memory.md\");\n}\n\n/** Load the shared memory of a project, or null when it does not exist yet. */\nexport async function loadProjectMemory(cwd: string, agentDir: string): Promise<ProjectMemory | null> {\n\tconst path = getProjectMemoryPath(cwd, agentDir);\n\ttry {\n\t\tconst content = await readFile(path, \"utf-8\");\n\t\treturn { path, content };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Synchronous variant used when building the system prompt context. */\nexport function loadProjectMemorySync(cwd: string, agentDir: string): ProjectMemory | null {\n\tconst path = getProjectMemoryPath(cwd, agentDir);\n\ttry {\n\t\tif (!existsSync(path)) return null;\n\t\treturn { path, content: readFileSync(path, \"utf-8\") };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Persist the shared memory of a project (creates the file/dir as needed). */\nexport async function saveProjectMemory(cwd: string, agentDir: string, content: string): Promise<ProjectMemory> {\n\tconst path = getProjectMemoryPath(cwd, agentDir);\n\tawait mkdir(dirname(path), { recursive: true });\n\tawait writeFile(path, content, \"utf-8\");\n\treturn { path, content };\n}\n\n/** Whether a memory file already exists for this project. */\nexport function hasProjectMemory(cwd: string, agentDir: string): boolean {\n\treturn existsSync(getProjectMemoryPath(cwd, agentDir));\n}\n"]}
1
+ {"version":3,"file":"project-memory.js","sourceRoot":"","sources":["../../src/core/project-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAmBrC,6EAA6E;AAC7E,MAAM,UAAU,uBAAuB,CAAC,GAAW;IAClD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1E,OAAO,GAAG,IAAI,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC9B,IAAI,CAAC;QACJ,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,CAAC;IACV,CAAC;AACF,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,QAAgB;IACjE,OAAO,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,uBAAuB,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;AACrF,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,QAAgB;IACpE,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,QAAgB;IAClE,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC;QACJ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,QAAgB,EAAE,OAAe;IACrF,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAgB;IAC7D,OAAO,UAAU,CAAC,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"project-trust.d.ts","sourceRoot":"","sources":["../../src/core/project-trust.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAIN,KAAK,iBAAiB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,OAAO,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAE/D,MAAM,WAAW,4BAA4B;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,OAAO,CAAC,CAkDnG","sourcesContent":["import { APP_NAME, CONFIG_DIR_NAME } from \"../config.ts\";\nimport { emitProjectTrustEvent } from \"./extensions/runner.ts\";\nimport type { LoadExtensionsResult, ProjectTrustContext } from \"./extensions/types.ts\";\nimport type { DefaultProjectTrust } from \"./settings-manager.ts\";\nimport {\n\tgetProjectTrustOptions,\n\thasTrustRequiringProjectResources,\n\ttype ProjectTrustOption,\n\ttype ProjectTrustStore,\n} from \"./trust-manager.ts\";\n\nexport type AppMode = \"interactive\" | \"print\" | \"json\" | \"rpc\";\n\nexport interface ResolveProjectTrustedOptions {\n\tcwd: string;\n\ttrustStore: ProjectTrustStore;\n\ttrustOverride?: boolean;\n\tdefaultProjectTrust?: DefaultProjectTrust;\n\textensionsResult?: LoadExtensionsResult;\n\tprojectTrustContext: ProjectTrustContext;\n\tonExtensionError?: (message: string) => void;\n}\n\nfunction formatProjectTrustPrompt(cwd: string): string {\n\treturn `Trust project folder?\\n${cwd}\\n\\nThis allows ${APP_NAME} to load ${CONFIG_DIR_NAME} settings and resources, install missing project packages, and execute project extensions.`;\n}\n\nasync function selectProjectTrustOption(\n\tcwd: string,\n\tctx: ProjectTrustContext,\n): Promise<ProjectTrustOption | undefined> {\n\tconst options = getProjectTrustOptions(cwd, { includeSessionOnly: true });\n\tconst selected = await ctx.ui.select(\n\t\tformatProjectTrustPrompt(cwd),\n\t\toptions.map((option) => option.label),\n\t);\n\treturn options.find((option) => option.label === selected);\n}\n\nfunction saveProjectTrustPromptResult(trustStore: ProjectTrustStore, result: ProjectTrustOption): void {\n\tif (result.updates.length > 0) {\n\t\ttrustStore.setMany(result.updates);\n\t}\n}\n\nexport async function resolveProjectTrusted(options: ResolveProjectTrustedOptions): Promise<boolean> {\n\tif (options.trustOverride !== undefined) {\n\t\treturn options.trustOverride;\n\t}\n\tif (!hasTrustRequiringProjectResources(options.cwd)) {\n\t\treturn true;\n\t}\n\n\tif (options.extensionsResult) {\n\t\tconst { result, errors } = await emitProjectTrustEvent(\n\t\t\toptions.extensionsResult,\n\t\t\t{ type: \"project_trust\", cwd: options.cwd },\n\t\t\toptions.projectTrustContext,\n\t\t);\n\t\tfor (const error of errors) {\n\t\t\toptions.onExtensionError?.(`Extension \"${error.extensionPath}\" project_trust error: ${error.error}`);\n\t\t}\n\t\tif (result) {\n\t\t\tconst trusted = result.trusted === \"yes\";\n\t\t\tif (result.remember === true) {\n\t\t\t\toptions.trustStore.set(options.cwd, trusted);\n\t\t\t}\n\t\t\treturn trusted;\n\t\t}\n\t}\n\n\tconst decision = options.trustStore.get(options.cwd);\n\tif (decision !== null) {\n\t\treturn decision;\n\t}\n\n\tswitch (options.defaultProjectTrust ?? \"ask\") {\n\t\tcase \"always\":\n\t\t\treturn true;\n\t\tcase \"never\":\n\t\t\treturn false;\n\t\tcase \"ask\":\n\t\t\tbreak;\n\t}\n\n\tif (!options.projectTrustContext.hasUI) {\n\t\treturn false;\n\t}\n\n\tconst selected = await selectProjectTrustOption(options.cwd, options.projectTrustContext);\n\tif (selected !== undefined) {\n\t\tsaveProjectTrustPromptResult(options.trustStore, selected);\n\t\treturn selected.trusted;\n\t}\n\treturn false;\n}\n"]}
1
+ {"version":3,"file":"project-trust.d.ts","sourceRoot":"","sources":["../../src/core/project-trust.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAIN,KAAK,iBAAiB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,OAAO,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAE/D,MAAM,WAAW,4BAA4B;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,OAAO,CAAC,CAkDnG"}
@@ -1 +1 @@
1
- {"version":3,"file":"project-trust.js","sourceRoot":"","sources":["../../src/core/project-trust.ts"],"names":[],"mappings":"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","sourcesContent":["import { APP_NAME, CONFIG_DIR_NAME } from \"../config.ts\";\nimport { emitProjectTrustEvent } from \"./extensions/runner.ts\";\nimport type { LoadExtensionsResult, ProjectTrustContext } from \"./extensions/types.ts\";\nimport type { DefaultProjectTrust } from \"./settings-manager.ts\";\nimport {\n\tgetProjectTrustOptions,\n\thasTrustRequiringProjectResources,\n\ttype ProjectTrustOption,\n\ttype ProjectTrustStore,\n} from \"./trust-manager.ts\";\n\nexport type AppMode = \"interactive\" | \"print\" | \"json\" | \"rpc\";\n\nexport interface ResolveProjectTrustedOptions {\n\tcwd: string;\n\ttrustStore: ProjectTrustStore;\n\ttrustOverride?: boolean;\n\tdefaultProjectTrust?: DefaultProjectTrust;\n\textensionsResult?: LoadExtensionsResult;\n\tprojectTrustContext: ProjectTrustContext;\n\tonExtensionError?: (message: string) => void;\n}\n\nfunction formatProjectTrustPrompt(cwd: string): string {\n\treturn `Trust project folder?\\n${cwd}\\n\\nThis allows ${APP_NAME} to load ${CONFIG_DIR_NAME} settings and resources, install missing project packages, and execute project extensions.`;\n}\n\nasync function selectProjectTrustOption(\n\tcwd: string,\n\tctx: ProjectTrustContext,\n): Promise<ProjectTrustOption | undefined> {\n\tconst options = getProjectTrustOptions(cwd, { includeSessionOnly: true });\n\tconst selected = await ctx.ui.select(\n\t\tformatProjectTrustPrompt(cwd),\n\t\toptions.map((option) => option.label),\n\t);\n\treturn options.find((option) => option.label === selected);\n}\n\nfunction saveProjectTrustPromptResult(trustStore: ProjectTrustStore, result: ProjectTrustOption): void {\n\tif (result.updates.length > 0) {\n\t\ttrustStore.setMany(result.updates);\n\t}\n}\n\nexport async function resolveProjectTrusted(options: ResolveProjectTrustedOptions): Promise<boolean> {\n\tif (options.trustOverride !== undefined) {\n\t\treturn options.trustOverride;\n\t}\n\tif (!hasTrustRequiringProjectResources(options.cwd)) {\n\t\treturn true;\n\t}\n\n\tif (options.extensionsResult) {\n\t\tconst { result, errors } = await emitProjectTrustEvent(\n\t\t\toptions.extensionsResult,\n\t\t\t{ type: \"project_trust\", cwd: options.cwd },\n\t\t\toptions.projectTrustContext,\n\t\t);\n\t\tfor (const error of errors) {\n\t\t\toptions.onExtensionError?.(`Extension \"${error.extensionPath}\" project_trust error: ${error.error}`);\n\t\t}\n\t\tif (result) {\n\t\t\tconst trusted = result.trusted === \"yes\";\n\t\t\tif (result.remember === true) {\n\t\t\t\toptions.trustStore.set(options.cwd, trusted);\n\t\t\t}\n\t\t\treturn trusted;\n\t\t}\n\t}\n\n\tconst decision = options.trustStore.get(options.cwd);\n\tif (decision !== null) {\n\t\treturn decision;\n\t}\n\n\tswitch (options.defaultProjectTrust ?? \"ask\") {\n\t\tcase \"always\":\n\t\t\treturn true;\n\t\tcase \"never\":\n\t\t\treturn false;\n\t\tcase \"ask\":\n\t\t\tbreak;\n\t}\n\n\tif (!options.projectTrustContext.hasUI) {\n\t\treturn false;\n\t}\n\n\tconst selected = await selectProjectTrustOption(options.cwd, options.projectTrustContext);\n\tif (selected !== undefined) {\n\t\tsaveProjectTrustPromptResult(options.trustStore, selected);\n\t\treturn selected.trusted;\n\t}\n\treturn false;\n}\n"]}
1
+ {"version":3,"file":"project-trust.js","sourceRoot":"","sources":["../../src/core/project-trust.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/core/prompt-cache/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,eAAe;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,0CAA0C;IAC1C,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AASD,8EAA8E;AAC9E,wBAAgB,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAEtD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,SAAS,CAgEhG;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE,CAOrE;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAWpD","sourcesContent":["/**\n * Diagnóstico de por qué la caché no acierta.\n *\n * Un hit rate bajo casi nunca es culpa del modelo: suele ser el prompt moviéndose\n * o el enrutado fragmentándose. Esto nombra la causa concreta en vez de dejar un\n * porcentaje que el usuario no sabe interpretar.\n *\n * Además es, literalmente, la especificación del lado servidor de nuestro\n * gateway: cada aviso de aquí es una obligación que el gateway tendrá que\n * cumplir.\n */\n\nimport type { ModelCacheStats } from \"./stats.ts\";\n\nexport interface ProviderProfile {\n\tapi: string;\n\tbaseUrl?: string;\n\t/** `compat.sendSessionAffinityHeaders` */\n\tsendsAffinityHeaders?: boolean;\n\t/** `compat.supportsLongCacheRetention` */\n\tsupportsLongRetention?: boolean;\n}\n\nexport interface Diagnosis {\n\tseverity: \"ok\" | \"warn\" | \"problem\";\n\tsummary: string;\n\tcauses: string[];\n\tactions: string[];\n}\n\nconst OFFICIAL_HOSTS = [\"api.openai.com\", \"api.anthropic.com\", \"api.deepseek.com\", \"generativelanguage.googleapis.com\"];\n\nfunction isThirdParty(baseUrl?: string): boolean {\n\tif (!baseUrl) return false;\n\treturn !OFFICIAL_HOSTS.some((host) => baseUrl.includes(host));\n}\n\n/** Ratio de aciertos por tokens (no por peticiones): es lo que se factura. */\nexport function hitRate(stats: ModelCacheStats): number {\n\treturn stats.totalTokens > 0 ? stats.cachedTokens / stats.totalTokens : 0;\n}\n\nexport function diagnose(stats: ModelCacheStats | undefined, profile: ProviderProfile): Diagnosis {\n\tconst causes: string[] = [];\n\tconst actions: string[] = [];\n\n\tif (!stats || stats.requests < 3) {\n\t\treturn {\n\t\t\tseverity: \"ok\",\n\t\t\tsummary: \"Aún no hay muestras suficientes para diagnosticar.\",\n\t\t\tcauses: [],\n\t\t\tactions: [\"Sigue trabajando unos turnos y vuelve a mirar.\"],\n\t\t};\n\t}\n\n\t// Telemetría antes que diagnóstico: si el proveedor no reporta, un 0% no\n\t// significa que la caché falle, significa que no lo sabemos.\n\tif (stats.missingFieldRequests > stats.requests / 2) {\n\t\treturn {\n\t\t\tseverity: \"warn\",\n\t\t\tsummary: \"El proveedor no está devolviendo campos de uso de caché — el porcentaje no es fiable.\",\n\t\t\tcauses: [\"Un proxy o gateway intermedio está descartando el `usage` del upstream.\"],\n\t\t\tactions: [\n\t\t\t\t\"Haz que el gateway reenvíe los campos de caché tal cual (prompt_cache_hit_tokens, cached_tokens, cache_read_input_tokens).\",\n\t\t\t],\n\t\t};\n\t}\n\n\tconst rate = hitRate(stats);\n\tif (rate >= 0.5) {\n\t\treturn { severity: \"ok\", summary: `Hit rate ${(rate * 100).toFixed(1)}% — sano.`, causes: [], actions: [] };\n\t}\n\n\t// Endpoint de terceros sin afinidad: cada turno puede caer en otro backend, y\n\t// entonces no hay prefijo que valga.\n\tif (isThirdParty(profile.baseUrl) && profile.sendsAffinityHeaders !== true) {\n\t\tcauses.push(\n\t\t\t\"Endpoint de terceros sin cabeceras de afinidad de sesión: cada turno puede aterrizar en otro backend.\",\n\t\t);\n\t\tactions.push(\"Pon `compat.sendSessionAffinityHeaders: true` en la entrada del proveedor en models.json.\");\n\t}\n\n\tif (profile.api === \"openai-completions\" && isThirdParty(profile.baseUrl)) {\n\t\tcauses.push(\n\t\t\t\"En openai-completions con URL de terceros, el core solo manda prompt_cache_key con retención larga.\",\n\t\t);\n\t\tactions.push(\"Deja activo el optimizador de caché de Ada: rellena la clave en ese caso.\");\n\t}\n\n\tif (isThirdParty(profile.baseUrl)) {\n\t\tcauses.push(\"El proxy podría estar repartiendo la sesión entre varias cuentas o instancias upstream.\");\n\t\tactions.push(\"Fija una sesión a un único upstream (routing pegajoso por x-session-affinity).\");\n\t\tactions.push(\"No reescribas el payload en el proxy: reordenar claves JSON rompe el prefijo que intenta cachear.\");\n\t}\n\n\tif (causes.length === 0) {\n\t\tcauses.push(\"El prefijo del prompt se está moviendo entre turnos.\");\n\t\tactions.push(\"Comprueba que nada dinámico (hora, estado de git, memoria) esté delante del contenido estable.\");\n\t}\n\n\treturn {\n\t\tseverity: rate < 0.15 ? \"problem\" : \"warn\",\n\t\tsummary: `Hit rate ${(rate * 100).toFixed(1)}% — por debajo de lo esperable.`,\n\t\tcauses,\n\t\tactions,\n\t};\n}\n\n/** Ajustes de `compat` que faltan y que sabemos que ayudan, por proveedor. */\nexport function missingCompatFlags(profile: ProviderProfile): string[] {\n\tconst missing: string[] = [];\n\tif (isThirdParty(profile.baseUrl)) {\n\t\tif (profile.sendsAffinityHeaders !== true) missing.push(\"sendSessionAffinityHeaders\");\n\t\tif (profile.supportsLongRetention === undefined) missing.push(\"supportsLongCacheRetention\");\n\t}\n\treturn missing;\n}\n\nexport function renderDiagnosis(d: Diagnosis): string {\n\tconst lines = [d.summary];\n\tif (d.causes.length) {\n\t\tlines.push(\"\", \"Causas probables:\");\n\t\tfor (const c of d.causes) lines.push(` · ${c}`);\n\t}\n\tif (d.actions.length) {\n\t\tlines.push(\"\", \"Qué hacer:\");\n\t\tfor (const a of d.actions) lines.push(` → ${a}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/core/prompt-cache/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,eAAe;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,0CAA0C;IAC1C,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AASD,8EAA8E;AAC9E,wBAAgB,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAEtD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,SAAS,CAgEhG;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE,CAOrE;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAWpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/core/prompt-cache/diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Diagnóstico de por qué la caché no acierta.\n *\n * Un hit rate bajo casi nunca es culpa del modelo: suele ser el prompt moviéndose\n * o el enrutado fragmentándose. Esto nombra la causa concreta en vez de dejar un\n * porcentaje que el usuario no sabe interpretar.\n *\n * Además es, literalmente, la especificación del lado servidor de nuestro\n * gateway: cada aviso de aquí es una obligación que el gateway tendrá que\n * cumplir.\n */\n\nimport type { ModelCacheStats } from \"./stats.ts\";\n\nexport interface ProviderProfile {\n\tapi: string;\n\tbaseUrl?: string;\n\t/** `compat.sendSessionAffinityHeaders` */\n\tsendsAffinityHeaders?: boolean;\n\t/** `compat.supportsLongCacheRetention` */\n\tsupportsLongRetention?: boolean;\n}\n\nexport interface Diagnosis {\n\tseverity: \"ok\" | \"warn\" | \"problem\";\n\tsummary: string;\n\tcauses: string[];\n\tactions: string[];\n}\n\nconst OFFICIAL_HOSTS = [\"api.openai.com\", \"api.anthropic.com\", \"api.deepseek.com\", \"generativelanguage.googleapis.com\"];\n\nfunction isThirdParty(baseUrl?: string): boolean {\n\tif (!baseUrl) return false;\n\treturn !OFFICIAL_HOSTS.some((host) => baseUrl.includes(host));\n}\n\n/** Ratio de aciertos por tokens (no por peticiones): es lo que se factura. */\nexport function hitRate(stats: ModelCacheStats): number {\n\treturn stats.totalTokens > 0 ? stats.cachedTokens / stats.totalTokens : 0;\n}\n\nexport function diagnose(stats: ModelCacheStats | undefined, profile: ProviderProfile): Diagnosis {\n\tconst causes: string[] = [];\n\tconst actions: string[] = [];\n\n\tif (!stats || stats.requests < 3) {\n\t\treturn {\n\t\t\tseverity: \"ok\",\n\t\t\tsummary: \"Aún no hay muestras suficientes para diagnosticar.\",\n\t\t\tcauses: [],\n\t\t\tactions: [\"Sigue trabajando unos turnos y vuelve a mirar.\"],\n\t\t};\n\t}\n\n\t// Telemetría antes que diagnóstico: si el proveedor no reporta, un 0% no\n\t// significa que la caché falle, significa que no lo sabemos.\n\tif (stats.missingFieldRequests > stats.requests / 2) {\n\t\treturn {\n\t\t\tseverity: \"warn\",\n\t\t\tsummary: \"El proveedor no está devolviendo campos de uso de caché — el porcentaje no es fiable.\",\n\t\t\tcauses: [\"Un proxy o gateway intermedio está descartando el `usage` del upstream.\"],\n\t\t\tactions: [\n\t\t\t\t\"Haz que el gateway reenvíe los campos de caché tal cual (prompt_cache_hit_tokens, cached_tokens, cache_read_input_tokens).\",\n\t\t\t],\n\t\t};\n\t}\n\n\tconst rate = hitRate(stats);\n\tif (rate >= 0.5) {\n\t\treturn { severity: \"ok\", summary: `Hit rate ${(rate * 100).toFixed(1)}% — sano.`, causes: [], actions: [] };\n\t}\n\n\t// Endpoint de terceros sin afinidad: cada turno puede caer en otro backend, y\n\t// entonces no hay prefijo que valga.\n\tif (isThirdParty(profile.baseUrl) && profile.sendsAffinityHeaders !== true) {\n\t\tcauses.push(\n\t\t\t\"Endpoint de terceros sin cabeceras de afinidad de sesión: cada turno puede aterrizar en otro backend.\",\n\t\t);\n\t\tactions.push(\"Pon `compat.sendSessionAffinityHeaders: true` en la entrada del proveedor en models.json.\");\n\t}\n\n\tif (profile.api === \"openai-completions\" && isThirdParty(profile.baseUrl)) {\n\t\tcauses.push(\n\t\t\t\"En openai-completions con URL de terceros, el core solo manda prompt_cache_key con retención larga.\",\n\t\t);\n\t\tactions.push(\"Deja activo el optimizador de caché de Ada: rellena la clave en ese caso.\");\n\t}\n\n\tif (isThirdParty(profile.baseUrl)) {\n\t\tcauses.push(\"El proxy podría estar repartiendo la sesión entre varias cuentas o instancias upstream.\");\n\t\tactions.push(\"Fija una sesión a un único upstream (routing pegajoso por x-session-affinity).\");\n\t\tactions.push(\"No reescribas el payload en el proxy: reordenar claves JSON rompe el prefijo que intenta cachear.\");\n\t}\n\n\tif (causes.length === 0) {\n\t\tcauses.push(\"El prefijo del prompt se está moviendo entre turnos.\");\n\t\tactions.push(\"Comprueba que nada dinámico (hora, estado de git, memoria) esté delante del contenido estable.\");\n\t}\n\n\treturn {\n\t\tseverity: rate < 0.15 ? \"problem\" : \"warn\",\n\t\tsummary: `Hit rate ${(rate * 100).toFixed(1)}% — por debajo de lo esperable.`,\n\t\tcauses,\n\t\tactions,\n\t};\n}\n\n/** Ajustes de `compat` que faltan y que sabemos que ayudan, por proveedor. */\nexport function missingCompatFlags(profile: ProviderProfile): string[] {\n\tconst missing: string[] = [];\n\tif (isThirdParty(profile.baseUrl)) {\n\t\tif (profile.sendsAffinityHeaders !== true) missing.push(\"sendSessionAffinityHeaders\");\n\t\tif (profile.supportsLongRetention === undefined) missing.push(\"supportsLongCacheRetention\");\n\t}\n\treturn missing;\n}\n\nexport function renderDiagnosis(d: Diagnosis): string {\n\tconst lines = [d.summary];\n\tif (d.causes.length) {\n\t\tlines.push(\"\", \"Causas probables:\");\n\t\tfor (const c of d.causes) lines.push(` · ${c}`);\n\t}\n\tif (d.actions.length) {\n\t\tlines.push(\"\", \"Qué hacer:\");\n\t\tfor (const a of d.actions) lines.push(` → ${a}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/core/prompt-cache/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/prompt-cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAM3D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgB7D,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,8BAsIrE","sourcesContent":["/**\n * Ada Prompt Cache — optimizador de aciertos de caché de prompt.\n *\n * Se registra como extensión inline por defecto. Vive entero en ficheros\n * propiedad de Ada, así que no cuesta nada contra el presupuesto de sync, y usa\n * la API pública de extensiones, que es estable.\n *\n * Qué hace, y por qué cada cosa:\n *\n * - Reordena el system prompt para que lo estable quede delante (`stabilize`).\n * Con caché por prefijo, el coste de un cambio depende de su POSICIÓN, no de\n * su tamaño.\n * - Rellena `prompt_cache_key` donde el core no lo pone: endpoints de terceros\n * con retención corta, que es justo el caso de un gateway propio.\n * - Quita `prompt_cache_retention` de endpoints que no lo soportan (un 400 tumba\n * la petición entera) y APRENDE de los 400 que ve.\n * - Repara el orden de TTL de `cache_control` de Anthropic.\n * - Mide el hit rate real por proveedor y lo muestra en el footer. Sin medición\n * todo lo anterior es fe.\n *\n * Se desactiva con `promptCache: false` en settings o `ADA_NO_PROMPT_CACHE=1`.\n */\n\nimport type { ExtensionAPI } from \"../extensions/types.ts\";\nimport { diagnose, missingCompatFlags, renderDiagnosis } from \"./diagnostics.ts\";\nimport { normalizeAnthropicTtlOrder, withCacheKey, withRetentionGuard } from \"./payload.ts\";\nimport { stabilizeSystemPrompt } from \"./stabilize.ts\";\nimport { CacheStatsStore, formatStats, readCacheUsage } from \"./stats.ts\";\n\nexport { diagnose } from \"./diagnostics.ts\";\nexport { stabilizeSystemPrompt } from \"./stabilize.ts\";\nexport { CacheStatsStore, readCacheUsage } from \"./stats.ts\";\n\nfunction today(): string {\n\treturn new Date().toISOString().slice(0, 10);\n}\n\n/** Etiqueta corta por familia, para el footer. */\nfunction labelFor(modelId: string): string {\n\tconst id = modelId.toLowerCase();\n\tif (id.includes(\"deepseek\")) return \"DS cache\";\n\tif (id.includes(\"claude\")) return \"Claude cache\";\n\tif (id.includes(\"gemini\")) return \"Gemini cache\";\n\tif (id.includes(\"gpt\") || id.includes(\"o1\") || id.includes(\"o3\")) return \"OpenAI cache\";\n\treturn \"cache\";\n}\n\nexport interface PromptCacheOptions {\n\tagentDir: string;\n\t/** Desactiva todo (settings o variable de entorno). */\n\tdisabled?: boolean;\n}\n\nexport function createPromptCacheExtension(options: PromptCacheOptions) {\n\treturn (pi: ExtensionAPI): void => {\n\t\tif (options.disabled) return;\n\n\t\tconst store = new CacheStatsStore(options.agentDir);\n\t\tvoid store.load();\n\n\t\t/** Modelos a los que este proceso ya vio rechazar la retención. */\n\t\tconst retentionRejected = new Set<string>();\n\t\t/** ¿La última petición llevó `prompt_cache_retention`? Ver el 400 de abajo. */\n\t\tlet sentRetentionLastRequest = false;\n\t\tlet currentModelKey = \"unknown\";\n\t\tlet integrityRolledBack = false;\n\n\t\t// ── 1. Prefijo estable ────────────────────────────────────────────────\n\t\tpi.on(\"before_agent_start\", async (event) => {\n\t\t\tconst opts = event.systemPromptOptions;\n\t\t\tconst result = stabilizeSystemPrompt({\n\t\t\t\tprompt: event.systemPrompt,\n\t\t\t\tcustomPrompt: opts.customPrompt,\n\t\t\t\tappendSystemPrompt: opts.appendSystemPrompt,\n\t\t\t\tpromptGuidelines: opts.promptGuidelines,\n\t\t\t\tcontextFiles: opts.contextFiles,\n\t\t\t});\n\t\t\tif (result.rolledBack) integrityRolledBack = true;\n\t\t\tif (result.lifted === 0) return undefined;\n\t\t\treturn { systemPrompt: result.prompt };\n\t\t});\n\n\t\t// ── 2. Payload ────────────────────────────────────────────────────────\n\t\tpi.on(\"before_provider_request\", async (event) => {\n\t\t\tconst payload = event.payload;\n\t\t\tif (!payload || typeof payload !== \"object\") return undefined;\n\t\t\tconst record = payload as Record<string, unknown>;\n\t\t\tconst api = typeof record.__api === \"string\" ? record.__api : inferApi(record);\n\n\t\t\tlet next = withCacheKey(record, {\n\t\t\t\tapi,\n\t\t\t\tsessionId: currentSessionId,\n\t\t\t\tbaseUrl: currentBaseUrl,\n\t\t\t});\n\t\t\tnext = withRetentionGuard(next, {\n\t\t\t\tapi,\n\t\t\t\tbaseUrl: currentBaseUrl,\n\t\t\t\tsupportsLongRetention: currentSupportsLongRetention,\n\t\t\t\tretentionRejected: retentionRejected.has(currentModelKey),\n\t\t\t});\n\t\t\tif (api === \"anthropic-messages\") next = normalizeAnthropicTtlOrder(next);\n\t\t\t// Se recuerda si viajó retención, para poder atribuir un 400 posterior.\n\t\t\tsentRetentionLastRequest = typeof next.prompt_cache_retention === \"string\";\n\t\t\treturn next === record ? undefined : next;\n\t\t});\n\n\t\t// ── 3. Aprender de los errores del proveedor ──────────────────────────\n\t\tpi.on(\"after_provider_response\", async (event) => {\n\t\t\t// El cuerpo no viaja en este evento, así que no se puede clasificar el\n\t\t\t// error por texto. Se usa la única evidencia disponible: un 400 JUSTO\n\t\t\t// DESPUÉS de haber enviado retención. Sin esa condición, un 400 por\n\t\t\t// cualquier otro motivo (contexto demasiado largo, argumento inválido)\n\t\t\t// desactivaría la retención de ese modelo para siempre.\n\t\t\tif (event.status === 400 && sentRetentionLastRequest) {\n\t\t\t\tretentionRejected.add(currentModelKey);\n\t\t\t}\n\t\t\tsentRetentionLastRequest = false;\n\t\t});\n\n\t\t// ── 4. Medición ───────────────────────────────────────────────────────\n\t\tlet currentSessionId: string | undefined;\n\t\tlet currentBaseUrl: string | undefined;\n\t\tlet currentSupportsLongRetention: boolean | undefined;\n\n\t\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\t\tcurrentSessionId = ctx?.sessionManager?.getSessionId?.();\n\t\t});\n\n\t\tpi.on(\"message_end\", async (event, ctx) => {\n\t\t\tconst message = event.message as unknown as Record<string, unknown> | undefined;\n\t\t\tif (!message || message.role !== \"assistant\") return;\n\t\t\t// Un reintento del host emite message_end con usage a cero: contarlo\n\t\t\t// hundiría el ratio con peticiones que nunca llegaron al proveedor.\n\t\t\tconst stop = message.stopReason;\n\t\t\tif (stop === \"error\" || stop === \"aborted\") return;\n\t\t\tconst usage = readCacheUsage(message.usage);\n\t\t\tif (usage.totalInput === 0) return;\n\t\t\tconst stats = store.record(currentModelKey, today(), usage);\n\t\t\tconst text = formatStats(labelFor(currentModelKey), stats);\n\t\t\tif (text) ctx?.ui?.setStatus(\"ada-prompt-cache\", integrityRolledBack ? `${text} ⚠️ integridad` : text);\n\t\t});\n\n\t\tpi.on(\"model_select\", async (event) => {\n\t\t\tconst model = (event as { model?: { id?: string; provider?: string; baseUrl?: string; compat?: unknown } })\n\t\t\t\t.model;\n\t\t\tif (!model) return;\n\t\t\tcurrentModelKey = `${model.provider ?? \"?\"}/${model.id ?? \"?\"}`;\n\t\t\tcurrentBaseUrl = model.baseUrl;\n\t\t\tconst compat = model.compat as { supportsLongCacheRetention?: boolean } | undefined;\n\t\t\tcurrentSupportsLongRetention = compat?.supportsLongCacheRetention;\n\t\t});\n\n\t\tpi.on(\"session_shutdown\", async () => {\n\t\t\tawait store.flush();\n\t\t});\n\n\t\t// ── 5. Comando ────────────────────────────────────────────────────────\n\t\tpi.registerCommand(\"cache\", {\n\t\t\tdescription: \"Estadísticas y diagnóstico de la caché de prompt\",\n\t\t\thandler: async (args: string, cmdCtx): Promise<void> => {\n\t\t\t\tconst say = (text: string) => cmdCtx.ui?.notify(text, \"info\");\n\t\t\t\tconst sub = args.trim().split(/\\s+/)[0] || \"stats\";\n\t\t\t\tconst stats = store.get(currentModelKey);\n\t\t\t\tif (sub === \"reset\") {\n\t\t\t\t\tstore.reset();\n\t\t\t\t\tsay(\"Contadores de caché reiniciados.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (sub === \"doctor\") {\n\t\t\t\t\tconst d = diagnose(stats, {\n\t\t\t\t\t\tapi: inferApiFromKey(currentModelKey),\n\t\t\t\t\t\tbaseUrl: currentBaseUrl,\n\t\t\t\t\t\tsupportsLongRetention: currentSupportsLongRetention,\n\t\t\t\t\t});\n\t\t\t\t\tconst missing = missingCompatFlags({\n\t\t\t\t\t\tapi: inferApiFromKey(currentModelKey),\n\t\t\t\t\t\tbaseUrl: currentBaseUrl,\n\t\t\t\t\t\tsupportsLongRetention: currentSupportsLongRetention,\n\t\t\t\t\t});\n\t\t\t\t\tconst extra = missing.length ? `\\n\\nFlags de compat que faltan: ${missing.join(\", \")}` : \"\";\n\t\t\t\t\tsay(`${currentModelKey}\\n\\n${renderDiagnosis(d)}${extra}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsay(stats ? formatStats(labelFor(currentModelKey), stats) : \"Sin datos de caché todavía.\");\n\t\t\t},\n\t\t});\n\t};\n}\n\nfunction inferApi(payload: Record<string, unknown>): string {\n\tif (\"anthropic_version\" in payload || \"system\" in payload) return \"anthropic-messages\";\n\tif (\"input\" in payload && !(\"messages\" in payload)) return \"openai-responses\";\n\treturn \"openai-completions\";\n}\n\nfunction inferApiFromKey(modelKey: string): string {\n\treturn modelKey.toLowerCase().includes(\"claude\") ? \"anthropic-messages\" : \"openai-completions\";\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/prompt-cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAM3D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgB7D,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,IAC7D,IAAI,YAAY,KAAG,IAAI,CAqI/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/prompt-cache/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Ada Prompt Cache — optimizador de aciertos de caché de prompt.\n *\n * Se registra como extensión inline por defecto. Vive entero en ficheros\n * propiedad de Ada, así que no cuesta nada contra el presupuesto de sync, y usa\n * la API pública de extensiones, que es estable.\n *\n * Qué hace, y por qué cada cosa:\n *\n * - Reordena el system prompt para que lo estable quede delante (`stabilize`).\n * Con caché por prefijo, el coste de un cambio depende de su POSICIÓN, no de\n * su tamaño.\n * - Rellena `prompt_cache_key` donde el core no lo pone: endpoints de terceros\n * con retención corta, que es justo el caso de un gateway propio.\n * - Quita `prompt_cache_retention` de endpoints que no lo soportan (un 400 tumba\n * la petición entera) y APRENDE de los 400 que ve.\n * - Repara el orden de TTL de `cache_control` de Anthropic.\n * - Mide el hit rate real por proveedor y lo muestra en el footer. Sin medición\n * todo lo anterior es fe.\n *\n * Se desactiva con `promptCache: false` en settings o `ADA_NO_PROMPT_CACHE=1`.\n */\n\nimport type { ExtensionAPI } from \"../extensions/types.ts\";\nimport { diagnose, missingCompatFlags, renderDiagnosis } from \"./diagnostics.ts\";\nimport { normalizeAnthropicTtlOrder, withCacheKey, withRetentionGuard } from \"./payload.ts\";\nimport { stabilizeSystemPrompt } from \"./stabilize.ts\";\nimport { CacheStatsStore, formatStats, readCacheUsage } from \"./stats.ts\";\n\nexport { diagnose } from \"./diagnostics.ts\";\nexport { stabilizeSystemPrompt } from \"./stabilize.ts\";\nexport { CacheStatsStore, readCacheUsage } from \"./stats.ts\";\n\nfunction today(): string {\n\treturn new Date().toISOString().slice(0, 10);\n}\n\n/** Etiqueta corta por familia, para el footer. */\nfunction labelFor(modelId: string): string {\n\tconst id = modelId.toLowerCase();\n\tif (id.includes(\"deepseek\")) return \"DS cache\";\n\tif (id.includes(\"claude\")) return \"Claude cache\";\n\tif (id.includes(\"gemini\")) return \"Gemini cache\";\n\tif (id.includes(\"gpt\") || id.includes(\"o1\") || id.includes(\"o3\")) return \"OpenAI cache\";\n\treturn \"cache\";\n}\n\nexport interface PromptCacheOptions {\n\tagentDir: string;\n\t/** Desactiva todo (settings o variable de entorno). */\n\tdisabled?: boolean;\n}\n\nexport function createPromptCacheExtension(options: PromptCacheOptions) {\n\treturn (pi: ExtensionAPI): void => {\n\t\tif (options.disabled) return;\n\n\t\tconst store = new CacheStatsStore(options.agentDir);\n\t\tvoid store.load();\n\n\t\t/** Modelos a los que este proceso ya vio rechazar la retención. */\n\t\tconst retentionRejected = new Set<string>();\n\t\t/** ¿La última petición llevó `prompt_cache_retention`? Ver el 400 de abajo. */\n\t\tlet sentRetentionLastRequest = false;\n\t\tlet currentModelKey = \"unknown\";\n\t\tlet integrityRolledBack = false;\n\n\t\t// ── 1. Prefijo estable ────────────────────────────────────────────────\n\t\tpi.on(\"before_agent_start\", async (event) => {\n\t\t\tconst opts = event.systemPromptOptions;\n\t\t\tconst result = stabilizeSystemPrompt({\n\t\t\t\tprompt: event.systemPrompt,\n\t\t\t\tcustomPrompt: opts.customPrompt,\n\t\t\t\tappendSystemPrompt: opts.appendSystemPrompt,\n\t\t\t\tpromptGuidelines: opts.promptGuidelines,\n\t\t\t\tcontextFiles: opts.contextFiles,\n\t\t\t});\n\t\t\tif (result.rolledBack) integrityRolledBack = true;\n\t\t\tif (result.lifted === 0) return undefined;\n\t\t\treturn { systemPrompt: result.prompt };\n\t\t});\n\n\t\t// ── 2. Payload ────────────────────────────────────────────────────────\n\t\tpi.on(\"before_provider_request\", async (event) => {\n\t\t\tconst payload = event.payload;\n\t\t\tif (!payload || typeof payload !== \"object\") return undefined;\n\t\t\tconst record = payload as Record<string, unknown>;\n\t\t\tconst api = typeof record.__api === \"string\" ? record.__api : inferApi(record);\n\n\t\t\tlet next = withCacheKey(record, {\n\t\t\t\tapi,\n\t\t\t\tsessionId: currentSessionId,\n\t\t\t\tbaseUrl: currentBaseUrl,\n\t\t\t});\n\t\t\tnext = withRetentionGuard(next, {\n\t\t\t\tapi,\n\t\t\t\tbaseUrl: currentBaseUrl,\n\t\t\t\tsupportsLongRetention: currentSupportsLongRetention,\n\t\t\t\tretentionRejected: retentionRejected.has(currentModelKey),\n\t\t\t});\n\t\t\tif (api === \"anthropic-messages\") next = normalizeAnthropicTtlOrder(next);\n\t\t\t// Se recuerda si viajó retención, para poder atribuir un 400 posterior.\n\t\t\tsentRetentionLastRequest = typeof next.prompt_cache_retention === \"string\";\n\t\t\treturn next === record ? undefined : next;\n\t\t});\n\n\t\t// ── 3. Aprender de los errores del proveedor ──────────────────────────\n\t\tpi.on(\"after_provider_response\", async (event) => {\n\t\t\t// El cuerpo no viaja en este evento, así que no se puede clasificar el\n\t\t\t// error por texto. Se usa la única evidencia disponible: un 400 JUSTO\n\t\t\t// DESPUÉS de haber enviado retención. Sin esa condición, un 400 por\n\t\t\t// cualquier otro motivo (contexto demasiado largo, argumento inválido)\n\t\t\t// desactivaría la retención de ese modelo para siempre.\n\t\t\tif (event.status === 400 && sentRetentionLastRequest) {\n\t\t\t\tretentionRejected.add(currentModelKey);\n\t\t\t}\n\t\t\tsentRetentionLastRequest = false;\n\t\t});\n\n\t\t// ── 4. Medición ───────────────────────────────────────────────────────\n\t\tlet currentSessionId: string | undefined;\n\t\tlet currentBaseUrl: string | undefined;\n\t\tlet currentSupportsLongRetention: boolean | undefined;\n\n\t\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\t\tcurrentSessionId = ctx?.sessionManager?.getSessionId?.();\n\t\t});\n\n\t\tpi.on(\"message_end\", async (event, ctx) => {\n\t\t\tconst message = event.message as unknown as Record<string, unknown> | undefined;\n\t\t\tif (!message || message.role !== \"assistant\") return;\n\t\t\t// Un reintento del host emite message_end con usage a cero: contarlo\n\t\t\t// hundiría el ratio con peticiones que nunca llegaron al proveedor.\n\t\t\tconst stop = message.stopReason;\n\t\t\tif (stop === \"error\" || stop === \"aborted\") return;\n\t\t\tconst usage = readCacheUsage(message.usage);\n\t\t\tif (usage.totalInput === 0) return;\n\t\t\tconst stats = store.record(currentModelKey, today(), usage);\n\t\t\tconst text = formatStats(labelFor(currentModelKey), stats);\n\t\t\tif (text) ctx?.ui?.setStatus(\"ada-prompt-cache\", integrityRolledBack ? `${text} ⚠️ integridad` : text);\n\t\t});\n\n\t\tpi.on(\"model_select\", async (event) => {\n\t\t\tconst model = (event as { model?: { id?: string; provider?: string; baseUrl?: string; compat?: unknown } })\n\t\t\t\t.model;\n\t\t\tif (!model) return;\n\t\t\tcurrentModelKey = `${model.provider ?? \"?\"}/${model.id ?? \"?\"}`;\n\t\t\tcurrentBaseUrl = model.baseUrl;\n\t\t\tconst compat = model.compat as { supportsLongCacheRetention?: boolean } | undefined;\n\t\t\tcurrentSupportsLongRetention = compat?.supportsLongCacheRetention;\n\t\t});\n\n\t\tpi.on(\"session_shutdown\", async () => {\n\t\t\tawait store.flush();\n\t\t});\n\n\t\t// ── 5. Comando ────────────────────────────────────────────────────────\n\t\tpi.registerCommand(\"cache\", {\n\t\t\tdescription: \"Estadísticas y diagnóstico de la caché de prompt\",\n\t\t\thandler: async (args: string, cmdCtx): Promise<void> => {\n\t\t\t\tconst say = (text: string) => cmdCtx.ui?.notify(text, \"info\");\n\t\t\t\tconst sub = args.trim().split(/\\s+/)[0] || \"stats\";\n\t\t\t\tconst stats = store.get(currentModelKey);\n\t\t\t\tif (sub === \"reset\") {\n\t\t\t\t\tstore.reset();\n\t\t\t\t\tsay(\"Contadores de caché reiniciados.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (sub === \"doctor\") {\n\t\t\t\t\tconst d = diagnose(stats, {\n\t\t\t\t\t\tapi: inferApiFromKey(currentModelKey),\n\t\t\t\t\t\tbaseUrl: currentBaseUrl,\n\t\t\t\t\t\tsupportsLongRetention: currentSupportsLongRetention,\n\t\t\t\t\t});\n\t\t\t\t\tconst missing = missingCompatFlags({\n\t\t\t\t\t\tapi: inferApiFromKey(currentModelKey),\n\t\t\t\t\t\tbaseUrl: currentBaseUrl,\n\t\t\t\t\t\tsupportsLongRetention: currentSupportsLongRetention,\n\t\t\t\t\t});\n\t\t\t\t\tconst extra = missing.length ? `\\n\\nFlags de compat que faltan: ${missing.join(\", \")}` : \"\";\n\t\t\t\t\tsay(`${currentModelKey}\\n\\n${renderDiagnosis(d)}${extra}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsay(stats ? formatStats(labelFor(currentModelKey), stats) : \"Sin datos de caché todavía.\");\n\t\t\t},\n\t\t});\n\t};\n}\n\nfunction inferApi(payload: Record<string, unknown>): string {\n\tif (\"anthropic_version\" in payload || \"system\" in payload) return \"anthropic-messages\";\n\tif (\"input\" in payload && !(\"messages\" in payload)) return \"openai-responses\";\n\treturn \"openai-completions\";\n}\n\nfunction inferApiFromKey(modelKey: string): string {\n\treturn modelKey.toLowerCase().includes(\"claude\") ? \"anthropic-messages\" : \"openai-completions\";\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/prompt-cache/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../src/core/prompt-cache/payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI/E;AAED,0EAAyE;AACzE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAErE;AAED,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,yEAAwE;IACxE,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAKD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM3G;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAI7D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKjH;AAED,0EAAyE;AACzE,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,oEAAmE;AACnE,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAOD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiCpG","sourcesContent":["/**\n * Mutaciones del payload de proveedor para maximizar aciertos de caché.\n *\n * Tres cosas, cada una por un motivo distinto:\n *\n * 1. `prompt_cache_key` de respaldo. Ada core ya lo pone, pero solo para la URL\n * oficial de OpenAI o cuando hay retención larga declarada\n * (`openai-completions.ts`). Un endpoint de terceros con retención corta —\n * justo el caso de un gateway propio o un proxy — se queda sin clave, y sin\n * clave el backend no puede enrutar a un worker con la caché caliente.\n *\n * 2. Seguridad de `prompt_cache_retention`. Enviarlo a un endpoint que no lo\n * entiende devuelve 400 y tumba la petición entera. Se envía solo cuando se\n * sabe que se soporta, y se APRENDE de los 400 vistos.\n *\n * 3. Orden de TTL en `cache_control` de Anthropic. La API rechaza un breakpoint\n * de 1h que venga detrás de uno de 5m. Es un fallo de orden, no de contenido,\n * y se puede reparar sin cambiar nada semántico.\n */\n\n/** Límite documentado de OpenAI para prompt_cache_key. */\nconst MAX_CACHE_KEY_LENGTH = 64;\n\nexport function clampCacheKey(sessionId: string | undefined): string | undefined {\n\tconst trimmed = sessionId?.trim();\n\tif (!trimmed) return undefined;\n\treturn [...trimmed].slice(0, MAX_CACHE_KEY_LENGTH).join(\"\");\n}\n\n/** ¿El payload ya trae una clave efectiva? Nunca se pisa la del host. */\nexport function hasCacheKey(payload: Record<string, unknown>): boolean {\n\treturn typeof payload.prompt_cache_key === \"string\" || typeof payload.promptCacheKey === \"string\";\n}\n\nexport interface PayloadContext {\n\tapi: string;\n\tbaseUrl?: string;\n\tsessionId?: string;\n\t/** `compat.supportsLongCacheRetention` del modelo. */\n\tsupportsLongRetention?: boolean;\n\t/** Modelos a los que este proceso ya vio devolver 400 por retención. */\n\tretentionRejected?: boolean;\n}\n\n/** APIs con forma OpenAI donde `prompt_cache_key` significa algo. */\nconst OPENAI_SHAPED = new Set([\"openai-completions\", \"openai-responses\"]);\n\n/**\n * Añade la clave de caché si falta. No sobrescribe nunca: una clave que cambia\n * entre peticiones es PEOR que ninguna, porque fragmenta el enrutado.\n */\nexport function withCacheKey(payload: Record<string, unknown>, ctx: PayloadContext): Record<string, unknown> {\n\tif (!OPENAI_SHAPED.has(ctx.api)) return payload;\n\tif (hasCacheKey(payload)) return payload;\n\tconst key = clampCacheKey(ctx.sessionId);\n\tif (!key) return payload;\n\treturn { ...payload, prompt_cache_key: key };\n}\n\n/**\n * Decide si `prompt_cache_retention` puede viajar.\n *\n * El orden importa: la evidencia empírica (un 400 ya visto) manda sobre la\n * configuración del usuario. Si no, un opt-in equivocado contra un endpoint que\n * lo rechaza devuelve 400 para siempre.\n */\nexport function retentionAllowed(ctx: PayloadContext): boolean {\n\tif (ctx.baseUrl?.includes(\"api.openai.com\")) return true;\n\tif (ctx.retentionRejected) return false;\n\treturn ctx.supportsLongRetention === true;\n}\n\nexport function withRetentionGuard(payload: Record<string, unknown>, ctx: PayloadContext): Record<string, unknown> {\n\tif (typeof payload.prompt_cache_retention !== \"string\") return payload;\n\tif (retentionAllowed(ctx)) return payload;\n\tconst { prompt_cache_retention: _dropped, ...rest } = payload;\n\treturn rest;\n}\n\n/** ¿Este error del proveedor es \"no entiendo prompt_cache_retention\"? */\nexport function isRetentionUnsupportedError(text: string): boolean {\n\treturn /prompt_cache_retention/i.test(text) && /unsupported|unknown|unrecognized|invalid/i.test(text);\n}\n\n/** ¿Es el error de Anthropic por orden de TTL en cache_control? */\nexport function isAnthropicTtlOrderError(text: string): boolean {\n\treturn /cache_control/i.test(text) && /ttl/i.test(text) && /order|1h|5m/i.test(text);\n}\n\ninterface CacheControlHolder {\n\tcache_control?: { type?: string; ttl?: string };\n\t[key: string]: unknown;\n}\n\n/**\n * Recorre los bloques con `cache_control` en ORDEN DE CABLE (tools → system →\n * messages) y degrada cualquier TTL largo que venga detrás de uno corto.\n *\n * Degradar es seguro: se pierde duración de caché, no corrección. Reordenar los\n * breakpoints sí cambiaría qué se cachea, y eso no es nuestro para decidir.\n */\nexport function normalizeAnthropicTtlOrder(payload: Record<string, unknown>): Record<string, unknown> {\n\tconst holders: CacheControlHolder[] = [];\n\tconst collect = (value: unknown): void => {\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const item of value) collect(item);\n\t\t\treturn;\n\t\t}\n\t\tif (!value || typeof value !== \"object\") return;\n\t\tconst record = value as CacheControlHolder;\n\t\tif (record.cache_control && typeof record.cache_control === \"object\") holders.push(record);\n\t\tfor (const nested of Object.values(record)) {\n\t\t\tif (nested && typeof nested === \"object\") collect(nested);\n\t\t}\n\t};\n\t// Orden de cable, no de objeto: es el que valida Anthropic.\n\tcollect(payload.tools);\n\tcollect(payload.system);\n\tcollect(payload.messages);\n\n\tlet seenShort = false;\n\tlet changed = false;\n\tfor (const holder of holders) {\n\t\tconst ttl = holder.cache_control?.ttl;\n\t\tif (ttl === \"5m\" || ttl === undefined) {\n\t\t\tseenShort = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ttl === \"1h\" && seenShort) {\n\t\t\tholder.cache_control = { ...holder.cache_control, ttl: \"5m\" };\n\t\t\tchanged = true;\n\t\t}\n\t}\n\treturn changed ? { ...payload } : payload;\n}\n"]}
1
+ {"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../src/core/prompt-cache/payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI/E;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAErE;AAED,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAKD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM3G;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAI7D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKjH;AAED,yEAAyE;AACzE,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,mEAAmE;AACnE,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAOD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiCpG"}