@hoilab/ada-cli 0.85.0 → 0.85.1

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 (1691) 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.map +1 -1
  134. package/dist/core/agent-session.d.ts +67 -0
  135. package/dist/core/agent-session.d.ts.map +1 -1
  136. package/dist/core/agent-session.js +43 -2
  137. package/dist/core/agent-session.js.map +1 -1
  138. package/dist/core/agents/loader.d.ts.map +1 -1
  139. package/dist/core/agents/loader.js.map +1 -1
  140. package/dist/core/appendonly/append-only-context.d.ts +118 -0
  141. package/dist/core/appendonly/append-only-context.d.ts.map +1 -0
  142. package/dist/core/appendonly/append-only-context.js +256 -0
  143. package/dist/core/appendonly/append-only-context.js.map +1 -0
  144. package/dist/core/appendonly/auto.d.ts +30 -0
  145. package/dist/core/appendonly/auto.d.ts.map +1 -0
  146. package/dist/core/appendonly/auto.js +68 -0
  147. package/dist/core/appendonly/auto.js.map +1 -0
  148. package/dist/core/appendonly/extension.d.ts +29 -0
  149. package/dist/core/appendonly/extension.d.ts.map +1 -0
  150. package/dist/core/appendonly/extension.js +51 -0
  151. package/dist/core/appendonly/extension.js.map +1 -0
  152. package/dist/core/appendonly/index.d.ts +41 -0
  153. package/dist/core/appendonly/index.d.ts.map +1 -0
  154. package/dist/core/appendonly/index.js +42 -0
  155. package/dist/core/appendonly/index.js.map +1 -0
  156. package/dist/core/aprobacion/generados.d.ts.map +1 -1
  157. package/dist/core/aprobacion/generados.js.map +1 -1
  158. package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -1
  159. package/dist/core/aprobacion/politica-de-maquina.js.map +1 -1
  160. package/dist/core/aprobacion/politica.d.ts +1 -1
  161. package/dist/core/aprobacion/politica.d.ts.map +1 -1
  162. package/dist/core/aprobacion/politica.js.map +1 -1
  163. package/dist/core/arranque/atajos.d.ts.map +1 -1
  164. package/dist/core/arranque/atajos.js +20 -0
  165. package/dist/core/arranque/atajos.js.map +1 -1
  166. package/dist/core/audit/exportacion.d.ts.map +1 -1
  167. package/dist/core/audit/exportacion.js +5 -3
  168. package/dist/core/audit/exportacion.js.map +1 -1
  169. package/dist/core/audit/libro.d.ts +7 -0
  170. package/dist/core/audit/libro.d.ts.map +1 -1
  171. package/dist/core/audit/libro.js.map +1 -1
  172. package/dist/core/audit/registro-sesion.d.ts.map +1 -1
  173. package/dist/core/audit/registro-sesion.js.map +1 -1
  174. package/dist/core/audit/retencion.d.ts.map +1 -1
  175. package/dist/core/audit/retencion.js.map +1 -1
  176. package/dist/core/audit/rutas.d.ts.map +1 -1
  177. package/dist/core/audit/rutas.js.map +1 -1
  178. package/dist/core/auth-guidance.d.ts.map +1 -1
  179. package/dist/core/auth-guidance.js.map +1 -1
  180. package/dist/core/auth-storage.d.ts.map +1 -1
  181. package/dist/core/auth-storage.js.map +1 -1
  182. package/dist/core/banco/almacenamiento.d.ts.map +1 -1
  183. package/dist/core/banco/almacenamiento.js.map +1 -1
  184. package/dist/core/banco/analisis.d.ts.map +1 -1
  185. package/dist/core/banco/analisis.js.map +1 -1
  186. package/dist/core/banco/asides.d.ts +64 -0
  187. package/dist/core/banco/asides.d.ts.map +1 -0
  188. package/dist/core/banco/asides.js +113 -0
  189. package/dist/core/banco/asides.js.map +1 -0
  190. package/dist/core/banco/bloques.d.ts.map +1 -1
  191. package/dist/core/banco/bloques.js.map +1 -1
  192. package/dist/core/banco/cargas.d.ts.map +1 -1
  193. package/dist/core/banco/cargas.js.map +1 -1
  194. package/dist/core/banco/comparar.d.ts.map +1 -1
  195. package/dist/core/banco/comparar.js.map +1 -1
  196. package/dist/core/banco/cow-isolation.d.ts +74 -0
  197. package/dist/core/banco/cow-isolation.d.ts.map +1 -0
  198. package/dist/core/banco/cow-isolation.js +259 -0
  199. package/dist/core/banco/cow-isolation.js.map +1 -0
  200. package/dist/core/banco/ejecutar.d.ts.map +1 -1
  201. package/dist/core/banco/ejecutar.js.map +1 -1
  202. package/dist/core/banco/generar.d.ts.map +1 -1
  203. package/dist/core/banco/generar.js.map +1 -1
  204. package/dist/core/banco/mutaciones.d.ts.map +1 -1
  205. package/dist/core/banco/mutaciones.js.map +1 -1
  206. package/dist/core/banco/park-revive.d.ts +67 -0
  207. package/dist/core/banco/park-revive.d.ts.map +1 -0
  208. package/dist/core/banco/park-revive.js +130 -0
  209. package/dist/core/banco/park-revive.js.map +1 -0
  210. package/dist/core/banco/pruning.d.ts +48 -0
  211. package/dist/core/banco/pruning.d.ts.map +1 -0
  212. package/dist/core/banco/pruning.js +146 -0
  213. package/dist/core/banco/pruning.js.map +1 -0
  214. package/dist/core/banco/steering.d.ts +81 -0
  215. package/dist/core/banco/steering.d.ts.map +1 -0
  216. package/dist/core/banco/steering.js +96 -0
  217. package/dist/core/banco/steering.js.map +1 -0
  218. package/dist/core/banco/tipos.d.ts.map +1 -1
  219. package/dist/core/banco/tipos.js.map +1 -1
  220. package/dist/core/bash-executor.d.ts.map +1 -1
  221. package/dist/core/bash-executor.js.map +1 -1
  222. package/dist/core/blobs/almacen.d.ts.map +1 -1
  223. package/dist/core/blobs/almacen.js.map +1 -1
  224. package/dist/core/blobs/broker.d.ts +1 -0
  225. package/dist/core/blobs/broker.d.ts.map +1 -1
  226. package/dist/core/blobs/broker.js +1 -1
  227. package/dist/core/blobs/broker.js.map +1 -1
  228. package/dist/core/blobs/index.d.ts +1 -0
  229. package/dist/core/blobs/index.d.ts.map +1 -1
  230. package/dist/core/blobs/index.js +1 -0
  231. package/dist/core/blobs/index.js.map +1 -1
  232. package/dist/core/blobs/payload.d.ts.map +1 -1
  233. package/dist/core/blobs/payload.js.map +1 -1
  234. package/dist/core/blobs/proveedor.d.ts.map +1 -1
  235. package/dist/core/blobs/proveedor.js.map +1 -1
  236. package/dist/core/blobs/uploaders.d.ts +105 -0
  237. package/dist/core/blobs/uploaders.d.ts.map +1 -0
  238. package/dist/core/blobs/uploaders.js +224 -0
  239. package/dist/core/blobs/uploaders.js.map +1 -0
  240. package/dist/core/broker/broker.d.ts +54 -0
  241. package/dist/core/broker/broker.d.ts.map +1 -0
  242. package/dist/core/broker/broker.js +216 -0
  243. package/dist/core/broker/broker.js.map +1 -0
  244. package/dist/core/broker/index.d.ts +21 -0
  245. package/dist/core/broker/index.d.ts.map +1 -0
  246. package/dist/core/broker/index.js +33 -0
  247. package/dist/core/broker/index.js.map +1 -0
  248. package/dist/core/broker/ps.d.ts +20 -0
  249. package/dist/core/broker/ps.d.ts.map +1 -0
  250. package/dist/core/broker/ps.js +55 -0
  251. package/dist/core/broker/ps.js.map +1 -0
  252. package/dist/core/broker/types.d.ts +45 -0
  253. package/dist/core/broker/types.d.ts.map +1 -0
  254. package/dist/core/broker/types.js +19 -0
  255. package/dist/core/broker/types.js.map +1 -0
  256. package/dist/core/browser/cdp.d.ts.map +1 -1
  257. package/dist/core/browser/cdp.js.map +1 -1
  258. package/dist/core/browser/politica.d.ts.map +1 -1
  259. package/dist/core/browser/politica.js.map +1 -1
  260. package/dist/core/browser/sesion.d.ts.map +1 -1
  261. package/dist/core/browser/sesion.js.map +1 -1
  262. package/dist/core/browser/tools.d.ts.map +1 -1
  263. package/dist/core/browser/tools.js.map +1 -1
  264. package/dist/core/cache-stats.d.ts.map +1 -1
  265. package/dist/core/cache-stats.js.map +1 -1
  266. package/dist/core/capability/capability.test.d.ts +12 -0
  267. package/dist/core/capability/capability.test.d.ts.map +1 -0
  268. package/dist/core/capability/capability.test.js +258 -0
  269. package/dist/core/capability/capability.test.js.map +1 -0
  270. package/dist/core/capability/fs.d.ts +32 -0
  271. package/dist/core/capability/fs.d.ts.map +1 -0
  272. package/dist/core/capability/fs.js +106 -0
  273. package/dist/core/capability/fs.js.map +1 -0
  274. package/dist/core/capability/index.d.ts +68 -0
  275. package/dist/core/capability/index.d.ts.map +1 -0
  276. package/dist/core/capability/index.js +258 -0
  277. package/dist/core/capability/index.js.map +1 -0
  278. package/dist/core/capability/types.d.ts +168 -0
  279. package/dist/core/capability/types.d.ts.map +1 -0
  280. package/dist/core/capability/types.js +16 -0
  281. package/dist/core/capability/types.js.map +1 -0
  282. package/dist/core/carga-plugins/index.d.ts +49 -0
  283. package/dist/core/carga-plugins/index.d.ts.map +1 -0
  284. package/dist/core/carga-plugins/index.js +85 -0
  285. package/dist/core/carga-plugins/index.js.map +1 -0
  286. package/dist/core/carga-plugins/invalidacion.d.ts +60 -0
  287. package/dist/core/carga-plugins/invalidacion.d.ts.map +1 -0
  288. package/dist/core/carga-plugins/invalidacion.js +94 -0
  289. package/dist/core/carga-plugins/invalidacion.js.map +1 -0
  290. package/dist/core/carga-plugins/paralelo.d.ts +48 -0
  291. package/dist/core/carga-plugins/paralelo.d.ts.map +1 -0
  292. package/dist/core/carga-plugins/paralelo.js +47 -0
  293. package/dist/core/carga-plugins/paralelo.js.map +1 -0
  294. package/dist/core/colaboracion/autoresearch.d.ts +56 -0
  295. package/dist/core/colaboracion/autoresearch.d.ts.map +1 -0
  296. package/dist/core/colaboracion/autoresearch.js +95 -0
  297. package/dist/core/colaboracion/autoresearch.js.map +1 -0
  298. package/dist/core/colaboracion/index.d.ts +10 -0
  299. package/dist/core/colaboracion/index.d.ts.map +1 -0
  300. package/dist/core/colaboracion/index.js +7 -0
  301. package/dist/core/colaboracion/index.js.map +1 -0
  302. package/dist/core/colaboracion/kernels.d.ts +63 -0
  303. package/dist/core/colaboracion/kernels.d.ts.map +1 -0
  304. package/dist/core/colaboracion/kernels.js +99 -0
  305. package/dist/core/colaboracion/kernels.js.map +1 -0
  306. package/dist/core/colaboracion/rele/index.d.ts +8 -0
  307. package/dist/core/colaboracion/rele/index.d.ts.map +1 -0
  308. package/dist/core/colaboracion/rele/index.js +6 -0
  309. package/dist/core/colaboracion/rele/index.js.map +1 -0
  310. package/dist/core/colaboracion/rele/rele-servidor.d.ts +69 -0
  311. package/dist/core/colaboracion/rele/rele-servidor.d.ts.map +1 -0
  312. package/dist/core/colaboracion/rele/rele-servidor.js +197 -0
  313. package/dist/core/colaboracion/rele/rele-servidor.js.map +1 -0
  314. package/dist/core/colaboracion/rele/suscriptor.d.ts +31 -0
  315. package/dist/core/colaboracion/rele/suscriptor.d.ts.map +1 -0
  316. package/dist/core/colaboracion/rele/suscriptor.js +173 -0
  317. package/dist/core/colaboracion/rele/suscriptor.js.map +1 -0
  318. package/dist/core/colaboracion/sesion-colaborativa.d.ts +61 -0
  319. package/dist/core/colaboracion/sesion-colaborativa.d.ts.map +1 -0
  320. package/dist/core/colaboracion/sesion-colaborativa.js +127 -0
  321. package/dist/core/colaboracion/sesion-colaborativa.js.map +1 -0
  322. package/dist/core/commits/agentic.d.ts +101 -0
  323. package/dist/core/commits/agentic.d.ts.map +1 -0
  324. package/dist/core/commits/agentic.js +268 -0
  325. package/dist/core/commits/agentic.js.map +1 -0
  326. package/dist/core/commits/changelog.d.ts +37 -0
  327. package/dist/core/commits/changelog.d.ts.map +1 -0
  328. package/dist/core/commits/changelog.js +155 -0
  329. package/dist/core/commits/changelog.js.map +1 -0
  330. package/dist/core/commits/diff.d.ts.map +1 -0
  331. package/dist/core/commits/diff.js.map +1 -0
  332. package/dist/core/commits/git.d.ts +43 -0
  333. package/dist/core/commits/git.d.ts.map +1 -0
  334. package/dist/core/commits/git.js +61 -0
  335. package/dist/core/commits/git.js.map +1 -0
  336. package/dist/core/commits/split.d.ts +45 -0
  337. package/dist/core/commits/split.d.ts.map +1 -0
  338. package/dist/core/commits/split.js +128 -0
  339. package/dist/core/commits/split.js.map +1 -0
  340. package/dist/core/compactacion/comandos.d.ts +53 -0
  341. package/dist/core/compactacion/comandos.d.ts.map +1 -0
  342. package/dist/core/compactacion/comandos.js +155 -0
  343. package/dist/core/compactacion/comandos.js.map +1 -0
  344. package/dist/core/compactacion/extension.d.ts +28 -0
  345. package/dist/core/compactacion/extension.d.ts.map +1 -0
  346. package/dist/core/compactacion/extension.js +159 -0
  347. package/dist/core/compactacion/extension.js.map +1 -0
  348. package/dist/core/compactacion/handoff.d.ts +61 -0
  349. package/dist/core/compactacion/handoff.d.ts.map +1 -0
  350. package/dist/core/compactacion/handoff.js +139 -0
  351. package/dist/core/compactacion/handoff.js.map +1 -0
  352. package/dist/core/compactacion/index.d.ts +15 -0
  353. package/dist/core/compactacion/index.d.ts.map +1 -0
  354. package/dist/core/compactacion/index.js +15 -0
  355. package/dist/core/compactacion/index.js.map +1 -0
  356. package/dist/core/compactacion/prune.d.ts +38 -0
  357. package/dist/core/compactacion/prune.d.ts.map +1 -0
  358. package/dist/core/compactacion/prune.js +81 -0
  359. package/dist/core/compactacion/prune.js.map +1 -0
  360. package/dist/core/compactacion/shake.d.ts +40 -0
  361. package/dist/core/compactacion/shake.d.ts.map +1 -0
  362. package/dist/core/compactacion/shake.js +106 -0
  363. package/dist/core/compactacion/shake.js.map +1 -0
  364. package/dist/core/compactacion/tipos.d.ts +54 -0
  365. package/dist/core/compactacion/tipos.d.ts.map +1 -0
  366. package/dist/core/compactacion/tipos.js +44 -0
  367. package/dist/core/compactacion/tipos.js.map +1 -0
  368. package/dist/core/compactar/index.d.ts.map +1 -1
  369. package/dist/core/compactar/index.js.map +1 -1
  370. package/dist/core/compactar/registro-denso.d.ts.map +1 -1
  371. package/dist/core/compactar/registro-denso.js.map +1 -1
  372. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  373. package/dist/core/compaction/branch-summarization.js.map +1 -1
  374. package/dist/core/compaction/compaction.d.ts.map +1 -1
  375. package/dist/core/compaction/compaction.js.map +1 -1
  376. package/dist/core/compaction/index.d.ts.map +1 -1
  377. package/dist/core/compaction/index.js.map +1 -1
  378. package/dist/core/compaction/utils.d.ts.map +1 -1
  379. package/dist/core/compaction/utils.js.map +1 -1
  380. package/dist/core/computer/captura.d.ts.map +1 -1
  381. package/dist/core/computer/captura.js.map +1 -1
  382. package/dist/core/computer/driver.d.ts.map +1 -1
  383. package/dist/core/computer/driver.js.map +1 -1
  384. package/dist/core/computer/motor/actions.d.ts.map +1 -1
  385. package/dist/core/computer/motor/actions.js.map +1 -1
  386. package/dist/core/computer/motor/bridge.d.ts +2 -2
  387. package/dist/core/computer/motor/bridge.d.ts.map +1 -1
  388. package/dist/core/computer/motor/bridge.js.map +1 -1
  389. package/dist/core/computer/motor/cdp.d.ts.map +1 -1
  390. package/dist/core/computer/motor/cdp.js.map +1 -1
  391. package/dist/core/computer/motor/config.d.ts.map +1 -1
  392. package/dist/core/computer/motor/config.js.map +1 -1
  393. package/dist/core/computer/motor/contract.d.ts.map +1 -1
  394. package/dist/core/computer/motor/contract.js.map +1 -1
  395. package/dist/core/computer/motor/note.d.ts.map +1 -1
  396. package/dist/core/computer/motor/note.js.map +1 -1
  397. package/dist/core/computer/motor/outline.d.ts.map +1 -1
  398. package/dist/core/computer/motor/outline.js.map +1 -1
  399. package/dist/core/computer/motor/output.d.ts.map +1 -1
  400. package/dist/core/computer/motor/output.js.map +1 -1
  401. package/dist/core/computer/motor/permissions.d.ts.map +1 -1
  402. package/dist/core/computer/motor/permissions.js.map +1 -1
  403. package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -1
  404. package/dist/core/computer/motor/platform/architecture.js.map +1 -1
  405. package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -1
  406. package/dist/core/computer/motor/platform/coerce.js.map +1 -1
  407. package/dist/core/computer/motor/platform/index.d.ts.map +1 -1
  408. package/dist/core/computer/motor/platform/index.js.map +1 -1
  409. package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -1
  410. package/dist/core/computer/motor/platform/linux/backend.js.map +1 -1
  411. package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -1
  412. package/dist/core/computer/motor/platform/linux/helper.js.map +1 -1
  413. package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -1
  414. package/dist/core/computer/motor/platform/macos/backend.js.map +1 -1
  415. package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -1
  416. package/dist/core/computer/motor/platform/macos/browser.js.map +1 -1
  417. package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -1
  418. package/dist/core/computer/motor/platform/macos/helper.js.map +1 -1
  419. package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -1
  420. package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -1
  421. package/dist/core/computer/motor/platform/types.d.ts.map +1 -1
  422. package/dist/core/computer/motor/platform/types.js.map +1 -1
  423. package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -1
  424. package/dist/core/computer/motor/platform/windows/backend.js.map +1 -1
  425. package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -1
  426. package/dist/core/computer/motor/platform/windows/helper.js.map +1 -1
  427. package/dist/core/computer/motor/root-selection.d.ts.map +1 -1
  428. package/dist/core/computer/motor/root-selection.js.map +1 -1
  429. package/dist/core/computer/motor/runtime.d.ts.map +1 -1
  430. package/dist/core/computer/motor/runtime.js.map +1 -1
  431. package/dist/core/computer/motor/state.d.ts.map +1 -1
  432. package/dist/core/computer/motor/state.js.map +1 -1
  433. package/dist/core/computer/motor/view.d.ts.map +1 -1
  434. package/dist/core/computer/motor/view.js.map +1 -1
  435. package/dist/core/computer/motor-ada.d.ts.map +1 -1
  436. package/dist/core/computer/motor-ada.js.map +1 -1
  437. package/dist/core/computer/politica.d.ts.map +1 -1
  438. package/dist/core/computer/politica.js.map +1 -1
  439. package/dist/core/computer/tools.d.ts.map +1 -1
  440. package/dist/core/computer/tools.js.map +1 -1
  441. package/dist/core/config/quarantine.d.ts +57 -0
  442. package/dist/core/config/quarantine.d.ts.map +1 -0
  443. package/dist/core/config/quarantine.js +161 -0
  444. package/dist/core/config/quarantine.js.map +1 -0
  445. package/dist/core/config-viva/ambito.d.ts +46 -0
  446. package/dist/core/config-viva/ambito.d.ts.map +1 -0
  447. package/dist/core/config-viva/ambito.js +62 -0
  448. package/dist/core/config-viva/ambito.js.map +1 -0
  449. package/dist/core/config-viva/cache-negativa.d.ts +50 -0
  450. package/dist/core/config-viva/cache-negativa.d.ts.map +1 -0
  451. package/dist/core/config-viva/cache-negativa.js +78 -0
  452. package/dist/core/config-viva/cache-negativa.js.map +1 -0
  453. package/dist/core/config-viva/headers-vivos.d.ts +41 -0
  454. package/dist/core/config-viva/headers-vivos.d.ts.map +1 -0
  455. package/dist/core/config-viva/headers-vivos.js +43 -0
  456. package/dist/core/config-viva/headers-vivos.js.map +1 -0
  457. package/dist/core/config-viva/index.d.ts +16 -0
  458. package/dist/core/config-viva/index.d.ts.map +1 -0
  459. package/dist/core/config-viva/index.js +16 -0
  460. package/dist/core/config-viva/index.js.map +1 -0
  461. package/dist/core/config-viva/proveedor.d.ts +48 -0
  462. package/dist/core/config-viva/proveedor.d.ts.map +1 -0
  463. package/dist/core/config-viva/proveedor.js +78 -0
  464. package/dist/core/config-viva/proveedor.js.map +1 -0
  465. package/dist/core/context-breakdown.d.ts.map +1 -1
  466. package/dist/core/context-breakdown.js.map +1 -1
  467. package/dist/core/credenciales/cliente.d.ts.map +1 -1
  468. package/dist/core/credenciales/cliente.js.map +1 -1
  469. package/dist/core/credenciales/pool.d.ts +36 -1
  470. package/dist/core/credenciales/pool.d.ts.map +1 -1
  471. package/dist/core/credenciales/pool.js +56 -7
  472. package/dist/core/credenciales/pool.js.map +1 -1
  473. package/dist/core/credenciales/ranking.d.ts +56 -0
  474. package/dist/core/credenciales/ranking.d.ts.map +1 -0
  475. package/dist/core/credenciales/ranking.js +94 -0
  476. package/dist/core/credenciales/ranking.js.map +1 -0
  477. package/dist/core/credenciales/ratelimit.d.ts +54 -0
  478. package/dist/core/credenciales/ratelimit.d.ts.map +1 -0
  479. package/dist/core/credenciales/ratelimit.js +116 -0
  480. package/dist/core/credenciales/ratelimit.js.map +1 -0
  481. package/dist/core/credenciales/reposo.d.ts.map +1 -1
  482. package/dist/core/credenciales/reposo.js.map +1 -1
  483. package/dist/core/credenciales/servidor.d.ts +8 -0
  484. package/dist/core/credenciales/servidor.d.ts.map +1 -1
  485. package/dist/core/credenciales/servidor.js +9 -1
  486. package/dist/core/credenciales/servidor.js.map +1 -1
  487. package/dist/core/defaults.d.ts.map +1 -1
  488. package/dist/core/defaults.js.map +1 -1
  489. package/dist/core/descubrimiento/comandos.d.ts.map +1 -1
  490. package/dist/core/descubrimiento/comandos.js.map +1 -1
  491. package/dist/core/descubrimiento/mcp.d.ts +12 -0
  492. package/dist/core/descubrimiento/mcp.d.ts.map +1 -1
  493. package/dist/core/descubrimiento/mcp.js +32 -0
  494. package/dist/core/descubrimiento/mcp.js.map +1 -1
  495. package/dist/core/descubrimiento/reglas.d.ts.map +1 -1
  496. package/dist/core/descubrimiento/reglas.js.map +1 -1
  497. package/dist/core/descubrimiento/runtimes/index.d.ts +24 -0
  498. package/dist/core/descubrimiento/runtimes/index.d.ts.map +1 -0
  499. package/dist/core/descubrimiento/runtimes/index.js +109 -0
  500. package/dist/core/descubrimiento/runtimes/index.js.map +1 -0
  501. package/dist/core/descubrimiento/runtimes/litellm.d.ts +12 -0
  502. package/dist/core/descubrimiento/runtimes/litellm.d.ts.map +1 -0
  503. package/dist/core/descubrimiento/runtimes/litellm.js +185 -0
  504. package/dist/core/descubrimiento/runtimes/litellm.js.map +1 -0
  505. package/dist/core/descubrimiento/runtimes/lm-studio.d.ts +13 -0
  506. package/dist/core/descubrimiento/runtimes/lm-studio.d.ts.map +1 -0
  507. package/dist/core/descubrimiento/runtimes/lm-studio.js +142 -0
  508. package/dist/core/descubrimiento/runtimes/lm-studio.js.map +1 -0
  509. package/dist/core/descubrimiento/runtimes/ollama.d.ts +8 -0
  510. package/dist/core/descubrimiento/runtimes/ollama.d.ts.map +1 -0
  511. package/dist/core/descubrimiento/runtimes/ollama.js +96 -0
  512. package/dist/core/descubrimiento/runtimes/ollama.js.map +1 -0
  513. package/dist/core/descubrimiento/runtimes/tipos.d.ts +47 -0
  514. package/dist/core/descubrimiento/runtimes/tipos.d.ts.map +1 -0
  515. package/dist/core/descubrimiento/runtimes/tipos.js +10 -0
  516. package/dist/core/descubrimiento/runtimes/tipos.js.map +1 -0
  517. package/dist/core/descubrimiento/skills.d.ts.map +1 -1
  518. package/dist/core/descubrimiento/skills.js.map +1 -1
  519. package/dist/core/diagnostics.d.ts.map +1 -1
  520. package/dist/core/diagnostics.js.map +1 -1
  521. package/dist/core/dificultad/clasificador.d.ts.map +1 -1
  522. package/dist/core/dificultad/clasificador.js.map +1 -1
  523. package/dist/core/edicion/diario.d.ts.map +1 -1
  524. package/dist/core/edicion/diario.js.map +1 -1
  525. package/dist/core/edicion/hashline.d.ts.map +1 -1
  526. package/dist/core/edicion/hashline.js.map +1 -1
  527. package/dist/core/edicion/hueco.d.ts.map +1 -1
  528. package/dist/core/edicion/hueco.js.map +1 -1
  529. package/dist/core/edicion/ipynb.d.ts +51 -0
  530. package/dist/core/edicion/ipynb.d.ts.map +1 -0
  531. package/dist/core/edicion/ipynb.js +110 -0
  532. package/dist/core/edicion/ipynb.js.map +1 -0
  533. package/dist/core/edicion/limpiar-carga.d.ts.map +1 -1
  534. package/dist/core/edicion/limpiar-carga.js.map +1 -1
  535. package/dist/core/edicion/observador.d.ts.map +1 -1
  536. package/dist/core/edicion/observador.js.map +1 -1
  537. package/dist/core/edicion/parecido.d.ts.map +1 -1
  538. package/dist/core/edicion/parecido.js.map +1 -1
  539. package/dist/core/edicion/parseo.d.ts.map +1 -1
  540. package/dist/core/edicion/parseo.js.map +1 -1
  541. package/dist/core/edicion/portapapeles.d.ts +28 -0
  542. package/dist/core/edicion/portapapeles.d.ts.map +1 -0
  543. package/dist/core/edicion/portapapeles.js +49 -0
  544. package/dist/core/edicion/portapapeles.js.map +1 -0
  545. package/dist/core/edicion/reparacion.d.ts.map +1 -1
  546. package/dist/core/edicion/reparacion.js.map +1 -1
  547. package/dist/core/edicion/rutas-difusas.d.ts +44 -0
  548. package/dist/core/edicion/rutas-difusas.d.ts.map +1 -0
  549. package/dist/core/edicion/rutas-difusas.js +93 -0
  550. package/dist/core/edicion/rutas-difusas.js.map +1 -0
  551. package/dist/core/edicion/sangria.d.ts.map +1 -1
  552. package/dist/core/edicion/sangria.js.map +1 -1
  553. package/dist/core/edicion/tipos.d.ts.map +1 -1
  554. package/dist/core/edicion/tipos.js.map +1 -1
  555. package/dist/core/engine-personality.d.ts.map +1 -1
  556. package/dist/core/engine-personality.js.map +1 -1
  557. package/dist/core/errores/proveedor.d.ts.map +1 -1
  558. package/dist/core/errores/proveedor.js.map +1 -1
  559. package/dist/core/estructural/buscar.d.ts.map +1 -1
  560. package/dist/core/estructural/buscar.js.map +1 -1
  561. package/dist/core/estructural/editar.d.ts.map +1 -1
  562. package/dist/core/estructural/editar.js.map +1 -1
  563. package/dist/core/estructural/tools.d.ts.map +1 -1
  564. package/dist/core/estructural/tools.js.map +1 -1
  565. package/dist/core/event-bus.d.ts.map +1 -1
  566. package/dist/core/event-bus.js.map +1 -1
  567. package/dist/core/exec.d.ts.map +1 -1
  568. package/dist/core/exec.js.map +1 -1
  569. package/dist/core/experimental.d.ts.map +1 -1
  570. package/dist/core/experimental.js.map +1 -1
  571. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  572. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  573. package/dist/core/export-html/index.d.ts.map +1 -1
  574. package/dist/core/export-html/index.js +183 -13
  575. package/dist/core/export-html/index.js.map +1 -1
  576. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  577. package/dist/core/export-html/tool-renderer.js.map +1 -1
  578. package/dist/core/extensiones/suplantacion.d.ts.map +1 -1
  579. package/dist/core/extensiones/suplantacion.js.map +1 -1
  580. package/dist/core/extensiones/vigilancia.d.ts.map +1 -1
  581. package/dist/core/extensiones/vigilancia.js.map +1 -1
  582. package/dist/core/extensions/index.d.ts.map +1 -1
  583. package/dist/core/extensions/index.js.map +1 -1
  584. package/dist/core/extensions/loader.d.ts.map +1 -1
  585. package/dist/core/extensions/loader.js.map +1 -1
  586. package/dist/core/extensions/runner.d.ts.map +1 -1
  587. package/dist/core/extensions/runner.js.map +1 -1
  588. package/dist/core/extensions/types.d.ts.map +1 -1
  589. package/dist/core/extensions/types.js.map +1 -1
  590. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  591. package/dist/core/extensions/wrapper.js.map +1 -1
  592. package/dist/core/footer-data-provider.d.ts.map +1 -1
  593. package/dist/core/footer-data-provider.js.map +1 -1
  594. package/dist/core/gc/archivo-frio.d.ts +33 -0
  595. package/dist/core/gc/archivo-frio.d.ts.map +1 -0
  596. package/dist/core/gc/archivo-frio.js +152 -0
  597. package/dist/core/gc/archivo-frio.js.map +1 -0
  598. package/dist/core/gc/blobs-gc.d.ts +25 -0
  599. package/dist/core/gc/blobs-gc.d.ts.map +1 -0
  600. package/dist/core/gc/blobs-gc.js +143 -0
  601. package/dist/core/gc/blobs-gc.js.map +1 -0
  602. package/dist/core/gc/index.d.ts +42 -0
  603. package/dist/core/gc/index.d.ts.map +1 -0
  604. package/dist/core/gc/index.js +50 -0
  605. package/dist/core/gc/index.js.map +1 -0
  606. package/dist/core/gc/lock.d.ts +19 -0
  607. package/dist/core/gc/lock.d.ts.map +1 -0
  608. package/dist/core/gc/lock.js +48 -0
  609. package/dist/core/gc/lock.js.map +1 -0
  610. package/dist/core/gc/reconciliacion.d.ts +19 -0
  611. package/dist/core/gc/reconciliacion.d.ts.map +1 -0
  612. package/dist/core/gc/reconciliacion.js +102 -0
  613. package/dist/core/gc/reconciliacion.js.map +1 -0
  614. package/dist/core/gc/wal.d.ts +15 -0
  615. package/dist/core/gc/wal.d.ts.map +1 -0
  616. package/dist/core/gc/wal.js +44 -0
  617. package/dist/core/gc/wal.js.map +1 -0
  618. package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -1
  619. package/dist/core/harness/fuentes-de-contexto.js.map +1 -1
  620. package/dist/core/harness/refine.d.ts.map +1 -1
  621. package/dist/core/harness/refine.js.map +1 -1
  622. package/dist/core/harness/store.d.ts.map +1 -1
  623. package/dist/core/harness/store.js.map +1 -1
  624. package/dist/core/higiene/index.d.ts +8 -0
  625. package/dist/core/higiene/index.d.ts.map +1 -0
  626. package/dist/core/higiene/index.js +8 -0
  627. package/dist/core/higiene/index.js.map +1 -0
  628. package/dist/core/higiene/managed-timers.d.ts +19 -0
  629. package/dist/core/higiene/managed-timers.d.ts.map +1 -0
  630. package/dist/core/higiene/managed-timers.js +68 -0
  631. package/dist/core/higiene/managed-timers.js.map +1 -0
  632. package/dist/core/higiene/race-handler.d.ts +7 -0
  633. package/dist/core/higiene/race-handler.d.ts.map +1 -0
  634. package/dist/core/higiene/race-handler.js +32 -0
  635. package/dist/core/higiene/race-handler.js.map +1 -0
  636. package/dist/core/higiene/withHostGuard.d.ts +27 -0
  637. package/dist/core/higiene/withHostGuard.d.ts.map +1 -0
  638. package/dist/core/higiene/withHostGuard.js +79 -0
  639. package/dist/core/higiene/withHostGuard.js.map +1 -0
  640. package/dist/core/hooks/contract.d.ts.map +1 -1
  641. package/dist/core/hooks/contract.js.map +1 -1
  642. package/dist/core/hooks/runner.d.ts.map +1 -1
  643. package/dist/core/hooks/runner.js.map +1 -1
  644. package/dist/core/hooks/session-hooks.d.ts.map +1 -1
  645. package/dist/core/hooks/session-hooks.js.map +1 -1
  646. package/dist/core/hooks-ts/cargador.d.ts +29 -0
  647. package/dist/core/hooks-ts/cargador.d.ts.map +1 -0
  648. package/dist/core/hooks-ts/cargador.js +51 -0
  649. package/dist/core/hooks-ts/cargador.js.map +1 -0
  650. package/dist/core/hooks-ts/index.d.ts +25 -0
  651. package/dist/core/hooks-ts/index.d.ts.map +1 -0
  652. package/dist/core/hooks-ts/index.js +25 -0
  653. package/dist/core/hooks-ts/index.js.map +1 -0
  654. package/dist/core/hooks-ts/runner.d.ts +40 -0
  655. package/dist/core/hooks-ts/runner.d.ts.map +1 -0
  656. package/dist/core/hooks-ts/runner.js +95 -0
  657. package/dist/core/hooks-ts/runner.js.map +1 -0
  658. package/dist/core/hooks-ts/tipos.d.ts +69 -0
  659. package/dist/core/hooks-ts/tipos.d.ts.map +1 -0
  660. package/dist/core/hooks-ts/tipos.js +90 -0
  661. package/dist/core/hooks-ts/tipos.js.map +1 -0
  662. package/dist/core/http-dispatcher.d.ts.map +1 -1
  663. package/dist/core/http-dispatcher.js.map +1 -1
  664. package/dist/core/importar/formatos.d.ts.map +1 -1
  665. package/dist/core/importar/formatos.js.map +1 -1
  666. package/dist/core/index.d.ts.map +1 -1
  667. package/dist/core/index.js.map +1 -1
  668. package/dist/core/interactivo/deteccion.d.ts.map +1 -1
  669. package/dist/core/interactivo/deteccion.js.map +1 -1
  670. package/dist/core/interactivo/sesion.d.ts.map +1 -1
  671. package/dist/core/interactivo/sesion.js.map +1 -1
  672. package/dist/core/interactivo/tools.d.ts.map +1 -1
  673. package/dist/core/interactivo/tools.js.map +1 -1
  674. package/dist/core/keybindings.d.ts +170 -170
  675. package/dist/core/keybindings.d.ts.map +1 -1
  676. package/dist/core/keybindings.js.map +1 -1
  677. package/dist/core/lectura/mapa.d.ts.map +1 -1
  678. package/dist/core/lectura/mapa.js.map +1 -1
  679. package/dist/core/lectura/pdf.d.ts.map +1 -1
  680. package/dist/core/lectura/pdf.js.map +1 -1
  681. package/dist/core/lectura/sniffer.d.ts +54 -0
  682. package/dist/core/lectura/sniffer.d.ts.map +1 -0
  683. package/dist/core/lectura/sniffer.js +106 -0
  684. package/dist/core/lectura/sniffer.js.map +1 -0
  685. package/dist/core/limpieza/comprobadores.d.ts +16 -2
  686. package/dist/core/limpieza/comprobadores.d.ts.map +1 -1
  687. package/dist/core/limpieza/comprobadores.js +200 -6
  688. package/dist/core/limpieza/comprobadores.js.map +1 -1
  689. package/dist/core/limpieza/flujo.d.ts +36 -0
  690. package/dist/core/limpieza/flujo.d.ts.map +1 -0
  691. package/dist/core/limpieza/flujo.js +89 -0
  692. package/dist/core/limpieza/flujo.js.map +1 -0
  693. package/dist/core/limpieza/parseo.d.ts.map +1 -1
  694. package/dist/core/limpieza/parseo.js.map +1 -1
  695. package/dist/core/limpieza/peso.d.ts +17 -0
  696. package/dist/core/limpieza/peso.d.ts.map +1 -0
  697. package/dist/core/limpieza/peso.js +52 -0
  698. package/dist/core/limpieza/peso.js.map +1 -0
  699. package/dist/core/limpieza/pool.d.ts +44 -0
  700. package/dist/core/limpieza/pool.d.ts.map +1 -0
  701. package/dist/core/limpieza/pool.js +123 -0
  702. package/dist/core/limpieza/pool.js.map +1 -0
  703. package/dist/core/limpieza/reparacion.d.ts +19 -2
  704. package/dist/core/limpieza/reparacion.d.ts.map +1 -1
  705. package/dist/core/limpieza/reparacion.js +95 -8
  706. package/dist/core/limpieza/reparacion.js.map +1 -1
  707. package/dist/core/limpieza/tablero.d.ts +47 -0
  708. package/dist/core/limpieza/tablero.d.ts.map +1 -0
  709. package/dist/core/limpieza/tablero.js +78 -0
  710. package/dist/core/limpieza/tablero.js.map +1 -0
  711. package/dist/core/limpieza/tipos.d.ts +25 -0
  712. package/dist/core/limpieza/tipos.d.ts.map +1 -1
  713. package/dist/core/limpieza/tipos.js.map +1 -1
  714. package/dist/core/lsp/cliente.d.ts +7 -0
  715. package/dist/core/lsp/cliente.d.ts.map +1 -1
  716. package/dist/core/lsp/cliente.js +4 -2
  717. package/dist/core/lsp/cliente.js.map +1 -1
  718. package/dist/core/lsp/descubrimiento.d.ts.map +1 -1
  719. package/dist/core/lsp/descubrimiento.js.map +1 -1
  720. package/dist/core/lsp/ediciones.d.ts.map +1 -1
  721. package/dist/core/lsp/ediciones.js.map +1 -1
  722. package/dist/core/lsp/extension.d.ts +9 -0
  723. package/dist/core/lsp/extension.d.ts.map +1 -1
  724. package/dist/core/lsp/extension.js +60 -4
  725. package/dist/core/lsp/extension.js.map +1 -1
  726. package/dist/core/lsp/formato.d.ts +72 -0
  727. package/dist/core/lsp/formato.d.ts.map +1 -0
  728. package/dist/core/lsp/formato.js +117 -0
  729. package/dist/core/lsp/formato.js.map +1 -0
  730. package/dist/core/lsp/tools.d.ts +3 -3
  731. package/dist/core/lsp/tools.d.ts.map +1 -1
  732. package/dist/core/lsp/tools.js.map +1 -1
  733. package/dist/core/lsp/writethrough.d.ts +165 -0
  734. package/dist/core/lsp/writethrough.d.ts.map +1 -0
  735. package/dist/core/lsp/writethrough.js +282 -0
  736. package/dist/core/lsp/writethrough.js.map +1 -0
  737. package/dist/core/marketplace/catalogo.d.ts +32 -0
  738. package/dist/core/marketplace/catalogo.d.ts.map +1 -0
  739. package/dist/core/marketplace/catalogo.js +122 -0
  740. package/dist/core/marketplace/catalogo.js.map +1 -0
  741. package/dist/core/marketplace/doctor.d.ts +47 -0
  742. package/dist/core/marketplace/doctor.d.ts.map +1 -0
  743. package/dist/core/marketplace/doctor.js +155 -0
  744. package/dist/core/marketplace/doctor.js.map +1 -0
  745. package/dist/core/marketplace/features.d.ts +22 -0
  746. package/dist/core/marketplace/features.d.ts.map +1 -0
  747. package/dist/core/marketplace/features.js +70 -0
  748. package/dist/core/marketplace/features.js.map +1 -0
  749. package/dist/core/marketplace/index.d.ts +33 -0
  750. package/dist/core/marketplace/index.d.ts.map +1 -0
  751. package/dist/core/marketplace/index.js +33 -0
  752. package/dist/core/marketplace/index.js.map +1 -0
  753. package/dist/core/marketplace/instalar.d.ts +27 -0
  754. package/dist/core/marketplace/instalar.d.ts.map +1 -0
  755. package/dist/core/marketplace/instalar.js +50 -0
  756. package/dist/core/marketplace/instalar.js.map +1 -0
  757. package/dist/core/mcp/client.d.ts.map +1 -1
  758. package/dist/core/mcp/client.js.map +1 -1
  759. package/dist/core/mcp/manager.d.ts.map +1 -1
  760. package/dist/core/mcp/manager.js.map +1 -1
  761. package/dist/core/mcp/oauth.d.ts +138 -0
  762. package/dist/core/mcp/oauth.d.ts.map +1 -0
  763. package/dist/core/mcp/oauth.js +348 -0
  764. package/dist/core/mcp/oauth.js.map +1 -0
  765. package/dist/core/mcp/tools.d.ts.map +1 -1
  766. package/dist/core/mcp/tools.js.map +1 -1
  767. package/dist/core/memoria/almacen.d.ts +56 -0
  768. package/dist/core/memoria/almacen.d.ts.map +1 -0
  769. package/dist/core/memoria/almacen.js +214 -0
  770. package/dist/core/memoria/almacen.js.map +1 -0
  771. package/dist/core/memoria/dr/respaldo.d.ts +34 -0
  772. package/dist/core/memoria/dr/respaldo.d.ts.map +1 -0
  773. package/dist/core/memoria/dr/respaldo.js +133 -0
  774. package/dist/core/memoria/dr/respaldo.js.map +1 -0
  775. package/dist/core/memoria/embeddings.d.ts +21 -0
  776. package/dist/core/memoria/embeddings.d.ts.map +1 -0
  777. package/dist/core/memoria/embeddings.js +87 -0
  778. package/dist/core/memoria/embeddings.js.map +1 -0
  779. package/dist/core/memoria/grafo.d.ts +56 -0
  780. package/dist/core/memoria/grafo.d.ts.map +1 -0
  781. package/dist/core/memoria/grafo.js +143 -0
  782. package/dist/core/memoria/grafo.js.map +1 -0
  783. package/dist/core/memoria/redaccion.d.ts +32 -0
  784. package/dist/core/memoria/redaccion.d.ts.map +1 -0
  785. package/dist/core/memoria/redaccion.js +76 -0
  786. package/dist/core/memoria/redaccion.js.map +1 -0
  787. package/dist/core/memoria/servidor/almacen-json.d.ts +26 -0
  788. package/dist/core/memoria/servidor/almacen-json.d.ts.map +1 -0
  789. package/dist/core/memoria/servidor/almacen-json.js +90 -0
  790. package/dist/core/memoria/servidor/almacen-json.js.map +1 -0
  791. package/dist/core/memoria/servidor/servidor.d.ts +43 -0
  792. package/dist/core/memoria/servidor/servidor.d.ts.map +1 -0
  793. package/dist/core/memoria/servidor/servidor.js +195 -0
  794. package/dist/core/memoria/servidor/servidor.js.map +1 -0
  795. package/dist/core/memoria/servidor/tipos.d.ts +44 -0
  796. package/dist/core/memoria/servidor/tipos.d.ts.map +1 -0
  797. package/dist/core/memoria/servidor/tipos.js +12 -0
  798. package/dist/core/memoria/servidor/tipos.js.map +1 -0
  799. package/dist/core/memoria/tipos.d.ts +63 -0
  800. package/dist/core/memoria/tipos.d.ts.map +1 -0
  801. package/dist/core/memoria/tipos.js +14 -0
  802. package/dist/core/memoria/tipos.js.map +1 -0
  803. package/dist/core/memory-engine/audit-export.d.ts.map +1 -1
  804. package/dist/core/memory-engine/audit-export.js.map +1 -1
  805. package/dist/core/memory-engine/audit-indice.d.ts.map +1 -1
  806. package/dist/core/memory-engine/audit-indice.js.map +1 -1
  807. package/dist/core/memory-engine/audit.d.ts.map +1 -1
  808. package/dist/core/memory-engine/audit.js.map +1 -1
  809. package/dist/core/memory-engine/engine.d.ts +7 -0
  810. package/dist/core/memory-engine/engine.d.ts.map +1 -1
  811. package/dist/core/memory-engine/engine.js.map +1 -1
  812. package/dist/core/memory-engine/inverted-index.d.ts.map +1 -1
  813. package/dist/core/memory-engine/inverted-index.js.map +1 -1
  814. package/dist/core/memory-engine/keychain.d.ts.map +1 -1
  815. package/dist/core/memory-engine/keychain.js.map +1 -1
  816. package/dist/core/memory-engine/observation-store.d.ts +1 -0
  817. package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
  818. package/dist/core/memory-engine/observation-store.js.map +1 -1
  819. package/dist/core/memory-engine/refinements.d.ts.map +1 -1
  820. package/dist/core/memory-engine/refinements.js.map +1 -1
  821. package/dist/core/memory-engine/scanner.d.ts.map +1 -1
  822. package/dist/core/memory-engine/scanner.js.map +1 -1
  823. package/dist/core/memory-engine/security.d.ts.map +1 -1
  824. package/dist/core/memory-engine/security.js.map +1 -1
  825. package/dist/core/memory-engine/session-indexer.d.ts.map +1 -1
  826. package/dist/core/memory-engine/session-indexer.js.map +1 -1
  827. package/dist/core/memory-engine/tools.d.ts.map +1 -1
  828. package/dist/core/memory-engine/tools.js.map +1 -1
  829. package/dist/core/memory-engine/types.d.ts.map +1 -1
  830. package/dist/core/memory-engine/types.js.map +1 -1
  831. package/dist/core/memory-engine/vault.d.ts.map +1 -1
  832. package/dist/core/memory-engine/vault.js.map +1 -1
  833. package/dist/core/messages.d.ts.map +1 -1
  834. package/dist/core/messages.js.map +1 -1
  835. package/dist/core/metaharness/cli.d.ts +19 -0
  836. package/dist/core/metaharness/cli.d.ts.map +1 -0
  837. package/dist/core/metaharness/cli.js +171 -0
  838. package/dist/core/metaharness/cli.js.map +1 -0
  839. package/dist/core/metaharness/comparar.d.ts +21 -0
  840. package/dist/core/metaharness/comparar.d.ts.map +1 -0
  841. package/dist/core/metaharness/comparar.js +64 -0
  842. package/dist/core/metaharness/comparar.js.map +1 -0
  843. package/dist/core/metaharness/ejecutar.d.ts +70 -0
  844. package/dist/core/metaharness/ejecutar.d.ts.map +1 -0
  845. package/dist/core/metaharness/ejecutar.js +249 -0
  846. package/dist/core/metaharness/ejecutar.js.map +1 -0
  847. package/dist/core/metaharness/tipos.d.ts +142 -0
  848. package/dist/core/metaharness/tipos.d.ts.map +1 -0
  849. package/dist/core/metaharness/tipos.js +17 -0
  850. package/dist/core/metaharness/tipos.js.map +1 -0
  851. package/dist/core/model-config.d.ts +8 -8
  852. package/dist/core/model-config.d.ts.map +1 -1
  853. package/dist/core/model-config.js.map +1 -1
  854. package/dist/core/model-registry.d.ts.map +1 -1
  855. package/dist/core/model-registry.js.map +1 -1
  856. package/dist/core/model-resolver.d.ts.map +1 -1
  857. package/dist/core/model-resolver.js.map +1 -1
  858. package/dist/core/model-runtime.d.ts.map +1 -1
  859. package/dist/core/model-runtime.js.map +1 -1
  860. package/dist/core/models-store.d.ts.map +1 -1
  861. package/dist/core/models-store.js.map +1 -1
  862. package/dist/core/muestreo-restringido.d.ts.map +1 -1
  863. package/dist/core/muestreo-restringido.js.map +1 -1
  864. package/dist/core/orphan-process-journal.d.ts.map +1 -1
  865. package/dist/core/orphan-process-journal.js.map +1 -1
  866. package/dist/core/output-guard.d.ts.map +1 -1
  867. package/dist/core/output-guard.js.map +1 -1
  868. package/dist/core/package-manager.d.ts.map +1 -1
  869. package/dist/core/package-manager.js.map +1 -1
  870. package/dist/core/parche/aplicar.d.ts +19 -0
  871. package/dist/core/parche/aplicar.d.ts.map +1 -0
  872. package/dist/core/parche/aplicar.js +243 -0
  873. package/dist/core/parche/aplicar.js.map +1 -0
  874. package/dist/core/parche/parser.d.ts +38 -0
  875. package/dist/core/parche/parser.d.ts.map +1 -0
  876. package/dist/core/parche/parser.js +217 -0
  877. package/dist/core/parche/parser.js.map +1 -0
  878. package/dist/core/parche/registro.d.ts +12 -0
  879. package/dist/core/parche/registro.d.ts.map +1 -0
  880. package/dist/core/parche/registro.js +58 -0
  881. package/dist/core/parche/registro.js.map +1 -0
  882. package/dist/core/perfiles/index.d.ts +22 -0
  883. package/dist/core/perfiles/index.d.ts.map +1 -0
  884. package/dist/core/perfiles/index.js +21 -0
  885. package/dist/core/perfiles/index.js.map +1 -0
  886. package/dist/core/perfiles/resolver.d.ts +51 -0
  887. package/dist/core/perfiles/resolver.d.ts.map +1 -0
  888. package/dist/core/perfiles/resolver.js +329 -0
  889. package/dist/core/perfiles/resolver.js.map +1 -0
  890. package/dist/core/perfiles/tipos.d.ts +69 -0
  891. package/dist/core/perfiles/tipos.d.ts.map +1 -0
  892. package/dist/core/perfiles/tipos.js +98 -0
  893. package/dist/core/perfiles/tipos.js.map +1 -0
  894. package/dist/core/pi-manifest.d.ts.map +1 -1
  895. package/dist/core/pi-manifest.js.map +1 -1
  896. package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -1
  897. package/dist/core/privacidad/categorias-especiales.js +4 -0
  898. package/dist/core/privacidad/categorias-especiales.js.map +1 -1
  899. package/dist/core/privacidad/tapar.d.ts.map +1 -1
  900. package/dist/core/privacidad/tapar.js.map +1 -1
  901. package/dist/core/project-memory.d.ts.map +1 -1
  902. package/dist/core/project-memory.js.map +1 -1
  903. package/dist/core/project-trust.d.ts.map +1 -1
  904. package/dist/core/project-trust.js.map +1 -1
  905. package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -1
  906. package/dist/core/prompt-cache/diagnostics.js.map +1 -1
  907. package/dist/core/prompt-cache/index.d.ts.map +1 -1
  908. package/dist/core/prompt-cache/index.js.map +1 -1
  909. package/dist/core/prompt-cache/payload.d.ts.map +1 -1
  910. package/dist/core/prompt-cache/payload.js.map +1 -1
  911. package/dist/core/prompt-cache/stabilize.d.ts.map +1 -1
  912. package/dist/core/prompt-cache/stabilize.js.map +1 -1
  913. package/dist/core/prompt-cache/stats.d.ts.map +1 -1
  914. package/dist/core/prompt-cache/stats.js.map +1 -1
  915. package/dist/core/prompt-eleccion.d.ts.map +1 -1
  916. package/dist/core/prompt-eleccion.js.map +1 -1
  917. package/dist/core/prompt-optimizer.d.ts.map +1 -1
  918. package/dist/core/prompt-optimizer.js.map +1 -1
  919. package/dist/core/prompt-templates.d.ts.map +1 -1
  920. package/dist/core/prompt-templates.js.map +1 -1
  921. package/dist/core/prompts/montar.d.ts.map +1 -1
  922. package/dist/core/prompts/montar.js.map +1 -1
  923. package/dist/core/prompts/plantilla.d.ts.map +1 -1
  924. package/dist/core/prompts/plantilla.js.map +1 -1
  925. package/dist/core/proveedores-registry/definiciones.d.ts +15 -0
  926. package/dist/core/proveedores-registry/definiciones.d.ts.map +1 -0
  927. package/dist/core/proveedores-registry/definiciones.js +22 -0
  928. package/dist/core/proveedores-registry/definiciones.js.map +1 -0
  929. package/dist/core/proveedores-registry/index.d.ts +14 -0
  930. package/dist/core/proveedores-registry/index.d.ts.map +1 -0
  931. package/dist/core/proveedores-registry/index.js +13 -0
  932. package/dist/core/proveedores-registry/index.js.map +1 -0
  933. package/dist/core/proveedores-registry/resolver.d.ts +25 -0
  934. package/dist/core/proveedores-registry/resolver.d.ts.map +1 -0
  935. package/dist/core/proveedores-registry/resolver.js +69 -0
  936. package/dist/core/proveedores-registry/resolver.js.map +1 -0
  937. package/dist/core/proveedores-registry/tipos.d.ts +47 -0
  938. package/dist/core/proveedores-registry/tipos.d.ts.map +1 -0
  939. package/dist/core/proveedores-registry/tipos.js +15 -0
  940. package/dist/core/proveedores-registry/tipos.js.map +1 -0
  941. package/dist/core/provider-attribution.d.ts.map +1 -1
  942. package/dist/core/provider-attribution.js.map +1 -1
  943. package/dist/core/provider-composer.d.ts.map +1 -1
  944. package/dist/core/provider-composer.js.map +1 -1
  945. package/dist/core/radius.d.ts.map +1 -1
  946. package/dist/core/radius.js.map +1 -1
  947. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  948. package/dist/core/remote-catalog-provider.js.map +1 -1
  949. package/dist/core/remoto/destino.d.ts.map +1 -1
  950. package/dist/core/remoto/destino.js.map +1 -1
  951. package/dist/core/remoto/ejecutor.d.ts.map +1 -1
  952. package/dist/core/remoto/ejecutor.js.map +1 -1
  953. package/dist/core/remoto/ficheros.d.ts.map +1 -1
  954. package/dist/core/remoto/ficheros.js.map +1 -1
  955. package/dist/core/remoto/registro-extension.d.ts.map +1 -1
  956. package/dist/core/remoto/registro-extension.js.map +1 -1
  957. package/dist/core/remoto/tools.d.ts.map +1 -1
  958. package/dist/core/remoto/tools.js.map +1 -1
  959. package/dist/core/reparacion/index.d.ts +2 -0
  960. package/dist/core/reparacion/index.d.ts.map +1 -0
  961. package/dist/core/reparacion/index.js +2 -0
  962. package/dist/core/reparacion/index.js.map +1 -0
  963. package/dist/core/reparacion/reparar-hunk.d.ts +27 -0
  964. package/dist/core/reparacion/reparar-hunk.d.ts.map +1 -0
  965. package/dist/core/reparacion/reparar-hunk.js +139 -0
  966. package/dist/core/reparacion/reparar-hunk.js.map +1 -0
  967. package/dist/core/resolve-config-value.d.ts.map +1 -1
  968. package/dist/core/resolve-config-value.js.map +1 -1
  969. package/dist/core/resource-loader.d.ts +13 -0
  970. package/dist/core/resource-loader.d.ts.map +1 -1
  971. package/dist/core/resource-loader.js +7 -4
  972. package/dist/core/resource-loader.js.map +1 -1
  973. package/dist/core/revision/dispositions.d.ts +86 -0
  974. package/dist/core/revision/dispositions.d.ts.map +1 -0
  975. package/dist/core/revision/dispositions.js +137 -0
  976. package/dist/core/revision/dispositions.js.map +1 -0
  977. package/dist/core/revision/hallazgo.d.ts.map +1 -1
  978. package/dist/core/revision/hallazgo.js.map +1 -1
  979. package/dist/core/revision/procedencia.d.ts +63 -0
  980. package/dist/core/revision/procedencia.d.ts.map +1 -0
  981. package/dist/core/revision/procedencia.js +72 -0
  982. package/dist/core/revision/procedencia.js.map +1 -0
  983. package/dist/core/revision/publicar.d.ts +26 -0
  984. package/dist/core/revision/publicar.d.ts.map +1 -0
  985. package/dist/core/revision/publicar.js +34 -0
  986. package/dist/core/revision/publicar.js.map +1 -0
  987. package/dist/core/revision/revisor.d.ts.map +1 -1
  988. package/dist/core/revision/revisor.js.map +1 -1
  989. package/dist/core/revision/sarif.d.ts.map +1 -1
  990. package/dist/core/revision/sarif.js.map +1 -1
  991. package/dist/core/router-uris/index.d.ts +12 -0
  992. package/dist/core/router-uris/index.d.ts.map +1 -0
  993. package/dist/core/router-uris/index.js +12 -0
  994. package/dist/core/router-uris/index.js.map +1 -0
  995. package/dist/core/router-uris/router.d.ts +2 -0
  996. package/dist/core/router-uris/router.d.ts.map +1 -0
  997. package/dist/core/router-uris/router.js +2 -0
  998. package/dist/core/router-uris/router.js.map +1 -0
  999. package/dist/core/runtime-credentials.d.ts.map +1 -1
  1000. package/dist/core/runtime-credentials.js.map +1 -1
  1001. package/dist/core/rutas/envoltorio.d.ts +20 -0
  1002. package/dist/core/rutas/envoltorio.d.ts.map +1 -0
  1003. package/dist/core/rutas/envoltorio.js +48 -0
  1004. package/dist/core/rutas/envoltorio.js.map +1 -0
  1005. package/dist/core/rutas/index.d.ts +11 -0
  1006. package/dist/core/rutas/index.d.ts.map +1 -0
  1007. package/dist/core/rutas/index.js +11 -0
  1008. package/dist/core/rutas/index.js.map +1 -0
  1009. package/dist/core/rutas/router.d.ts +82 -0
  1010. package/dist/core/rutas/router.d.ts.map +1 -0
  1011. package/dist/core/rutas/router.js +161 -0
  1012. package/dist/core/rutas/router.js.map +1 -0
  1013. package/dist/core/scheduler/scheduler.d.ts.map +1 -1
  1014. package/dist/core/scheduler/scheduler.js.map +1 -1
  1015. package/dist/core/sdk.d.ts.map +1 -1
  1016. package/dist/core/sdk.js.map +1 -1
  1017. package/dist/core/secretos/extension.d.ts +31 -0
  1018. package/dist/core/secretos/extension.d.ts.map +1 -0
  1019. package/dist/core/secretos/extension.js +64 -0
  1020. package/dist/core/secretos/extension.js.map +1 -0
  1021. package/dist/core/secretos/index.d.ts +75 -0
  1022. package/dist/core/secretos/index.d.ts.map +1 -0
  1023. package/dist/core/secretos/index.js +385 -0
  1024. package/dist/core/secretos/index.js.map +1 -0
  1025. package/dist/core/secretos/message-transform.d.ts +44 -0
  1026. package/dist/core/secretos/message-transform.d.ts.map +1 -0
  1027. package/dist/core/secretos/message-transform.js +246 -0
  1028. package/dist/core/secretos/message-transform.js.map +1 -0
  1029. package/dist/core/secretos/obfuscator.d.ts +30 -0
  1030. package/dist/core/secretos/obfuscator.d.ts.map +1 -0
  1031. package/dist/core/secretos/obfuscator.js +1182 -0
  1032. package/dist/core/secretos/obfuscator.js.map +1 -0
  1033. package/dist/core/secretos/placeholder-scan.d.ts +96 -0
  1034. package/dist/core/secretos/placeholder-scan.d.ts.map +1 -0
  1035. package/dist/core/secretos/placeholder-scan.js +433 -0
  1036. package/dist/core/secretos/placeholder-scan.js.map +1 -0
  1037. package/dist/core/secretos/placeholder.d.ts +95 -0
  1038. package/dist/core/secretos/placeholder.d.ts.map +1 -0
  1039. package/dist/core/secretos/placeholder.js +283 -0
  1040. package/dist/core/secretos/placeholder.js.map +1 -0
  1041. package/dist/core/secretos/regex.d.ts +3 -0
  1042. package/dist/core/secretos/regex.d.ts.map +1 -0
  1043. package/dist/core/secretos/regex.js +19 -0
  1044. package/dist/core/secretos/regex.js.map +1 -0
  1045. package/dist/core/secretos/replacement.d.ts +83 -0
  1046. package/dist/core/secretos/replacement.d.ts.map +1 -0
  1047. package/dist/core/secretos/replacement.js +211 -0
  1048. package/dist/core/secretos/replacement.js.map +1 -0
  1049. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -1
  1050. package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -1
  1051. package/dist/core/sesion/journal-tree.d.ts +73 -0
  1052. package/dist/core/sesion/journal-tree.d.ts.map +1 -0
  1053. package/dist/core/sesion/journal-tree.js +241 -0
  1054. package/dist/core/sesion/journal-tree.js.map +1 -0
  1055. package/dist/core/sesion/turn-recovery.d.ts +48 -0
  1056. package/dist/core/sesion/turn-recovery.d.ts.map +1 -0
  1057. package/dist/core/sesion/turn-recovery.js +182 -0
  1058. package/dist/core/sesion/turn-recovery.js.map +1 -0
  1059. package/dist/core/session-cwd.d.ts.map +1 -1
  1060. package/dist/core/session-cwd.js.map +1 -1
  1061. package/dist/core/session-manager.d.ts.map +1 -1
  1062. package/dist/core/session-manager.js.map +1 -1
  1063. package/dist/core/settings-diagnostics.d.ts.map +1 -1
  1064. package/dist/core/settings-diagnostics.js.map +1 -1
  1065. package/dist/core/settings-manager.d.ts +2 -2
  1066. package/dist/core/settings-manager.d.ts.map +1 -1
  1067. package/dist/core/settings-manager.js.map +1 -1
  1068. package/dist/core/share/cifrado.d.ts +39 -0
  1069. package/dist/core/share/cifrado.d.ts.map +1 -0
  1070. package/dist/core/share/cifrado.js +81 -0
  1071. package/dist/core/share/cifrado.js.map +1 -0
  1072. package/dist/core/share/exportar.d.ts +69 -0
  1073. package/dist/core/share/exportar.d.ts.map +1 -0
  1074. package/dist/core/share/exportar.js +247 -0
  1075. package/dist/core/share/exportar.js.map +1 -0
  1076. package/dist/core/skills.d.ts.map +1 -1
  1077. package/dist/core/skills.js.map +1 -1
  1078. package/dist/core/slash-commands.d.ts.map +1 -1
  1079. package/dist/core/slash-commands.js.map +1 -1
  1080. package/dist/core/source-info.d.ts.map +1 -1
  1081. package/dist/core/source-info.js.map +1 -1
  1082. package/dist/core/stream-guard/guardia.d.ts +45 -0
  1083. package/dist/core/stream-guard/guardia.d.ts.map +1 -0
  1084. package/dist/core/stream-guard/guardia.js +100 -0
  1085. package/dist/core/stream-guard/guardia.js.map +1 -0
  1086. package/dist/core/stream-guard/index.d.ts +9 -0
  1087. package/dist/core/stream-guard/index.d.ts.map +1 -0
  1088. package/dist/core/stream-guard/index.js +7 -0
  1089. package/dist/core/stream-guard/index.js.map +1 -0
  1090. package/dist/core/stream-guard/replay.d.ts +39 -0
  1091. package/dist/core/stream-guard/replay.d.ts.map +1 -0
  1092. package/dist/core/stream-guard/replay.js +68 -0
  1093. package/dist/core/stream-guard/replay.js.map +1 -0
  1094. package/dist/core/system-prompt.d.ts.map +1 -1
  1095. package/dist/core/system-prompt.js.map +1 -1
  1096. package/dist/core/telemetria/otlp.d.ts.map +1 -1
  1097. package/dist/core/telemetria/otlp.js.map +1 -1
  1098. package/dist/core/telemetry/otel-genai.d.ts +44 -0
  1099. package/dist/core/telemetry/otel-genai.d.ts.map +1 -0
  1100. package/dist/core/telemetry/otel-genai.js +124 -0
  1101. package/dist/core/telemetry/otel-genai.js.map +1 -0
  1102. package/dist/core/telemetry.d.ts.map +1 -1
  1103. package/dist/core/telemetry.js.map +1 -1
  1104. package/dist/core/terminal/backlog-guard.d.ts +53 -0
  1105. package/dist/core/terminal/backlog-guard.d.ts.map +1 -0
  1106. package/dist/core/terminal/backlog-guard.js +122 -0
  1107. package/dist/core/terminal/backlog-guard.js.map +1 -0
  1108. package/dist/core/terminal/conpty.d.ts +29 -0
  1109. package/dist/core/terminal/conpty.d.ts.map +1 -0
  1110. package/dist/core/terminal/conpty.js +67 -0
  1111. package/dist/core/terminal/conpty.js.map +1 -0
  1112. package/dist/core/terminal/conptyChunking.d.ts +2 -0
  1113. package/dist/core/terminal/conptyChunking.d.ts.map +1 -0
  1114. package/dist/core/terminal/conptyChunking.js +2 -0
  1115. package/dist/core/terminal/conptyChunking.js.map +1 -0
  1116. package/dist/core/terminal/index.d.ts +5 -0
  1117. package/dist/core/terminal/index.d.ts.map +1 -0
  1118. package/dist/core/terminal/index.js +5 -0
  1119. package/dist/core/terminal/index.js.map +1 -0
  1120. package/dist/core/terminal/loop-watchdog.d.ts +43 -0
  1121. package/dist/core/terminal/loop-watchdog.d.ts.map +1 -0
  1122. package/dist/core/terminal/loop-watchdog.js +117 -0
  1123. package/dist/core/terminal/loop-watchdog.js.map +1 -0
  1124. package/dist/core/terminal/runner.d.ts +55 -0
  1125. package/dist/core/terminal/runner.d.ts.map +1 -0
  1126. package/dist/core/terminal/runner.js +102 -0
  1127. package/dist/core/terminal/runner.js.map +1 -0
  1128. package/dist/core/timings.d.ts.map +1 -1
  1129. package/dist/core/timings.js.map +1 -1
  1130. package/dist/core/tools/apply_patch.d.ts +29 -0
  1131. package/dist/core/tools/apply_patch.d.ts.map +1 -0
  1132. package/dist/core/tools/apply_patch.js +54 -0
  1133. package/dist/core/tools/apply_patch.js.map +1 -0
  1134. package/dist/core/tools/bash.d.ts.map +1 -1
  1135. package/dist/core/tools/bash.js.map +1 -1
  1136. package/dist/core/tools/coercion-argumentos.d.ts.map +1 -1
  1137. package/dist/core/tools/coercion-argumentos.js.map +1 -1
  1138. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  1139. package/dist/core/tools/edit-diff.js.map +1 -1
  1140. package/dist/core/tools/edit.d.ts.map +1 -1
  1141. package/dist/core/tools/edit.js +43 -1
  1142. package/dist/core/tools/edit.js.map +1 -1
  1143. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  1144. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  1145. package/dist/core/tools/find.d.ts.map +1 -1
  1146. package/dist/core/tools/find.js.map +1 -1
  1147. package/dist/core/tools/grep.d.ts.map +1 -1
  1148. package/dist/core/tools/grep.js.map +1 -1
  1149. package/dist/core/tools/index.d.ts.map +1 -1
  1150. package/dist/core/tools/index.js.map +1 -1
  1151. package/dist/core/tools/json-tolerante.d.ts.map +1 -1
  1152. package/dist/core/tools/json-tolerante.js.map +1 -1
  1153. package/dist/core/tools/ls.d.ts.map +1 -1
  1154. package/dist/core/tools/ls.js.map +1 -1
  1155. package/dist/core/tools/noop-loop-guard.d.ts +46 -0
  1156. package/dist/core/tools/noop-loop-guard.d.ts.map +1 -0
  1157. package/dist/core/tools/noop-loop-guard.js +57 -0
  1158. package/dist/core/tools/noop-loop-guard.js.map +1 -0
  1159. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  1160. package/dist/core/tools/output-accumulator.js.map +1 -1
  1161. package/dist/core/tools/path-utils.d.ts.map +1 -1
  1162. package/dist/core/tools/path-utils.js.map +1 -1
  1163. package/dist/core/tools/project-memory-tool.d.ts.map +1 -1
  1164. package/dist/core/tools/project-memory-tool.js.map +1 -1
  1165. package/dist/core/tools/read.d.ts.map +1 -1
  1166. package/dist/core/tools/read.js.map +1 -1
  1167. package/dist/core/tools/render-utils.d.ts.map +1 -1
  1168. package/dist/core/tools/render-utils.js.map +1 -1
  1169. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  1170. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  1171. package/dist/core/tools/truncate.d.ts.map +1 -1
  1172. package/dist/core/tools/truncate.js.map +1 -1
  1173. package/dist/core/tools/write.d.ts.map +1 -1
  1174. package/dist/core/tools/write.js.map +1 -1
  1175. package/dist/core/trust-manager.d.ts.map +1 -1
  1176. package/dist/core/trust-manager.js.map +1 -1
  1177. package/dist/core/ttsr/captura.d.ts +72 -0
  1178. package/dist/core/ttsr/captura.d.ts.map +1 -0
  1179. package/dist/core/ttsr/captura.js +183 -0
  1180. package/dist/core/ttsr/captura.js.map +1 -0
  1181. package/dist/core/ttsr/index.d.ts +24 -0
  1182. package/dist/core/ttsr/index.d.ts.map +1 -0
  1183. package/dist/core/ttsr/index.js +57 -0
  1184. package/dist/core/ttsr/index.js.map +1 -0
  1185. package/dist/core/ttsr/preview.d.ts +48 -0
  1186. package/dist/core/ttsr/preview.d.ts.map +1 -0
  1187. package/dist/core/ttsr/preview.js +83 -0
  1188. package/dist/core/ttsr/preview.js.map +1 -0
  1189. package/dist/core/turno-vacio/detectar.d.ts.map +1 -1
  1190. package/dist/core/turno-vacio/detectar.js.map +1 -1
  1191. package/dist/core/undo/journal.d.ts.map +1 -1
  1192. package/dist/core/undo/journal.js.map +1 -1
  1193. package/dist/core/urls-internas/auditoria.d.ts.map +1 -1
  1194. package/dist/core/urls-internas/auditoria.js.map +1 -1
  1195. package/dist/core/urls-internas/boveda.d.ts.map +1 -1
  1196. package/dist/core/urls-internas/boveda.js.map +1 -1
  1197. package/dist/core/urls-internas/lector.d.ts +14 -10
  1198. package/dist/core/urls-internas/lector.d.ts.map +1 -1
  1199. package/dist/core/urls-internas/lector.js +50 -36
  1200. package/dist/core/urls-internas/lector.js.map +1 -1
  1201. package/dist/core/urls-internas/memoria.d.ts.map +1 -1
  1202. package/dist/core/urls-internas/memoria.js.map +1 -1
  1203. package/dist/core/urls-internas/parse.d.ts +6 -13
  1204. package/dist/core/urls-internas/parse.d.ts.map +1 -1
  1205. package/dist/core/urls-internas/parse.js +6 -17
  1206. package/dist/core/urls-internas/parse.js.map +1 -1
  1207. package/dist/core/urls-internas/reglas.d.ts.map +1 -1
  1208. package/dist/core/urls-internas/reglas.js.map +1 -1
  1209. package/dist/core/usage/aggregate.d.ts +1 -0
  1210. package/dist/core/usage/aggregate.d.ts.map +1 -1
  1211. package/dist/core/usage/aggregate.js +1 -1
  1212. package/dist/core/usage/aggregate.js.map +1 -1
  1213. package/dist/core/usage/cuota/anthropic.d.ts.map +1 -1
  1214. package/dist/core/usage/cuota/anthropic.js.map +1 -1
  1215. package/dist/core/usage/cuota/cache.d.ts.map +1 -1
  1216. package/dist/core/usage/cuota/cache.js.map +1 -1
  1217. package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -1
  1218. package/dist/core/usage/cuota/github-copilot.js.map +1 -1
  1219. package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -1
  1220. package/dist/core/usage/cuota/google-gemini.js.map +1 -1
  1221. package/dist/core/usage/cuota/index.d.ts.map +1 -1
  1222. package/dist/core/usage/cuota/index.js.map +1 -1
  1223. package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -1
  1224. package/dist/core/usage/cuota/openai-codex.js.map +1 -1
  1225. package/dist/core/usage/cuota/openrouter.d.ts.map +1 -1
  1226. package/dist/core/usage/cuota/openrouter.js.map +1 -1
  1227. package/dist/core/usage/cuota/tipos.d.ts.map +1 -1
  1228. package/dist/core/usage/cuota/tipos.js.map +1 -1
  1229. package/dist/core/usage/index.d.ts +11 -0
  1230. package/dist/core/usage/index.d.ts.map +1 -0
  1231. package/dist/core/usage/index.js +11 -0
  1232. package/dist/core/usage/index.js.map +1 -0
  1233. package/dist/core/usage/multi.d.ts +62 -0
  1234. package/dist/core/usage/multi.d.ts.map +1 -0
  1235. package/dist/core/usage/multi.js +122 -0
  1236. package/dist/core/usage/multi.js.map +1 -0
  1237. package/dist/core/usage/redaccion.d.ts +48 -0
  1238. package/dist/core/usage/redaccion.d.ts.map +1 -0
  1239. package/dist/core/usage/redaccion.js +72 -0
  1240. package/dist/core/usage/redaccion.js.map +1 -0
  1241. package/dist/core/usage-totals.d.ts.map +1 -1
  1242. package/dist/core/usage-totals.js.map +1 -1
  1243. package/dist/core/utils/atomic-write.d.ts +55 -0
  1244. package/dist/core/utils/atomic-write.d.ts.map +1 -0
  1245. package/dist/core/utils/atomic-write.js +293 -0
  1246. package/dist/core/utils/atomic-write.js.map +1 -0
  1247. package/dist/core/utils/git.d.ts +24 -0
  1248. package/dist/core/utils/git.d.ts.map +1 -0
  1249. package/dist/core/utils/git.js +107 -0
  1250. package/dist/core/utils/git.js.map +1 -0
  1251. package/dist/core/utils/logger.d.ts +26 -0
  1252. package/dist/core/utils/logger.d.ts.map +1 -0
  1253. package/dist/core/utils/logger.js +104 -0
  1254. package/dist/core/utils/logger.js.map +1 -0
  1255. package/dist/core/utils/shell-snapshot.d.ts +21 -0
  1256. package/dist/core/utils/shell-snapshot.d.ts.map +1 -0
  1257. package/dist/core/utils/shell-snapshot.js +32 -0
  1258. package/dist/core/utils/shell-snapshot.js.map +1 -0
  1259. package/dist/core/utils/startup-watchdog.d.ts +11 -0
  1260. package/dist/core/utils/startup-watchdog.d.ts.map +1 -0
  1261. package/dist/core/utils/startup-watchdog.js +34 -0
  1262. package/dist/core/utils/startup-watchdog.js.map +1 -0
  1263. package/dist/core/utils/tls-ca-shim.d.ts +17 -0
  1264. package/dist/core/utils/tls-ca-shim.d.ts.map +1 -0
  1265. package/dist/core/utils/tls-ca-shim.js +33 -0
  1266. package/dist/core/utils/tls-ca-shim.js.map +1 -0
  1267. package/dist/core/web/agregador.d.ts +67 -0
  1268. package/dist/core/web/agregador.d.ts.map +1 -0
  1269. package/dist/core/web/agregador.js +182 -0
  1270. package/dist/core/web/agregador.js.map +1 -0
  1271. package/dist/core/web/busqueda-nativa.d.ts.map +1 -1
  1272. package/dist/core/web/busqueda-nativa.js.map +1 -1
  1273. package/dist/core/web/consulta.d.ts +53 -0
  1274. package/dist/core/web/consulta.d.ts.map +1 -0
  1275. package/dist/core/web/consulta.js +213 -0
  1276. package/dist/core/web/consulta.js.map +1 -0
  1277. package/dist/core/web/destino.d.ts +11 -0
  1278. package/dist/core/web/destino.d.ts.map +1 -1
  1279. package/dist/core/web/destino.js +35 -0
  1280. package/dist/core/web/destino.js.map +1 -1
  1281. package/dist/core/web/load-page.d.ts +52 -0
  1282. package/dist/core/web/load-page.d.ts.map +1 -0
  1283. package/dist/core/web/load-page.js +221 -0
  1284. package/dist/core/web/load-page.js.map +1 -0
  1285. package/dist/core/web/proveedores/brave.d.ts.map +1 -1
  1286. package/dist/core/web/proveedores/brave.js.map +1 -1
  1287. package/dist/core/web/proveedores/claves.d.ts.map +1 -1
  1288. package/dist/core/web/proveedores/claves.js.map +1 -1
  1289. package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -1
  1290. package/dist/core/web/proveedores/duckduckgo.js.map +1 -1
  1291. package/dist/core/web/proveedores/ecosia.d.ts.map +1 -1
  1292. package/dist/core/web/proveedores/ecosia.js.map +1 -1
  1293. package/dist/core/web/proveedores/exa.d.ts.map +1 -1
  1294. package/dist/core/web/proveedores/exa.js.map +1 -1
  1295. package/dist/core/web/proveedores/mojeek.d.ts.map +1 -1
  1296. package/dist/core/web/proveedores/mojeek.js.map +1 -1
  1297. package/dist/core/web/proveedores/navegador.d.ts.map +1 -1
  1298. package/dist/core/web/proveedores/navegador.js.map +1 -1
  1299. package/dist/core/web/proveedores/registro.d.ts.map +1 -1
  1300. package/dist/core/web/proveedores/registro.js.map +1 -1
  1301. package/dist/core/web/proveedores/searxng.d.ts.map +1 -1
  1302. package/dist/core/web/proveedores/searxng.js.map +1 -1
  1303. package/dist/core/web/proveedores/serper.d.ts.map +1 -1
  1304. package/dist/core/web/proveedores/serper.js.map +1 -1
  1305. package/dist/core/web/proveedores/tavily.d.ts.map +1 -1
  1306. package/dist/core/web/proveedores/tavily.js.map +1 -1
  1307. package/dist/core/web/proveedores/tipos.d.ts.map +1 -1
  1308. package/dist/core/web/proveedores/tipos.js.map +1 -1
  1309. package/dist/core/web/registro-red.d.ts.map +1 -1
  1310. package/dist/core/web/registro-red.js.map +1 -1
  1311. package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -1
  1312. package/dist/core/web/scrapers/cisa-kev.js.map +1 -1
  1313. package/dist/core/web/scrapers/crates-io.d.ts.map +1 -1
  1314. package/dist/core/web/scrapers/crates-io.js.map +1 -1
  1315. package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -1
  1316. package/dist/core/web/scrapers/docs-rs.js.map +1 -1
  1317. package/dist/core/web/scrapers/github.d.ts.map +1 -1
  1318. package/dist/core/web/scrapers/github.js.map +1 -1
  1319. package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -1
  1320. package/dist/core/web/scrapers/go-pkg.js.map +1 -1
  1321. package/dist/core/web/scrapers/hex.d.ts.map +1 -1
  1322. package/dist/core/web/scrapers/hex.js.map +1 -1
  1323. package/dist/core/web/scrapers/maven.d.ts.map +1 -1
  1324. package/dist/core/web/scrapers/maven.js.map +1 -1
  1325. package/dist/core/web/scrapers/mdn.d.ts.map +1 -1
  1326. package/dist/core/web/scrapers/mdn.js.map +1 -1
  1327. package/dist/core/web/scrapers/npm.d.ts.map +1 -1
  1328. package/dist/core/web/scrapers/npm.js.map +1 -1
  1329. package/dist/core/web/scrapers/nuget.d.ts.map +1 -1
  1330. package/dist/core/web/scrapers/nuget.js.map +1 -1
  1331. package/dist/core/web/scrapers/nvd.d.ts.map +1 -1
  1332. package/dist/core/web/scrapers/nvd.js.map +1 -1
  1333. package/dist/core/web/scrapers/pypi.d.ts.map +1 -1
  1334. package/dist/core/web/scrapers/pypi.js.map +1 -1
  1335. package/dist/core/web/scrapers/registro.d.ts.map +1 -1
  1336. package/dist/core/web/scrapers/registro.js.map +1 -1
  1337. package/dist/core/web/scrapers/rubygems.d.ts.map +1 -1
  1338. package/dist/core/web/scrapers/rubygems.js.map +1 -1
  1339. package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -1
  1340. package/dist/core/web/scrapers/stackoverflow.js.map +1 -1
  1341. package/dist/core/web/scrapers/tipos.d.ts.map +1 -1
  1342. package/dist/core/web/scrapers/tipos.js.map +1 -1
  1343. package/dist/core/web/texto.d.ts.map +1 -1
  1344. package/dist/core/web/texto.js.map +1 -1
  1345. package/dist/core/web/tools.d.ts +1 -8
  1346. package/dist/core/web/tools.d.ts.map +1 -1
  1347. package/dist/core/web/tools.js +2 -33
  1348. package/dist/core/web/tools.js.map +1 -1
  1349. package/dist/core/wiki/almacen.d.ts.map +1 -1
  1350. package/dist/core/wiki/almacen.js.map +1 -1
  1351. package/dist/core/wiki/citas.d.ts.map +1 -1
  1352. package/dist/core/wiki/citas.js.map +1 -1
  1353. package/dist/core/workflows/agent-runner.d.ts.map +1 -1
  1354. package/dist/core/workflows/agent-runner.js.map +1 -1
  1355. package/dist/core/workflows/builtins.d.ts.map +1 -1
  1356. package/dist/core/workflows/builtins.js.map +1 -1
  1357. package/dist/core/workflows/contrato/esquema.d.ts.map +1 -1
  1358. package/dist/core/workflows/contrato/esquema.js.map +1 -1
  1359. package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -1
  1360. package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -1
  1361. package/dist/core/workflows/contrato/validador.d.ts.map +1 -1
  1362. package/dist/core/workflows/contrato/validador.js.map +1 -1
  1363. package/dist/core/workflows/contrato/yield.d.ts.map +1 -1
  1364. package/dist/core/workflows/contrato/yield.js.map +1 -1
  1365. package/dist/core/workflows/goal-engine/engine.d.ts +5 -0
  1366. package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -1
  1367. package/dist/core/workflows/goal-engine/engine.js.map +1 -1
  1368. package/dist/core/workflows/goal-engine/errors.d.ts.map +1 -1
  1369. package/dist/core/workflows/goal-engine/errors.js.map +1 -1
  1370. package/dist/core/workflows/goal-engine/index.d.ts.map +1 -1
  1371. package/dist/core/workflows/goal-engine/index.js.map +1 -1
  1372. package/dist/core/workflows/goal-engine/persistence.d.ts.map +1 -1
  1373. package/dist/core/workflows/goal-engine/persistence.js.map +1 -1
  1374. package/dist/core/workflows/goal-engine/prompts.d.ts.map +1 -1
  1375. package/dist/core/workflows/goal-engine/prompts.js.map +1 -1
  1376. package/dist/core/workflows/goal-engine/state.d.ts.map +1 -1
  1377. package/dist/core/workflows/goal-engine/state.js.map +1 -1
  1378. package/dist/core/workflows/goal-engine/tools.d.ts.map +1 -1
  1379. package/dist/core/workflows/goal-engine/tools.js.map +1 -1
  1380. package/dist/core/workflows/goal-engine/types.d.ts.map +1 -1
  1381. package/dist/core/workflows/goal-engine/types.js.map +1 -1
  1382. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts.map +1 -1
  1383. package/dist/core/workflows/goal-engine/worktree-fingerprint.js.map +1 -1
  1384. package/dist/core/workflows/graph-sync.d.ts.map +1 -1
  1385. package/dist/core/workflows/graph-sync.js.map +1 -1
  1386. package/dist/core/workflows/graph.d.ts.map +1 -1
  1387. package/dist/core/workflows/graph.js.map +1 -1
  1388. package/dist/core/workflows/index.d.ts +6 -0
  1389. package/dist/core/workflows/index.d.ts.map +1 -1
  1390. package/dist/core/workflows/index.js +3 -0
  1391. package/dist/core/workflows/index.js.map +1 -1
  1392. package/dist/core/workflows/journal.d.ts.map +1 -1
  1393. package/dist/core/workflows/journal.js.map +1 -1
  1394. package/dist/core/workflows/manager.d.ts.map +1 -1
  1395. package/dist/core/workflows/manager.js.map +1 -1
  1396. package/dist/core/workflows/provider-caps.d.ts +103 -0
  1397. package/dist/core/workflows/provider-caps.d.ts.map +1 -0
  1398. package/dist/core/workflows/provider-caps.js +235 -0
  1399. package/dist/core/workflows/provider-caps.js.map +1 -0
  1400. package/dist/core/workflows/resolve-script.d.ts.map +1 -1
  1401. package/dist/core/workflows/resolve-script.js.map +1 -1
  1402. package/dist/core/workflows/runtime.d.ts.map +1 -1
  1403. package/dist/core/workflows/runtime.js.map +1 -1
  1404. package/dist/core/workflows/save-as-skill.d.ts.map +1 -1
  1405. package/dist/core/workflows/save-as-skill.js.map +1 -1
  1406. package/dist/core/workflows/shared-store.d.ts.map +1 -1
  1407. package/dist/core/workflows/shared-store.js.map +1 -1
  1408. package/dist/core/workflows/soft-budget.d.ts +27 -0
  1409. package/dist/core/workflows/soft-budget.d.ts.map +1 -0
  1410. package/dist/core/workflows/soft-budget.js +47 -0
  1411. package/dist/core/workflows/soft-budget.js.map +1 -0
  1412. package/dist/core/workflows/subagent-host.d.ts.map +1 -1
  1413. package/dist/core/workflows/subagent-host.js.map +1 -1
  1414. package/dist/core/workflows/tool-scheduling.d.ts +47 -0
  1415. package/dist/core/workflows/tool-scheduling.d.ts.map +1 -0
  1416. package/dist/core/workflows/tool-scheduling.js +102 -0
  1417. package/dist/core/workflows/tool-scheduling.js.map +1 -0
  1418. package/dist/core/workflows/tool-workflow.d.ts.map +1 -1
  1419. package/dist/core/workflows/tool-workflow.js.map +1 -1
  1420. package/dist/core/workflows/types.d.ts.map +1 -1
  1421. package/dist/core/workflows/types.js.map +1 -1
  1422. package/dist/core/workflows/worktree.d.ts.map +1 -1
  1423. package/dist/core/workflows/worktree.js.map +1 -1
  1424. package/dist/extensions/index.d.ts.map +1 -1
  1425. package/dist/extensions/index.js.map +1 -1
  1426. package/dist/extensions/llama/client.d.ts.map +1 -1
  1427. package/dist/extensions/llama/client.js.map +1 -1
  1428. package/dist/extensions/llama/huggingface.d.ts.map +1 -1
  1429. package/dist/extensions/llama/huggingface.js.map +1 -1
  1430. package/dist/extensions/llama/index.d.ts.map +1 -1
  1431. package/dist/extensions/llama/index.js.map +1 -1
  1432. package/dist/extensions/llama/provider.d.ts.map +1 -1
  1433. package/dist/extensions/llama/provider.js.map +1 -1
  1434. package/dist/extensions/llama/ui.d.ts.map +1 -1
  1435. package/dist/extensions/llama/ui.js.map +1 -1
  1436. package/dist/extensions/remoto/index.d.ts.map +1 -1
  1437. package/dist/extensions/remoto/index.js.map +1 -1
  1438. package/dist/index.d.ts.map +1 -1
  1439. package/dist/index.js.map +1 -1
  1440. package/dist/main.d.ts.map +1 -1
  1441. package/dist/main.js +71 -3
  1442. package/dist/main.js.map +1 -1
  1443. package/dist/migrations.d.ts.map +1 -1
  1444. package/dist/migrations.js.map +1 -1
  1445. package/dist/modes/acp/acp-mode.d.ts.map +1 -1
  1446. package/dist/modes/acp/acp-mode.js.map +1 -1
  1447. package/dist/modes/acp/events.d.ts.map +1 -1
  1448. package/dist/modes/acp/events.js.map +1 -1
  1449. package/dist/modes/index.d.ts.map +1 -1
  1450. package/dist/modes/index.js.map +1 -1
  1451. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  1452. package/dist/modes/interactive/components/armin.js.map +1 -1
  1453. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  1454. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  1455. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  1456. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  1457. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  1458. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  1459. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  1460. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  1461. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  1462. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  1463. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  1464. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  1465. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  1466. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  1467. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  1468. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  1469. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  1470. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  1471. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  1472. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  1473. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  1474. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  1475. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  1476. package/dist/modes/interactive/components/diff.js.map +1 -1
  1477. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  1478. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  1479. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  1480. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  1481. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  1482. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  1483. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  1484. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  1485. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  1486. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  1487. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  1488. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  1489. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  1490. package/dist/modes/interactive/components/footer.js.map +1 -1
  1491. package/dist/modes/interactive/components/home-screen.d.ts +2 -0
  1492. package/dist/modes/interactive/components/home-screen.d.ts.map +1 -1
  1493. package/dist/modes/interactive/components/home-screen.js +5 -6
  1494. package/dist/modes/interactive/components/home-screen.js.map +1 -1
  1495. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  1496. package/dist/modes/interactive/components/index.js.map +1 -1
  1497. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  1498. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  1499. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  1500. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  1501. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  1502. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  1503. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  1504. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  1505. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  1506. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  1507. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  1508. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  1509. package/dist/modes/interactive/components/prompt-optimization.d.ts.map +1 -1
  1510. package/dist/modes/interactive/components/prompt-optimization.js.map +1 -1
  1511. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  1512. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  1513. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  1514. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  1515. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  1516. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  1517. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1518. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1519. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  1520. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  1521. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  1522. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  1523. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  1524. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  1525. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  1526. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  1527. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  1528. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  1529. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  1530. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  1531. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  1532. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  1533. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  1534. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  1535. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  1536. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  1537. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  1538. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  1539. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  1540. package/dist/modes/interactive/components/user-message.js.map +1 -1
  1541. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  1542. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  1543. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  1544. package/dist/modes/interactive/external-editor.js.map +1 -1
  1545. package/dist/modes/interactive/interactive-mode.d.ts +19 -0
  1546. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1547. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1548. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -1
  1549. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -1
  1550. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  1551. package/dist/modes/interactive/model-search.js.map +1 -1
  1552. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  1553. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  1554. package/dist/modes/interactive/theme/theme.d.ts +2 -2
  1555. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  1556. package/dist/modes/interactive/theme/theme.js.map +1 -1
  1557. package/dist/modes/json-event.d.ts.map +1 -1
  1558. package/dist/modes/json-event.js.map +1 -1
  1559. package/dist/modes/print-mode.d.ts.map +1 -1
  1560. package/dist/modes/print-mode.js.map +1 -1
  1561. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  1562. package/dist/modes/rpc/jsonl.js.map +1 -1
  1563. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  1564. package/dist/modes/rpc/rpc-client.js.map +1 -1
  1565. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  1566. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  1567. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  1568. package/dist/modes/rpc/rpc-types.js.map +1 -1
  1569. package/dist/package-manager-cli.d.ts.map +1 -1
  1570. package/dist/package-manager-cli.js.map +1 -1
  1571. package/dist/rpc-entry.d.ts.map +1 -1
  1572. package/dist/rpc-entry.js +0 -0
  1573. package/dist/rpc-entry.js.map +1 -1
  1574. package/dist/server/attach.d.ts.map +1 -1
  1575. package/dist/server/attach.js.map +1 -1
  1576. package/dist/server/create-harness.d.ts.map +1 -1
  1577. package/dist/server/create-harness.js.map +1 -1
  1578. package/dist/server/extension-ops.d.ts.map +1 -1
  1579. package/dist/server/extension-ops.js.map +1 -1
  1580. package/dist/server/pi-server-service.d.ts.map +1 -1
  1581. package/dist/server/pi-server-service.js.map +1 -1
  1582. package/dist/server/scheduler-tick.d.ts.map +1 -1
  1583. package/dist/server/scheduler-tick.js.map +1 -1
  1584. package/dist/server/serve.d.ts.map +1 -1
  1585. package/dist/server/serve.js.map +1 -1
  1586. package/dist/server/transcript.d.ts.map +1 -1
  1587. package/dist/server/transcript.js.map +1 -1
  1588. package/dist/telegram/api.d.ts +6 -0
  1589. package/dist/telegram/api.d.ts.map +1 -1
  1590. package/dist/telegram/api.js.map +1 -1
  1591. package/dist/telegram/bridge.d.ts.map +1 -1
  1592. package/dist/telegram/bridge.js.map +1 -1
  1593. package/dist/telegram/journal.d.ts.map +1 -1
  1594. package/dist/telegram/journal.js.map +1 -1
  1595. package/dist/telegram/servidor.d.ts.map +1 -1
  1596. package/dist/telegram/servidor.js.map +1 -1
  1597. package/dist/utils/abort.d.ts.map +1 -1
  1598. package/dist/utils/abort.js.map +1 -1
  1599. package/dist/utils/ansi.d.ts.map +1 -1
  1600. package/dist/utils/ansi.js.map +1 -1
  1601. package/dist/utils/changelog.d.ts.map +1 -1
  1602. package/dist/utils/changelog.js.map +1 -1
  1603. package/dist/utils/child-process.d.ts.map +1 -1
  1604. package/dist/utils/child-process.js.map +1 -1
  1605. package/dist/utils/clipboard-image.d.ts.map +1 -1
  1606. package/dist/utils/clipboard-image.js.map +1 -1
  1607. package/dist/utils/clipboard-native.d.ts.map +1 -1
  1608. package/dist/utils/clipboard-native.js.map +1 -1
  1609. package/dist/utils/clipboard.d.ts.map +1 -1
  1610. package/dist/utils/clipboard.js.map +1 -1
  1611. package/dist/utils/deprecation.d.ts.map +1 -1
  1612. package/dist/utils/deprecation.js.map +1 -1
  1613. package/dist/utils/exif-orientation.d.ts.map +1 -1
  1614. package/dist/utils/exif-orientation.js.map +1 -1
  1615. package/dist/utils/frontmatter.d.ts.map +1 -1
  1616. package/dist/utils/frontmatter.js.map +1 -1
  1617. package/dist/utils/fs-watch.d.ts.map +1 -1
  1618. package/dist/utils/fs-watch.js.map +1 -1
  1619. package/dist/utils/git.d.ts.map +1 -1
  1620. package/dist/utils/git.js.map +1 -1
  1621. package/dist/utils/html.d.ts.map +1 -1
  1622. package/dist/utils/html.js.map +1 -1
  1623. package/dist/utils/image-convert.d.ts.map +1 -1
  1624. package/dist/utils/image-convert.js.map +1 -1
  1625. package/dist/utils/image-process.d.ts.map +1 -1
  1626. package/dist/utils/image-process.js.map +1 -1
  1627. package/dist/utils/image-resize-core.d.ts.map +1 -1
  1628. package/dist/utils/image-resize-core.js.map +1 -1
  1629. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  1630. package/dist/utils/image-resize-worker.js.map +1 -1
  1631. package/dist/utils/image-resize.d.ts.map +1 -1
  1632. package/dist/utils/image-resize.js.map +1 -1
  1633. package/dist/utils/json.d.ts.map +1 -1
  1634. package/dist/utils/json.js.map +1 -1
  1635. package/dist/utils/management-http.d.ts.map +1 -1
  1636. package/dist/utils/management-http.js.map +1 -1
  1637. package/dist/utils/mime.d.ts.map +1 -1
  1638. package/dist/utils/mime.js.map +1 -1
  1639. package/dist/utils/open-browser.d.ts.map +1 -1
  1640. package/dist/utils/open-browser.js.map +1 -1
  1641. package/dist/utils/paths.d.ts.map +1 -1
  1642. package/dist/utils/paths.js.map +1 -1
  1643. package/dist/utils/photon.d.ts.map +1 -1
  1644. package/dist/utils/photon.js.map +1 -1
  1645. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  1646. package/dist/utils/pi-user-agent.js.map +1 -1
  1647. package/dist/utils/shell.d.ts.map +1 -1
  1648. package/dist/utils/shell.js.map +1 -1
  1649. package/dist/utils/sleep.d.ts.map +1 -1
  1650. package/dist/utils/sleep.js.map +1 -1
  1651. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  1652. package/dist/utils/syntax-highlight.js.map +1 -1
  1653. package/dist/utils/text.d.ts.map +1 -1
  1654. package/dist/utils/text.js.map +1 -1
  1655. package/dist/utils/tool-result-images.d.ts.map +1 -1
  1656. package/dist/utils/tool-result-images.js.map +1 -1
  1657. package/dist/utils/tools-manager.d.ts.map +1 -1
  1658. package/dist/utils/tools-manager.js.map +1 -1
  1659. package/dist/utils/version-check.d.ts.map +1 -1
  1660. package/dist/utils/version-check.js.map +1 -1
  1661. package/dist/utils/windows-self-update.d.ts.map +1 -1
  1662. package/dist/utils/windows-self-update.js.map +1 -1
  1663. package/docs/development-fork.md +170 -0
  1664. package/docs/docs.json +25 -0
  1665. package/docs/modules-infraestructura.md +115 -0
  1666. package/docs/modules-motor.md +160 -0
  1667. package/docs/modules-producto.md +179 -0
  1668. package/docs/modules-seguridad.md +158 -0
  1669. package/npm-shrinkwrap.json +2 -2
  1670. package/package.json +113 -113
  1671. package/dist/core/commit/diff.d.ts.map +0 -1
  1672. package/dist/core/commit/diff.js.map +0 -1
  1673. package/dist/core/commit/mensaje.d.ts +0 -80
  1674. package/dist/core/commit/mensaje.d.ts.map +0 -1
  1675. package/dist/core/commit/mensaje.js +0 -207
  1676. package/dist/core/commit/mensaje.js.map +0 -1
  1677. package/dist/core/computer/motor/platform/macos/helper-path.mjs +0 -34
  1678. package/dist/core/export-html/template.css +0 -1066
  1679. package/dist/core/export-html/template.html +0 -55
  1680. package/dist/core/export-html/template.js +0 -1864
  1681. package/dist/core/export-html/vendor/highlight.min.js +0 -1213
  1682. package/dist/core/export-html/vendor/marked.min.js +0 -78
  1683. package/dist/core/prompts/sistema.md +0 -134
  1684. package/dist/modes/interactive/assets/clankolas.png +0 -0
  1685. package/dist/modes/interactive/theme/dark.json +0 -90
  1686. package/dist/modes/interactive/theme/light.json +0 -89
  1687. package/dist/modes/interactive/theme/theme-schema.json +0 -352
  1688. package/dist/skills/ada-engine/SKILL.md +0 -153
  1689. package/dist/skills/skill-creator/SKILL.md +0 -90
  1690. /package/dist/core/{commit → commits}/diff.d.ts +0 -0
  1691. /package/dist/core/{commit → commits}/diff.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/npm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AA6BnE,eAAO,MAAM,QAAQ,EAAE,cAsCtB,CAAC","sourcesContent":["/**\n * npm, vía la API pública del registro (`registry.npmjs.org`).\n *\n * Encaja tanto con la URL de la API en sí (`registry.npmjs.org/<paquete>`,\n * el caso que pide la puerta de este hueco) como con la página humana\n * (`npmjs.com/package/<paquete>`), que se traduce a la API antes de pedirla:\n * la página humana es HTML de React, no algo que merezca la pena parsear.\n */\nimport type { FuncionScraper, ResultadoScraper } from \"./tipos.ts\";\n\ninterface DocVersionNpm {\n\tversion?: string;\n\tdescription?: string;\n\tlicense?: string | { type: string };\n\thomepage?: string;\n}\n\ninterface DocPaqueteNpm extends DocVersionNpm {\n\tname?: string;\n\t\"dist-tags\"?: { latest?: string };\n\tversions?: Record<string, DocVersionNpm>;\n}\n\nfunction nombreDesdePagina(pathname: string): string | undefined {\n\tconst match = pathname.match(/^\\/package\\/(.+)/);\n\tif (!match) return undefined;\n\tconst resto = decodeURIComponent(match[1]);\n\tconst partes = resto.split(\"/\");\n\t// Paquete con scope: /package/@scope/nombre — el resto son sub-rutas (README, versions…).\n\treturn partes[0].startsWith(\"@\") ? partes.slice(0, 2).join(\"/\") : partes[0];\n}\n\nfunction licenciaDeString(valor: string | { type: string } | undefined): string | undefined {\n\tif (!valor) return undefined;\n\treturn typeof valor === \"string\" ? valor : valor.type;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tlet apiUrl: string;\n\tif (url.hostname === \"registry.npmjs.org\") {\n\t\tapiUrl = url.href; // ya es la API: se pide tal cual.\n\t} else if (url.hostname === \"www.npmjs.com\" || url.hostname === \"npmjs.com\") {\n\t\tconst nombre = nombreDesdePagina(url.pathname);\n\t\tif (!nombre) return null;\n\t\tapiUrl = `https://registry.npmjs.org/${nombre}`;\n\t} else {\n\t\treturn null;\n\t}\n\n\tconst respuesta = await fetchImpl(apiUrl, { headers: { Accept: \"application/json\" }, signal });\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`npm respondió HTTP ${respuesta.status}.`);\n\tconst paquete = (await respuesta.json()) as DocPaqueteNpm;\n\tif (!paquete?.name) return null;\n\n\tconst ultimaEtiqueta = paquete[\"dist-tags\"]?.latest;\n\t// Con `dist-tags.latest` viene un mapa `versions`: se usa esa versión concreta\n\t// (misma licencia que el `/latest` endpoint más ligero). Sin él —cuando la URL\n\t// ya apuntaba a una versión abreviada— el propio documento ES la versión.\n\tconst version: DocVersionNpm = (ultimaEtiqueta && paquete.versions?.[ultimaEtiqueta]) || paquete;\n\tconst licencia = licenciaDeString(version.license) ?? licenciaDeString(paquete.license);\n\tconst numeroVersion = ultimaEtiqueta ?? paquete.version;\n\n\tconst datos: ResultadoScraper[\"datos\"] = {\n\t\tnombre: paquete.name,\n\t\tversion: numeroVersion,\n\t\tlicencia,\n\t\thomepage: version.homepage ?? paquete.homepage,\n\t};\n\treturn {\n\t\ttitulo: `${paquete.name}${numeroVersion ? `@${numeroVersion}` : \"\"}`,\n\t\turl: `https://www.npmjs.com/package/${paquete.name}`,\n\t\tresumen: version.description ?? paquete.description ?? \"\",\n\t\tdatos,\n\t};\n};\n"]}
1
+ {"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/npm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AA6BnE,eAAO,MAAM,QAAQ,EAAE,cAsCtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"npm.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/npm.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * npm, vía la API pública del registro (`registry.npmjs.org`).\n *\n * Encaja tanto con la URL de la API en sí (`registry.npmjs.org/<paquete>`,\n * el caso que pide la puerta de este hueco) como con la página humana\n * (`npmjs.com/package/<paquete>`), que se traduce a la API antes de pedirla:\n * la página humana es HTML de React, no algo que merezca la pena parsear.\n */\nimport type { FuncionScraper, ResultadoScraper } from \"./tipos.ts\";\n\ninterface DocVersionNpm {\n\tversion?: string;\n\tdescription?: string;\n\tlicense?: string | { type: string };\n\thomepage?: string;\n}\n\ninterface DocPaqueteNpm extends DocVersionNpm {\n\tname?: string;\n\t\"dist-tags\"?: { latest?: string };\n\tversions?: Record<string, DocVersionNpm>;\n}\n\nfunction nombreDesdePagina(pathname: string): string | undefined {\n\tconst match = pathname.match(/^\\/package\\/(.+)/);\n\tif (!match) return undefined;\n\tconst resto = decodeURIComponent(match[1]);\n\tconst partes = resto.split(\"/\");\n\t// Paquete con scope: /package/@scope/nombre — el resto son sub-rutas (README, versions…).\n\treturn partes[0].startsWith(\"@\") ? partes.slice(0, 2).join(\"/\") : partes[0];\n}\n\nfunction licenciaDeString(valor: string | { type: string } | undefined): string | undefined {\n\tif (!valor) return undefined;\n\treturn typeof valor === \"string\" ? valor : valor.type;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tlet apiUrl: string;\n\tif (url.hostname === \"registry.npmjs.org\") {\n\t\tapiUrl = url.href; // ya es la API: se pide tal cual.\n\t} else if (url.hostname === \"www.npmjs.com\" || url.hostname === \"npmjs.com\") {\n\t\tconst nombre = nombreDesdePagina(url.pathname);\n\t\tif (!nombre) return null;\n\t\tapiUrl = `https://registry.npmjs.org/${nombre}`;\n\t} else {\n\t\treturn null;\n\t}\n\n\tconst respuesta = await fetchImpl(apiUrl, { headers: { Accept: \"application/json\" }, signal });\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`npm respondió HTTP ${respuesta.status}.`);\n\tconst paquete = (await respuesta.json()) as DocPaqueteNpm;\n\tif (!paquete?.name) return null;\n\n\tconst ultimaEtiqueta = paquete[\"dist-tags\"]?.latest;\n\t// Con `dist-tags.latest` viene un mapa `versions`: se usa esa versión concreta\n\t// (misma licencia que el `/latest` endpoint más ligero). Sin él —cuando la URL\n\t// ya apuntaba a una versión abreviada— el propio documento ES la versión.\n\tconst version: DocVersionNpm = (ultimaEtiqueta && paquete.versions?.[ultimaEtiqueta]) || paquete;\n\tconst licencia = licenciaDeString(version.license) ?? licenciaDeString(paquete.license);\n\tconst numeroVersion = ultimaEtiqueta ?? paquete.version;\n\n\tconst datos: ResultadoScraper[\"datos\"] = {\n\t\tnombre: paquete.name,\n\t\tversion: numeroVersion,\n\t\tlicencia,\n\t\thomepage: version.homepage ?? paquete.homepage,\n\t};\n\treturn {\n\t\ttitulo: `${paquete.name}${numeroVersion ? `@${numeroVersion}` : \"\"}`,\n\t\turl: `https://www.npmjs.com/package/${paquete.name}`,\n\t\tresumen: version.description ?? paquete.description ?? \"\",\n\t\tdatos,\n\t};\n};\n"]}
1
+ {"version":3,"file":"npm.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/npm.ts"],"names":[],"mappings":"AAuBA,SAAS,iBAAiB,CAAC,QAAgB;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,0FAA0F;IAC1F,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA4C;IACrE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;IACxE,IAAI,MAAc,CAAC;IACnB,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,kCAAkC;IACtD,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7E,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,GAAG,8BAA8B,MAAM,EAAE,CAAC;IACjD,CAAC;SAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/F,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAkB,CAAC;IAC1D,IAAI,CAAC,OAAO,EAAE,IAAI;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IACpD,+EAA+E;IAC/E,+EAA+E;IAC/E,0EAA0E;IAC1E,MAAM,OAAO,GAAkB,CAAC,cAAc,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC,CAAC,IAAI,OAAO,CAAC;IACjG,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxF,MAAM,aAAa,GAAG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAExD,MAAM,KAAK,GAA8B;QACxC,MAAM,EAAE,OAAO,CAAC,IAAI;QACpB,OAAO,EAAE,aAAa;QACtB,QAAQ;QACR,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;KAC9C,CAAC;IACF,OAAO;QACN,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QACpE,GAAG,EAAE,iCAAiC,OAAO,CAAC,IAAI,EAAE;QACpD,OAAO,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,IAAI,EAAE;QACzD,KAAK;KACL,CAAC;AACH,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"nuget.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/nuget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,eAAO,MAAM,QAAQ,EAAE,cAqBtB,CAAC","sourcesContent":["/**\n * NuGet, vía su API de búsqueda plana (`azuresearch-usnc.nuget.org/query`) —\n * a diferencia del índice de registro oficial, no viene paginado ni\n * gzip-envuelto, así que basta una petición.\n */\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocNuGet {\n\tdata?: Array<{ id?: string; version?: string; description?: string; licenseUrl?: string; projectUrl?: string }>;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"www.nuget.org\" && url.hostname !== \"nuget.org\") return null;\n\tconst match = url.pathname.match(/^\\/packages\\/([^/]+)/i);\n\tif (!match) return null;\n\tconst paquete = decodeURIComponent(match[1]);\n\n\tconst respuesta = await fetchImpl(\n\t\t`https://azuresearch-usnc.nuget.org/query?q=packageid:${encodeURIComponent(paquete)}&prerelease=true&take=1`,\n\t\t{ signal },\n\t);\n\tif (!respuesta.ok) throw new Error(`NuGet respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as DocNuGet;\n\tconst pkg = doc.data?.[0];\n\tif (!pkg?.id) return null;\n\n\treturn {\n\t\ttitulo: `${pkg.id}@${pkg.version ?? \"?\"}`,\n\t\turl: `https://www.nuget.org/packages/${pkg.id}/${pkg.version ?? \"\"}`,\n\t\tresumen: pkg.description ?? \"\",\n\t\tdatos: { nombre: pkg.id, version: pkg.version, licenciaUrl: pkg.licenseUrl, homepage: pkg.projectUrl },\n\t};\n};\n"]}
1
+ {"version":3,"file":"nuget.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/nuget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,eAAO,MAAM,QAAQ,EAAE,cAqBtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"nuget.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/nuget.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACzE,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAClF,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,MAAM,SAAS,CAChC,wDAAwD,kBAAkB,CAAC,OAAO,CAAC,yBAAyB,EAC5G,EAAE,MAAM,EAAE,CACV,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAwB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAa,CAAC;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG,EAAE,EAAE;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO;QACN,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE;QACzC,GAAG,EAAE,kCAAkC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE;QACpE,OAAO,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;QAC9B,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE;KACtG,CAAC;AAAA,CACF,CAAC","sourcesContent":["/**\n * NuGet, vía su API de búsqueda plana (`azuresearch-usnc.nuget.org/query`) —\n * a diferencia del índice de registro oficial, no viene paginado ni\n * gzip-envuelto, así que basta una petición.\n */\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocNuGet {\n\tdata?: Array<{ id?: string; version?: string; description?: string; licenseUrl?: string; projectUrl?: string }>;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"www.nuget.org\" && url.hostname !== \"nuget.org\") return null;\n\tconst match = url.pathname.match(/^\\/packages\\/([^/]+)/i);\n\tif (!match) return null;\n\tconst paquete = decodeURIComponent(match[1]);\n\n\tconst respuesta = await fetchImpl(\n\t\t`https://azuresearch-usnc.nuget.org/query?q=packageid:${encodeURIComponent(paquete)}&prerelease=true&take=1`,\n\t\t{ signal },\n\t);\n\tif (!respuesta.ok) throw new Error(`NuGet respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as DocNuGet;\n\tconst pkg = doc.data?.[0];\n\tif (!pkg?.id) return null;\n\n\treturn {\n\t\ttitulo: `${pkg.id}@${pkg.version ?? \"?\"}`,\n\t\turl: `https://www.nuget.org/packages/${pkg.id}/${pkg.version ?? \"\"}`,\n\t\tresumen: pkg.description ?? \"\",\n\t\tdatos: { nombre: pkg.id, version: pkg.version, licenciaUrl: pkg.licenseUrl, homepage: pkg.projectUrl },\n\t};\n};\n"]}
1
+ {"version":3,"file":"nuget.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/nuget.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;IACxE,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAClF,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,MAAM,SAAS,CAChC,wDAAwD,kBAAkB,CAAC,OAAO,CAAC,yBAAyB,EAC5G,EAAE,MAAM,EAAE,CACV,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAa,CAAC;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG,EAAE,EAAE;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO;QACN,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE;QACzC,GAAG,EAAE,kCAAkC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE;QACpE,OAAO,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;QAC9B,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE;KACtG,CAAC;AACH,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"nvd.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/nvd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAcpE,eAAO,MAAM,QAAQ,EAAE,cA6BtB,CAAC","sourcesContent":["/**\n * NVD (National Vulnerability Database), vía su API REST 2.0 — sin clave,\n * aunque con un límite de tasa más estricto que con una (5 peticiones/30s).\n */\nimport { esHostOSubdominio, type FuncionScraper } from \"./tipos.ts\";\n\ninterface CveDoc {\n\tid?: string;\n\tvulnStatus?: string;\n\tpublished?: string;\n\tdescriptions?: Array<{ lang?: string; value?: string }>;\n\tmetrics?: {\n\t\tcvssMetricV31?: Array<{ cvssData?: { baseScore?: number; baseSeverity?: string } }>;\n\t\tcvssMetricV30?: Array<{ cvssData?: { baseScore?: number; baseSeverity?: string } }>;\n\t\tcvssMetricV2?: Array<{ cvssData?: { baseScore?: number; baseSeverity?: string } }>;\n\t};\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (!esHostOSubdominio(url.hostname, \"nvd.nist.gov\")) return null;\n\tconst match = url.pathname.match(/\\/vuln\\/detail\\/(CVE-\\d{4}-\\d+)/i);\n\tif (!match) return null;\n\tconst cveId = match[1].toUpperCase();\n\n\tconst respuesta = await fetchImpl(`https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=${cveId}`, {\n\t\theaders: { Accept: \"application/json\" },\n\t\tsignal,\n\t});\n\tif (!respuesta.ok) throw new Error(`NVD respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as { vulnerabilities?: Array<{ cve?: CveDoc }> };\n\tconst cve = doc.vulnerabilities?.[0]?.cve;\n\tif (!cve?.id) return null;\n\n\tconst cvss = cve.metrics?.cvssMetricV31?.[0] ?? cve.metrics?.cvssMetricV30?.[0] ?? cve.metrics?.cvssMetricV2?.[0];\n\tconst descripcion = cve.descriptions?.find((d) => d.lang === \"en\")?.value ?? \"\";\n\n\treturn {\n\t\ttitulo: cve.id,\n\t\turl: `https://nvd.nist.gov/vuln/detail/${cve.id}`,\n\t\tresumen: descripcion,\n\t\tdatos: {\n\t\t\testado: cve.vulnStatus,\n\t\t\tpublicado: cve.published,\n\t\t\tpuntuacionCvss: cvss?.cvssData?.baseScore,\n\t\t\tseveridad: cvss?.cvssData?.baseSeverity,\n\t\t},\n\t};\n};\n"]}
1
+ {"version":3,"file":"nvd.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/nvd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAcpE,eAAO,MAAM,QAAQ,EAAE,cA6BtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"nvd.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/nvd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAuB,MAAM,YAAY,CAAC;AAcpE,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACzE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,0DAA0D,KAAK,EAAE,EAAE;QACpG,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;QACvC,MAAM;KACN,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAsB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAkD,CAAC;IACtF,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IAC1C,IAAI,CAAC,GAAG,EAAE,EAAE;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAClH,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IAEhF,OAAO;QACN,MAAM,EAAE,GAAG,CAAC,EAAE;QACd,GAAG,EAAE,oCAAoC,GAAG,CAAC,EAAE,EAAE;QACjD,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE;YACN,MAAM,EAAE,GAAG,CAAC,UAAU;YACtB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS;YACzC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY;SACvC;KACD,CAAC;AAAA,CACF,CAAC","sourcesContent":["/**\n * NVD (National Vulnerability Database), vía su API REST 2.0 — sin clave,\n * aunque con un límite de tasa más estricto que con una (5 peticiones/30s).\n */\nimport { esHostOSubdominio, type FuncionScraper } from \"./tipos.ts\";\n\ninterface CveDoc {\n\tid?: string;\n\tvulnStatus?: string;\n\tpublished?: string;\n\tdescriptions?: Array<{ lang?: string; value?: string }>;\n\tmetrics?: {\n\t\tcvssMetricV31?: Array<{ cvssData?: { baseScore?: number; baseSeverity?: string } }>;\n\t\tcvssMetricV30?: Array<{ cvssData?: { baseScore?: number; baseSeverity?: string } }>;\n\t\tcvssMetricV2?: Array<{ cvssData?: { baseScore?: number; baseSeverity?: string } }>;\n\t};\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (!esHostOSubdominio(url.hostname, \"nvd.nist.gov\")) return null;\n\tconst match = url.pathname.match(/\\/vuln\\/detail\\/(CVE-\\d{4}-\\d+)/i);\n\tif (!match) return null;\n\tconst cveId = match[1].toUpperCase();\n\n\tconst respuesta = await fetchImpl(`https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=${cveId}`, {\n\t\theaders: { Accept: \"application/json\" },\n\t\tsignal,\n\t});\n\tif (!respuesta.ok) throw new Error(`NVD respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as { vulnerabilities?: Array<{ cve?: CveDoc }> };\n\tconst cve = doc.vulnerabilities?.[0]?.cve;\n\tif (!cve?.id) return null;\n\n\tconst cvss = cve.metrics?.cvssMetricV31?.[0] ?? cve.metrics?.cvssMetricV30?.[0] ?? cve.metrics?.cvssMetricV2?.[0];\n\tconst descripcion = cve.descriptions?.find((d) => d.lang === \"en\")?.value ?? \"\";\n\n\treturn {\n\t\ttitulo: cve.id,\n\t\turl: `https://nvd.nist.gov/vuln/detail/${cve.id}`,\n\t\tresumen: descripcion,\n\t\tdatos: {\n\t\t\testado: cve.vulnStatus,\n\t\t\tpublicado: cve.published,\n\t\t\tpuntuacionCvss: cvss?.cvssData?.baseScore,\n\t\t\tseveridad: cvss?.cvssData?.baseSeverity,\n\t\t},\n\t};\n};\n"]}
1
+ {"version":3,"file":"nvd.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/nvd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAuB,MAAM,YAAY,CAAC;AAcpE,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;IACxE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,0DAA0D,KAAK,EAAE,EAAE;QACpG,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;QACvC,MAAM;KACN,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAkD,CAAC;IACtF,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IAC1C,IAAI,CAAC,GAAG,EAAE,EAAE;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAClH,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IAEhF,OAAO;QACN,MAAM,EAAE,GAAG,CAAC,EAAE;QACd,GAAG,EAAE,oCAAoC,GAAG,CAAC,EAAE,EAAE;QACjD,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE;YACN,MAAM,EAAE,GAAG,CAAC,UAAU;YACtB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS;YACzC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY;SACvC;KACD,CAAC;AACH,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pypi.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/pypi.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAajD,eAAO,MAAM,QAAQ,EAAE,cA0BtB,CAAC","sourcesContent":["/**\n * PyPI, vía su API JSON pública (`pypi.org/pypi/<paquete>/json`).\n */\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocPyPI {\n\tinfo?: {\n\t\tname?: string;\n\t\tversion?: string;\n\t\tlicense?: string;\n\t\tlicense_expression?: string;\n\t\thome_page?: string;\n\t\tsummary?: string;\n\t};\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"pypi.org\") return null;\n\tconst match = url.pathname.match(/^\\/project\\/([^/]+)/);\n\tif (!match) return null;\n\tconst paquete = decodeURIComponent(match[1]);\n\n\tconst respuesta = await fetchImpl(`https://pypi.org/pypi/${paquete}/json`, {\n\t\theaders: { Accept: \"application/json\" },\n\t\tsignal,\n\t});\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`PyPI respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as DocPyPI;\n\tconst info = doc.info;\n\tif (!info?.name) return null;\n\n\t// PyPI migró la licencia de texto libre a SPDX (`license_expression`); el\n\t// campo viejo suele repetir el nombre del paquete cuando el autor solo\n\t// rellenó el clasificador, así que se prefiere el nuevo cuando existe.\n\tconst licencia = info.license_expression || info.license || undefined;\n\treturn {\n\t\ttitulo: `${info.name}@${info.version ?? \"?\"}`,\n\t\turl: `https://pypi.org/project/${info.name}/`,\n\t\tresumen: info.summary ?? \"\",\n\t\tdatos: { nombre: info.name, version: info.version, licencia, homepage: info.home_page },\n\t};\n};\n"]}
1
+ {"version":3,"file":"pypi.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/pypi.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAajD,eAAO,MAAM,QAAQ,EAAE,cA0BtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pypi.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/pypi.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACzE,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,yBAAyB,OAAO,OAAO,EAAE;QAC1E,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;QACvC,MAAM;KACN,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAuB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAY,CAAC;IAChD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,CAAC,IAAI,EAAE,IAAI;QAAE,OAAO,IAAI,CAAC;IAE7B,2EAA0E;IAC1E,uEAAuE;IACvE,yEAAuE;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC;IACtE,OAAO;QACN,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,GAAG,EAAE;QAC7C,GAAG,EAAE,4BAA4B,IAAI,CAAC,IAAI,GAAG;QAC7C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;QAC3B,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE;KACvF,CAAC;AAAA,CACF,CAAC","sourcesContent":["/**\n * PyPI, vía su API JSON pública (`pypi.org/pypi/<paquete>/json`).\n */\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocPyPI {\n\tinfo?: {\n\t\tname?: string;\n\t\tversion?: string;\n\t\tlicense?: string;\n\t\tlicense_expression?: string;\n\t\thome_page?: string;\n\t\tsummary?: string;\n\t};\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"pypi.org\") return null;\n\tconst match = url.pathname.match(/^\\/project\\/([^/]+)/);\n\tif (!match) return null;\n\tconst paquete = decodeURIComponent(match[1]);\n\n\tconst respuesta = await fetchImpl(`https://pypi.org/pypi/${paquete}/json`, {\n\t\theaders: { Accept: \"application/json\" },\n\t\tsignal,\n\t});\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`PyPI respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as DocPyPI;\n\tconst info = doc.info;\n\tif (!info?.name) return null;\n\n\t// PyPI migró la licencia de texto libre a SPDX (`license_expression`); el\n\t// campo viejo suele repetir el nombre del paquete cuando el autor solo\n\t// rellenó el clasificador, así que se prefiere el nuevo cuando existe.\n\tconst licencia = info.license_expression || info.license || undefined;\n\treturn {\n\t\ttitulo: `${info.name}@${info.version ?? \"?\"}`,\n\t\turl: `https://pypi.org/project/${info.name}/`,\n\t\tresumen: info.summary ?? \"\",\n\t\tdatos: { nombre: info.name, version: info.version, licencia, homepage: info.home_page },\n\t};\n};\n"]}
1
+ {"version":3,"file":"pypi.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/pypi.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;IACxE,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,yBAAyB,OAAO,OAAO,EAAE;QAC1E,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;QACvC,MAAM;KACN,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAY,CAAC;IAChD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,CAAC,IAAI,EAAE,IAAI;QAAE,OAAO,IAAI,CAAC;IAE7B,0EAA0E;IAC1E,uEAAuE;IACvE,uEAAuE;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC;IACtE,OAAO;QACN,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,GAAG,EAAE;QAC7C,GAAG,EAAE,4BAA4B,IAAI,CAAC,IAAI,GAAG;QAC7C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;QAC3B,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE;KACvF,CAAC;AACH,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"registro.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/registro.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,iBAAiB,EAAqB,MAAM,YAAY,CAAC;AAuDvE,4EAA0E;AAC1E,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAAa,CAAC;AAE3E,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB,GAAG,SAAS,CAExE","sourcesContent":["/**\n * Registro perezoso de scrapers de `web_fetch`.\n *\n * Igual que en `proveedores/registro.ts`: importar este fichero no carga\n * ningún scraper. `encontrarScraper` solo mira el hostname/ruta (sin red) y\n * `cargar()` no se ejecuta hasta que un scraper concreto encaja de verdad.\n */\nimport { type DescriptorScraper, esHostOSubdominio } from \"./tipos.ts\";\n\nconst SCRAPERS: readonly DescriptorScraper[] = [\n\t{\n\t\tnombre: \"npm\",\n\t\tencaja: (u) =>\n\t\t\tu.hostname === \"registry.npmjs.org\" || u.hostname === \"www.npmjs.com\" || u.hostname === \"npmjs.com\",\n\t\tcargar: () => import(\"./npm.ts\"),\n\t},\n\t{ nombre: \"pypi\", encaja: (u) => u.hostname === \"pypi.org\", cargar: () => import(\"./pypi.ts\") },\n\t{ nombre: \"crates-io\", encaja: (u) => u.hostname === \"crates.io\", cargar: () => import(\"./crates-io.ts\") },\n\t{ nombre: \"docs-rs\", encaja: (u) => u.hostname === \"docs.rs\", cargar: () => import(\"./docs-rs.ts\") },\n\t{\n\t\tnombre: \"mdn\",\n\t\tencaja: (u) => esHostOSubdominio(u.hostname, \"developer.mozilla.org\"),\n\t\tcargar: () => import(\"./mdn.ts\"),\n\t},\n\t{\n\t\tnombre: \"stackoverflow\",\n\t\tencaja: (u) => u.hostname === \"stackoverflow.com\" || u.hostname === \"www.stackoverflow.com\",\n\t\tcargar: () => import(\"./stackoverflow.ts\"),\n\t},\n\t{\n\t\tnombre: \"github\",\n\t\tencaja: (u) => u.hostname === \"github.com\" || u.hostname === \"api.github.com\",\n\t\tcargar: () => import(\"./github.ts\"),\n\t},\n\t{ nombre: \"go-pkg\", encaja: (u) => u.hostname === \"pkg.go.dev\", cargar: () => import(\"./go-pkg.ts\") },\n\t{\n\t\tnombre: \"maven\",\n\t\tencaja: (u) =>\n\t\t\tu.hostname === \"search.maven.org\" ||\n\t\t\tu.hostname === \"mvnrepository.com\" ||\n\t\t\tu.hostname === \"www.mvnrepository.com\",\n\t\tcargar: () => import(\"./maven.ts\"),\n\t},\n\t{\n\t\tnombre: \"nuget\",\n\t\tencaja: (u) => u.hostname === \"www.nuget.org\" || u.hostname === \"nuget.org\",\n\t\tcargar: () => import(\"./nuget.ts\"),\n\t},\n\t{ nombre: \"hex\", encaja: (u) => u.hostname === \"hex.pm\", cargar: () => import(\"./hex.ts\") },\n\t{ nombre: \"rubygems\", encaja: (u) => u.hostname === \"rubygems.org\", cargar: () => import(\"./rubygems.ts\") },\n\t{\n\t\tnombre: \"nvd\",\n\t\tencaja: (u) => esHostOSubdominio(u.hostname, \"nvd.nist.gov\"),\n\t\tcargar: () => import(\"./nvd.ts\"),\n\t},\n\t{\n\t\tnombre: \"cisa-kev\",\n\t\tencaja: (u) => esHostOSubdominio(u.hostname.toLowerCase(), \"cisa.gov\"),\n\t\tcargar: () => import(\"./cisa-kev.ts\"),\n\t},\n];\n\n/** Metadatos de todos los scrapers. Ningún `cargar()` se ejecuta aquí. */\nexport const SCRAPERS_REGISTRADOS: readonly DescriptorScraper[] = SCRAPERS;\n\n/** El primer scraper cuya URL encaje, o `undefined` si ninguno la reclama. */\nexport function encontrarScraper(url: URL): DescriptorScraper | undefined {\n\treturn SCRAPERS.find((s) => s.encaja(url));\n}\n"]}
1
+ {"version":3,"file":"registro.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/registro.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,iBAAiB,EAAqB,MAAM,YAAY,CAAC;AAuDvE,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAAa,CAAC;AAE3E,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB,GAAG,SAAS,CAExE"}
@@ -1 +1 @@
1
- {"version":3,"file":"registro.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/registro.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Registro perezoso de scrapers de `web_fetch`.\n *\n * Igual que en `proveedores/registro.ts`: importar este fichero no carga\n * ningún scraper. `encontrarScraper` solo mira el hostname/ruta (sin red) y\n * `cargar()` no se ejecuta hasta que un scraper concreto encaja de verdad.\n */\nimport { type DescriptorScraper, esHostOSubdominio } from \"./tipos.ts\";\n\nconst SCRAPERS: readonly DescriptorScraper[] = [\n\t{\n\t\tnombre: \"npm\",\n\t\tencaja: (u) =>\n\t\t\tu.hostname === \"registry.npmjs.org\" || u.hostname === \"www.npmjs.com\" || u.hostname === \"npmjs.com\",\n\t\tcargar: () => import(\"./npm.ts\"),\n\t},\n\t{ nombre: \"pypi\", encaja: (u) => u.hostname === \"pypi.org\", cargar: () => import(\"./pypi.ts\") },\n\t{ nombre: \"crates-io\", encaja: (u) => u.hostname === \"crates.io\", cargar: () => import(\"./crates-io.ts\") },\n\t{ nombre: \"docs-rs\", encaja: (u) => u.hostname === \"docs.rs\", cargar: () => import(\"./docs-rs.ts\") },\n\t{\n\t\tnombre: \"mdn\",\n\t\tencaja: (u) => esHostOSubdominio(u.hostname, \"developer.mozilla.org\"),\n\t\tcargar: () => import(\"./mdn.ts\"),\n\t},\n\t{\n\t\tnombre: \"stackoverflow\",\n\t\tencaja: (u) => u.hostname === \"stackoverflow.com\" || u.hostname === \"www.stackoverflow.com\",\n\t\tcargar: () => import(\"./stackoverflow.ts\"),\n\t},\n\t{\n\t\tnombre: \"github\",\n\t\tencaja: (u) => u.hostname === \"github.com\" || u.hostname === \"api.github.com\",\n\t\tcargar: () => import(\"./github.ts\"),\n\t},\n\t{ nombre: \"go-pkg\", encaja: (u) => u.hostname === \"pkg.go.dev\", cargar: () => import(\"./go-pkg.ts\") },\n\t{\n\t\tnombre: \"maven\",\n\t\tencaja: (u) =>\n\t\t\tu.hostname === \"search.maven.org\" ||\n\t\t\tu.hostname === \"mvnrepository.com\" ||\n\t\t\tu.hostname === \"www.mvnrepository.com\",\n\t\tcargar: () => import(\"./maven.ts\"),\n\t},\n\t{\n\t\tnombre: \"nuget\",\n\t\tencaja: (u) => u.hostname === \"www.nuget.org\" || u.hostname === \"nuget.org\",\n\t\tcargar: () => import(\"./nuget.ts\"),\n\t},\n\t{ nombre: \"hex\", encaja: (u) => u.hostname === \"hex.pm\", cargar: () => import(\"./hex.ts\") },\n\t{ nombre: \"rubygems\", encaja: (u) => u.hostname === \"rubygems.org\", cargar: () => import(\"./rubygems.ts\") },\n\t{\n\t\tnombre: \"nvd\",\n\t\tencaja: (u) => esHostOSubdominio(u.hostname, \"nvd.nist.gov\"),\n\t\tcargar: () => import(\"./nvd.ts\"),\n\t},\n\t{\n\t\tnombre: \"cisa-kev\",\n\t\tencaja: (u) => esHostOSubdominio(u.hostname.toLowerCase(), \"cisa.gov\"),\n\t\tcargar: () => import(\"./cisa-kev.ts\"),\n\t},\n];\n\n/** Metadatos de todos los scrapers. Ningún `cargar()` se ejecuta aquí. */\nexport const SCRAPERS_REGISTRADOS: readonly DescriptorScraper[] = SCRAPERS;\n\n/** El primer scraper cuya URL encaje, o `undefined` si ninguno la reclama. */\nexport function encontrarScraper(url: URL): DescriptorScraper | undefined {\n\treturn SCRAPERS.find((s) => s.encaja(url));\n}\n"]}
1
+ {"version":3,"file":"registro.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/registro.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rubygems.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/rubygems.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAUjD,eAAO,MAAM,QAAQ,EAAE,cAkBtB,CAAC","sourcesContent":["/**\n * RubyGems, vía su API pública (`rubygems.org/api/v1/gems/<gema>.json`).\n */\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocRubyGems {\n\tname?: string;\n\tversion?: string;\n\tlicenses?: string[] | null;\n\tinfo?: string;\n\thomepage_uri?: string;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"rubygems.org\") return null;\n\tconst match = url.pathname.match(/^\\/gems\\/([^/]+)/);\n\tif (!match) return null;\n\tconst gema = decodeURIComponent(match[1]);\n\n\tconst respuesta = await fetchImpl(`https://rubygems.org/api/v1/gems/${encodeURIComponent(gema)}.json`, { signal });\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`RubyGems respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as DocRubyGems;\n\tif (!doc.name) return null;\n\n\treturn {\n\t\ttitulo: `${doc.name}@${doc.version ?? \"?\"}`,\n\t\turl: `https://rubygems.org/gems/${doc.name}`,\n\t\tresumen: doc.info ?? \"\",\n\t\tdatos: { nombre: doc.name, version: doc.version, licencias: doc.licenses ?? [], homepage: doc.homepage_uri },\n\t};\n};\n"]}
1
+ {"version":3,"file":"rubygems.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/rubygems.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAUjD,eAAO,MAAM,QAAQ,EAAE,cAkBtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rubygems.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/rubygems.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACzE,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,oCAAoC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACnH,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA2B,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACnF,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAgB,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAE3B,OAAO;QACN,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE;QAC3C,GAAG,EAAE,6BAA6B,GAAG,CAAC,IAAI,EAAE;QAC5C,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;QACvB,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,YAAY,EAAE;KAC5G,CAAC;AAAA,CACF,CAAC","sourcesContent":["/**\n * RubyGems, vía su API pública (`rubygems.org/api/v1/gems/<gema>.json`).\n */\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocRubyGems {\n\tname?: string;\n\tversion?: string;\n\tlicenses?: string[] | null;\n\tinfo?: string;\n\thomepage_uri?: string;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"rubygems.org\") return null;\n\tconst match = url.pathname.match(/^\\/gems\\/([^/]+)/);\n\tif (!match) return null;\n\tconst gema = decodeURIComponent(match[1]);\n\n\tconst respuesta = await fetchImpl(`https://rubygems.org/api/v1/gems/${encodeURIComponent(gema)}.json`, { signal });\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`RubyGems respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as DocRubyGems;\n\tif (!doc.name) return null;\n\n\treturn {\n\t\ttitulo: `${doc.name}@${doc.version ?? \"?\"}`,\n\t\turl: `https://rubygems.org/gems/${doc.name}`,\n\t\tresumen: doc.info ?? \"\",\n\t\tdatos: { nombre: doc.name, version: doc.version, licencias: doc.licenses ?? [], homepage: doc.homepage_uri },\n\t};\n};\n"]}
1
+ {"version":3,"file":"rubygems.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/rubygems.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;IACxE,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,oCAAoC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACnH,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACnF,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAgB,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAE3B,OAAO;QACN,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE;QAC3C,GAAG,EAAE,6BAA6B,GAAG,CAAC,IAAI,EAAE;QAC5C,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;QACvB,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,YAAY,EAAE;KAC5G,CAAC;AACH,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"stackoverflow.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/stackoverflow.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAmBjD,eAAO,MAAM,QAAQ,EAAE,cAwCtB,CAAC","sourcesContent":["/**\n * Stack Overflow, vía la API pública de Stack Exchange (sin clave, con\n * cuota compartida). Trae la pregunta y, si la hay, la respuesta aceptada —\n * es lo que un agente de código va a buscar en la URL, no el layout de la\n * página.\n */\nimport { htmlToText } from \"../texto.ts\";\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface Pregunta {\n\ttitle?: string;\n\tbody?: string;\n\tscore?: number;\n\ttags?: string[];\n\tanswer_count?: number;\n\tis_answered?: boolean;\n\taccepted_answer_id?: number;\n}\n\ninterface Respuesta {\n\tbody?: string;\n\tscore?: number;\n}\n\nconst RESUMEN_MAX = 600;\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"stackoverflow.com\" && url.hostname !== \"www.stackoverflow.com\") return null;\n\tconst match = url.pathname.match(/\\/questions\\/(\\d+)/);\n\tif (!match) return null;\n\tconst id = match[1];\n\n\tconst respuesta = await fetchImpl(\n\t\t`https://api.stackexchange.com/2.3/questions/${id}?order=desc&sort=votes&site=stackoverflow&filter=withbody`,\n\t\t{ signal },\n\t);\n\tif (!respuesta.ok) throw new Error(`Stack Overflow respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as { items?: Pregunta[] };\n\tconst pregunta = doc.items?.[0];\n\tif (!pregunta?.title) return null;\n\n\tlet respuestaAceptada: string | undefined;\n\tif (pregunta.accepted_answer_id) {\n\t\tconst respAns = await fetchImpl(\n\t\t\t`https://api.stackexchange.com/2.3/answers/${pregunta.accepted_answer_id}?order=desc&sort=votes&site=stackoverflow&filter=withbody`,\n\t\t\t{ signal },\n\t\t);\n\t\tif (respAns.ok) {\n\t\t\tconst docAns = (await respAns.json()) as { items?: Respuesta[] };\n\t\t\tconst cuerpo = docAns.items?.[0]?.body;\n\t\t\tif (cuerpo) respuestaAceptada = htmlToText(cuerpo);\n\t\t}\n\t}\n\n\treturn {\n\t\ttitulo: pregunta.title,\n\t\turl: `https://stackoverflow.com/questions/${id}`,\n\t\tresumen: htmlToText(pregunta.body ?? \"\").slice(0, RESUMEN_MAX),\n\t\tdatos: {\n\t\t\tpuntuacion: pregunta.score,\n\t\t\trespuestas: pregunta.answer_count,\n\t\t\tresuelta: pregunta.is_answered ?? false,\n\t\t\tetiquetas: pregunta.tags ?? [],\n\t\t\trespuestaAceptada,\n\t\t},\n\t};\n};\n"]}
1
+ {"version":3,"file":"stackoverflow.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/stackoverflow.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAmBjD,eAAO,MAAM,QAAQ,EAAE,cAwCtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"stackoverflow.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/stackoverflow.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAkBzC,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACzE,IAAI,GAAG,CAAC,QAAQ,KAAK,mBAAmB,IAAI,GAAG,CAAC,QAAQ,KAAK,uBAAuB;QAAE,OAAO,IAAI,CAAC;IAClG,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEpB,MAAM,SAAS,GAAG,MAAM,SAAS,CAChC,+CAA+C,EAAE,2DAA2D,EAC5G,EAAE,MAAM,EAAE,CACV,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAiC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACzF,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAA2B,CAAC;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,QAAQ,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC;IAElC,IAAI,iBAAqC,CAAC;IAC1C,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,SAAS,CAC9B,6CAA6C,QAAQ,CAAC,kBAAkB,2DAA2D,EACnI,EAAE,MAAM,EAAE,CACV,CAAC;QACF,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAA4B,CAAC;YACjE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACvC,IAAI,MAAM;gBAAE,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED,OAAO;QACN,MAAM,EAAE,QAAQ,CAAC,KAAK;QACtB,GAAG,EAAE,uCAAuC,EAAE,EAAE;QAChD,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;QAC9D,KAAK,EAAE;YACN,UAAU,EAAE,QAAQ,CAAC,KAAK;YAC1B,UAAU,EAAE,QAAQ,CAAC,YAAY;YACjC,QAAQ,EAAE,QAAQ,CAAC,WAAW,IAAI,KAAK;YACvC,SAAS,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;YAC9B,iBAAiB;SACjB;KACD,CAAC;AAAA,CACF,CAAC","sourcesContent":["/**\n * Stack Overflow, vía la API pública de Stack Exchange (sin clave, con\n * cuota compartida). Trae la pregunta y, si la hay, la respuesta aceptada —\n * es lo que un agente de código va a buscar en la URL, no el layout de la\n * página.\n */\nimport { htmlToText } from \"../texto.ts\";\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface Pregunta {\n\ttitle?: string;\n\tbody?: string;\n\tscore?: number;\n\ttags?: string[];\n\tanswer_count?: number;\n\tis_answered?: boolean;\n\taccepted_answer_id?: number;\n}\n\ninterface Respuesta {\n\tbody?: string;\n\tscore?: number;\n}\n\nconst RESUMEN_MAX = 600;\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"stackoverflow.com\" && url.hostname !== \"www.stackoverflow.com\") return null;\n\tconst match = url.pathname.match(/\\/questions\\/(\\d+)/);\n\tif (!match) return null;\n\tconst id = match[1];\n\n\tconst respuesta = await fetchImpl(\n\t\t`https://api.stackexchange.com/2.3/questions/${id}?order=desc&sort=votes&site=stackoverflow&filter=withbody`,\n\t\t{ signal },\n\t);\n\tif (!respuesta.ok) throw new Error(`Stack Overflow respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as { items?: Pregunta[] };\n\tconst pregunta = doc.items?.[0];\n\tif (!pregunta?.title) return null;\n\n\tlet respuestaAceptada: string | undefined;\n\tif (pregunta.accepted_answer_id) {\n\t\tconst respAns = await fetchImpl(\n\t\t\t`https://api.stackexchange.com/2.3/answers/${pregunta.accepted_answer_id}?order=desc&sort=votes&site=stackoverflow&filter=withbody`,\n\t\t\t{ signal },\n\t\t);\n\t\tif (respAns.ok) {\n\t\t\tconst docAns = (await respAns.json()) as { items?: Respuesta[] };\n\t\t\tconst cuerpo = docAns.items?.[0]?.body;\n\t\t\tif (cuerpo) respuestaAceptada = htmlToText(cuerpo);\n\t\t}\n\t}\n\n\treturn {\n\t\ttitulo: pregunta.title,\n\t\turl: `https://stackoverflow.com/questions/${id}`,\n\t\tresumen: htmlToText(pregunta.body ?? \"\").slice(0, RESUMEN_MAX),\n\t\tdatos: {\n\t\t\tpuntuacion: pregunta.score,\n\t\t\trespuestas: pregunta.answer_count,\n\t\t\tresuelta: pregunta.is_answered ?? false,\n\t\t\tetiquetas: pregunta.tags ?? [],\n\t\t\trespuestaAceptada,\n\t\t},\n\t};\n};\n"]}
1
+ {"version":3,"file":"stackoverflow.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/stackoverflow.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAkBzC,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;IACxE,IAAI,GAAG,CAAC,QAAQ,KAAK,mBAAmB,IAAI,GAAG,CAAC,QAAQ,KAAK,uBAAuB;QAAE,OAAO,IAAI,CAAC;IAClG,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEpB,MAAM,SAAS,GAAG,MAAM,SAAS,CAChC,+CAA+C,EAAE,2DAA2D,EAC5G,EAAE,MAAM,EAAE,CACV,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACzF,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAA2B,CAAC;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,QAAQ,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC;IAElC,IAAI,iBAAqC,CAAC;IAC1C,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,SAAS,CAC9B,6CAA6C,QAAQ,CAAC,kBAAkB,2DAA2D,EACnI,EAAE,MAAM,EAAE,CACV,CAAC;QACF,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAA4B,CAAC;YACjE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACvC,IAAI,MAAM;gBAAE,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED,OAAO;QACN,MAAM,EAAE,QAAQ,CAAC,KAAK;QACtB,GAAG,EAAE,uCAAuC,EAAE,EAAE;QAChD,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;QAC9D,KAAK,EAAE;YACN,UAAU,EAAE,QAAQ,CAAC,KAAK;YAC1B,UAAU,EAAE,QAAQ,CAAC,YAAY;YACjC,QAAQ,EAAE,QAAQ,CAAC,WAAW,IAAI,KAAK;YACvC,SAAS,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;YAC9B,iBAAiB;SACjB;KACD,CAAC;AACH,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tipos.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/tipos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAC5B,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,OAAO,KAAK,EACvB,MAAM,CAAC,EAAE,WAAW,KAChB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,+EAA8E;IAC9E,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;IAC9B,wEAAwE;IACxE,MAAM,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE5E","sourcesContent":["/**\n * Tipos compartidos por los scrapers de `web_fetch`.\n *\n * Un scraper devuelve datos ESTRUCTURADOS de una API pública en vez del HTML\n * crudo de la página — un agente de código quiere la versión y la licencia de\n * un paquete, no el DOM de `npmjs.com` con su menú y su footer. `null` cuando\n * la URL entra en el sitio pero no en una forma reconocida (p.ej. la portada\n * de npmjs.com, sin ruta de paquete): `web_fetch` cae entonces al fetch\n * genérico, nunca se inventa un resultado vacío.\n */\n\nexport interface ResultadoScraper {\n\ttitulo: string;\n\turl: string;\n\tresumen: string;\n\tdatos: unknown;\n}\n\n/**\n * Debe LANZAR ante un fallo real (red, HTTP, JSON roto) para que `web_fetch`\n * lo distinga de «esta URL no es mía» (`null`, sin lanzar).\n */\nexport type FuncionScraper = (\n\turl: URL,\n\tfetchImpl: typeof fetch,\n\tsignal?: AbortSignal,\n) => Promise<ResultadoScraper | null>;\n\nexport interface ModuloScraper {\n\tscrapear: FuncionScraper;\n}\n\nexport interface DescriptorScraper {\n\tnombre: string;\n\t/** Barato y síncrono: decide si esta URL es de su sitio, sin tocar la red. */\n\tencaja: (url: URL) => boolean;\n\t/** Import perezoso: no se ejecuta hasta que la URL encaja de verdad. */\n\tcargar: () => Promise<ModuloScraper>;\n}\n\n/**\n * `hostname === dominio` o subdominio real de `dominio` (con el punto).\n *\n * Un `endsWith(dominio)` a secas confunde cualquier host que termine con\n * los mismos caracteres sin ser un subdominio real —`notcisa.gov` con\n * `cisa.gov`, `xnvd.nist.gov` con `nvd.nist.gov`— con el sitio de verdad.\n * Comparar con el punto delante evita ese falso positivo sin perder los\n * subdominios legítimos (`www.cisa.gov` sí encaja).\n */\nexport function esHostOSubdominio(hostname: string, dominio: string): boolean {\n\treturn hostname === dominio || hostname.endsWith(`.${dominio}`);\n}\n"]}
1
+ {"version":3,"file":"tipos.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/tipos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAC5B,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,OAAO,KAAK,EACvB,MAAM,CAAC,EAAE,WAAW,KAChB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;IAC9B,wEAAwE;IACxE,MAAM,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"tipos.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/tipos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+BH;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,OAAe,EAAW;IAC7E,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAAA,CAChE","sourcesContent":["/**\n * Tipos compartidos por los scrapers de `web_fetch`.\n *\n * Un scraper devuelve datos ESTRUCTURADOS de una API pública en vez del HTML\n * crudo de la página — un agente de código quiere la versión y la licencia de\n * un paquete, no el DOM de `npmjs.com` con su menú y su footer. `null` cuando\n * la URL entra en el sitio pero no en una forma reconocida (p.ej. la portada\n * de npmjs.com, sin ruta de paquete): `web_fetch` cae entonces al fetch\n * genérico, nunca se inventa un resultado vacío.\n */\n\nexport interface ResultadoScraper {\n\ttitulo: string;\n\turl: string;\n\tresumen: string;\n\tdatos: unknown;\n}\n\n/**\n * Debe LANZAR ante un fallo real (red, HTTP, JSON roto) para que `web_fetch`\n * lo distinga de «esta URL no es mía» (`null`, sin lanzar).\n */\nexport type FuncionScraper = (\n\turl: URL,\n\tfetchImpl: typeof fetch,\n\tsignal?: AbortSignal,\n) => Promise<ResultadoScraper | null>;\n\nexport interface ModuloScraper {\n\tscrapear: FuncionScraper;\n}\n\nexport interface DescriptorScraper {\n\tnombre: string;\n\t/** Barato y síncrono: decide si esta URL es de su sitio, sin tocar la red. */\n\tencaja: (url: URL) => boolean;\n\t/** Import perezoso: no se ejecuta hasta que la URL encaja de verdad. */\n\tcargar: () => Promise<ModuloScraper>;\n}\n\n/**\n * `hostname === dominio` o subdominio real de `dominio` (con el punto).\n *\n * Un `endsWith(dominio)` a secas confunde cualquier host que termine con\n * los mismos caracteres sin ser un subdominio real —`notcisa.gov` con\n * `cisa.gov`, `xnvd.nist.gov` con `nvd.nist.gov`— con el sitio de verdad.\n * Comparar con el punto delante evita ese falso positivo sin perder los\n * subdominios legítimos (`www.cisa.gov` sí encaja).\n */\nexport function esHostOSubdominio(hostname: string, dominio: string): boolean {\n\treturn hostname === dominio || hostname.endsWith(`.${dominio}`);\n}\n"]}
1
+ {"version":3,"file":"tipos.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/tipos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+BH;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,OAAe;IAClE,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AACjE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"texto.d.ts","sourceRoot":"","sources":["../../../src/core/web/texto.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sDAAsD;AACtD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkB/C","sourcesContent":["/**\n * Limpieza de HTML a texto plano, compartida por `web_fetch` y los scrapers.\n *\n * Vive separada de `tools.ts` para que los scrapers puedan usarla sin crear\n * un ciclo de imports estáticos con el fichero que orquesta su propio\n * registro perezoso.\n */\n\n/** Extrae texto legible de HTML, sin dependencias. */\nexport function htmlToText(html: string): string {\n\treturn (\n\t\thtml\n\t\t\t.replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n\t\t\t.replace(/<style[\\s\\S]*?<\\/style>/gi, \" \")\n\t\t\t.replace(/<!--[\\s\\S]*?-->/g, \" \")\n\t\t\t.replace(/<[^>]+>/g, \" \")\n\t\t\t.replace(/&nbsp;/g, \" \")\n\t\t\t.replace(/&lt;/g, \"<\")\n\t\t\t.replace(/&gt;/g, \">\")\n\t\t\t.replace(/&quot;/g, '\"')\n\t\t\t.replace(/&#39;/g, \"'\")\n\t\t\t// `&amp;` va AL FINAL: hacerlo antes reintroduciría `&` y convertiría\n\t\t\t// `&amp;lt;` (un `&lt;` literal escapado) en `<`.\n\t\t\t.replace(/&amp;/g, \"&\")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim()\n\t);\n}\n"]}
1
+ {"version":3,"file":"texto.d.ts","sourceRoot":"","sources":["../../../src/core/web/texto.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sDAAsD;AACtD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkB/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"texto.js","sourceRoot":"","sources":["../../../src/core/web/texto.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sDAAsD;AACtD,MAAM,UAAU,UAAU,CAAC,IAAY,EAAU;IAChD,OAAO,CACN,IAAI;SACF,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC;SAC3C,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;SAChC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;QACvB,wEAAsE;QACtE,kDAAkD;SACjD,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CACR,CAAC;AAAA,CACF","sourcesContent":["/**\n * Limpieza de HTML a texto plano, compartida por `web_fetch` y los scrapers.\n *\n * Vive separada de `tools.ts` para que los scrapers puedan usarla sin crear\n * un ciclo de imports estáticos con el fichero que orquesta su propio\n * registro perezoso.\n */\n\n/** Extrae texto legible de HTML, sin dependencias. */\nexport function htmlToText(html: string): string {\n\treturn (\n\t\thtml\n\t\t\t.replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n\t\t\t.replace(/<style[\\s\\S]*?<\\/style>/gi, \" \")\n\t\t\t.replace(/<!--[\\s\\S]*?-->/g, \" \")\n\t\t\t.replace(/<[^>]+>/g, \" \")\n\t\t\t.replace(/&nbsp;/g, \" \")\n\t\t\t.replace(/&lt;/g, \"<\")\n\t\t\t.replace(/&gt;/g, \">\")\n\t\t\t.replace(/&quot;/g, '\"')\n\t\t\t.replace(/&#39;/g, \"'\")\n\t\t\t// `&amp;` va AL FINAL: hacerlo antes reintroduciría `&` y convertiría\n\t\t\t// `&amp;lt;` (un `&lt;` literal escapado) en `<`.\n\t\t\t.replace(/&amp;/g, \"&\")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim()\n\t);\n}\n"]}
1
+ {"version":3,"file":"texto.js","sourceRoot":"","sources":["../../../src/core/web/texto.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sDAAsD;AACtD,MAAM,UAAU,UAAU,CAAC,IAAY;IACtC,OAAO,CACN,IAAI;SACF,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC;SAC3C,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;SAChC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;QACvB,sEAAsE;QACtE,kDAAkD;SACjD,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CACR,CAAC;AACH,CAAC"}
@@ -29,6 +29,7 @@
29
29
  import type { ToolDefinition } from "../extensions/types.ts";
30
30
  import type { ResultadoWeb } from "./busqueda-nativa.ts";
31
31
  import { htmlToText } from "./texto.ts";
32
+ export { assertFetchableUrl } from "./destino.ts";
32
33
  export { htmlToText };
33
34
  export interface WebToolsOptions {
34
35
  /**
@@ -79,13 +80,5 @@ export interface WebToolsOptions {
79
80
  anotarRed?: (dominio: string, permitido: boolean, motivo?: string) => void;
80
81
  timeoutMs?: number;
81
82
  }
82
- /**
83
- * Valida una URL antes de pedirla.
84
- *
85
- * Bloquea esquemas no-HTTP, loopback, rangos privados y el endpoint de metadatos
86
- * de los proveedores cloud — que es el objetivo clásico de un SSRF y devuelve
87
- * credenciales de la instancia.
88
- */
89
- export declare function assertFetchableUrl(raw: string): URL;
90
83
  export declare function createWebTools(options: WebToolsOptions): Record<string, ToolDefinition>;
91
84
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/core/web/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,CAAC;AAKtB,MAAM,WAAW,eAAe;IAC/B;;;;;OAKG;IACH,YAAY,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvE;;;;;;;;;;;;;;;;;;;OAmBG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;IACpF,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAmBnD;AA2CD,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAuMvF","sourcesContent":["/**\n * Tools de web: `web_search` y `web_fetch`.\n *\n * Existían por su NOMBRE en el builtin `deep_research` pero nadie las\n * registraba, así que ese workflow —uno de los cinco que anunciamos— no podía\n * funcionar: le pedía al agente usar herramientas inexistentes. Un nombre de\n * tool dentro de un prompt no lo comprueba ni el compilador ni los tests.\n *\n * `web_search` prueba, en orden: la búsqueda nativa del proveedor de modelo\n * activo (ya es la credencial con la que corre el agente) → el registro de\n * proveedores de terceros con clave configurada (`proveedores/registro.ts`,\n * vault primero, variable de entorno después) → los proveedores sin clave\n * (DuckDuckGo, Mojeek, Ecosia), que garantizan que `web_search` funciona de\n * fábrica incluso sin ninguna credencial de terceros y con un modelo que no\n * traiga búsqueda propia.\n *\n * `web_fetch` prueba primero un scraper especializado (`scrapers/registro.ts`)\n * que devuelve datos ESTRUCTURADOS de la API pública del sitio —versión y\n * licencia de un paquete, no el HTML de la página—; si ninguno encaja o falla,\n * cae al fetch genérico + limpieza de HTML de siempre.\n *\n * `web_fetch` trae guardas contra SSRF. Una tool que descarga cualquier URL que\n * el modelo proponga es, sin ellas, una puerta a la red interna: basta con que\n * el modelo lea una URL en un README para que acabe pidiéndola.\n *\n * El acceso a estas tools es opt-in por agente (`web: true`), nunca implícito\n * en `readOnly` — ver `resolveAllowedTools` en workflows/agent-runner.ts.\n */\n\nimport { Type } from \"typebox\";\nimport type { AgentToolResult, ToolDefinition } from \"../extensions/types.ts\";\nimport type { ResultadoWeb } from \"./busqueda-nativa.ts\";\nimport { destinoPermitido } from \"./destino.ts\";\nimport { buscarConProveedores } from \"./proveedores/registro.ts\";\nimport { encontrarScraper } from \"./scrapers/registro.ts\";\nimport { htmlToText } from \"./texto.ts\";\n\nexport { htmlToText };\n\nconst MAX_FETCH_BYTES = 512 * 1024;\nconst DEFAULT_TIMEOUT_MS = 20_000;\n\nexport interface WebToolsOptions {\n\t/**\n\t * Clave de un proveedor de búsqueda de terceros, por nombre (`serper`,\n\t * `brave`, `tavily`, `exa`, `searxng`): vault primero, variable de entorno\n\t * después. `undefined` cuando ese proveedor concreto no está configurado —\n\t * eso lo salta, no lo hace fallar.\n\t */\n\tobtenerClave: (nombreProveedor: string) => Promise<string | undefined>;\n\t/**\n\t * Búsqueda con la credencial del modelo, cuando el proveedor la trae.\n\t *\n\t * Es lo que hace que `web_search` funcione sin configurar nada: el usuario ya\n\t * tiene credencial —es con la que corre el agente— y los modelos de Anthropic\n\t * saben buscar solos. Sin esto, la respuesta de fábrica era «Búsqueda web no\n\t * configurada», que para un agente de código equivale a no poder mirar la\n\t * documentación de ninguna librería.\n\t *\n\t * Va PRIMERO: es la credencial que el usuario ya está pagando, así que no\n\t * tiene sentido preguntar por una clave de terceros antes de intentarla.\n\t *\n\t * Devuelve `null` cuando NO puede buscar (el proveedor activo no trae\n\t * búsqueda propia) y `[]` cuando ha buscado y no ha encontrado nada. Los dos\n\t * casos se leen igual desde fuera y no son lo mismo: al agente hay que\n\t * decirle «no puedo» para que cambie de estrategia, no «no hay» para que se\n\t * rinda. Se cometió justo ese fallo aquí, y solo salió ejecutando el\n\t * producto: con un modelo de OpenRouter la tool contestaba «Sin resultados»\n\t * cuando en realidad no había buscado.\n\t */\n\tbuscarNativo?: (consulta: string, maximo: number) => Promise<ResultadoWeb[] | null>;\n\tfetchImpl?: typeof fetch;\n\t/**\n\t * Anota una salida a la red en el libro de sesión: art. 44 y ss. del RGPD,\n\t * \"qué salió de la máquina y hacia dónde\".\n\t *\n\t * El tipo `red` del libro existía sin que nadie lo anotara. Se engancha aquí y\n\t * no en el manejador de tools de `agent-session.ts` porque desde allí el único\n\t * destino visible es la URL que pidió el modelo, y la petición de verdad la\n\t * hacen los scrapers y los proveedores de búsqueda a OTROS dominios (la API de\n\t * npm, DuckDuckGo…). Envolviendo el `fetchImpl` que todos ellos comparten, el\n\t * destino que se registra es el real y no el pedido.\n\t *\n\t * Solo el DOMINIO, nunca la ruta ni los parámetros: una query string lleva\n\t * tokens y términos de búsqueda, y el libro guarda la forma, no el contenido.\n\t *\n\t * Nunca debe lanzar: un fallo del registro no puede tumbar una descarga.\n\t */\n\tanotarRed?: (dominio: string, permitido: boolean, motivo?: string) => void;\n\ttimeoutMs?: number;\n}\n\nfunction textResult(text: string): AgentToolResult<unknown> {\n\treturn { content: [{ type: \"text\" as const, text }], details: undefined };\n}\n\n/** Hosts que nunca deben alcanzarse desde una URL propuesta por el modelo. */\nconst BLOCKED_HOSTNAMES = new Set([\"localhost\", \"metadata.google.internal\", \"metadata\"]);\n\n/** Cuántos saltos se siguen antes de rendirse. Cada uno se revalida. */\nconst MAX_REDIRECCIONES = 5;\nconst PRIVATE_IPV4 =\n\t/^(?:10\\.|127\\.|0\\.|169\\.254\\.|192\\.168\\.|172\\.(?:1[6-9]|2\\d|3[01])\\.|100\\.(?:6[4-9]|[7-9]\\d|1[01]\\d|12[0-7])\\.)/;\n\n/**\n * Valida una URL antes de pedirla.\n *\n * Bloquea esquemas no-HTTP, loopback, rangos privados y el endpoint de metadatos\n * de los proveedores cloud — que es el objetivo clásico de un SSRF y devuelve\n * credenciales de la instancia.\n */\nexport function assertFetchableUrl(raw: string): URL {\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(raw);\n\t} catch {\n\t\tthrow new Error(`URL inválida: ${raw}`);\n\t}\n\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n\t\tthrow new Error(`Solo se permiten http y https (recibido: ${url.protocol}).`);\n\t}\n\tconst host = url.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\tif (host === \"169.254.169.254\") throw new Error(\"Endpoint de metadatos cloud bloqueado.\");\n\tif (BLOCKED_HOSTNAMES.has(host) || host.endsWith(\".localhost\")) {\n\t\tthrow new Error(`Host bloqueado: ${host}`);\n\t}\n\tif (PRIVATE_IPV4.test(host) || host === \"::1\" || host.startsWith(\"fc\") || host.startsWith(\"fd\")) {\n\t\tthrow new Error(`Dirección de red privada bloqueada: ${host}`);\n\t}\n\treturn url;\n}\n\nconst searchParams = Type.Object({\n\tquery: Type.String({ description: \"Consulta de búsqueda.\" }),\n\tcount: Type.Optional(Type.Number({ description: \"Número de resultados (por defecto 5, máximo 10).\" })),\n});\n\nconst fetchParams = Type.Object({\n\turl: Type.String({ description: \"URL http(s) a descargar.\" }),\n});\n\n/** Formatea resultados de búsqueda (nativos o de un proveedor) como texto numerado. */\nfunction formatearResultados(\n\tresultados: Array<{ titulo: string; url: string; resumen?: string; edad?: string }>,\n): string {\n\treturn resultados\n\t\t.map((r, i) => {\n\t\t\tconst partes = [`${i + 1}. ${r.titulo}`, ` ${r.url}`];\n\t\t\tif (r.resumen) partes.push(` ${r.resumen}`);\n\t\t\tif (r.edad) partes.push(` (${r.edad})`);\n\t\t\treturn partes.join(\"\\n\");\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\n/**\n * El dominio de destino, o `null` si no se puede leer.\n *\n * Solo el hostname: la ruta y la query se descartan aquí a propósito, porque es\n * el único sitio por el que pasan y un `?api_key=…` en el libro sería la fuga\n * que el libro existe para no tener.\n */\n// `Parameters<typeof fetch>[0]` y no `RequestInfo`: el proyecto compila sin la\n// librería DOM, así que ese nombre global no existe aquí.\nfunction dominioDe(destino: Parameters<typeof fetch>[0]): string | null {\n\ttry {\n\t\tconst crudo = typeof destino === \"string\" ? destino : destino instanceof URL ? destino.href : destino.url;\n\t\treturn new URL(crudo).hostname || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function createWebTools(options: WebToolsOptions): Record<string, ToolDefinition> {\n\tconst fetchCrudo = options.fetchImpl ?? fetch;\n\tconst anotarRed = options.anotarRed;\n\t// Un solo punto para todas las salidas: este `fetchImpl` es el que reciben los\n\t// scrapers (`modulo.scrapear(url, fetchImpl, …)`) y los proveedores de\n\t// búsqueda (`buscarConProveedores(…, { fetchImpl })`), así que envolverlo una\n\t// vez registra las salidas de los tres caminos y no solo del fetch genérico.\n\tconst fetchImpl: typeof fetch = anotarRed\n\t\t? (destino, init) => {\n\t\t\t\tconst dominio = dominioDe(destino);\n\t\t\t\t// `try` porque el registro es best-effort y la descarga no lo es.\n\t\t\t\tif (dominio) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tanotarRed(dominio, true);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Un fallo del libro no puede impedir una descarga.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn fetchCrudo(destino, init);\n\t\t\t}\n\t\t: fetchCrudo;\n\tconst timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n\t/** Aborta la petición si tarda demasiado, y respeta el abort del agente. */\n\tconst withTimeout = async (\n\t\touter: AbortSignal | undefined,\n\t\trun: (signal: AbortSignal) => Promise<Response>,\n\t): Promise<Response> => {\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), timeoutMs);\n\t\tconst onAbort = () => controller.abort();\n\t\touter?.addEventListener(\"abort\", onAbort);\n\t\ttry {\n\t\t\treturn await run(controller.signal);\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t\touter?.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t};\n\n\tconst webSearch: ToolDefinition<typeof searchParams> = {\n\t\tname: \"web_search\",\n\t\tlabel: \"Buscar en la web\",\n\t\tdescription:\n\t\t\t\"Busca en la web y devuelve resultados con título, URL y extracto. \" +\n\t\t\t\"Úsalo para hechos que puedan haber cambiado o que no estén en el repositorio. \" +\n\t\t\t\"Cita siempre la URL exacta: un resultado sin fuente no vale como evidencia.\",\n\t\tpromptSnippet: \"buscar en la web\",\n\t\tparameters: searchParams,\n\t\tasync execute(_toolCallId, input, signal): Promise<AgentToolResult<unknown>> {\n\t\t\tconst query = String(input.query ?? \"\").trim();\n\t\t\tif (!query) return textResult(\"Error: 'query' es obligatorio.\");\n\t\t\tconst count = Math.min(Math.max(Number(input.count) || 5, 1), 10);\n\n\t\t\t// 1) Nativo del proveedor de modelo: la credencial que el usuario ya paga.\n\t\t\tif (options.buscarNativo) {\n\t\t\t\ttry {\n\t\t\t\t\tconst nativos = await options.buscarNativo(query, count);\n\t\t\t\t\tif (nativos !== null) {\n\t\t\t\t\t\tif (nativos.length === 0) return textResult(`Sin resultados para: ${query}`);\n\t\t\t\t\t\treturn textResult(formatearResultados(nativos));\n\t\t\t\t\t}\n\t\t\t\t\t// null: el proveedor activo no trae búsqueda propia — seguir al registro.\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn textResult(\n\t\t\t\t\t\t`La búsqueda con el modelo falló: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 2) Registro de proveedores: clave configurada > sin clave. Los tres sin\n\t\t\t// clave (duckduckgo, mojeek, ecosia) están siempre en la lista, así que\n\t\t\t// esto SIEMPRE tiene algo que probar — nunca \"no configurado\".\n\t\t\ttry {\n\t\t\t\tconst { resultados } = await buscarConProveedores(query, count, {\n\t\t\t\t\tobtenerClave: options.obtenerClave,\n\t\t\t\t\tfetchImpl,\n\t\t\t\t\tsignal,\n\t\t\t\t});\n\t\t\t\tif (resultados.length === 0) return textResult(`Sin resultados para: ${query}`);\n\t\t\t\treturn textResult(formatearResultados(resultados));\n\t\t\t} catch (error) {\n\t\t\t\t// Un fallo de red o de todos los proveedores es un FALLO, no \"sin\n\t\t\t\t// resultados\": el agente debe saber que no se ha buscado de verdad.\n\t\t\t\treturn textResult(`La búsqueda falló: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst webFetch: ToolDefinition<typeof fetchParams> = {\n\t\tname: \"web_fetch\",\n\t\tlabel: \"Descargar URL\",\n\t\tdescription:\n\t\t\t\"Descarga una URL y devuelve su texto. Úsalo tras web_search para leer una fuente concreta. \" +\n\t\t\t\"Para registros de paquetes (npm, PyPI, crates.io…), GitHub, MDN, Stack Overflow y CVEs (NVD, CISA \" +\n\t\t\t\"KEV) devuelve datos estructurados en vez de HTML. Solo http/https públicos: la red interna está bloqueada.\",\n\t\tpromptSnippet: \"leer el contenido de una URL\",\n\t\tparameters: fetchParams,\n\t\tasync execute(_toolCallId, input, signal): Promise<AgentToolResult<unknown>> {\n\t\t\tconst raw = String(input.url ?? \"\").trim();\n\t\t\tif (!raw) return textResult(\"Error: 'url' es obligatorio.\");\n\t\t\tlet url: URL;\n\t\t\ttry {\n\t\t\t\turl = assertFetchableUrl(raw);\n\t\t\t} catch (error) {\n\t\t\t\tconst motivo = error instanceof Error ? error.message : String(error);\n\t\t\t\t// Un intento BLOQUEADO es tan auditable como una salida consumada, y es\n\t\t\t\t// el único que no pasa por el `fetchImpl` envuelto: la guarda SSRF corta\n\t\t\t\t// antes. Sin esta línea el libro solo tendría `permitido: true` y el\n\t\t\t\t// campo `permitido` sería decorativo — un registro que dice siempre lo\n\t\t\t\t// mismo no distingue nada.\n\t\t\t\ttry {\n\t\t\t\t\tanotarRed?.(dominioDe(raw) ?? \"(url ilegible)\", false, motivo);\n\t\t\t\t} catch {\n\t\t\t\t\t// best-effort, igual que arriba.\n\t\t\t\t}\n\t\t\t\treturn textResult(`Error: ${motivo}`);\n\t\t\t}\n\n\t\t\t// Scraper especializado primero: datos estructurados de la API del sitio\n\t\t\t// en vez del HTML de la página. Si no encaja o falla, se cae al fetch\n\t\t\t// genérico de siempre — la URL sigue siendo legible aunque no se pueda\n\t\t\t// enriquecer.\n\t\t\tconst descriptor = encontrarScraper(url);\n\t\t\tif (descriptor) {\n\t\t\t\ttry {\n\t\t\t\t\tconst modulo = await descriptor.cargar();\n\t\t\t\t\tconst resultado = await modulo.scrapear(url, fetchImpl, signal);\n\t\t\t\t\tif (resultado) {\n\t\t\t\t\t\treturn textResult(\n\t\t\t\t\t\t\t`${resultado.titulo}\\n${resultado.url}\\n\\n${resultado.resumen}\\n\\nDatos estructurados:\\n` +\n\t\t\t\t\t\t\t\tJSON.stringify(resultado.datos, null, 2),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// El scraper falló: se cae al fetch genérico en vez de dejar la\n\t\t\t\t\t// tool en blanco. La URL sigue siendo lo que el usuario pidió leer.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// La dirección, no el nombre. `assertFetchableUrl` compara cadenas y deja\n\t\t\t// pasar todo lo que llega al mismo sitio por otro camino: medido,\n\t\t\t// `[::ffff:127.0.0.1]` y un dominio que resuelve a 127.0.0.1 pasaban\n\t\t\t// enteros. Ver `core/web/destino.ts`.\n\t\t\tconst rechazo = await destinoPermitido(url);\n\t\t\tif (rechazo) {\n\t\t\t\tanotarRed?.(url.hostname, false, rechazo.motivo);\n\t\t\t\treturn textResult(\n\t\t\t\t\t`Descarga bloqueada: ${rechazo.motivo}${rechazo.direccion ? ` (${rechazo.direccion})` : \"\"}. ` +\n\t\t\t\t\t\t\"Las tools web no alcanzan la red interna ni la propia máquina.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// `redirect: \"manual\"` y cada salto revalidado. Con `follow`, una URL\n\t\t\t\t// pública que responde 302 hacia loopback llegaba igual, porque solo se\n\t\t\t\t// miraba la primera — era el tercer camino abierto de los tres.\n\t\t\t\tlet destino = url;\n\t\t\t\tlet response: Response | undefined;\n\t\t\t\tfor (let salto = 0; salto <= MAX_REDIRECCIONES; salto++) {\n\t\t\t\t\tresponse = await withTimeout(signal, (s) =>\n\t\t\t\t\t\tfetchImpl(destino.toString(), {\n\t\t\t\t\t\t\tredirect: \"manual\",\n\t\t\t\t\t\t\tsignal: s,\n\t\t\t\t\t\t\theaders: { \"user-agent\": \"ada-cli\" },\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (response.status < 300 || response.status >= 400) break;\n\t\t\t\t\tconst siguiente = response.headers.get(\"location\");\n\t\t\t\t\tif (!siguiente) break;\n\t\t\t\t\tif (salto === MAX_REDIRECCIONES) {\n\t\t\t\t\t\treturn textResult(`La descarga dio más de ${MAX_REDIRECCIONES} redirecciones y se ha parado.`);\n\t\t\t\t\t}\n\t\t\t\t\t// Relativa respecto al destino actual, como manda el estándar.\n\t\t\t\t\tdestino = new URL(siguiente, destino);\n\t\t\t\t\tassertFetchableUrl(destino.toString());\n\t\t\t\t\tconst rechazoSalto = await destinoPermitido(destino);\n\t\t\t\t\tif (rechazoSalto) {\n\t\t\t\t\t\tanotarRed?.(destino.hostname, false, `redirección a ${rechazoSalto.motivo}`);\n\t\t\t\t\t\treturn textResult(\n\t\t\t\t\t\t\t`Descarga bloqueada: la redirección lleva a ${rechazoSalto.motivo}` +\n\t\t\t\t\t\t\t\t`${rechazoSalto.direccion ? ` (${rechazoSalto.direccion})` : \"\"}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tanotarRed?.(destino.hostname, true, \"redirección\");\n\t\t\t\t}\n\t\t\t\tif (!response) return textResult(\"La descarga no devolvió respuesta.\");\n\t\t\t\tif (!response.ok) return textResult(`La descarga devolvió HTTP ${response.status}.`);\n\t\t\t\tconst body = await response.text();\n\t\t\t\tconst truncated = body.length > MAX_FETCH_BYTES;\n\t\t\t\tconst text = htmlToText(body.slice(0, MAX_FETCH_BYTES));\n\t\t\t\treturn textResult(truncated ? `${text}\\n\\n[truncado en ${MAX_FETCH_BYTES} bytes]` : text);\n\t\t\t} catch (error) {\n\t\t\t\treturn textResult(`La descarga falló: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t},\n\t};\n\n\treturn { web_search: webSearch as ToolDefinition, web_fetch: webFetch as ToolDefinition };\n}\n"]}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/core/web/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,CAAC;AAKtB,MAAM,WAAW,eAAe;IAC/B;;;;;OAKG;IACH,YAAY,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvE;;;;;;;;;;;;;;;;;;;OAmBG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;IACpF,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAkDD,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAuMvF"}
@@ -27,50 +27,19 @@
27
27
  * en `readOnly` — ver `resolveAllowedTools` en workflows/agent-runner.ts.
28
28
  */
29
29
  import { Type } from "typebox";
30
- import { destinoPermitido } from "./destino.js";
30
+ import { assertFetchableUrl, destinoPermitido } from "./destino.js";
31
31
  import { buscarConProveedores } from "./proveedores/registro.js";
32
32
  import { encontrarScraper } from "./scrapers/registro.js";
33
33
  import { htmlToText } from "./texto.js";
34
+ export { assertFetchableUrl } from "./destino.js";
34
35
  export { htmlToText };
35
36
  const MAX_FETCH_BYTES = 512 * 1024;
36
37
  const DEFAULT_TIMEOUT_MS = 20_000;
37
38
  function textResult(text) {
38
39
  return { content: [{ type: "text", text }], details: undefined };
39
40
  }
40
- /** Hosts que nunca deben alcanzarse desde una URL propuesta por el modelo. */
41
- const BLOCKED_HOSTNAMES = new Set(["localhost", "metadata.google.internal", "metadata"]);
42
41
  /** Cuántos saltos se siguen antes de rendirse. Cada uno se revalida. */
43
42
  const MAX_REDIRECCIONES = 5;
44
- const PRIVATE_IPV4 = /^(?:10\.|127\.|0\.|169\.254\.|192\.168\.|172\.(?:1[6-9]|2\d|3[01])\.|100\.(?:6[4-9]|[7-9]\d|1[01]\d|12[0-7])\.)/;
45
- /**
46
- * Valida una URL antes de pedirla.
47
- *
48
- * Bloquea esquemas no-HTTP, loopback, rangos privados y el endpoint de metadatos
49
- * de los proveedores cloud — que es el objetivo clásico de un SSRF y devuelve
50
- * credenciales de la instancia.
51
- */
52
- export function assertFetchableUrl(raw) {
53
- let url;
54
- try {
55
- url = new URL(raw);
56
- }
57
- catch {
58
- throw new Error(`URL inválida: ${raw}`);
59
- }
60
- if (url.protocol !== "http:" && url.protocol !== "https:") {
61
- throw new Error(`Solo se permiten http y https (recibido: ${url.protocol}).`);
62
- }
63
- const host = url.hostname.toLowerCase().replace(/^\[|\]$/g, "");
64
- if (host === "169.254.169.254")
65
- throw new Error("Endpoint de metadatos cloud bloqueado.");
66
- if (BLOCKED_HOSTNAMES.has(host) || host.endsWith(".localhost")) {
67
- throw new Error(`Host bloqueado: ${host}`);
68
- }
69
- if (PRIVATE_IPV4.test(host) || host === "::1" || host.startsWith("fc") || host.startsWith("fd")) {
70
- throw new Error(`Dirección de red privada bloqueada: ${host}`);
71
- }
72
- return url;
73
- }
74
43
  const searchParams = Type.Object({
75
44
  query: Type.String({ description: "Consulta de búsqueda." }),
76
45
  count: Type.Optional(Type.Number({ description: "Número de resultados (por defecto 5, máximo 10)." })),
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/core/web/tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tools de web: `web_search` y `web_fetch`.\n *\n * Existían por su NOMBRE en el builtin `deep_research` pero nadie las\n * registraba, así que ese workflow —uno de los cinco que anunciamos— no podía\n * funcionar: le pedía al agente usar herramientas inexistentes. Un nombre de\n * tool dentro de un prompt no lo comprueba ni el compilador ni los tests.\n *\n * `web_search` prueba, en orden: la búsqueda nativa del proveedor de modelo\n * activo (ya es la credencial con la que corre el agente) → el registro de\n * proveedores de terceros con clave configurada (`proveedores/registro.ts`,\n * vault primero, variable de entorno después) → los proveedores sin clave\n * (DuckDuckGo, Mojeek, Ecosia), que garantizan que `web_search` funciona de\n * fábrica incluso sin ninguna credencial de terceros y con un modelo que no\n * traiga búsqueda propia.\n *\n * `web_fetch` prueba primero un scraper especializado (`scrapers/registro.ts`)\n * que devuelve datos ESTRUCTURADOS de la API pública del sitio —versión y\n * licencia de un paquete, no el HTML de la página—; si ninguno encaja o falla,\n * cae al fetch genérico + limpieza de HTML de siempre.\n *\n * `web_fetch` trae guardas contra SSRF. Una tool que descarga cualquier URL que\n * el modelo proponga es, sin ellas, una puerta a la red interna: basta con que\n * el modelo lea una URL en un README para que acabe pidiéndola.\n *\n * El acceso a estas tools es opt-in por agente (`web: true`), nunca implícito\n * en `readOnly` — ver `resolveAllowedTools` en workflows/agent-runner.ts.\n */\n\nimport { Type } from \"typebox\";\nimport type { AgentToolResult, ToolDefinition } from \"../extensions/types.ts\";\nimport type { ResultadoWeb } from \"./busqueda-nativa.ts\";\nimport { destinoPermitido } from \"./destino.ts\";\nimport { buscarConProveedores } from \"./proveedores/registro.ts\";\nimport { encontrarScraper } from \"./scrapers/registro.ts\";\nimport { htmlToText } from \"./texto.ts\";\n\nexport { htmlToText };\n\nconst MAX_FETCH_BYTES = 512 * 1024;\nconst DEFAULT_TIMEOUT_MS = 20_000;\n\nexport interface WebToolsOptions {\n\t/**\n\t * Clave de un proveedor de búsqueda de terceros, por nombre (`serper`,\n\t * `brave`, `tavily`, `exa`, `searxng`): vault primero, variable de entorno\n\t * después. `undefined` cuando ese proveedor concreto no está configurado —\n\t * eso lo salta, no lo hace fallar.\n\t */\n\tobtenerClave: (nombreProveedor: string) => Promise<string | undefined>;\n\t/**\n\t * Búsqueda con la credencial del modelo, cuando el proveedor la trae.\n\t *\n\t * Es lo que hace que `web_search` funcione sin configurar nada: el usuario ya\n\t * tiene credencial —es con la que corre el agente— y los modelos de Anthropic\n\t * saben buscar solos. Sin esto, la respuesta de fábrica era «Búsqueda web no\n\t * configurada», que para un agente de código equivale a no poder mirar la\n\t * documentación de ninguna librería.\n\t *\n\t * Va PRIMERO: es la credencial que el usuario ya está pagando, así que no\n\t * tiene sentido preguntar por una clave de terceros antes de intentarla.\n\t *\n\t * Devuelve `null` cuando NO puede buscar (el proveedor activo no trae\n\t * búsqueda propia) y `[]` cuando ha buscado y no ha encontrado nada. Los dos\n\t * casos se leen igual desde fuera y no son lo mismo: al agente hay que\n\t * decirle «no puedo» para que cambie de estrategia, no «no hay» para que se\n\t * rinda. Se cometió justo ese fallo aquí, y solo salió ejecutando el\n\t * producto: con un modelo de OpenRouter la tool contestaba «Sin resultados»\n\t * cuando en realidad no había buscado.\n\t */\n\tbuscarNativo?: (consulta: string, maximo: number) => Promise<ResultadoWeb[] | null>;\n\tfetchImpl?: typeof fetch;\n\t/**\n\t * Anota una salida a la red en el libro de sesión: art. 44 y ss. del RGPD,\n\t * \"qué salió de la máquina y hacia dónde\".\n\t *\n\t * El tipo `red` del libro existía sin que nadie lo anotara. Se engancha aquí y\n\t * no en el manejador de tools de `agent-session.ts` porque desde allí el único\n\t * destino visible es la URL que pidió el modelo, y la petición de verdad la\n\t * hacen los scrapers y los proveedores de búsqueda a OTROS dominios (la API de\n\t * npm, DuckDuckGo…). Envolviendo el `fetchImpl` que todos ellos comparten, el\n\t * destino que se registra es el real y no el pedido.\n\t *\n\t * Solo el DOMINIO, nunca la ruta ni los parámetros: una query string lleva\n\t * tokens y términos de búsqueda, y el libro guarda la forma, no el contenido.\n\t *\n\t * Nunca debe lanzar: un fallo del registro no puede tumbar una descarga.\n\t */\n\tanotarRed?: (dominio: string, permitido: boolean, motivo?: string) => void;\n\ttimeoutMs?: number;\n}\n\nfunction textResult(text: string): AgentToolResult<unknown> {\n\treturn { content: [{ type: \"text\" as const, text }], details: undefined };\n}\n\n/** Hosts que nunca deben alcanzarse desde una URL propuesta por el modelo. */\nconst BLOCKED_HOSTNAMES = new Set([\"localhost\", \"metadata.google.internal\", \"metadata\"]);\n\n/** Cuántos saltos se siguen antes de rendirse. Cada uno se revalida. */\nconst MAX_REDIRECCIONES = 5;\nconst PRIVATE_IPV4 =\n\t/^(?:10\\.|127\\.|0\\.|169\\.254\\.|192\\.168\\.|172\\.(?:1[6-9]|2\\d|3[01])\\.|100\\.(?:6[4-9]|[7-9]\\d|1[01]\\d|12[0-7])\\.)/;\n\n/**\n * Valida una URL antes de pedirla.\n *\n * Bloquea esquemas no-HTTP, loopback, rangos privados y el endpoint de metadatos\n * de los proveedores cloud — que es el objetivo clásico de un SSRF y devuelve\n * credenciales de la instancia.\n */\nexport function assertFetchableUrl(raw: string): URL {\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(raw);\n\t} catch {\n\t\tthrow new Error(`URL inválida: ${raw}`);\n\t}\n\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n\t\tthrow new Error(`Solo se permiten http y https (recibido: ${url.protocol}).`);\n\t}\n\tconst host = url.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\tif (host === \"169.254.169.254\") throw new Error(\"Endpoint de metadatos cloud bloqueado.\");\n\tif (BLOCKED_HOSTNAMES.has(host) || host.endsWith(\".localhost\")) {\n\t\tthrow new Error(`Host bloqueado: ${host}`);\n\t}\n\tif (PRIVATE_IPV4.test(host) || host === \"::1\" || host.startsWith(\"fc\") || host.startsWith(\"fd\")) {\n\t\tthrow new Error(`Dirección de red privada bloqueada: ${host}`);\n\t}\n\treturn url;\n}\n\nconst searchParams = Type.Object({\n\tquery: Type.String({ description: \"Consulta de búsqueda.\" }),\n\tcount: Type.Optional(Type.Number({ description: \"Número de resultados (por defecto 5, máximo 10).\" })),\n});\n\nconst fetchParams = Type.Object({\n\turl: Type.String({ description: \"URL http(s) a descargar.\" }),\n});\n\n/** Formatea resultados de búsqueda (nativos o de un proveedor) como texto numerado. */\nfunction formatearResultados(\n\tresultados: Array<{ titulo: string; url: string; resumen?: string; edad?: string }>,\n): string {\n\treturn resultados\n\t\t.map((r, i) => {\n\t\t\tconst partes = [`${i + 1}. ${r.titulo}`, ` ${r.url}`];\n\t\t\tif (r.resumen) partes.push(` ${r.resumen}`);\n\t\t\tif (r.edad) partes.push(` (${r.edad})`);\n\t\t\treturn partes.join(\"\\n\");\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\n/**\n * El dominio de destino, o `null` si no se puede leer.\n *\n * Solo el hostname: la ruta y la query se descartan aquí a propósito, porque es\n * el único sitio por el que pasan y un `?api_key=…` en el libro sería la fuga\n * que el libro existe para no tener.\n */\n// `Parameters<typeof fetch>[0]` y no `RequestInfo`: el proyecto compila sin la\n// librería DOM, así que ese nombre global no existe aquí.\nfunction dominioDe(destino: Parameters<typeof fetch>[0]): string | null {\n\ttry {\n\t\tconst crudo = typeof destino === \"string\" ? destino : destino instanceof URL ? destino.href : destino.url;\n\t\treturn new URL(crudo).hostname || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function createWebTools(options: WebToolsOptions): Record<string, ToolDefinition> {\n\tconst fetchCrudo = options.fetchImpl ?? fetch;\n\tconst anotarRed = options.anotarRed;\n\t// Un solo punto para todas las salidas: este `fetchImpl` es el que reciben los\n\t// scrapers (`modulo.scrapear(url, fetchImpl, …)`) y los proveedores de\n\t// búsqueda (`buscarConProveedores(…, { fetchImpl })`), así que envolverlo una\n\t// vez registra las salidas de los tres caminos y no solo del fetch genérico.\n\tconst fetchImpl: typeof fetch = anotarRed\n\t\t? (destino, init) => {\n\t\t\t\tconst dominio = dominioDe(destino);\n\t\t\t\t// `try` porque el registro es best-effort y la descarga no lo es.\n\t\t\t\tif (dominio) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tanotarRed(dominio, true);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Un fallo del libro no puede impedir una descarga.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn fetchCrudo(destino, init);\n\t\t\t}\n\t\t: fetchCrudo;\n\tconst timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n\t/** Aborta la petición si tarda demasiado, y respeta el abort del agente. */\n\tconst withTimeout = async (\n\t\touter: AbortSignal | undefined,\n\t\trun: (signal: AbortSignal) => Promise<Response>,\n\t): Promise<Response> => {\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), timeoutMs);\n\t\tconst onAbort = () => controller.abort();\n\t\touter?.addEventListener(\"abort\", onAbort);\n\t\ttry {\n\t\t\treturn await run(controller.signal);\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t\touter?.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t};\n\n\tconst webSearch: ToolDefinition<typeof searchParams> = {\n\t\tname: \"web_search\",\n\t\tlabel: \"Buscar en la web\",\n\t\tdescription:\n\t\t\t\"Busca en la web y devuelve resultados con título, URL y extracto. \" +\n\t\t\t\"Úsalo para hechos que puedan haber cambiado o que no estén en el repositorio. \" +\n\t\t\t\"Cita siempre la URL exacta: un resultado sin fuente no vale como evidencia.\",\n\t\tpromptSnippet: \"buscar en la web\",\n\t\tparameters: searchParams,\n\t\tasync execute(_toolCallId, input, signal): Promise<AgentToolResult<unknown>> {\n\t\t\tconst query = String(input.query ?? \"\").trim();\n\t\t\tif (!query) return textResult(\"Error: 'query' es obligatorio.\");\n\t\t\tconst count = Math.min(Math.max(Number(input.count) || 5, 1), 10);\n\n\t\t\t// 1) Nativo del proveedor de modelo: la credencial que el usuario ya paga.\n\t\t\tif (options.buscarNativo) {\n\t\t\t\ttry {\n\t\t\t\t\tconst nativos = await options.buscarNativo(query, count);\n\t\t\t\t\tif (nativos !== null) {\n\t\t\t\t\t\tif (nativos.length === 0) return textResult(`Sin resultados para: ${query}`);\n\t\t\t\t\t\treturn textResult(formatearResultados(nativos));\n\t\t\t\t\t}\n\t\t\t\t\t// null: el proveedor activo no trae búsqueda propia — seguir al registro.\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn textResult(\n\t\t\t\t\t\t`La búsqueda con el modelo falló: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 2) Registro de proveedores: clave configurada > sin clave. Los tres sin\n\t\t\t// clave (duckduckgo, mojeek, ecosia) están siempre en la lista, así que\n\t\t\t// esto SIEMPRE tiene algo que probar — nunca \"no configurado\".\n\t\t\ttry {\n\t\t\t\tconst { resultados } = await buscarConProveedores(query, count, {\n\t\t\t\t\tobtenerClave: options.obtenerClave,\n\t\t\t\t\tfetchImpl,\n\t\t\t\t\tsignal,\n\t\t\t\t});\n\t\t\t\tif (resultados.length === 0) return textResult(`Sin resultados para: ${query}`);\n\t\t\t\treturn textResult(formatearResultados(resultados));\n\t\t\t} catch (error) {\n\t\t\t\t// Un fallo de red o de todos los proveedores es un FALLO, no \"sin\n\t\t\t\t// resultados\": el agente debe saber que no se ha buscado de verdad.\n\t\t\t\treturn textResult(`La búsqueda falló: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst webFetch: ToolDefinition<typeof fetchParams> = {\n\t\tname: \"web_fetch\",\n\t\tlabel: \"Descargar URL\",\n\t\tdescription:\n\t\t\t\"Descarga una URL y devuelve su texto. Úsalo tras web_search para leer una fuente concreta. \" +\n\t\t\t\"Para registros de paquetes (npm, PyPI, crates.io…), GitHub, MDN, Stack Overflow y CVEs (NVD, CISA \" +\n\t\t\t\"KEV) devuelve datos estructurados en vez de HTML. Solo http/https públicos: la red interna está bloqueada.\",\n\t\tpromptSnippet: \"leer el contenido de una URL\",\n\t\tparameters: fetchParams,\n\t\tasync execute(_toolCallId, input, signal): Promise<AgentToolResult<unknown>> {\n\t\t\tconst raw = String(input.url ?? \"\").trim();\n\t\t\tif (!raw) return textResult(\"Error: 'url' es obligatorio.\");\n\t\t\tlet url: URL;\n\t\t\ttry {\n\t\t\t\turl = assertFetchableUrl(raw);\n\t\t\t} catch (error) {\n\t\t\t\tconst motivo = error instanceof Error ? error.message : String(error);\n\t\t\t\t// Un intento BLOQUEADO es tan auditable como una salida consumada, y es\n\t\t\t\t// el único que no pasa por el `fetchImpl` envuelto: la guarda SSRF corta\n\t\t\t\t// antes. Sin esta línea el libro solo tendría `permitido: true` y el\n\t\t\t\t// campo `permitido` sería decorativo — un registro que dice siempre lo\n\t\t\t\t// mismo no distingue nada.\n\t\t\t\ttry {\n\t\t\t\t\tanotarRed?.(dominioDe(raw) ?? \"(url ilegible)\", false, motivo);\n\t\t\t\t} catch {\n\t\t\t\t\t// best-effort, igual que arriba.\n\t\t\t\t}\n\t\t\t\treturn textResult(`Error: ${motivo}`);\n\t\t\t}\n\n\t\t\t// Scraper especializado primero: datos estructurados de la API del sitio\n\t\t\t// en vez del HTML de la página. Si no encaja o falla, se cae al fetch\n\t\t\t// genérico de siempre — la URL sigue siendo legible aunque no se pueda\n\t\t\t// enriquecer.\n\t\t\tconst descriptor = encontrarScraper(url);\n\t\t\tif (descriptor) {\n\t\t\t\ttry {\n\t\t\t\t\tconst modulo = await descriptor.cargar();\n\t\t\t\t\tconst resultado = await modulo.scrapear(url, fetchImpl, signal);\n\t\t\t\t\tif (resultado) {\n\t\t\t\t\t\treturn textResult(\n\t\t\t\t\t\t\t`${resultado.titulo}\\n${resultado.url}\\n\\n${resultado.resumen}\\n\\nDatos estructurados:\\n` +\n\t\t\t\t\t\t\t\tJSON.stringify(resultado.datos, null, 2),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// El scraper falló: se cae al fetch genérico en vez de dejar la\n\t\t\t\t\t// tool en blanco. La URL sigue siendo lo que el usuario pidió leer.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// La dirección, no el nombre. `assertFetchableUrl` compara cadenas y deja\n\t\t\t// pasar todo lo que llega al mismo sitio por otro camino: medido,\n\t\t\t// `[::ffff:127.0.0.1]` y un dominio que resuelve a 127.0.0.1 pasaban\n\t\t\t// enteros. Ver `core/web/destino.ts`.\n\t\t\tconst rechazo = await destinoPermitido(url);\n\t\t\tif (rechazo) {\n\t\t\t\tanotarRed?.(url.hostname, false, rechazo.motivo);\n\t\t\t\treturn textResult(\n\t\t\t\t\t`Descarga bloqueada: ${rechazo.motivo}${rechazo.direccion ? ` (${rechazo.direccion})` : \"\"}. ` +\n\t\t\t\t\t\t\"Las tools web no alcanzan la red interna ni la propia máquina.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// `redirect: \"manual\"` y cada salto revalidado. Con `follow`, una URL\n\t\t\t\t// pública que responde 302 hacia loopback llegaba igual, porque solo se\n\t\t\t\t// miraba la primera — era el tercer camino abierto de los tres.\n\t\t\t\tlet destino = url;\n\t\t\t\tlet response: Response | undefined;\n\t\t\t\tfor (let salto = 0; salto <= MAX_REDIRECCIONES; salto++) {\n\t\t\t\t\tresponse = await withTimeout(signal, (s) =>\n\t\t\t\t\t\tfetchImpl(destino.toString(), {\n\t\t\t\t\t\t\tredirect: \"manual\",\n\t\t\t\t\t\t\tsignal: s,\n\t\t\t\t\t\t\theaders: { \"user-agent\": \"ada-cli\" },\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (response.status < 300 || response.status >= 400) break;\n\t\t\t\t\tconst siguiente = response.headers.get(\"location\");\n\t\t\t\t\tif (!siguiente) break;\n\t\t\t\t\tif (salto === MAX_REDIRECCIONES) {\n\t\t\t\t\t\treturn textResult(`La descarga dio más de ${MAX_REDIRECCIONES} redirecciones y se ha parado.`);\n\t\t\t\t\t}\n\t\t\t\t\t// Relativa respecto al destino actual, como manda el estándar.\n\t\t\t\t\tdestino = new URL(siguiente, destino);\n\t\t\t\t\tassertFetchableUrl(destino.toString());\n\t\t\t\t\tconst rechazoSalto = await destinoPermitido(destino);\n\t\t\t\t\tif (rechazoSalto) {\n\t\t\t\t\t\tanotarRed?.(destino.hostname, false, `redirección a ${rechazoSalto.motivo}`);\n\t\t\t\t\t\treturn textResult(\n\t\t\t\t\t\t\t`Descarga bloqueada: la redirección lleva a ${rechazoSalto.motivo}` +\n\t\t\t\t\t\t\t\t`${rechazoSalto.direccion ? ` (${rechazoSalto.direccion})` : \"\"}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tanotarRed?.(destino.hostname, true, \"redirección\");\n\t\t\t\t}\n\t\t\t\tif (!response) return textResult(\"La descarga no devolvió respuesta.\");\n\t\t\t\tif (!response.ok) return textResult(`La descarga devolvió HTTP ${response.status}.`);\n\t\t\t\tconst body = await response.text();\n\t\t\t\tconst truncated = body.length > MAX_FETCH_BYTES;\n\t\t\t\tconst text = htmlToText(body.slice(0, MAX_FETCH_BYTES));\n\t\t\t\treturn textResult(truncated ? `${text}\\n\\n[truncado en ${MAX_FETCH_BYTES} bytes]` : text);\n\t\t\t} catch (error) {\n\t\t\t\treturn textResult(`La descarga falló: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t},\n\t};\n\n\treturn { web_search: webSearch as ToolDefinition, web_fetch: webFetch as ToolDefinition };\n}\n"]}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/core/web/tools.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"almacen.d.ts","sourceRoot":"","sources":["../../../src/core/wiki/almacen.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,KAAK,UAAU,EAA0C,MAAM,YAAY,CAAC;AAErF,MAAM,WAAW,IAAI;IACpB,OAAO,EAAE,CAAC,CAAC;IACX,YAAY,EAAE,UAAU,EAAE,CAAC;CAC3B;AAID,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAUjE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAIjF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAYjF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CA2BvE","sourcesContent":["/**\n * Dónde vive la wiki y cómo se indexa.\n *\n * En `<proyecto>/<configDir>/wiki/`: páginas en Markdown y un `citas.json` con\n * la huella de cada cita. Va dentro del proyecto y no en el agentDir a\n * propósito — es documentación del repositorio, debe poder versionarse y\n * revisarse en un pull request como cualquier otro fichero.\n */\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, relative, resolve } from \"node:path\";\nimport { type Afirmacion, type Cita, extraerCitas, huellaDeTexto } from \"./citas.ts\";\n\nexport interface Wiki {\n\tversion: 1;\n\tafirmaciones: Afirmacion[];\n}\n\nconst VACIA: Wiki = { version: 1, afirmaciones: [] };\n\nexport function rutaWiki(cwd: string, configDirName: string): string {\n\treturn join(cwd, configDirName, \"wiki\");\n}\n\nexport function leerWiki(cwd: string, configDirName: string): Wiki {\n\tconst fichero = join(rutaWiki(cwd, configDirName), \"citas.json\");\n\tif (!existsSync(fichero)) return { ...VACIA };\n\ttry {\n\t\tconst datos = JSON.parse(readFileSync(fichero, \"utf8\")) as Wiki;\n\t\treturn Array.isArray(datos.afirmaciones) ? datos : { ...VACIA };\n\t} catch {\n\t\t// Un citas.json corrupto no puede impedir regenerar la wiki.\n\t\treturn { ...VACIA };\n\t}\n}\n\nexport function escribirWiki(cwd: string, configDirName: string, wiki: Wiki): void {\n\tconst dir = rutaWiki(cwd, configDirName);\n\tmkdirSync(dir, { recursive: true });\n\twriteFileSync(join(dir, \"citas.json\"), `${JSON.stringify(wiki, null, 2)}\\n`, \"utf8\");\n}\n\n/**\n * Lector de ficheros del proyecto, con la raíz cerrada.\n *\n * Una cita es texto que puede haber escrito un modelo. Sin esta comprobación,\n * `../../.ssh/id_rsa` en una página de la wiki haría que `wiki check` leyera\n * cualquier cosa del disco.\n */\nexport function lectorDelProyecto(cwd: string): (fichero: string) => string | null {\n\tconst raiz = resolve(cwd);\n\treturn (fichero) => {\n\t\tconst absoluta = resolve(raiz, fichero);\n\t\tconst dentro = relative(raiz, absoluta);\n\t\tif (dentro.startsWith(\"..\") || resolve(raiz, dentro) !== absoluta) return null;\n\t\ttry {\n\t\t\treturn readFileSync(absoluta, \"utf8\");\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\n/**\n * Indexa las páginas Markdown: saca sus citas y les calcula la huella.\n *\n * Cada párrafo no vacío es una afirmación. Es una regla tonta a propósito: si\n * el troceado fuera listo, dos ejecuciones sobre el mismo texto podrían dar\n * afirmaciones distintas y el fichero de citas cambiaría sin que cambiara nada.\n */\nexport function indexarPaginas(cwd: string, configDirName: string): Wiki {\n\tconst dir = rutaWiki(cwd, configDirName);\n\tif (!existsSync(dir)) return { ...VACIA };\n\tconst leer = lectorDelProyecto(cwd);\n\tconst afirmaciones: Afirmacion[] = [];\n\n\tfor (const fichero of readdirSync(dir)\n\t\t.filter((f) => f.endsWith(\".md\"))\n\t\t.sort()) {\n\t\tconst contenido = readFileSync(join(dir, fichero), \"utf8\");\n\t\tconst parrafos = contenido\n\t\t\t.split(/\\n\\s*\\n/)\n\t\t\t.map((p) => p.trim())\n\t\t\t.filter(Boolean);\n\t\tparrafos.forEach((parrafo, i) => {\n\t\t\tconst citas: Cita[] = [];\n\t\t\tfor (const sinHuella of extraerCitas(parrafo)) {\n\t\t\t\tconst fuente = leer(sinHuella.fichero);\n\t\t\t\tif (fuente === null) continue;\n\t\t\t\tconst lineas = fuente.split(\"\\n\").slice(sinHuella.desde - 1, sinHuella.hasta);\n\t\t\t\tif (lineas.length === 0) continue;\n\t\t\t\tcitas.push({ ...sinHuella, huella: huellaDeTexto(lineas) });\n\t\t\t}\n\t\t\tafirmaciones.push({ id: `${fichero}#${i}`, texto: parrafo.slice(0, 400), citas });\n\t\t});\n\t}\n\treturn { version: 1, afirmaciones };\n}\n"]}
1
+ {"version":3,"file":"almacen.d.ts","sourceRoot":"","sources":["../../../src/core/wiki/almacen.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,KAAK,UAAU,EAA0C,MAAM,YAAY,CAAC;AAErF,MAAM,WAAW,IAAI;IACpB,OAAO,EAAE,CAAC,CAAC;IACX,YAAY,EAAE,UAAU,EAAE,CAAC;CAC3B;AAID,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAUjE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAIjF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAYjF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CA2BvE"}
@@ -1 +1 @@
1
- {"version":3,"file":"almacen.js","sourceRoot":"","sources":["../../../src/core/wiki/almacen.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Dónde vive la wiki y cómo se indexa.\n *\n * En `<proyecto>/<configDir>/wiki/`: páginas en Markdown y un `citas.json` con\n * la huella de cada cita. Va dentro del proyecto y no en el agentDir a\n * propósito — es documentación del repositorio, debe poder versionarse y\n * revisarse en un pull request como cualquier otro fichero.\n */\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, relative, resolve } from \"node:path\";\nimport { type Afirmacion, type Cita, extraerCitas, huellaDeTexto } from \"./citas.ts\";\n\nexport interface Wiki {\n\tversion: 1;\n\tafirmaciones: Afirmacion[];\n}\n\nconst VACIA: Wiki = { version: 1, afirmaciones: [] };\n\nexport function rutaWiki(cwd: string, configDirName: string): string {\n\treturn join(cwd, configDirName, \"wiki\");\n}\n\nexport function leerWiki(cwd: string, configDirName: string): Wiki {\n\tconst fichero = join(rutaWiki(cwd, configDirName), \"citas.json\");\n\tif (!existsSync(fichero)) return { ...VACIA };\n\ttry {\n\t\tconst datos = JSON.parse(readFileSync(fichero, \"utf8\")) as Wiki;\n\t\treturn Array.isArray(datos.afirmaciones) ? datos : { ...VACIA };\n\t} catch {\n\t\t// Un citas.json corrupto no puede impedir regenerar la wiki.\n\t\treturn { ...VACIA };\n\t}\n}\n\nexport function escribirWiki(cwd: string, configDirName: string, wiki: Wiki): void {\n\tconst dir = rutaWiki(cwd, configDirName);\n\tmkdirSync(dir, { recursive: true });\n\twriteFileSync(join(dir, \"citas.json\"), `${JSON.stringify(wiki, null, 2)}\\n`, \"utf8\");\n}\n\n/**\n * Lector de ficheros del proyecto, con la raíz cerrada.\n *\n * Una cita es texto que puede haber escrito un modelo. Sin esta comprobación,\n * `../../.ssh/id_rsa` en una página de la wiki haría que `wiki check` leyera\n * cualquier cosa del disco.\n */\nexport function lectorDelProyecto(cwd: string): (fichero: string) => string | null {\n\tconst raiz = resolve(cwd);\n\treturn (fichero) => {\n\t\tconst absoluta = resolve(raiz, fichero);\n\t\tconst dentro = relative(raiz, absoluta);\n\t\tif (dentro.startsWith(\"..\") || resolve(raiz, dentro) !== absoluta) return null;\n\t\ttry {\n\t\t\treturn readFileSync(absoluta, \"utf8\");\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\n/**\n * Indexa las páginas Markdown: saca sus citas y les calcula la huella.\n *\n * Cada párrafo no vacío es una afirmación. Es una regla tonta a propósito: si\n * el troceado fuera listo, dos ejecuciones sobre el mismo texto podrían dar\n * afirmaciones distintas y el fichero de citas cambiaría sin que cambiara nada.\n */\nexport function indexarPaginas(cwd: string, configDirName: string): Wiki {\n\tconst dir = rutaWiki(cwd, configDirName);\n\tif (!existsSync(dir)) return { ...VACIA };\n\tconst leer = lectorDelProyecto(cwd);\n\tconst afirmaciones: Afirmacion[] = [];\n\n\tfor (const fichero of readdirSync(dir)\n\t\t.filter((f) => f.endsWith(\".md\"))\n\t\t.sort()) {\n\t\tconst contenido = readFileSync(join(dir, fichero), \"utf8\");\n\t\tconst parrafos = contenido\n\t\t\t.split(/\\n\\s*\\n/)\n\t\t\t.map((p) => p.trim())\n\t\t\t.filter(Boolean);\n\t\tparrafos.forEach((parrafo, i) => {\n\t\t\tconst citas: Cita[] = [];\n\t\t\tfor (const sinHuella of extraerCitas(parrafo)) {\n\t\t\t\tconst fuente = leer(sinHuella.fichero);\n\t\t\t\tif (fuente === null) continue;\n\t\t\t\tconst lineas = fuente.split(\"\\n\").slice(sinHuella.desde - 1, sinHuella.hasta);\n\t\t\t\tif (lineas.length === 0) continue;\n\t\t\t\tcitas.push({ ...sinHuella, huella: huellaDeTexto(lineas) });\n\t\t\t}\n\t\t\tafirmaciones.push({ id: `${fichero}#${i}`, texto: parrafo.slice(0, 400), citas });\n\t\t});\n\t}\n\treturn { version: 1, afirmaciones };\n}\n"]}
1
+ {"version":3,"file":"almacen.js","sourceRoot":"","sources":["../../../src/core/wiki/almacen.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAA8B,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAOrF,MAAM,KAAK,GAAS,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;AAErD,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,aAAqB;IAC1D,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,aAAqB;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;IACjE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;IAC9C,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAS,CAAC;QAChE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACR,6DAA6D;QAC7D,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;IACrB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,aAAqB,EAAE,IAAU;IAC1E,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACzC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACtF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/E,IAAI,CAAC;YACJ,OAAO,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,aAAqB;IAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,YAAY,GAAiB,EAAE,CAAC;IAEtC,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAChC,IAAI,EAAE,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,SAAS;aACxB,KAAK,CAAC,SAAS,CAAC;aAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAW,EAAE,CAAC;YACzB,KAAK,MAAM,SAAS,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,MAAM,KAAK,IAAI;oBAAE,SAAS;gBAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;AACrC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"citas.d.ts","sourceRoot":"","sources":["../../../src/core/wiki/citas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,MAAM,WAAW,IAAI;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,kEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GACnB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAGtD;AAOD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM1F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CA2B9E;AAED,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,oEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GACtC,gBAAgB,CAGlB;AAED,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,WAAW,CAiB/G;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,CAOhE;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEhD;AAID;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAQ1E","sourcesContent":["/**\n * Citas verificables para la wiki del repositorio.\n *\n * Una wiki generada por un modelo envejece mal: describe un código que ya no\n * existe y nadie se entera hasta que alguien la sigue y pierde una tarde. La\n * diferencia que buscamos no es generar mejor prosa, es que **cada afirmación\n * lleve su cita a `fichero:línea` y se sepa cuándo deja de ser cierta**.\n *\n * Aquí vive esa parte. Es pura: recibe texto y contenidos de fichero, no toca\n * disco ni llama a ningún modelo.\n *\n * La decisión que la hace útil en vez de molesta: si las líneas citadas\n * **cambiaron**, la afirmación queda obsoleta; pero si solo se **movieron** —el\n * mismo texto está más arriba o más abajo— la cita se reubica y la afirmación\n * sigue viva. Sin eso, insertar un import al principio de un fichero invalidaría\n * cada cita del fichero entero, la wiki daría cientos de falsos positivos y en\n * dos días nadie volvería a mirarla.\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport interface Cita {\n\tfichero: string;\n\t/** 1-indexado e inclusivo, como lo escribe la gente. */\n\tdesde: number;\n\thasta: number;\n\t/** Huella del texto citado cuando se escribió la afirmación. */\n\thuella: string;\n}\n\nexport interface Afirmacion {\n\tid: string;\n\ttexto: string;\n\tcitas: Cita[];\n}\n\nexport type EstadoCita =\n\t| { estado: \"vigente\"; cita: Cita }\n\t| { estado: \"movida\"; cita: Cita; desde: number; hasta: number }\n\t| { estado: \"obsoleta\"; cita: Cita; motivo: string };\n\n/**\n * Huella del texto citado.\n *\n * Se normaliza el final de línea y los espacios al final de cada línea: un\n * formateador que quita un espacio sobrante no cambia lo que el código dice, y\n * marcar eso como obsoleto entrenaría a todo el mundo a ignorar los avisos.\n * La indentación de la izquierda SÍ cuenta: en un lenguaje con bloques, mover\n * algo de nivel sí cambia lo que hace.\n */\nexport function huellaDeTexto(lineas: string[]): string {\n\tconst normalizado = lineas.map((l) => l.replace(/\\s+$/, \"\")).join(\"\\n\");\n\treturn createHash(\"sha256\").update(normalizado).digest(\"hex\").slice(0, 16);\n}\n\nfunction extraer(lineas: string[], desde: number, hasta: number): string[] | null {\n\tif (desde < 1 || hasta < desde || hasta > lineas.length) return null;\n\treturn lineas.slice(desde - 1, hasta);\n}\n\n/**\n * Busca el texto citado en otro sitio del fichero.\n *\n * Devuelve la primera línea (1-indexada) donde encaja el bloque entero, o\n * `null`. Es una búsqueda literal por bloques, no difusa: reubicar una cita\n * sobre un parecido sería peor que declararla obsoleta, porque la afirmación\n * pasaría a apuntar a un código que no es el suyo.\n */\nexport function buscarBloque(lineas: string[], huella: string, alto: number): number | null {\n\tif (alto <= 0 || alto > lineas.length) return null;\n\tfor (let inicio = 0; inicio + alto <= lineas.length; inicio++) {\n\t\tif (huellaDeTexto(lineas.slice(inicio, inicio + alto)) === huella) return inicio + 1;\n\t}\n\treturn null;\n}\n\n/**\n * Comprueba una cita contra el contenido actual del fichero.\n *\n * `contenido` es `null` si el fichero ya no existe.\n */\nexport function verificarCita(cita: Cita, contenido: string | null): EstadoCita {\n\tif (contenido === null) {\n\t\treturn { estado: \"obsoleta\", cita, motivo: `el fichero ${cita.fichero} ya no existe` };\n\t}\n\tconst lineas = contenido.split(\"\\n\");\n\tconst alto = cita.hasta - cita.desde + 1;\n\n\tconst enSuSitio = extraer(lineas, cita.desde, cita.hasta);\n\tif (enSuSitio && huellaDeTexto(enSuSitio) === cita.huella) {\n\t\treturn { estado: \"vigente\", cita };\n\t}\n\n\t// Puede que solo se haya movido. Ver la cabecera: sin esto, un import nuevo\n\t// al principio invalidaría todas las citas del fichero.\n\tconst nuevoInicio = buscarBloque(lineas, cita.huella, alto);\n\tif (nuevoInicio !== null) {\n\t\treturn { estado: \"movida\", cita, desde: nuevoInicio, hasta: nuevoInicio + alto - 1 };\n\t}\n\n\treturn {\n\t\testado: \"obsoleta\",\n\t\tcita,\n\t\tmotivo:\n\t\t\tenSuSitio === null\n\t\t\t\t? `${cita.fichero} ya no llega a la línea ${cita.hasta}`\n\t\t\t\t: `las líneas ${cita.desde}-${cita.hasta} de ${cita.fichero} han cambiado`,\n\t};\n}\n\nexport interface EstadoAfirmacion {\n\tafirmacion: Afirmacion;\n\tcitas: EstadoCita[];\n\t/** Obsoleta si CUALQUIERA de sus citas lo está. Ver más abajo. */\n\tobsoleta: boolean;\n}\n\n/**\n * Comprueba una afirmación entera.\n *\n * Basta una cita obsoleta para marcarla: una afirmación apoyada en tres trozos\n * de código de los que uno ya no dice lo que decía es, como mínimo,\n * sospechosa. Exigir que fallen todas dejaría pasar justo el caso peligroso —\n * la media verdad.\n */\nexport function verificarAfirmacion(\n\tafirmacion: Afirmacion,\n\tleer: (fichero: string) => string | null,\n): EstadoAfirmacion {\n\tconst citas = afirmacion.citas.map((c) => verificarCita(c, leer(c.fichero)));\n\treturn { afirmacion, citas, obsoleta: citas.some((c) => c.estado === \"obsoleta\") };\n}\n\nexport interface ResumenWiki {\n\ttotal: number;\n\tvigentes: number;\n\tmovidas: number;\n\tobsoletas: number;\n\tsinCitas: number;\n\tdetalles: EstadoAfirmacion[];\n}\n\nexport function verificarWiki(afirmaciones: Afirmacion[], leer: (fichero: string) => string | null): ResumenWiki {\n\tconst detalles = afirmaciones.map((a) => verificarAfirmacion(a, leer));\n\treturn {\n\t\ttotal: detalles.length,\n\t\t// Exige al menos una cita: `[].every()` es true, así que sin este filtro\n\t\t// una afirmación sin respaldo se contaba como verificada — que es\n\t\t// exactamente la mentira que esta wiki existe para evitar.\n\t\tvigentes: detalles.filter(\n\t\t\t(d) => d.afirmacion.citas.length > 0 && !d.obsoleta && d.citas.every((c) => c.estado === \"vigente\"),\n\t\t).length,\n\t\tmovidas: detalles.filter((d) => !d.obsoleta && d.citas.some((c) => c.estado === \"movida\")).length,\n\t\tobsoletas: detalles.filter((d) => d.obsoleta).length,\n\t\t// Una afirmación sin cita no es documentación, es una opinión. Se cuenta\n\t\t// aparte para que se vea cuánta wiki no está respaldada por nada.\n\t\tsinCitas: detalles.filter((d) => d.afirmacion.citas.length === 0).length,\n\t\tdetalles,\n\t};\n}\n\n/**\n * Reescribe las citas que solo se movieron.\n *\n * Devuelve las afirmaciones con las líneas actualizadas; las obsoletas se\n * dejan intactas a propósito: arreglarlas requiere leer el código nuevo y\n * decidir si la frase sigue siendo cierta, y eso no lo hace un `replace`.\n */\nexport function reubicarCitas(resumen: ResumenWiki): Afirmacion[] {\n\treturn resumen.detalles.map(({ afirmacion, citas }) => ({\n\t\t...afirmacion,\n\t\tcitas: citas.map((estado) =>\n\t\t\testado.estado === \"movida\" ? { ...estado.cita, desde: estado.desde, hasta: estado.hasta } : estado.cita,\n\t\t),\n\t}));\n}\n\n/** `fichero:12-30` o `fichero:12`. Es lo que la gente escribe a mano. */\nexport function formatearCita(cita: Cita): string {\n\treturn cita.desde === cita.hasta ? `${cita.fichero}:${cita.desde}` : `${cita.fichero}:${cita.desde}-${cita.hasta}`;\n}\n\nconst PATRON_CITA = /([\\w./@-]+\\.\\w+):(\\d+)(?:-(\\d+))?/g;\n\n/**\n * Saca las citas de un texto en Markdown.\n *\n * Sin huella: quien escribe a mano no la conoce. La calcula quien indexa, que\n * es el que tiene el fichero delante.\n */\nexport function extraerCitas(markdown: string): Array<Omit<Cita, \"huella\">> {\n\tconst encontradas: Array<Omit<Cita, \"huella\">> = [];\n\tfor (const m of markdown.matchAll(PATRON_CITA)) {\n\t\tconst desde = Number(m[2]);\n\t\tconst hasta = m[3] ? Number(m[3]) : desde;\n\t\tif (desde >= 1 && hasta >= desde) encontradas.push({ fichero: m[1], desde, hasta });\n\t}\n\treturn encontradas;\n}\n"]}
1
+ {"version":3,"file":"citas.d.ts","sourceRoot":"","sources":["../../../src/core/wiki/citas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,MAAM,WAAW,IAAI;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GACnB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAGtD;AAOD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM1F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CA2B9E;AAED,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,kEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GACtC,gBAAgB,CAGlB;AAED,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,WAAW,CAiB/G;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,CAOhE;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEhD;AAID;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAQ1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"citas.js","sourceRoot":"","sources":["../../../src/core/wiki/citas.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Citas verificables para la wiki del repositorio.\n *\n * Una wiki generada por un modelo envejece mal: describe un código que ya no\n * existe y nadie se entera hasta que alguien la sigue y pierde una tarde. La\n * diferencia que buscamos no es generar mejor prosa, es que **cada afirmación\n * lleve su cita a `fichero:línea` y se sepa cuándo deja de ser cierta**.\n *\n * Aquí vive esa parte. Es pura: recibe texto y contenidos de fichero, no toca\n * disco ni llama a ningún modelo.\n *\n * La decisión que la hace útil en vez de molesta: si las líneas citadas\n * **cambiaron**, la afirmación queda obsoleta; pero si solo se **movieron** —el\n * mismo texto está más arriba o más abajo— la cita se reubica y la afirmación\n * sigue viva. Sin eso, insertar un import al principio de un fichero invalidaría\n * cada cita del fichero entero, la wiki daría cientos de falsos positivos y en\n * dos días nadie volvería a mirarla.\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport interface Cita {\n\tfichero: string;\n\t/** 1-indexado e inclusivo, como lo escribe la gente. */\n\tdesde: number;\n\thasta: number;\n\t/** Huella del texto citado cuando se escribió la afirmación. */\n\thuella: string;\n}\n\nexport interface Afirmacion {\n\tid: string;\n\ttexto: string;\n\tcitas: Cita[];\n}\n\nexport type EstadoCita =\n\t| { estado: \"vigente\"; cita: Cita }\n\t| { estado: \"movida\"; cita: Cita; desde: number; hasta: number }\n\t| { estado: \"obsoleta\"; cita: Cita; motivo: string };\n\n/**\n * Huella del texto citado.\n *\n * Se normaliza el final de línea y los espacios al final de cada línea: un\n * formateador que quita un espacio sobrante no cambia lo que el código dice, y\n * marcar eso como obsoleto entrenaría a todo el mundo a ignorar los avisos.\n * La indentación de la izquierda SÍ cuenta: en un lenguaje con bloques, mover\n * algo de nivel sí cambia lo que hace.\n */\nexport function huellaDeTexto(lineas: string[]): string {\n\tconst normalizado = lineas.map((l) => l.replace(/\\s+$/, \"\")).join(\"\\n\");\n\treturn createHash(\"sha256\").update(normalizado).digest(\"hex\").slice(0, 16);\n}\n\nfunction extraer(lineas: string[], desde: number, hasta: number): string[] | null {\n\tif (desde < 1 || hasta < desde || hasta > lineas.length) return null;\n\treturn lineas.slice(desde - 1, hasta);\n}\n\n/**\n * Busca el texto citado en otro sitio del fichero.\n *\n * Devuelve la primera línea (1-indexada) donde encaja el bloque entero, o\n * `null`. Es una búsqueda literal por bloques, no difusa: reubicar una cita\n * sobre un parecido sería peor que declararla obsoleta, porque la afirmación\n * pasaría a apuntar a un código que no es el suyo.\n */\nexport function buscarBloque(lineas: string[], huella: string, alto: number): number | null {\n\tif (alto <= 0 || alto > lineas.length) return null;\n\tfor (let inicio = 0; inicio + alto <= lineas.length; inicio++) {\n\t\tif (huellaDeTexto(lineas.slice(inicio, inicio + alto)) === huella) return inicio + 1;\n\t}\n\treturn null;\n}\n\n/**\n * Comprueba una cita contra el contenido actual del fichero.\n *\n * `contenido` es `null` si el fichero ya no existe.\n */\nexport function verificarCita(cita: Cita, contenido: string | null): EstadoCita {\n\tif (contenido === null) {\n\t\treturn { estado: \"obsoleta\", cita, motivo: `el fichero ${cita.fichero} ya no existe` };\n\t}\n\tconst lineas = contenido.split(\"\\n\");\n\tconst alto = cita.hasta - cita.desde + 1;\n\n\tconst enSuSitio = extraer(lineas, cita.desde, cita.hasta);\n\tif (enSuSitio && huellaDeTexto(enSuSitio) === cita.huella) {\n\t\treturn { estado: \"vigente\", cita };\n\t}\n\n\t// Puede que solo se haya movido. Ver la cabecera: sin esto, un import nuevo\n\t// al principio invalidaría todas las citas del fichero.\n\tconst nuevoInicio = buscarBloque(lineas, cita.huella, alto);\n\tif (nuevoInicio !== null) {\n\t\treturn { estado: \"movida\", cita, desde: nuevoInicio, hasta: nuevoInicio + alto - 1 };\n\t}\n\n\treturn {\n\t\testado: \"obsoleta\",\n\t\tcita,\n\t\tmotivo:\n\t\t\tenSuSitio === null\n\t\t\t\t? `${cita.fichero} ya no llega a la línea ${cita.hasta}`\n\t\t\t\t: `las líneas ${cita.desde}-${cita.hasta} de ${cita.fichero} han cambiado`,\n\t};\n}\n\nexport interface EstadoAfirmacion {\n\tafirmacion: Afirmacion;\n\tcitas: EstadoCita[];\n\t/** Obsoleta si CUALQUIERA de sus citas lo está. Ver más abajo. */\n\tobsoleta: boolean;\n}\n\n/**\n * Comprueba una afirmación entera.\n *\n * Basta una cita obsoleta para marcarla: una afirmación apoyada en tres trozos\n * de código de los que uno ya no dice lo que decía es, como mínimo,\n * sospechosa. Exigir que fallen todas dejaría pasar justo el caso peligroso —\n * la media verdad.\n */\nexport function verificarAfirmacion(\n\tafirmacion: Afirmacion,\n\tleer: (fichero: string) => string | null,\n): EstadoAfirmacion {\n\tconst citas = afirmacion.citas.map((c) => verificarCita(c, leer(c.fichero)));\n\treturn { afirmacion, citas, obsoleta: citas.some((c) => c.estado === \"obsoleta\") };\n}\n\nexport interface ResumenWiki {\n\ttotal: number;\n\tvigentes: number;\n\tmovidas: number;\n\tobsoletas: number;\n\tsinCitas: number;\n\tdetalles: EstadoAfirmacion[];\n}\n\nexport function verificarWiki(afirmaciones: Afirmacion[], leer: (fichero: string) => string | null): ResumenWiki {\n\tconst detalles = afirmaciones.map((a) => verificarAfirmacion(a, leer));\n\treturn {\n\t\ttotal: detalles.length,\n\t\t// Exige al menos una cita: `[].every()` es true, así que sin este filtro\n\t\t// una afirmación sin respaldo se contaba como verificada — que es\n\t\t// exactamente la mentira que esta wiki existe para evitar.\n\t\tvigentes: detalles.filter(\n\t\t\t(d) => d.afirmacion.citas.length > 0 && !d.obsoleta && d.citas.every((c) => c.estado === \"vigente\"),\n\t\t).length,\n\t\tmovidas: detalles.filter((d) => !d.obsoleta && d.citas.some((c) => c.estado === \"movida\")).length,\n\t\tobsoletas: detalles.filter((d) => d.obsoleta).length,\n\t\t// Una afirmación sin cita no es documentación, es una opinión. Se cuenta\n\t\t// aparte para que se vea cuánta wiki no está respaldada por nada.\n\t\tsinCitas: detalles.filter((d) => d.afirmacion.citas.length === 0).length,\n\t\tdetalles,\n\t};\n}\n\n/**\n * Reescribe las citas que solo se movieron.\n *\n * Devuelve las afirmaciones con las líneas actualizadas; las obsoletas se\n * dejan intactas a propósito: arreglarlas requiere leer el código nuevo y\n * decidir si la frase sigue siendo cierta, y eso no lo hace un `replace`.\n */\nexport function reubicarCitas(resumen: ResumenWiki): Afirmacion[] {\n\treturn resumen.detalles.map(({ afirmacion, citas }) => ({\n\t\t...afirmacion,\n\t\tcitas: citas.map((estado) =>\n\t\t\testado.estado === \"movida\" ? { ...estado.cita, desde: estado.desde, hasta: estado.hasta } : estado.cita,\n\t\t),\n\t}));\n}\n\n/** `fichero:12-30` o `fichero:12`. Es lo que la gente escribe a mano. */\nexport function formatearCita(cita: Cita): string {\n\treturn cita.desde === cita.hasta ? `${cita.fichero}:${cita.desde}` : `${cita.fichero}:${cita.desde}-${cita.hasta}`;\n}\n\nconst PATRON_CITA = /([\\w./@-]+\\.\\w+):(\\d+)(?:-(\\d+))?/g;\n\n/**\n * Saca las citas de un texto en Markdown.\n *\n * Sin huella: quien escribe a mano no la conoce. La calcula quien indexa, que\n * es el que tiene el fichero delante.\n */\nexport function extraerCitas(markdown: string): Array<Omit<Cita, \"huella\">> {\n\tconst encontradas: Array<Omit<Cita, \"huella\">> = [];\n\tfor (const m of markdown.matchAll(PATRON_CITA)) {\n\t\tconst desde = Number(m[2]);\n\t\tconst hasta = m[3] ? Number(m[3]) : desde;\n\t\tif (desde >= 1 && hasta >= desde) encontradas.push({ fichero: m[1], desde, hasta });\n\t}\n\treturn encontradas;\n}\n"]}
1
+ {"version":3,"file":"citas.js","sourceRoot":"","sources":["../../../src/core/wiki/citas.ts"],"names":[],"mappings":"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"}