@hoilab/ada-cli 0.84.21 → 0.85.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1337) hide show
  1. package/CHANGELOG.md +49 -2
  2. package/README.es.md +174 -0
  3. package/README.md +203 -658
  4. package/dist/ada-publico.d.ts +35 -0
  5. package/dist/ada-publico.d.ts.map +1 -0
  6. package/dist/ada-publico.js +40 -0
  7. package/dist/ada-publico.js.map +1 -0
  8. package/dist/cli/args.d.ts +3 -0
  9. package/dist/cli/args.d.ts.map +1 -1
  10. package/dist/cli/args.js +11 -0
  11. package/dist/cli/args.js.map +1 -1
  12. package/dist/cli/audit-command.d.ts +15 -0
  13. package/dist/cli/audit-command.d.ts.map +1 -0
  14. package/dist/cli/audit-command.js +280 -0
  15. package/dist/cli/audit-command.js.map +1 -0
  16. package/dist/cli/banco-command.d.ts +15 -0
  17. package/dist/cli/banco-command.d.ts.map +1 -0
  18. package/dist/cli/banco-command.js +213 -0
  19. package/dist/cli/banco-command.js.map +1 -0
  20. package/dist/cli/cleanse-command.d.ts +11 -0
  21. package/dist/cli/cleanse-command.d.ts.map +1 -0
  22. package/dist/cli/cleanse-command.js +101 -0
  23. package/dist/cli/cleanse-command.js.map +1 -0
  24. package/dist/cli/commit-command.d.ts +31 -0
  25. package/dist/cli/commit-command.d.ts.map +1 -0
  26. package/dist/cli/commit-command.js +158 -0
  27. package/dist/cli/commit-command.js.map +1 -0
  28. package/dist/cli/computer-command.d.ts +12 -0
  29. package/dist/cli/computer-command.d.ts.map +1 -0
  30. package/dist/cli/computer-command.js +141 -0
  31. package/dist/cli/computer-command.js.map +1 -0
  32. package/dist/cli/discover-command.d.ts +18 -0
  33. package/dist/cli/discover-command.d.ts.map +1 -0
  34. package/dist/cli/discover-command.js +108 -0
  35. package/dist/cli/discover-command.js.map +1 -0
  36. package/dist/cli/file-processor.d.ts.map +1 -1
  37. package/dist/cli/file-processor.js +2 -1
  38. package/dist/cli/file-processor.js.map +1 -1
  39. package/dist/cli/hashline-command.d.ts +11 -0
  40. package/dist/cli/hashline-command.d.ts.map +1 -0
  41. package/dist/cli/hashline-command.js +106 -0
  42. package/dist/cli/hashline-command.js.map +1 -0
  43. package/dist/cli/home-screen.d.ts.map +1 -1
  44. package/dist/cli/home-screen.js +2 -2
  45. package/dist/cli/home-screen.js.map +1 -1
  46. package/dist/cli/import-command.d.ts +35 -0
  47. package/dist/cli/import-command.d.ts.map +1 -0
  48. package/dist/cli/import-command.js +164 -0
  49. package/dist/cli/import-command.js.map +1 -0
  50. package/dist/cli/politica-command.d.ts +20 -0
  51. package/dist/cli/politica-command.d.ts.map +1 -0
  52. package/dist/cli/politica-command.js +93 -0
  53. package/dist/cli/politica-command.js.map +1 -0
  54. package/dist/cli/refine-command.d.ts +18 -0
  55. package/dist/cli/refine-command.d.ts.map +1 -0
  56. package/dist/cli/refine-command.js +101 -0
  57. package/dist/cli/refine-command.js.map +1 -0
  58. package/dist/cli/review-command.d.ts +24 -0
  59. package/dist/cli/review-command.d.ts.map +1 -0
  60. package/dist/cli/review-command.js +168 -0
  61. package/dist/cli/review-command.js.map +1 -0
  62. package/dist/cli/schedule-command.d.ts +17 -0
  63. package/dist/cli/schedule-command.d.ts.map +1 -0
  64. package/dist/cli/schedule-command.js +117 -0
  65. package/dist/cli/schedule-command.js.map +1 -0
  66. package/dist/cli/serve-command.d.ts +72 -0
  67. package/dist/cli/serve-command.d.ts.map +1 -0
  68. package/dist/cli/serve-command.js +568 -0
  69. package/dist/cli/serve-command.js.map +1 -0
  70. package/dist/cli/startup-ui.d.ts.map +1 -1
  71. package/dist/cli/startup-ui.js +9 -3
  72. package/dist/cli/startup-ui.js.map +1 -1
  73. package/dist/cli/telegram-command.d.ts +18 -0
  74. package/dist/cli/telegram-command.d.ts.map +1 -0
  75. package/dist/cli/telegram-command.js +137 -0
  76. package/dist/cli/telegram-command.js.map +1 -0
  77. package/dist/cli/telemetria-command.d.ts +22 -0
  78. package/dist/cli/telemetria-command.d.ts.map +1 -0
  79. package/dist/cli/telemetria-command.js +127 -0
  80. package/dist/cli/telemetria-command.js.map +1 -0
  81. package/dist/cli/undo-command.d.ts +9 -0
  82. package/dist/cli/undo-command.d.ts.map +1 -0
  83. package/dist/cli/undo-command.js +56 -0
  84. package/dist/cli/undo-command.js.map +1 -0
  85. package/dist/cli/usage-command.d.ts +10 -0
  86. package/dist/cli/usage-command.d.ts.map +1 -0
  87. package/dist/cli/usage-command.js +209 -0
  88. package/dist/cli/usage-command.js.map +1 -0
  89. package/dist/cli/wiki-command.d.ts +9 -0
  90. package/dist/cli/wiki-command.d.ts.map +1 -0
  91. package/dist/cli/wiki-command.js +76 -0
  92. package/dist/cli/wiki-command.js.map +1 -0
  93. package/dist/cli.d.ts +6 -0
  94. package/dist/cli.d.ts.map +1 -1
  95. package/dist/cli.js +10 -11
  96. package/dist/cli.js.map +1 -1
  97. package/dist/config.d.ts +1 -1
  98. package/dist/config.d.ts.map +1 -1
  99. package/dist/config.js +3 -2
  100. package/dist/config.js.map +1 -1
  101. package/dist/core/ada.d.ts +58 -0
  102. package/dist/core/ada.d.ts.map +1 -0
  103. package/dist/core/ada.js +61 -0
  104. package/dist/core/ada.js.map +1 -0
  105. package/dist/core/advisor/guarda.d.ts +66 -0
  106. package/dist/core/advisor/guarda.d.ts.map +1 -0
  107. package/dist/core/advisor/guarda.js +191 -0
  108. package/dist/core/advisor/guarda.js.map +1 -0
  109. package/dist/core/advisor/runtime.d.ts +66 -0
  110. package/dist/core/advisor/runtime.d.ts.map +1 -0
  111. package/dist/core/advisor/runtime.js +121 -0
  112. package/dist/core/advisor/runtime.js.map +1 -0
  113. package/dist/core/advisor/sesion.d.ts +109 -0
  114. package/dist/core/advisor/sesion.d.ts.map +1 -0
  115. package/dist/core/advisor/sesion.js +139 -0
  116. package/dist/core/advisor/sesion.js.map +1 -0
  117. package/dist/core/agent-session.d.ts +85 -7
  118. package/dist/core/agent-session.d.ts.map +1 -1
  119. package/dist/core/agent-session.js +862 -78
  120. package/dist/core/agent-session.js.map +1 -1
  121. package/dist/core/agents/loader.d.ts +77 -0
  122. package/dist/core/agents/loader.d.ts.map +1 -0
  123. package/dist/core/agents/loader.js +154 -0
  124. package/dist/core/agents/loader.js.map +1 -0
  125. package/dist/core/aprobacion/generados.d.ts +37 -0
  126. package/dist/core/aprobacion/generados.d.ts.map +1 -0
  127. package/dist/core/aprobacion/generados.js +85 -0
  128. package/dist/core/aprobacion/generados.js.map +1 -0
  129. package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
  130. package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
  131. package/dist/core/aprobacion/politica-de-maquina.js +212 -0
  132. package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
  133. package/dist/core/aprobacion/politica.d.ts +90 -0
  134. package/dist/core/aprobacion/politica.d.ts.map +1 -0
  135. package/dist/core/aprobacion/politica.js +375 -0
  136. package/dist/core/aprobacion/politica.js.map +1 -0
  137. package/dist/core/arranque/atajos.d.ts +46 -0
  138. package/dist/core/arranque/atajos.d.ts.map +1 -0
  139. package/dist/core/arranque/atajos.js +113 -0
  140. package/dist/core/arranque/atajos.js.map +1 -0
  141. package/dist/core/audit/exportacion.d.ts +54 -0
  142. package/dist/core/audit/exportacion.d.ts.map +1 -0
  143. package/dist/core/audit/exportacion.js +265 -0
  144. package/dist/core/audit/exportacion.js.map +1 -0
  145. package/dist/core/audit/libro.d.ts +318 -0
  146. package/dist/core/audit/libro.d.ts.map +1 -0
  147. package/dist/core/audit/libro.js +508 -0
  148. package/dist/core/audit/libro.js.map +1 -0
  149. package/dist/core/audit/registro-sesion.d.ts +78 -0
  150. package/dist/core/audit/registro-sesion.d.ts.map +1 -0
  151. package/dist/core/audit/registro-sesion.js +202 -0
  152. package/dist/core/audit/registro-sesion.js.map +1 -0
  153. package/dist/core/audit/retencion.d.ts +82 -0
  154. package/dist/core/audit/retencion.d.ts.map +1 -0
  155. package/dist/core/audit/retencion.js +152 -0
  156. package/dist/core/audit/retencion.js.map +1 -0
  157. package/dist/core/audit/rutas.d.ts +23 -0
  158. package/dist/core/audit/rutas.d.ts.map +1 -0
  159. package/dist/core/audit/rutas.js +23 -0
  160. package/dist/core/audit/rutas.js.map +1 -0
  161. package/dist/core/auth-storage.d.ts +0 -3
  162. package/dist/core/auth-storage.d.ts.map +1 -1
  163. package/dist/core/auth-storage.js +21 -8
  164. package/dist/core/auth-storage.js.map +1 -1
  165. package/dist/core/banco/almacenamiento.d.ts +18 -0
  166. package/dist/core/banco/almacenamiento.d.ts.map +1 -0
  167. package/dist/core/banco/almacenamiento.js +50 -0
  168. package/dist/core/banco/almacenamiento.js.map +1 -0
  169. package/dist/core/banco/analisis.d.ts +37 -0
  170. package/dist/core/banco/analisis.d.ts.map +1 -0
  171. package/dist/core/banco/analisis.js +164 -0
  172. package/dist/core/banco/analisis.js.map +1 -0
  173. package/dist/core/banco/bloques.d.ts +39 -0
  174. package/dist/core/banco/bloques.d.ts.map +1 -0
  175. package/dist/core/banco/bloques.js +84 -0
  176. package/dist/core/banco/bloques.js.map +1 -0
  177. package/dist/core/banco/cargas.d.ts +84 -0
  178. package/dist/core/banco/cargas.d.ts.map +1 -0
  179. package/dist/core/banco/cargas.js +520 -0
  180. package/dist/core/banco/cargas.js.map +1 -0
  181. package/dist/core/banco/comparar.d.ts +29 -0
  182. package/dist/core/banco/comparar.d.ts.map +1 -0
  183. package/dist/core/banco/comparar.js +28 -0
  184. package/dist/core/banco/comparar.js.map +1 -0
  185. package/dist/core/banco/ejecutar.d.ts +44 -0
  186. package/dist/core/banco/ejecutar.d.ts.map +1 -0
  187. package/dist/core/banco/ejecutar.js +183 -0
  188. package/dist/core/banco/ejecutar.js.map +1 -0
  189. package/dist/core/banco/generar.d.ts +24 -0
  190. package/dist/core/banco/generar.d.ts.map +1 -0
  191. package/dist/core/banco/generar.js +159 -0
  192. package/dist/core/banco/generar.js.map +1 -0
  193. package/dist/core/banco/mutaciones.d.ts +25 -0
  194. package/dist/core/banco/mutaciones.d.ts.map +1 -0
  195. package/dist/core/banco/mutaciones.js +215 -0
  196. package/dist/core/banco/mutaciones.js.map +1 -0
  197. package/dist/core/banco/tipos.d.ts +121 -0
  198. package/dist/core/banco/tipos.d.ts.map +1 -0
  199. package/dist/core/banco/tipos.js +16 -0
  200. package/dist/core/banco/tipos.js.map +1 -0
  201. package/dist/core/blobs/almacen.d.ts +81 -0
  202. package/dist/core/blobs/almacen.d.ts.map +1 -0
  203. package/dist/core/blobs/almacen.js +198 -0
  204. package/dist/core/blobs/almacen.js.map +1 -0
  205. package/dist/core/blobs/broker.d.ts +103 -0
  206. package/dist/core/blobs/broker.d.ts.map +1 -0
  207. package/dist/core/blobs/broker.js +204 -0
  208. package/dist/core/blobs/broker.js.map +1 -0
  209. package/dist/core/blobs/index.d.ts +70 -0
  210. package/dist/core/blobs/index.d.ts.map +1 -0
  211. package/dist/core/blobs/index.js +232 -0
  212. package/dist/core/blobs/index.js.map +1 -0
  213. package/dist/core/blobs/payload.d.ts +55 -0
  214. package/dist/core/blobs/payload.d.ts.map +1 -0
  215. package/dist/core/blobs/payload.js +255 -0
  216. package/dist/core/blobs/payload.js.map +1 -0
  217. package/dist/core/blobs/proveedor.d.ts +85 -0
  218. package/dist/core/blobs/proveedor.d.ts.map +1 -0
  219. package/dist/core/blobs/proveedor.js +196 -0
  220. package/dist/core/blobs/proveedor.js.map +1 -0
  221. package/dist/core/browser/cdp.d.ts +41 -0
  222. package/dist/core/browser/cdp.d.ts.map +1 -0
  223. package/dist/core/browser/cdp.js +119 -0
  224. package/dist/core/browser/cdp.js.map +1 -0
  225. package/dist/core/browser/politica.d.ts +51 -0
  226. package/dist/core/browser/politica.d.ts.map +1 -0
  227. package/dist/core/browser/politica.js +123 -0
  228. package/dist/core/browser/politica.js.map +1 -0
  229. package/dist/core/browser/sesion.d.ts +52 -0
  230. package/dist/core/browser/sesion.d.ts.map +1 -0
  231. package/dist/core/browser/sesion.js +176 -0
  232. package/dist/core/browser/sesion.js.map +1 -0
  233. package/dist/core/browser/tools.d.ts +16 -0
  234. package/dist/core/browser/tools.d.ts.map +1 -0
  235. package/dist/core/browser/tools.js +279 -0
  236. package/dist/core/browser/tools.js.map +1 -0
  237. package/dist/core/commit/diff.d.ts +56 -0
  238. package/dist/core/commit/diff.d.ts.map +1 -0
  239. package/dist/core/commit/diff.js +145 -0
  240. package/dist/core/commit/diff.js.map +1 -0
  241. package/dist/core/commit/mensaje.d.ts +80 -0
  242. package/dist/core/commit/mensaje.d.ts.map +1 -0
  243. package/dist/core/commit/mensaje.js +207 -0
  244. package/dist/core/commit/mensaje.js.map +1 -0
  245. package/dist/core/compactar/index.d.ts +52 -0
  246. package/dist/core/compactar/index.d.ts.map +1 -0
  247. package/dist/core/compactar/index.js +91 -0
  248. package/dist/core/compactar/index.js.map +1 -0
  249. package/dist/core/compactar/registro-denso.d.ts +160 -0
  250. package/dist/core/compactar/registro-denso.d.ts.map +1 -0
  251. package/dist/core/compactar/registro-denso.js +620 -0
  252. package/dist/core/compactar/registro-denso.js.map +1 -0
  253. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  254. package/dist/core/compaction/branch-summarization.js +3 -0
  255. package/dist/core/compaction/branch-summarization.js.map +1 -1
  256. package/dist/core/compaction/compaction.d.ts +4 -3
  257. package/dist/core/compaction/compaction.d.ts.map +1 -1
  258. package/dist/core/compaction/compaction.js +41 -32
  259. package/dist/core/compaction/compaction.js.map +1 -1
  260. package/dist/core/computer/captura.d.ts +35 -0
  261. package/dist/core/computer/captura.d.ts.map +1 -0
  262. package/dist/core/computer/captura.js +140 -0
  263. package/dist/core/computer/captura.js.map +1 -0
  264. package/dist/core/computer/driver.d.ts +130 -0
  265. package/dist/core/computer/driver.d.ts.map +1 -0
  266. package/dist/core/computer/driver.js +206 -0
  267. package/dist/core/computer/driver.js.map +1 -0
  268. package/dist/core/computer/motor/actions.d.ts +109 -0
  269. package/dist/core/computer/motor/actions.d.ts.map +1 -0
  270. package/dist/core/computer/motor/actions.js +157 -0
  271. package/dist/core/computer/motor/actions.js.map +1 -0
  272. package/dist/core/computer/motor/bridge.d.ts +232 -0
  273. package/dist/core/computer/motor/bridge.d.ts.map +1 -0
  274. package/dist/core/computer/motor/bridge.js +2335 -0
  275. package/dist/core/computer/motor/bridge.js.map +1 -0
  276. package/dist/core/computer/motor/cdp.d.ts +107 -0
  277. package/dist/core/computer/motor/cdp.d.ts.map +1 -0
  278. package/dist/core/computer/motor/cdp.js +659 -0
  279. package/dist/core/computer/motor/cdp.js.map +1 -0
  280. package/dist/core/computer/motor/config.d.ts +23 -0
  281. package/dist/core/computer/motor/config.d.ts.map +1 -0
  282. package/dist/core/computer/motor/config.js +100 -0
  283. package/dist/core/computer/motor/config.js.map +1 -0
  284. package/dist/core/computer/motor/contract.d.ts +81 -0
  285. package/dist/core/computer/motor/contract.d.ts.map +1 -0
  286. package/dist/core/computer/motor/contract.js +14 -0
  287. package/dist/core/computer/motor/contract.js.map +1 -0
  288. package/dist/core/computer/motor/note.d.ts +37 -0
  289. package/dist/core/computer/motor/note.d.ts.map +1 -0
  290. package/dist/core/computer/motor/note.js +162 -0
  291. package/dist/core/computer/motor/note.js.map +1 -0
  292. package/dist/core/computer/motor/outline.d.ts +155 -0
  293. package/dist/core/computer/motor/outline.d.ts.map +1 -0
  294. package/dist/core/computer/motor/outline.js +590 -0
  295. package/dist/core/computer/motor/outline.js.map +1 -0
  296. package/dist/core/computer/motor/output.d.ts +18 -0
  297. package/dist/core/computer/motor/output.d.ts.map +1 -0
  298. package/dist/core/computer/motor/output.js +148 -0
  299. package/dist/core/computer/motor/output.js.map +1 -0
  300. package/dist/core/computer/motor/permissions.d.ts +41 -0
  301. package/dist/core/computer/motor/permissions.d.ts.map +1 -0
  302. package/dist/core/computer/motor/permissions.js +51 -0
  303. package/dist/core/computer/motor/permissions.js.map +1 -0
  304. package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
  305. package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
  306. package/dist/core/computer/motor/platform/architecture.js +21 -0
  307. package/dist/core/computer/motor/platform/architecture.js.map +1 -0
  308. package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
  309. package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
  310. package/dist/core/computer/motor/platform/coerce.js +17 -0
  311. package/dist/core/computer/motor/platform/coerce.js.map +1 -0
  312. package/dist/core/computer/motor/platform/index.d.ts +4 -0
  313. package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
  314. package/dist/core/computer/motor/platform/index.js +79 -0
  315. package/dist/core/computer/motor/platform/index.js.map +1 -0
  316. package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
  317. package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
  318. package/dist/core/computer/motor/platform/linux/backend.js +173 -0
  319. package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
  320. package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
  321. package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
  322. package/dist/core/computer/motor/platform/linux/helper.js +261 -0
  323. package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
  324. package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
  325. package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
  326. package/dist/core/computer/motor/platform/macos/backend.js +124 -0
  327. package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
  328. package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
  329. package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
  330. package/dist/core/computer/motor/platform/macos/browser.js +101 -0
  331. package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
  332. package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
  333. package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
  334. package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
  335. package/dist/core/computer/motor/platform/macos/helper.js +277 -0
  336. package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
  337. package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
  338. package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
  339. package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
  340. package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
  341. package/dist/core/computer/motor/platform/types.d.ts +263 -0
  342. package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
  343. package/dist/core/computer/motor/platform/types.js +2 -0
  344. package/dist/core/computer/motor/platform/types.js.map +1 -0
  345. package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
  346. package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
  347. package/dist/core/computer/motor/platform/windows/backend.js +163 -0
  348. package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
  349. package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
  350. package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
  351. package/dist/core/computer/motor/platform/windows/helper.js +174 -0
  352. package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
  353. package/dist/core/computer/motor/root-selection.d.ts +6 -0
  354. package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
  355. package/dist/core/computer/motor/root-selection.js +28 -0
  356. package/dist/core/computer/motor/root-selection.js.map +1 -0
  357. package/dist/core/computer/motor/runtime.d.ts +50 -0
  358. package/dist/core/computer/motor/runtime.d.ts.map +1 -0
  359. package/dist/core/computer/motor/runtime.js +119 -0
  360. package/dist/core/computer/motor/runtime.js.map +1 -0
  361. package/dist/core/computer/motor/state.d.ts +68 -0
  362. package/dist/core/computer/motor/state.d.ts.map +1 -0
  363. package/dist/core/computer/motor/state.js +100 -0
  364. package/dist/core/computer/motor/state.js.map +1 -0
  365. package/dist/core/computer/motor/view.d.ts +6 -0
  366. package/dist/core/computer/motor/view.d.ts.map +1 -0
  367. package/dist/core/computer/motor/view.js +185 -0
  368. package/dist/core/computer/motor/view.js.map +1 -0
  369. package/dist/core/computer/motor-ada.d.ts +159 -0
  370. package/dist/core/computer/motor-ada.d.ts.map +1 -0
  371. package/dist/core/computer/motor-ada.js +412 -0
  372. package/dist/core/computer/motor-ada.js.map +1 -0
  373. package/dist/core/computer/politica.d.ts +56 -0
  374. package/dist/core/computer/politica.d.ts.map +1 -0
  375. package/dist/core/computer/politica.js +163 -0
  376. package/dist/core/computer/politica.js.map +1 -0
  377. package/dist/core/computer/tools.d.ts +26 -0
  378. package/dist/core/computer/tools.d.ts.map +1 -0
  379. package/dist/core/computer/tools.js +399 -0
  380. package/dist/core/computer/tools.js.map +1 -0
  381. package/dist/core/context-breakdown.d.ts +80 -0
  382. package/dist/core/context-breakdown.d.ts.map +1 -0
  383. package/dist/core/context-breakdown.js +87 -0
  384. package/dist/core/context-breakdown.js.map +1 -0
  385. package/dist/core/credenciales/cliente.d.ts +60 -0
  386. package/dist/core/credenciales/cliente.d.ts.map +1 -0
  387. package/dist/core/credenciales/cliente.js +81 -0
  388. package/dist/core/credenciales/cliente.js.map +1 -0
  389. package/dist/core/credenciales/pool.d.ts +96 -0
  390. package/dist/core/credenciales/pool.d.ts.map +1 -0
  391. package/dist/core/credenciales/pool.js +128 -0
  392. package/dist/core/credenciales/pool.js.map +1 -0
  393. package/dist/core/credenciales/reposo.d.ts +93 -0
  394. package/dist/core/credenciales/reposo.d.ts.map +1 -0
  395. package/dist/core/credenciales/reposo.js +489 -0
  396. package/dist/core/credenciales/reposo.js.map +1 -0
  397. package/dist/core/credenciales/servidor.d.ts +55 -0
  398. package/dist/core/credenciales/servidor.d.ts.map +1 -0
  399. package/dist/core/credenciales/servidor.js +205 -0
  400. package/dist/core/credenciales/servidor.js.map +1 -0
  401. package/dist/core/defaults.d.ts +1 -0
  402. package/dist/core/defaults.d.ts.map +1 -1
  403. package/dist/core/defaults.js +9 -0
  404. package/dist/core/defaults.js.map +1 -1
  405. package/dist/core/descubrimiento/comandos.d.ts +30 -0
  406. package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
  407. package/dist/core/descubrimiento/comandos.js +76 -0
  408. package/dist/core/descubrimiento/comandos.js.map +1 -0
  409. package/dist/core/descubrimiento/mcp.d.ts +42 -0
  410. package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
  411. package/dist/core/descubrimiento/mcp.js +130 -0
  412. package/dist/core/descubrimiento/mcp.js.map +1 -0
  413. package/dist/core/descubrimiento/reglas.d.ts +61 -0
  414. package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
  415. package/dist/core/descubrimiento/reglas.js +134 -0
  416. package/dist/core/descubrimiento/reglas.js.map +1 -0
  417. package/dist/core/descubrimiento/skills.d.ts +57 -0
  418. package/dist/core/descubrimiento/skills.d.ts.map +1 -0
  419. package/dist/core/descubrimiento/skills.js +113 -0
  420. package/dist/core/descubrimiento/skills.js.map +1 -0
  421. package/dist/core/dificultad/clasificador.d.ts +133 -0
  422. package/dist/core/dificultad/clasificador.d.ts.map +1 -0
  423. package/dist/core/dificultad/clasificador.js +288 -0
  424. package/dist/core/dificultad/clasificador.js.map +1 -0
  425. package/dist/core/edicion/diario.d.ts +37 -0
  426. package/dist/core/edicion/diario.d.ts.map +1 -0
  427. package/dist/core/edicion/diario.js +51 -0
  428. package/dist/core/edicion/diario.js.map +1 -0
  429. package/dist/core/edicion/hashline.d.ts +71 -0
  430. package/dist/core/edicion/hashline.d.ts.map +1 -0
  431. package/dist/core/edicion/hashline.js +111 -0
  432. package/dist/core/edicion/hashline.js.map +1 -0
  433. package/dist/core/edicion/hueco.d.ts +64 -0
  434. package/dist/core/edicion/hueco.d.ts.map +1 -0
  435. package/dist/core/edicion/hueco.js +162 -0
  436. package/dist/core/edicion/hueco.js.map +1 -0
  437. package/dist/core/edicion/limpiar-carga.d.ts +39 -0
  438. package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
  439. package/dist/core/edicion/limpiar-carga.js +121 -0
  440. package/dist/core/edicion/limpiar-carga.js.map +1 -0
  441. package/dist/core/edicion/observador.d.ts +80 -0
  442. package/dist/core/edicion/observador.d.ts.map +1 -0
  443. package/dist/core/edicion/observador.js +183 -0
  444. package/dist/core/edicion/observador.js.map +1 -0
  445. package/dist/core/edicion/parecido.d.ts +53 -0
  446. package/dist/core/edicion/parecido.d.ts.map +1 -0
  447. package/dist/core/edicion/parecido.js +145 -0
  448. package/dist/core/edicion/parecido.js.map +1 -0
  449. package/dist/core/edicion/parseo.d.ts +58 -0
  450. package/dist/core/edicion/parseo.d.ts.map +1 -0
  451. package/dist/core/edicion/parseo.js +124 -0
  452. package/dist/core/edicion/parseo.js.map +1 -0
  453. package/dist/core/edicion/reparacion.d.ts +67 -0
  454. package/dist/core/edicion/reparacion.d.ts.map +1 -0
  455. package/dist/core/edicion/reparacion.js +202 -0
  456. package/dist/core/edicion/reparacion.js.map +1 -0
  457. package/dist/core/edicion/sangria.d.ts +121 -0
  458. package/dist/core/edicion/sangria.d.ts.map +1 -0
  459. package/dist/core/edicion/sangria.js +341 -0
  460. package/dist/core/edicion/sangria.js.map +1 -0
  461. package/dist/core/edicion/tipos.d.ts +58 -0
  462. package/dist/core/edicion/tipos.d.ts.map +1 -0
  463. package/dist/core/edicion/tipos.js +160 -0
  464. package/dist/core/edicion/tipos.js.map +1 -0
  465. package/dist/core/engine-personality.d.ts +12 -0
  466. package/dist/core/engine-personality.d.ts.map +1 -0
  467. package/dist/core/engine-personality.js +53 -0
  468. package/dist/core/engine-personality.js.map +1 -0
  469. package/dist/core/errores/proveedor.d.ts +53 -0
  470. package/dist/core/errores/proveedor.d.ts.map +1 -0
  471. package/dist/core/errores/proveedor.js +191 -0
  472. package/dist/core/errores/proveedor.js.map +1 -0
  473. package/dist/core/estructural/buscar.d.ts +61 -0
  474. package/dist/core/estructural/buscar.d.ts.map +1 -0
  475. package/dist/core/estructural/buscar.js +261 -0
  476. package/dist/core/estructural/buscar.js.map +1 -0
  477. package/dist/core/estructural/editar.d.ts +36 -0
  478. package/dist/core/estructural/editar.d.ts.map +1 -0
  479. package/dist/core/estructural/editar.js +123 -0
  480. package/dist/core/estructural/editar.js.map +1 -0
  481. package/dist/core/estructural/tools.d.ts +11 -0
  482. package/dist/core/estructural/tools.d.ts.map +1 -0
  483. package/dist/core/estructural/tools.js +100 -0
  484. package/dist/core/estructural/tools.js.map +1 -0
  485. package/dist/core/experimental.d.ts.map +1 -1
  486. package/dist/core/experimental.js +10 -1
  487. package/dist/core/experimental.js.map +1 -1
  488. package/dist/core/extensiones/suplantacion.d.ts +49 -0
  489. package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
  490. package/dist/core/extensiones/suplantacion.js +61 -0
  491. package/dist/core/extensiones/suplantacion.js.map +1 -0
  492. package/dist/core/extensiones/vigilancia.d.ts +54 -0
  493. package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
  494. package/dist/core/extensiones/vigilancia.js +217 -0
  495. package/dist/core/extensiones/vigilancia.js.map +1 -0
  496. package/dist/core/extensions/index.d.ts +1 -1
  497. package/dist/core/extensions/index.d.ts.map +1 -1
  498. package/dist/core/extensions/index.js.map +1 -1
  499. package/dist/core/extensions/loader.d.ts.map +1 -1
  500. package/dist/core/extensions/loader.js +21 -6
  501. package/dist/core/extensions/loader.js.map +1 -1
  502. package/dist/core/extensions/types.d.ts +23 -4
  503. package/dist/core/extensions/types.d.ts.map +1 -1
  504. package/dist/core/extensions/types.js.map +1 -1
  505. package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
  506. package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
  507. package/dist/core/harness/fuentes-de-contexto.js +44 -0
  508. package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
  509. package/dist/core/harness/refine.d.ts +40 -0
  510. package/dist/core/harness/refine.d.ts.map +1 -0
  511. package/dist/core/harness/refine.js +109 -0
  512. package/dist/core/harness/refine.js.map +1 -0
  513. package/dist/core/harness/store.d.ts +75 -0
  514. package/dist/core/harness/store.d.ts.map +1 -0
  515. package/dist/core/harness/store.js +149 -0
  516. package/dist/core/harness/store.js.map +1 -0
  517. package/dist/core/hooks/contract.d.ts +85 -0
  518. package/dist/core/hooks/contract.d.ts.map +1 -0
  519. package/dist/core/hooks/contract.js +140 -0
  520. package/dist/core/hooks/contract.js.map +1 -0
  521. package/dist/core/hooks/runner.d.ts +42 -0
  522. package/dist/core/hooks/runner.d.ts.map +1 -0
  523. package/dist/core/hooks/runner.js +85 -0
  524. package/dist/core/hooks/runner.js.map +1 -0
  525. package/dist/core/hooks/session-hooks.d.ts +62 -0
  526. package/dist/core/hooks/session-hooks.d.ts.map +1 -0
  527. package/dist/core/hooks/session-hooks.js +84 -0
  528. package/dist/core/hooks/session-hooks.js.map +1 -0
  529. package/dist/core/importar/formatos.d.ts +69 -0
  530. package/dist/core/importar/formatos.d.ts.map +1 -0
  531. package/dist/core/importar/formatos.js +235 -0
  532. package/dist/core/importar/formatos.js.map +1 -0
  533. package/dist/core/interactivo/deteccion.d.ts +44 -0
  534. package/dist/core/interactivo/deteccion.d.ts.map +1 -0
  535. package/dist/core/interactivo/deteccion.js +82 -0
  536. package/dist/core/interactivo/deteccion.js.map +1 -0
  537. package/dist/core/interactivo/sesion.d.ts +50 -0
  538. package/dist/core/interactivo/sesion.d.ts.map +1 -0
  539. package/dist/core/interactivo/sesion.js +156 -0
  540. package/dist/core/interactivo/sesion.js.map +1 -0
  541. package/dist/core/interactivo/tools.d.ts +21 -0
  542. package/dist/core/interactivo/tools.d.ts.map +1 -0
  543. package/dist/core/interactivo/tools.js +122 -0
  544. package/dist/core/interactivo/tools.js.map +1 -0
  545. package/dist/core/keybindings.d.ts.map +1 -1
  546. package/dist/core/keybindings.js +2 -1
  547. package/dist/core/keybindings.js.map +1 -1
  548. package/dist/core/lectura/mapa.d.ts +70 -0
  549. package/dist/core/lectura/mapa.d.ts.map +1 -0
  550. package/dist/core/lectura/mapa.js +177 -0
  551. package/dist/core/lectura/mapa.js.map +1 -0
  552. package/dist/core/lectura/pdf.d.ts +49 -0
  553. package/dist/core/lectura/pdf.d.ts.map +1 -0
  554. package/dist/core/lectura/pdf.js +337 -0
  555. package/dist/core/lectura/pdf.js.map +1 -0
  556. package/dist/core/limpieza/comprobadores.d.ts +28 -0
  557. package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
  558. package/dist/core/limpieza/comprobadores.js +311 -0
  559. package/dist/core/limpieza/comprobadores.js.map +1 -0
  560. package/dist/core/limpieza/parseo.d.ts +19 -0
  561. package/dist/core/limpieza/parseo.d.ts.map +1 -0
  562. package/dist/core/limpieza/parseo.js +124 -0
  563. package/dist/core/limpieza/parseo.js.map +1 -0
  564. package/dist/core/limpieza/reparacion.d.ts +77 -0
  565. package/dist/core/limpieza/reparacion.d.ts.map +1 -0
  566. package/dist/core/limpieza/reparacion.js +254 -0
  567. package/dist/core/limpieza/reparacion.js.map +1 -0
  568. package/dist/core/limpieza/tipos.d.ts +56 -0
  569. package/dist/core/limpieza/tipos.d.ts.map +1 -0
  570. package/dist/core/limpieza/tipos.js +9 -0
  571. package/dist/core/limpieza/tipos.js.map +1 -0
  572. package/dist/core/lsp/cliente.d.ts +52 -0
  573. package/dist/core/lsp/cliente.d.ts.map +1 -0
  574. package/dist/core/lsp/cliente.js +232 -0
  575. package/dist/core/lsp/cliente.js.map +1 -0
  576. package/dist/core/lsp/descubrimiento.d.ts +62 -0
  577. package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
  578. package/dist/core/lsp/descubrimiento.js +152 -0
  579. package/dist/core/lsp/descubrimiento.js.map +1 -0
  580. package/dist/core/lsp/ediciones.d.ts +59 -0
  581. package/dist/core/lsp/ediciones.d.ts.map +1 -0
  582. package/dist/core/lsp/ediciones.js +89 -0
  583. package/dist/core/lsp/ediciones.js.map +1 -0
  584. package/dist/core/lsp/extension.d.ts +28 -0
  585. package/dist/core/lsp/extension.d.ts.map +1 -0
  586. package/dist/core/lsp/extension.js +34 -0
  587. package/dist/core/lsp/extension.js.map +1 -0
  588. package/dist/core/lsp/tools.d.ts +45 -0
  589. package/dist/core/lsp/tools.d.ts.map +1 -0
  590. package/dist/core/lsp/tools.js +265 -0
  591. package/dist/core/lsp/tools.js.map +1 -0
  592. package/dist/core/mcp/client.d.ts +60 -0
  593. package/dist/core/mcp/client.d.ts.map +1 -0
  594. package/dist/core/mcp/client.js +139 -0
  595. package/dist/core/mcp/client.js.map +1 -0
  596. package/dist/core/mcp/manager.d.ts +86 -0
  597. package/dist/core/mcp/manager.d.ts.map +1 -0
  598. package/dist/core/mcp/manager.js +124 -0
  599. package/dist/core/mcp/manager.js.map +1 -0
  600. package/dist/core/mcp/tools.d.ts +15 -0
  601. package/dist/core/mcp/tools.d.ts.map +1 -0
  602. package/dist/core/mcp/tools.js +84 -0
  603. package/dist/core/mcp/tools.js.map +1 -0
  604. package/dist/core/memory-engine/audit-export.d.ts +56 -0
  605. package/dist/core/memory-engine/audit-export.d.ts.map +1 -0
  606. package/dist/core/memory-engine/audit-export.js +100 -0
  607. package/dist/core/memory-engine/audit-export.js.map +1 -0
  608. package/dist/core/memory-engine/audit-indice.d.ts +153 -0
  609. package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
  610. package/dist/core/memory-engine/audit-indice.js +271 -0
  611. package/dist/core/memory-engine/audit-indice.js.map +1 -0
  612. package/dist/core/memory-engine/audit.d.ts +18 -6
  613. package/dist/core/memory-engine/audit.d.ts.map +1 -1
  614. package/dist/core/memory-engine/audit.js +32 -50
  615. package/dist/core/memory-engine/audit.js.map +1 -1
  616. package/dist/core/memory-engine/engine.d.ts +21 -4
  617. package/dist/core/memory-engine/engine.d.ts.map +1 -1
  618. package/dist/core/memory-engine/engine.js +219 -55
  619. package/dist/core/memory-engine/engine.js.map +1 -1
  620. package/dist/core/memory-engine/inverted-index.d.ts.map +1 -1
  621. package/dist/core/memory-engine/inverted-index.js +67 -10
  622. package/dist/core/memory-engine/inverted-index.js.map +1 -1
  623. package/dist/core/memory-engine/keychain.d.ts.map +1 -1
  624. package/dist/core/memory-engine/keychain.js +1 -6
  625. package/dist/core/memory-engine/keychain.js.map +1 -1
  626. package/dist/core/memory-engine/observation-store.d.ts +0 -1
  627. package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
  628. package/dist/core/memory-engine/observation-store.js +40 -12
  629. package/dist/core/memory-engine/observation-store.js.map +1 -1
  630. package/dist/core/memory-engine/refinements.d.ts +51 -0
  631. package/dist/core/memory-engine/refinements.d.ts.map +1 -0
  632. package/dist/core/memory-engine/refinements.js +99 -0
  633. package/dist/core/memory-engine/refinements.js.map +1 -0
  634. package/dist/core/memory-engine/scanner.d.ts.map +1 -1
  635. package/dist/core/memory-engine/scanner.js +25 -5
  636. package/dist/core/memory-engine/scanner.js.map +1 -1
  637. package/dist/core/memory-engine/security.d.ts.map +1 -1
  638. package/dist/core/memory-engine/security.js +131 -23
  639. package/dist/core/memory-engine/security.js.map +1 -1
  640. package/dist/core/memory-engine/session-indexer.d.ts.map +1 -1
  641. package/dist/core/memory-engine/session-indexer.js +8 -2
  642. package/dist/core/memory-engine/session-indexer.js.map +1 -1
  643. package/dist/core/memory-engine/tools.d.ts +2 -2
  644. package/dist/core/memory-engine/tools.d.ts.map +1 -1
  645. package/dist/core/memory-engine/tools.js +41 -8
  646. package/dist/core/memory-engine/tools.js.map +1 -1
  647. package/dist/core/memory-engine/types.d.ts +2 -0
  648. package/dist/core/memory-engine/types.d.ts.map +1 -1
  649. package/dist/core/memory-engine/types.js.map +1 -1
  650. package/dist/core/memory-engine/vault.d.ts.map +1 -1
  651. package/dist/core/memory-engine/vault.js +2 -2
  652. package/dist/core/memory-engine/vault.js.map +1 -1
  653. package/dist/core/model-config.d.ts.map +1 -1
  654. package/dist/core/model-config.js +2 -1
  655. package/dist/core/model-config.js.map +1 -1
  656. package/dist/core/model-resolver.d.ts +1 -0
  657. package/dist/core/model-resolver.d.ts.map +1 -1
  658. package/dist/core/model-resolver.js +19 -7
  659. package/dist/core/model-resolver.js.map +1 -1
  660. package/dist/core/models-store.d.ts.map +1 -1
  661. package/dist/core/models-store.js +2 -1
  662. package/dist/core/models-store.js.map +1 -1
  663. package/dist/core/muestreo-restringido.d.ts +49 -0
  664. package/dist/core/muestreo-restringido.d.ts.map +1 -0
  665. package/dist/core/muestreo-restringido.js +65 -0
  666. package/dist/core/muestreo-restringido.js.map +1 -0
  667. package/dist/core/orphan-process-journal.d.ts +48 -0
  668. package/dist/core/orphan-process-journal.d.ts.map +1 -0
  669. package/dist/core/orphan-process-journal.js +116 -0
  670. package/dist/core/orphan-process-journal.js.map +1 -0
  671. package/dist/core/package-manager.d.ts.map +1 -1
  672. package/dist/core/package-manager.js +11 -6
  673. package/dist/core/package-manager.js.map +1 -1
  674. package/dist/core/pi-manifest.d.ts.map +1 -1
  675. package/dist/core/pi-manifest.js +2 -1
  676. package/dist/core/pi-manifest.js.map +1 -1
  677. package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
  678. package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
  679. package/dist/core/privacidad/categorias-especiales.js +745 -0
  680. package/dist/core/privacidad/categorias-especiales.js.map +1 -0
  681. package/dist/core/privacidad/tapar.d.ts +48 -0
  682. package/dist/core/privacidad/tapar.d.ts.map +1 -0
  683. package/dist/core/privacidad/tapar.js +66 -0
  684. package/dist/core/privacidad/tapar.js.map +1 -0
  685. package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
  686. package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
  687. package/dist/core/prompt-cache/diagnostics.js +100 -0
  688. package/dist/core/prompt-cache/diagnostics.js.map +1 -0
  689. package/dist/core/prompt-cache/index.d.ts +33 -0
  690. package/dist/core/prompt-cache/index.d.ts.map +1 -0
  691. package/dist/core/prompt-cache/index.js +189 -0
  692. package/dist/core/prompt-cache/index.js.map +1 -0
  693. package/dist/core/prompt-cache/payload.d.ts +58 -0
  694. package/dist/core/prompt-cache/payload.d.ts.map +1 -0
  695. package/dist/core/prompt-cache/payload.js +122 -0
  696. package/dist/core/prompt-cache/payload.js.map +1 -0
  697. package/dist/core/prompt-cache/stabilize.d.ts +65 -0
  698. package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
  699. package/dist/core/prompt-cache/stabilize.js +137 -0
  700. package/dist/core/prompt-cache/stabilize.js.map +1 -0
  701. package/dist/core/prompt-cache/stats.d.ts +55 -0
  702. package/dist/core/prompt-cache/stats.d.ts.map +1 -0
  703. package/dist/core/prompt-cache/stats.js +158 -0
  704. package/dist/core/prompt-cache/stats.js.map +1 -0
  705. package/dist/core/prompt-eleccion.d.ts +38 -0
  706. package/dist/core/prompt-eleccion.d.ts.map +1 -0
  707. package/dist/core/prompt-eleccion.js +46 -0
  708. package/dist/core/prompt-eleccion.js.map +1 -0
  709. package/dist/core/prompt-optimizer.d.ts +53 -0
  710. package/dist/core/prompt-optimizer.d.ts.map +1 -0
  711. package/dist/core/prompt-optimizer.js +138 -0
  712. package/dist/core/prompt-optimizer.js.map +1 -0
  713. package/dist/core/prompts/montar.d.ts +75 -0
  714. package/dist/core/prompts/montar.d.ts.map +1 -0
  715. package/dist/core/prompts/montar.js +146 -0
  716. package/dist/core/prompts/montar.js.map +1 -0
  717. package/dist/core/prompts/plantilla.d.ts +54 -0
  718. package/dist/core/prompts/plantilla.d.ts.map +1 -0
  719. package/dist/core/prompts/plantilla.js +153 -0
  720. package/dist/core/prompts/plantilla.js.map +1 -0
  721. package/dist/core/prompts/sistema.md +134 -0
  722. package/dist/core/provider-attribution.d.ts +24 -2
  723. package/dist/core/provider-attribution.d.ts.map +1 -1
  724. package/dist/core/provider-attribution.js +24 -42
  725. package/dist/core/provider-attribution.js.map +1 -1
  726. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  727. package/dist/core/remote-catalog-provider.js +2 -1
  728. package/dist/core/remote-catalog-provider.js.map +1 -1
  729. package/dist/core/remoto/destino.d.ts +38 -0
  730. package/dist/core/remoto/destino.d.ts.map +1 -0
  731. package/dist/core/remoto/destino.js +105 -0
  732. package/dist/core/remoto/destino.js.map +1 -0
  733. package/dist/core/remoto/ejecutor.d.ts +59 -0
  734. package/dist/core/remoto/ejecutor.d.ts.map +1 -0
  735. package/dist/core/remoto/ejecutor.js +225 -0
  736. package/dist/core/remoto/ejecutor.js.map +1 -0
  737. package/dist/core/remoto/ficheros.d.ts +29 -0
  738. package/dist/core/remoto/ficheros.d.ts.map +1 -0
  739. package/dist/core/remoto/ficheros.js +90 -0
  740. package/dist/core/remoto/ficheros.js.map +1 -0
  741. package/dist/core/remoto/registro-extension.d.ts +15 -0
  742. package/dist/core/remoto/registro-extension.d.ts.map +1 -0
  743. package/dist/core/remoto/registro-extension.js +17 -0
  744. package/dist/core/remoto/registro-extension.js.map +1 -0
  745. package/dist/core/remoto/tools.d.ts +28 -0
  746. package/dist/core/remoto/tools.d.ts.map +1 -0
  747. package/dist/core/remoto/tools.js +31 -0
  748. package/dist/core/remoto/tools.js.map +1 -0
  749. package/dist/core/resource-loader.d.ts +58 -0
  750. package/dist/core/resource-loader.d.ts.map +1 -1
  751. package/dist/core/resource-loader.js +326 -8
  752. package/dist/core/resource-loader.js.map +1 -1
  753. package/dist/core/revision/hallazgo.d.ts +51 -0
  754. package/dist/core/revision/hallazgo.d.ts.map +1 -0
  755. package/dist/core/revision/hallazgo.js +73 -0
  756. package/dist/core/revision/hallazgo.js.map +1 -0
  757. package/dist/core/revision/revisor.d.ts +81 -0
  758. package/dist/core/revision/revisor.d.ts.map +1 -0
  759. package/dist/core/revision/revisor.js +132 -0
  760. package/dist/core/revision/revisor.js.map +1 -0
  761. package/dist/core/revision/sarif.d.ts +30 -0
  762. package/dist/core/revision/sarif.d.ts.map +1 -0
  763. package/dist/core/revision/sarif.js +83 -0
  764. package/dist/core/revision/sarif.js.map +1 -0
  765. package/dist/core/scheduler/scheduler.d.ts +87 -0
  766. package/dist/core/scheduler/scheduler.d.ts.map +1 -0
  767. package/dist/core/scheduler/scheduler.js +178 -0
  768. package/dist/core/scheduler/scheduler.js.map +1 -0
  769. package/dist/core/sdk.d.ts +8 -0
  770. package/dist/core/sdk.d.ts.map +1 -1
  771. package/dist/core/sdk.js +11 -1
  772. package/dist/core/sdk.js.map +1 -1
  773. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
  774. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
  775. package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
  776. package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
  777. package/dist/core/session-manager.d.ts.map +1 -1
  778. package/dist/core/session-manager.js +2 -1
  779. package/dist/core/session-manager.js.map +1 -1
  780. package/dist/core/settings-diagnostics.d.ts +9 -0
  781. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  782. package/dist/core/settings-diagnostics.js +21 -0
  783. package/dist/core/settings-diagnostics.js.map +1 -0
  784. package/dist/core/settings-manager.d.ts +156 -0
  785. package/dist/core/settings-manager.d.ts.map +1 -1
  786. package/dist/core/settings-manager.js +255 -10
  787. package/dist/core/settings-manager.js.map +1 -1
  788. package/dist/core/skills.d.ts.map +1 -1
  789. package/dist/core/skills.js +51 -33
  790. package/dist/core/skills.js.map +1 -1
  791. package/dist/core/slash-commands.d.ts.map +1 -1
  792. package/dist/core/slash-commands.js +2 -1
  793. package/dist/core/slash-commands.js.map +1 -1
  794. package/dist/core/system-prompt.d.ts +17 -0
  795. package/dist/core/system-prompt.d.ts.map +1 -1
  796. package/dist/core/system-prompt.js +13 -5
  797. package/dist/core/system-prompt.js.map +1 -1
  798. package/dist/core/telemetria/otlp.d.ts +122 -0
  799. package/dist/core/telemetria/otlp.d.ts.map +1 -0
  800. package/dist/core/telemetria/otlp.js +373 -0
  801. package/dist/core/telemetria/otlp.js.map +1 -0
  802. package/dist/core/tools/coercion-argumentos.d.ts +48 -0
  803. package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
  804. package/dist/core/tools/coercion-argumentos.js +99 -0
  805. package/dist/core/tools/coercion-argumentos.js.map +1 -0
  806. package/dist/core/tools/edit-diff.d.ts +0 -12
  807. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  808. package/dist/core/tools/edit-diff.js +234 -12
  809. package/dist/core/tools/edit-diff.js.map +1 -1
  810. package/dist/core/tools/edit.d.ts.map +1 -1
  811. package/dist/core/tools/edit.js +28 -5
  812. package/dist/core/tools/edit.js.map +1 -1
  813. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  814. package/dist/core/tools/file-mutation-queue.js +5 -0
  815. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  816. package/dist/core/tools/index.d.ts.map +1 -1
  817. package/dist/core/tools/index.js +2 -2
  818. package/dist/core/tools/index.js.map +1 -1
  819. package/dist/core/tools/json-tolerante.d.ts +30 -0
  820. package/dist/core/tools/json-tolerante.d.ts.map +1 -0
  821. package/dist/core/tools/json-tolerante.js +70 -0
  822. package/dist/core/tools/json-tolerante.js.map +1 -0
  823. package/dist/core/tools/project-memory-tool.d.ts.map +1 -1
  824. package/dist/core/tools/project-memory-tool.js +4 -1
  825. package/dist/core/tools/project-memory-tool.js.map +1 -1
  826. package/dist/core/tools/read.d.ts.map +1 -1
  827. package/dist/core/tools/read.js +17 -0
  828. package/dist/core/tools/read.js.map +1 -1
  829. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
  830. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  831. package/dist/core/tools/tool-definition-wrapper.js +17 -1
  832. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  833. package/dist/core/trust-manager.d.ts.map +1 -1
  834. package/dist/core/trust-manager.js +2 -1
  835. package/dist/core/trust-manager.js.map +1 -1
  836. package/dist/core/turno-vacio/detectar.d.ts +38 -0
  837. package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
  838. package/dist/core/turno-vacio/detectar.js +66 -0
  839. package/dist/core/turno-vacio/detectar.js.map +1 -0
  840. package/dist/core/undo/journal.d.ts +57 -0
  841. package/dist/core/undo/journal.d.ts.map +1 -0
  842. package/dist/core/undo/journal.js +178 -0
  843. package/dist/core/undo/journal.js.map +1 -0
  844. package/dist/core/urls-internas/auditoria.d.ts +10 -0
  845. package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
  846. package/dist/core/urls-internas/auditoria.js +42 -0
  847. package/dist/core/urls-internas/auditoria.js.map +1 -0
  848. package/dist/core/urls-internas/boveda.d.ts +13 -0
  849. package/dist/core/urls-internas/boveda.d.ts.map +1 -0
  850. package/dist/core/urls-internas/boveda.js +40 -0
  851. package/dist/core/urls-internas/boveda.js.map +1 -0
  852. package/dist/core/urls-internas/lector.d.ts +30 -0
  853. package/dist/core/urls-internas/lector.d.ts.map +1 -0
  854. package/dist/core/urls-internas/lector.js +56 -0
  855. package/dist/core/urls-internas/lector.js.map +1 -0
  856. package/dist/core/urls-internas/memoria.d.ts +11 -0
  857. package/dist/core/urls-internas/memoria.d.ts.map +1 -0
  858. package/dist/core/urls-internas/memoria.js +25 -0
  859. package/dist/core/urls-internas/memoria.js.map +1 -0
  860. package/dist/core/urls-internas/parse.d.ts +28 -0
  861. package/dist/core/urls-internas/parse.d.ts.map +1 -0
  862. package/dist/core/urls-internas/parse.js +32 -0
  863. package/dist/core/urls-internas/parse.js.map +1 -0
  864. package/dist/core/urls-internas/reglas.d.ts +10 -0
  865. package/dist/core/urls-internas/reglas.d.ts.map +1 -0
  866. package/dist/core/urls-internas/reglas.js +31 -0
  867. package/dist/core/urls-internas/reglas.js.map +1 -0
  868. package/dist/core/usage/aggregate.d.ts +68 -0
  869. package/dist/core/usage/aggregate.d.ts.map +1 -0
  870. package/dist/core/usage/aggregate.js +93 -0
  871. package/dist/core/usage/aggregate.js.map +1 -0
  872. package/dist/core/usage/cuota/anthropic.d.ts +10 -0
  873. package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
  874. package/dist/core/usage/cuota/anthropic.js +63 -0
  875. package/dist/core/usage/cuota/anthropic.js.map +1 -0
  876. package/dist/core/usage/cuota/cache.d.ts +20 -0
  877. package/dist/core/usage/cuota/cache.d.ts.map +1 -0
  878. package/dist/core/usage/cuota/cache.js +36 -0
  879. package/dist/core/usage/cuota/cache.js.map +1 -0
  880. package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
  881. package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
  882. package/dist/core/usage/cuota/github-copilot.js +67 -0
  883. package/dist/core/usage/cuota/github-copilot.js.map +1 -0
  884. package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
  885. package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
  886. package/dist/core/usage/cuota/google-gemini.js +72 -0
  887. package/dist/core/usage/cuota/google-gemini.js.map +1 -0
  888. package/dist/core/usage/cuota/index.d.ts +25 -0
  889. package/dist/core/usage/cuota/index.d.ts.map +1 -0
  890. package/dist/core/usage/cuota/index.js +50 -0
  891. package/dist/core/usage/cuota/index.js.map +1 -0
  892. package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
  893. package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
  894. package/dist/core/usage/cuota/openai-codex.js +59 -0
  895. package/dist/core/usage/cuota/openai-codex.js.map +1 -0
  896. package/dist/core/usage/cuota/openrouter.d.ts +10 -0
  897. package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
  898. package/dist/core/usage/cuota/openrouter.js +47 -0
  899. package/dist/core/usage/cuota/openrouter.js.map +1 -0
  900. package/dist/core/usage/cuota/tipos.d.ts +50 -0
  901. package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
  902. package/dist/core/usage/cuota/tipos.js +25 -0
  903. package/dist/core/usage/cuota/tipos.js.map +1 -0
  904. package/dist/core/web/busqueda-nativa.d.ts +82 -0
  905. package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
  906. package/dist/core/web/busqueda-nativa.js +163 -0
  907. package/dist/core/web/busqueda-nativa.js.map +1 -0
  908. package/dist/core/web/destino.d.ts +58 -0
  909. package/dist/core/web/destino.d.ts.map +1 -0
  910. package/dist/core/web/destino.js +127 -0
  911. package/dist/core/web/destino.js.map +1 -0
  912. package/dist/core/web/proveedores/brave.d.ts +6 -0
  913. package/dist/core/web/proveedores/brave.d.ts.map +1 -0
  914. package/dist/core/web/proveedores/brave.js +20 -0
  915. package/dist/core/web/proveedores/brave.js.map +1 -0
  916. package/dist/core/web/proveedores/claves.d.ts +19 -0
  917. package/dist/core/web/proveedores/claves.d.ts.map +1 -0
  918. package/dist/core/web/proveedores/claves.js +36 -0
  919. package/dist/core/web/proveedores/claves.js.map +1 -0
  920. package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
  921. package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
  922. package/dist/core/web/proveedores/duckduckgo.js +109 -0
  923. package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
  924. package/dist/core/web/proveedores/ecosia.d.ts +3 -0
  925. package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
  926. package/dist/core/web/proveedores/ecosia.js +72 -0
  927. package/dist/core/web/proveedores/ecosia.js.map +1 -0
  928. package/dist/core/web/proveedores/exa.d.ts +6 -0
  929. package/dist/core/web/proveedores/exa.d.ts.map +1 -0
  930. package/dist/core/web/proveedores/exa.js +24 -0
  931. package/dist/core/web/proveedores/exa.js.map +1 -0
  932. package/dist/core/web/proveedores/mojeek.d.ts +3 -0
  933. package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
  934. package/dist/core/web/proveedores/mojeek.js +65 -0
  935. package/dist/core/web/proveedores/mojeek.js.map +1 -0
  936. package/dist/core/web/proveedores/navegador.d.ts +10 -0
  937. package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
  938. package/dist/core/web/proveedores/navegador.js +13 -0
  939. package/dist/core/web/proveedores/navegador.js.map +1 -0
  940. package/dist/core/web/proveedores/registro.d.ts +43 -0
  941. package/dist/core/web/proveedores/registro.d.ts.map +1 -0
  942. package/dist/core/web/proveedores/registro.js +49 -0
  943. package/dist/core/web/proveedores/registro.js.map +1 -0
  944. package/dist/core/web/proveedores/searxng.d.ts +9 -0
  945. package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
  946. package/dist/core/web/proveedores/searxng.js +17 -0
  947. package/dist/core/web/proveedores/searxng.js.map +1 -0
  948. package/dist/core/web/proveedores/serper.d.ts +9 -0
  949. package/dist/core/web/proveedores/serper.d.ts.map +1 -0
  950. package/dist/core/web/proveedores/serper.js +19 -0
  951. package/dist/core/web/proveedores/serper.js.map +1 -0
  952. package/dist/core/web/proveedores/tavily.d.ts +6 -0
  953. package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
  954. package/dist/core/web/proveedores/tavily.js +19 -0
  955. package/dist/core/web/proveedores/tavily.js.map +1 -0
  956. package/dist/core/web/proveedores/tipos.d.ts +36 -0
  957. package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
  958. package/dist/core/web/proveedores/tipos.js +10 -0
  959. package/dist/core/web/proveedores/tipos.js.map +1 -0
  960. package/dist/core/web/registro-red.d.ts +43 -0
  961. package/dist/core/web/registro-red.d.ts.map +1 -0
  962. package/dist/core/web/registro-red.js +86 -0
  963. package/dist/core/web/registro-red.js.map +1 -0
  964. package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
  965. package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
  966. package/dist/core/web/scrapers/cisa-kev.js +38 -0
  967. package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
  968. package/dist/core/web/scrapers/crates-io.d.ts +11 -0
  969. package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
  970. package/dist/core/web/scrapers/crates-io.js +29 -0
  971. package/dist/core/web/scrapers/crates-io.js.map +1 -0
  972. package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
  973. package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
  974. package/dist/core/web/scrapers/docs-rs.js +35 -0
  975. package/dist/core/web/scrapers/docs-rs.js.map +1 -0
  976. package/dist/core/web/scrapers/github.d.ts +3 -0
  977. package/dist/core/web/scrapers/github.d.ts.map +1 -0
  978. package/dist/core/web/scrapers/github.js +72 -0
  979. package/dist/core/web/scrapers/github.js.map +1 -0
  980. package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
  981. package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
  982. package/dist/core/web/scrapers/go-pkg.js +30 -0
  983. package/dist/core/web/scrapers/go-pkg.js.map +1 -0
  984. package/dist/core/web/scrapers/hex.d.ts +6 -0
  985. package/dist/core/web/scrapers/hex.d.ts.map +1 -0
  986. package/dist/core/web/scrapers/hex.js +27 -0
  987. package/dist/core/web/scrapers/hex.js.map +1 -0
  988. package/dist/core/web/scrapers/maven.d.ts +8 -0
  989. package/dist/core/web/scrapers/maven.d.ts.map +1 -0
  990. package/dist/core/web/scrapers/maven.js +41 -0
  991. package/dist/core/web/scrapers/maven.js.map +1 -0
  992. package/dist/core/web/scrapers/mdn.d.ts +6 -0
  993. package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
  994. package/dist/core/web/scrapers/mdn.js +28 -0
  995. package/dist/core/web/scrapers/mdn.js.map +1 -0
  996. package/dist/core/web/scrapers/npm.d.ts +11 -0
  997. package/dist/core/web/scrapers/npm.d.ts.map +1 -0
  998. package/dist/core/web/scrapers/npm.js +57 -0
  999. package/dist/core/web/scrapers/npm.js.map +1 -0
  1000. package/dist/core/web/scrapers/nuget.d.ts +8 -0
  1001. package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
  1002. package/dist/core/web/scrapers/nuget.js +22 -0
  1003. package/dist/core/web/scrapers/nuget.js.map +1 -0
  1004. package/dist/core/web/scrapers/nvd.d.ts +7 -0
  1005. package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
  1006. package/dist/core/web/scrapers/nvd.js +37 -0
  1007. package/dist/core/web/scrapers/nvd.js.map +1 -0
  1008. package/dist/core/web/scrapers/pypi.d.ts +6 -0
  1009. package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
  1010. package/dist/core/web/scrapers/pypi.js +31 -0
  1011. package/dist/core/web/scrapers/pypi.js.map +1 -0
  1012. package/dist/core/web/scrapers/registro.d.ts +13 -0
  1013. package/dist/core/web/scrapers/registro.d.ts.map +1 -0
  1014. package/dist/core/web/scrapers/registro.js +65 -0
  1015. package/dist/core/web/scrapers/registro.js.map +1 -0
  1016. package/dist/core/web/scrapers/rubygems.d.ts +6 -0
  1017. package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
  1018. package/dist/core/web/scrapers/rubygems.js +23 -0
  1019. package/dist/core/web/scrapers/rubygems.js.map +1 -0
  1020. package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
  1021. package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
  1022. package/dist/core/web/scrapers/stackoverflow.js +46 -0
  1023. package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
  1024. package/dist/core/web/scrapers/tipos.d.ts +42 -0
  1025. package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
  1026. package/dist/core/web/scrapers/tipos.js +23 -0
  1027. package/dist/core/web/scrapers/tipos.js.map +1 -0
  1028. package/dist/core/web/texto.d.ts +10 -0
  1029. package/dist/core/web/texto.d.ts.map +1 -0
  1030. package/dist/core/web/texto.js +26 -0
  1031. package/dist/core/web/texto.js.map +1 -0
  1032. package/dist/core/web/tools.d.ts +91 -0
  1033. package/dist/core/web/tools.d.ts.map +1 -0
  1034. package/dist/core/web/tools.js +304 -0
  1035. package/dist/core/web/tools.js.map +1 -0
  1036. package/dist/core/wiki/almacen.d.ts +33 -0
  1037. package/dist/core/wiki/almacen.d.ts.map +1 -0
  1038. package/dist/core/wiki/almacen.js +93 -0
  1039. package/dist/core/wiki/almacen.js.map +1 -0
  1040. package/dist/core/wiki/citas.d.ts +111 -0
  1041. package/dist/core/wiki/citas.d.ts.map +1 -0
  1042. package/dist/core/wiki/citas.js +146 -0
  1043. package/dist/core/wiki/citas.js.map +1 -0
  1044. package/dist/core/workflows/agent-runner.d.ts +88 -0
  1045. package/dist/core/workflows/agent-runner.d.ts.map +1 -0
  1046. package/dist/core/workflows/agent-runner.js +312 -0
  1047. package/dist/core/workflows/agent-runner.js.map +1 -0
  1048. package/dist/core/workflows/builtins.d.ts +41 -0
  1049. package/dist/core/workflows/builtins.d.ts.map +1 -0
  1050. package/dist/core/workflows/builtins.js +283 -0
  1051. package/dist/core/workflows/builtins.js.map +1 -0
  1052. package/dist/core/workflows/contrato/esquema.d.ts +32 -0
  1053. package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
  1054. package/dist/core/workflows/contrato/esquema.js +25 -0
  1055. package/dist/core/workflows/contrato/esquema.js.map +1 -0
  1056. package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
  1057. package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
  1058. package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
  1059. package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
  1060. package/dist/core/workflows/contrato/validador.d.ts +30 -0
  1061. package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
  1062. package/dist/core/workflows/contrato/validador.js +56 -0
  1063. package/dist/core/workflows/contrato/validador.js.map +1 -0
  1064. package/dist/core/workflows/contrato/yield.d.ts +65 -0
  1065. package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
  1066. package/dist/core/workflows/contrato/yield.js +80 -0
  1067. package/dist/core/workflows/contrato/yield.js.map +1 -0
  1068. package/dist/core/workflows/goal-engine/engine.d.ts +151 -0
  1069. package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -0
  1070. package/dist/core/workflows/goal-engine/engine.js +503 -0
  1071. package/dist/core/workflows/goal-engine/engine.js.map +1 -0
  1072. package/dist/core/workflows/goal-engine/errors.d.ts +7 -0
  1073. package/dist/core/workflows/goal-engine/errors.d.ts.map +1 -0
  1074. package/dist/core/workflows/goal-engine/errors.js +9 -0
  1075. package/dist/core/workflows/goal-engine/errors.js.map +1 -0
  1076. package/dist/core/workflows/goal-engine/index.d.ts +13 -0
  1077. package/dist/core/workflows/goal-engine/index.d.ts.map +1 -0
  1078. package/dist/core/workflows/goal-engine/index.js +8 -0
  1079. package/dist/core/workflows/goal-engine/index.js.map +1 -0
  1080. package/dist/core/workflows/goal-engine/persistence.d.ts +31 -0
  1081. package/dist/core/workflows/goal-engine/persistence.d.ts.map +1 -0
  1082. package/dist/core/workflows/goal-engine/persistence.js +145 -0
  1083. package/dist/core/workflows/goal-engine/persistence.js.map +1 -0
  1084. package/dist/core/workflows/goal-engine/prompts.d.ts +37 -0
  1085. package/dist/core/workflows/goal-engine/prompts.d.ts.map +1 -0
  1086. package/dist/core/workflows/goal-engine/prompts.js +131 -0
  1087. package/dist/core/workflows/goal-engine/prompts.js.map +1 -0
  1088. package/dist/core/workflows/goal-engine/state.d.ts +41 -0
  1089. package/dist/core/workflows/goal-engine/state.d.ts.map +1 -0
  1090. package/dist/core/workflows/goal-engine/state.js +397 -0
  1091. package/dist/core/workflows/goal-engine/state.js.map +1 -0
  1092. package/dist/core/workflows/goal-engine/tools.d.ts +31 -0
  1093. package/dist/core/workflows/goal-engine/tools.d.ts.map +1 -0
  1094. package/dist/core/workflows/goal-engine/tools.js +211 -0
  1095. package/dist/core/workflows/goal-engine/tools.js.map +1 -0
  1096. package/dist/core/workflows/goal-engine/types.d.ts +286 -0
  1097. package/dist/core/workflows/goal-engine/types.d.ts.map +1 -0
  1098. package/dist/core/workflows/goal-engine/types.js +17 -0
  1099. package/dist/core/workflows/goal-engine/types.js.map +1 -0
  1100. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts +23 -0
  1101. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts.map +1 -0
  1102. package/dist/core/workflows/goal-engine/worktree-fingerprint.js +72 -0
  1103. package/dist/core/workflows/goal-engine/worktree-fingerprint.js.map +1 -0
  1104. package/dist/core/workflows/graph-sync.d.ts +67 -0
  1105. package/dist/core/workflows/graph-sync.d.ts.map +1 -0
  1106. package/dist/core/workflows/graph-sync.js +188 -0
  1107. package/dist/core/workflows/graph-sync.js.map +1 -0
  1108. package/dist/core/workflows/graph.d.ts +143 -0
  1109. package/dist/core/workflows/graph.d.ts.map +1 -0
  1110. package/dist/core/workflows/graph.js +319 -0
  1111. package/dist/core/workflows/graph.js.map +1 -0
  1112. package/dist/core/workflows/index.d.ts +26 -0
  1113. package/dist/core/workflows/index.d.ts.map +1 -0
  1114. package/dist/core/workflows/index.js +18 -0
  1115. package/dist/core/workflows/index.js.map +1 -0
  1116. package/dist/core/workflows/journal.d.ts +68 -0
  1117. package/dist/core/workflows/journal.d.ts.map +1 -0
  1118. package/dist/core/workflows/journal.js +83 -0
  1119. package/dist/core/workflows/journal.js.map +1 -0
  1120. package/dist/core/workflows/manager.d.ts +122 -0
  1121. package/dist/core/workflows/manager.d.ts.map +1 -0
  1122. package/dist/core/workflows/manager.js +351 -0
  1123. package/dist/core/workflows/manager.js.map +1 -0
  1124. package/dist/core/workflows/resolve-script.d.ts +35 -0
  1125. package/dist/core/workflows/resolve-script.d.ts.map +1 -0
  1126. package/dist/core/workflows/resolve-script.js +66 -0
  1127. package/dist/core/workflows/resolve-script.js.map +1 -0
  1128. package/dist/core/workflows/runtime.d.ts +62 -0
  1129. package/dist/core/workflows/runtime.d.ts.map +1 -0
  1130. package/dist/core/workflows/runtime.js +380 -0
  1131. package/dist/core/workflows/runtime.js.map +1 -0
  1132. package/dist/core/workflows/save-as-skill.d.ts +27 -0
  1133. package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
  1134. package/dist/core/workflows/save-as-skill.js +54 -0
  1135. package/dist/core/workflows/save-as-skill.js.map +1 -0
  1136. package/dist/core/workflows/shared-store.d.ts +31 -0
  1137. package/dist/core/workflows/shared-store.d.ts.map +1 -0
  1138. package/dist/core/workflows/shared-store.js +80 -0
  1139. package/dist/core/workflows/shared-store.js.map +1 -0
  1140. package/dist/core/workflows/subagent-host.d.ts +50 -0
  1141. package/dist/core/workflows/subagent-host.d.ts.map +1 -0
  1142. package/dist/core/workflows/subagent-host.js +225 -0
  1143. package/dist/core/workflows/subagent-host.js.map +1 -0
  1144. package/dist/core/workflows/tool-workflow.d.ts +22 -0
  1145. package/dist/core/workflows/tool-workflow.d.ts.map +1 -0
  1146. package/dist/core/workflows/tool-workflow.js +120 -0
  1147. package/dist/core/workflows/tool-workflow.js.map +1 -0
  1148. package/dist/core/workflows/types.d.ts +191 -0
  1149. package/dist/core/workflows/types.d.ts.map +1 -0
  1150. package/dist/core/workflows/types.js +26 -0
  1151. package/dist/core/workflows/types.js.map +1 -0
  1152. package/dist/core/workflows/worktree.d.ts +42 -0
  1153. package/dist/core/workflows/worktree.d.ts.map +1 -0
  1154. package/dist/core/workflows/worktree.js +107 -0
  1155. package/dist/core/workflows/worktree.js.map +1 -0
  1156. package/dist/extensions/llama/index.d.ts.map +1 -1
  1157. package/dist/extensions/llama/index.js +2 -0
  1158. package/dist/extensions/llama/index.js.map +1 -1
  1159. package/dist/extensions/llama/provider.d.ts.map +1 -1
  1160. package/dist/extensions/llama/provider.js +6 -2
  1161. package/dist/extensions/llama/provider.js.map +1 -1
  1162. package/dist/extensions/remoto/index.d.ts +22 -0
  1163. package/dist/extensions/remoto/index.d.ts.map +1 -0
  1164. package/dist/extensions/remoto/index.js +54 -0
  1165. package/dist/extensions/remoto/index.js.map +1 -0
  1166. package/dist/index.d.ts +1 -13
  1167. package/dist/index.d.ts.map +1 -1
  1168. package/dist/index.js +7 -13
  1169. package/dist/index.js.map +1 -1
  1170. package/dist/main.d.ts +4 -0
  1171. package/dist/main.d.ts.map +1 -1
  1172. package/dist/main.js +26 -15
  1173. package/dist/main.js.map +1 -1
  1174. package/dist/migrations.d.ts.map +1 -1
  1175. package/dist/migrations.js +4 -3
  1176. package/dist/migrations.js.map +1 -1
  1177. package/dist/modes/acp/acp-mode.d.ts +42 -0
  1178. package/dist/modes/acp/acp-mode.d.ts.map +1 -0
  1179. package/dist/modes/acp/acp-mode.js +190 -0
  1180. package/dist/modes/acp/acp-mode.js.map +1 -0
  1181. package/dist/modes/acp/events.d.ts +74 -0
  1182. package/dist/modes/acp/events.d.ts.map +1 -0
  1183. package/dist/modes/acp/events.js +116 -0
  1184. package/dist/modes/acp/events.js.map +1 -0
  1185. package/dist/modes/interactive/components/home-screen.d.ts.map +1 -1
  1186. package/dist/modes/interactive/components/home-screen.js +2 -2
  1187. package/dist/modes/interactive/components/home-screen.js.map +1 -1
  1188. package/dist/modes/interactive/components/model-selector.d.ts +9 -3
  1189. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  1190. package/dist/modes/interactive/components/model-selector.js +56 -12
  1191. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  1192. package/dist/modes/interactive/components/prompt-optimization.d.ts +16 -0
  1193. package/dist/modes/interactive/components/prompt-optimization.d.ts.map +1 -0
  1194. package/dist/modes/interactive/components/prompt-optimization.js +46 -0
  1195. package/dist/modes/interactive/components/prompt-optimization.js.map +1 -0
  1196. package/dist/modes/interactive/components/settings-selector.d.ts +19 -2
  1197. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1198. package/dist/modes/interactive/components/settings-selector.js +180 -56
  1199. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1200. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  1201. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  1202. package/dist/modes/interactive/components/settings-submenu.js +165 -0
  1203. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  1204. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  1205. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  1206. package/dist/modes/interactive/components/thinking-selector.js +74 -17
  1207. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  1208. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  1209. package/dist/modes/interactive/external-editor.js +2 -1
  1210. package/dist/modes/interactive/external-editor.js.map +1 -1
  1211. package/dist/modes/interactive/interactive-mode.d.ts +21 -1
  1212. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1213. package/dist/modes/interactive/interactive-mode.js +709 -75
  1214. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1215. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  1216. package/dist/modes/interactive/theme/theme.js +4 -3
  1217. package/dist/modes/interactive/theme/theme.js.map +1 -1
  1218. package/dist/modes/json-event.d.ts +16 -13
  1219. package/dist/modes/json-event.d.ts.map +1 -1
  1220. package/dist/modes/json-event.js +20 -6
  1221. package/dist/modes/json-event.js.map +1 -1
  1222. package/dist/modes/print-mode.d.ts.map +1 -1
  1223. package/dist/modes/print-mode.js +11 -0
  1224. package/dist/modes/print-mode.js.map +1 -1
  1225. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  1226. package/dist/modes/rpc/rpc-mode.js +173 -0
  1227. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  1228. package/dist/modes/rpc/rpc-types.d.ts +29 -0
  1229. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  1230. package/dist/modes/rpc/rpc-types.js.map +1 -1
  1231. package/dist/package-manager-cli.d.ts.map +1 -1
  1232. package/dist/package-manager-cli.js +27 -5
  1233. package/dist/package-manager-cli.js.map +1 -1
  1234. package/dist/server/attach.d.ts +56 -0
  1235. package/dist/server/attach.d.ts.map +1 -0
  1236. package/dist/server/attach.js +130 -0
  1237. package/dist/server/attach.js.map +1 -0
  1238. package/dist/server/extension-ops.d.ts +40 -0
  1239. package/dist/server/extension-ops.d.ts.map +1 -0
  1240. package/dist/server/extension-ops.js +146 -0
  1241. package/dist/server/extension-ops.js.map +1 -0
  1242. package/dist/server/pi-server-service.d.ts +85 -0
  1243. package/dist/server/pi-server-service.d.ts.map +1 -0
  1244. package/dist/server/pi-server-service.js +213 -0
  1245. package/dist/server/pi-server-service.js.map +1 -0
  1246. package/dist/server/scheduler-tick.d.ts +32 -0
  1247. package/dist/server/scheduler-tick.d.ts.map +1 -0
  1248. package/dist/server/scheduler-tick.js +47 -0
  1249. package/dist/server/scheduler-tick.js.map +1 -0
  1250. package/dist/server/serve.d.ts +25 -0
  1251. package/dist/server/serve.d.ts.map +1 -0
  1252. package/dist/server/serve.js +83 -0
  1253. package/dist/server/serve.js.map +1 -0
  1254. package/dist/server/transcript.d.ts +38 -0
  1255. package/dist/server/transcript.d.ts.map +1 -0
  1256. package/dist/server/transcript.js +176 -0
  1257. package/dist/server/transcript.js.map +1 -0
  1258. package/dist/skills/ada-engine/SKILL.md +153 -0
  1259. package/dist/skills/skill-creator/SKILL.md +90 -0
  1260. package/dist/telegram/api.d.ts +75 -0
  1261. package/dist/telegram/api.d.ts.map +1 -0
  1262. package/dist/telegram/api.js +104 -0
  1263. package/dist/telegram/api.js.map +1 -0
  1264. package/dist/telegram/bridge.d.ts +85 -0
  1265. package/dist/telegram/bridge.d.ts.map +1 -0
  1266. package/dist/telegram/bridge.js +182 -0
  1267. package/dist/telegram/bridge.js.map +1 -0
  1268. package/dist/telegram/journal.d.ts +67 -0
  1269. package/dist/telegram/journal.d.ts.map +1 -0
  1270. package/dist/telegram/journal.js +119 -0
  1271. package/dist/telegram/journal.js.map +1 -0
  1272. package/dist/telegram/servidor.d.ts +15 -0
  1273. package/dist/telegram/servidor.d.ts.map +1 -0
  1274. package/dist/telegram/servidor.js +74 -0
  1275. package/dist/telegram/servidor.js.map +1 -0
  1276. package/dist/utils/frontmatter.d.ts.map +1 -1
  1277. package/dist/utils/frontmatter.js +2 -1
  1278. package/dist/utils/frontmatter.js.map +1 -1
  1279. package/dist/utils/management-http.d.ts +5 -3
  1280. package/dist/utils/management-http.d.ts.map +1 -1
  1281. package/dist/utils/management-http.js +14 -10
  1282. package/dist/utils/management-http.js.map +1 -1
  1283. package/dist/utils/shell.d.ts +11 -0
  1284. package/dist/utils/shell.d.ts.map +1 -1
  1285. package/dist/utils/shell.js +11 -0
  1286. package/dist/utils/shell.js.map +1 -1
  1287. package/dist/utils/text.d.ts +8 -0
  1288. package/dist/utils/text.d.ts.map +1 -0
  1289. package/dist/utils/text.js +9 -0
  1290. package/dist/utils/text.js.map +1 -0
  1291. package/dist/utils/version-check.d.ts.map +1 -1
  1292. package/dist/utils/version-check.js +29 -1
  1293. package/dist/utils/version-check.js.map +1 -1
  1294. package/docs/compaction.md +25 -10
  1295. package/docs/compliance.md +241 -0
  1296. package/docs/containerization.md +24 -24
  1297. package/docs/custom-provider.md +15 -12
  1298. package/docs/development.md +47 -10
  1299. package/docs/docs.json +14 -2
  1300. package/docs/environment-variables.md +20 -17
  1301. package/docs/extensions.md +62 -51
  1302. package/docs/index.md +15 -21
  1303. package/docs/json.md +10 -5
  1304. package/docs/keybindings.md +5 -5
  1305. package/docs/llama-cpp.md +9 -7
  1306. package/docs/models.md +18 -12
  1307. package/docs/packages.md +45 -45
  1308. package/docs/prompt-templates.md +5 -5
  1309. package/docs/providers.md +12 -12
  1310. package/docs/quickstart.md +39 -39
  1311. package/docs/rpc.md +21 -15
  1312. package/docs/sdk.md +38 -38
  1313. package/docs/security.md +26 -21
  1314. package/docs/session-format.md +7 -7
  1315. package/docs/sessions.md +14 -14
  1316. package/docs/settings.md +47 -22
  1317. package/docs/shell-aliases.md +2 -2
  1318. package/docs/skills.md +14 -13
  1319. package/docs/terminal-setup.md +14 -14
  1320. package/docs/termux.md +7 -7
  1321. package/docs/themes.md +11 -11
  1322. package/docs/tmux.md +4 -4
  1323. package/docs/tui.md +3 -3
  1324. package/docs/usage.md +54 -54
  1325. package/docs/windows.md +2 -2
  1326. package/examples/extensions/border-status-editor.ts +1 -1
  1327. package/examples/extensions/git-checkpoint.ts +2 -2
  1328. package/examples/extensions/notify.ts +3 -1
  1329. package/examples/extensions/subagent/README.md +1 -1
  1330. package/examples/extensions/subagent/index.ts +6 -1
  1331. package/examples/extensions/titlebar-spinner.ts +1 -1
  1332. package/examples/rpc-extension-ui.ts +1 -1
  1333. package/examples/sdk/06-extensions.ts +1 -1
  1334. package/examples/sdk/12-full-control.ts +9 -0
  1335. package/examples/sdk/README.md +1 -1
  1336. package/npm-shrinkwrap.json +35 -261
  1337. package/package.json +9 -3
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Tools de web: `web_search` y `web_fetch`.
3
+ *
4
+ * Existían por su NOMBRE en el builtin `deep_research` pero nadie las
5
+ * registraba, así que ese workflow —uno de los cinco que anunciamos— no podía
6
+ * funcionar: le pedía al agente usar herramientas inexistentes. Un nombre de
7
+ * tool dentro de un prompt no lo comprueba ni el compilador ni los tests.
8
+ *
9
+ * `web_search` prueba, en orden: la búsqueda nativa del proveedor de modelo
10
+ * activo (ya es la credencial con la que corre el agente) → el registro de
11
+ * proveedores de terceros con clave configurada (`proveedores/registro.ts`,
12
+ * vault primero, variable de entorno después) → los proveedores sin clave
13
+ * (DuckDuckGo, Mojeek, Ecosia), que garantizan que `web_search` funciona de
14
+ * fábrica incluso sin ninguna credencial de terceros y con un modelo que no
15
+ * traiga búsqueda propia.
16
+ *
17
+ * `web_fetch` prueba primero un scraper especializado (`scrapers/registro.ts`)
18
+ * que devuelve datos ESTRUCTURADOS de la API pública del sitio —versión y
19
+ * licencia de un paquete, no el HTML de la página—; si ninguno encaja o falla,
20
+ * cae al fetch genérico + limpieza de HTML de siempre.
21
+ *
22
+ * `web_fetch` trae guardas contra SSRF. Una tool que descarga cualquier URL que
23
+ * el modelo proponga es, sin ellas, una puerta a la red interna: basta con que
24
+ * el modelo lea una URL en un README para que acabe pidiéndola.
25
+ *
26
+ * El acceso a estas tools es opt-in por agente (`web: true`), nunca implícito
27
+ * en `readOnly` — ver `resolveAllowedTools` en workflows/agent-runner.ts.
28
+ */
29
+ import type { ToolDefinition } from "../extensions/types.ts";
30
+ import type { ResultadoWeb } from "./busqueda-nativa.ts";
31
+ import { htmlToText } from "./texto.ts";
32
+ export { htmlToText };
33
+ export interface WebToolsOptions {
34
+ /**
35
+ * Clave de un proveedor de búsqueda de terceros, por nombre (`serper`,
36
+ * `brave`, `tavily`, `exa`, `searxng`): vault primero, variable de entorno
37
+ * después. `undefined` cuando ese proveedor concreto no está configurado —
38
+ * eso lo salta, no lo hace fallar.
39
+ */
40
+ obtenerClave: (nombreProveedor: string) => Promise<string | undefined>;
41
+ /**
42
+ * Búsqueda con la credencial del modelo, cuando el proveedor la trae.
43
+ *
44
+ * Es lo que hace que `web_search` funcione sin configurar nada: el usuario ya
45
+ * tiene credencial —es con la que corre el agente— y los modelos de Anthropic
46
+ * saben buscar solos. Sin esto, la respuesta de fábrica era «Búsqueda web no
47
+ * configurada», que para un agente de código equivale a no poder mirar la
48
+ * documentación de ninguna librería.
49
+ *
50
+ * Va PRIMERO: es la credencial que el usuario ya está pagando, así que no
51
+ * tiene sentido preguntar por una clave de terceros antes de intentarla.
52
+ *
53
+ * Devuelve `null` cuando NO puede buscar (el proveedor activo no trae
54
+ * búsqueda propia) y `[]` cuando ha buscado y no ha encontrado nada. Los dos
55
+ * casos se leen igual desde fuera y no son lo mismo: al agente hay que
56
+ * decirle «no puedo» para que cambie de estrategia, no «no hay» para que se
57
+ * rinda. Se cometió justo ese fallo aquí, y solo salió ejecutando el
58
+ * producto: con un modelo de OpenRouter la tool contestaba «Sin resultados»
59
+ * cuando en realidad no había buscado.
60
+ */
61
+ buscarNativo?: (consulta: string, maximo: number) => Promise<ResultadoWeb[] | null>;
62
+ fetchImpl?: typeof fetch;
63
+ /**
64
+ * Anota una salida a la red en el libro de sesión: art. 44 y ss. del RGPD,
65
+ * "qué salió de la máquina y hacia dónde".
66
+ *
67
+ * El tipo `red` del libro existía sin que nadie lo anotara. Se engancha aquí y
68
+ * no en el manejador de tools de `agent-session.ts` porque desde allí el único
69
+ * destino visible es la URL que pidió el modelo, y la petición de verdad la
70
+ * hacen los scrapers y los proveedores de búsqueda a OTROS dominios (la API de
71
+ * npm, DuckDuckGo…). Envolviendo el `fetchImpl` que todos ellos comparten, el
72
+ * destino que se registra es el real y no el pedido.
73
+ *
74
+ * Solo el DOMINIO, nunca la ruta ni los parámetros: una query string lleva
75
+ * tokens y términos de búsqueda, y el libro guarda la forma, no el contenido.
76
+ *
77
+ * Nunca debe lanzar: un fallo del registro no puede tumbar una descarga.
78
+ */
79
+ anotarRed?: (dominio: string, permitido: boolean, motivo?: string) => void;
80
+ timeoutMs?: number;
81
+ }
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
+ export declare function createWebTools(options: WebToolsOptions): Record<string, ToolDefinition>;
91
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +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"]}
@@ -0,0 +1,304 @@
1
+ /**
2
+ * Tools de web: `web_search` y `web_fetch`.
3
+ *
4
+ * Existían por su NOMBRE en el builtin `deep_research` pero nadie las
5
+ * registraba, así que ese workflow —uno de los cinco que anunciamos— no podía
6
+ * funcionar: le pedía al agente usar herramientas inexistentes. Un nombre de
7
+ * tool dentro de un prompt no lo comprueba ni el compilador ni los tests.
8
+ *
9
+ * `web_search` prueba, en orden: la búsqueda nativa del proveedor de modelo
10
+ * activo (ya es la credencial con la que corre el agente) → el registro de
11
+ * proveedores de terceros con clave configurada (`proveedores/registro.ts`,
12
+ * vault primero, variable de entorno después) → los proveedores sin clave
13
+ * (DuckDuckGo, Mojeek, Ecosia), que garantizan que `web_search` funciona de
14
+ * fábrica incluso sin ninguna credencial de terceros y con un modelo que no
15
+ * traiga búsqueda propia.
16
+ *
17
+ * `web_fetch` prueba primero un scraper especializado (`scrapers/registro.ts`)
18
+ * que devuelve datos ESTRUCTURADOS de la API pública del sitio —versión y
19
+ * licencia de un paquete, no el HTML de la página—; si ninguno encaja o falla,
20
+ * cae al fetch genérico + limpieza de HTML de siempre.
21
+ *
22
+ * `web_fetch` trae guardas contra SSRF. Una tool que descarga cualquier URL que
23
+ * el modelo proponga es, sin ellas, una puerta a la red interna: basta con que
24
+ * el modelo lea una URL en un README para que acabe pidiéndola.
25
+ *
26
+ * El acceso a estas tools es opt-in por agente (`web: true`), nunca implícito
27
+ * en `readOnly` — ver `resolveAllowedTools` en workflows/agent-runner.ts.
28
+ */
29
+ import { Type } from "typebox";
30
+ import { destinoPermitido } from "./destino.js";
31
+ import { buscarConProveedores } from "./proveedores/registro.js";
32
+ import { encontrarScraper } from "./scrapers/registro.js";
33
+ import { htmlToText } from "./texto.js";
34
+ export { htmlToText };
35
+ const MAX_FETCH_BYTES = 512 * 1024;
36
+ const DEFAULT_TIMEOUT_MS = 20_000;
37
+ function textResult(text) {
38
+ return { content: [{ type: "text", text }], details: undefined };
39
+ }
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
+ /** Cuántos saltos se siguen antes de rendirse. Cada uno se revalida. */
43
+ 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
+ const searchParams = Type.Object({
75
+ query: Type.String({ description: "Consulta de búsqueda." }),
76
+ count: Type.Optional(Type.Number({ description: "Número de resultados (por defecto 5, máximo 10)." })),
77
+ });
78
+ const fetchParams = Type.Object({
79
+ url: Type.String({ description: "URL http(s) a descargar." }),
80
+ });
81
+ /** Formatea resultados de búsqueda (nativos o de un proveedor) como texto numerado. */
82
+ function formatearResultados(resultados) {
83
+ return resultados
84
+ .map((r, i) => {
85
+ const partes = [`${i + 1}. ${r.titulo}`, ` ${r.url}`];
86
+ if (r.resumen)
87
+ partes.push(` ${r.resumen}`);
88
+ if (r.edad)
89
+ partes.push(` (${r.edad})`);
90
+ return partes.join("\n");
91
+ })
92
+ .join("\n\n");
93
+ }
94
+ /**
95
+ * El dominio de destino, o `null` si no se puede leer.
96
+ *
97
+ * Solo el hostname: la ruta y la query se descartan aquí a propósito, porque es
98
+ * el único sitio por el que pasan y un `?api_key=…` en el libro sería la fuga
99
+ * que el libro existe para no tener.
100
+ */
101
+ // `Parameters<typeof fetch>[0]` y no `RequestInfo`: el proyecto compila sin la
102
+ // librería DOM, así que ese nombre global no existe aquí.
103
+ function dominioDe(destino) {
104
+ try {
105
+ const crudo = typeof destino === "string" ? destino : destino instanceof URL ? destino.href : destino.url;
106
+ return new URL(crudo).hostname || null;
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ export function createWebTools(options) {
113
+ const fetchCrudo = options.fetchImpl ?? fetch;
114
+ const anotarRed = options.anotarRed;
115
+ // Un solo punto para todas las salidas: este `fetchImpl` es el que reciben los
116
+ // scrapers (`modulo.scrapear(url, fetchImpl, …)`) y los proveedores de
117
+ // búsqueda (`buscarConProveedores(…, { fetchImpl })`), así que envolverlo una
118
+ // vez registra las salidas de los tres caminos y no solo del fetch genérico.
119
+ const fetchImpl = anotarRed
120
+ ? (destino, init) => {
121
+ const dominio = dominioDe(destino);
122
+ // `try` porque el registro es best-effort y la descarga no lo es.
123
+ if (dominio) {
124
+ try {
125
+ anotarRed(dominio, true);
126
+ }
127
+ catch {
128
+ // Un fallo del libro no puede impedir una descarga.
129
+ }
130
+ }
131
+ return fetchCrudo(destino, init);
132
+ }
133
+ : fetchCrudo;
134
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
135
+ /** Aborta la petición si tarda demasiado, y respeta el abort del agente. */
136
+ const withTimeout = async (outer, run) => {
137
+ const controller = new AbortController();
138
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
139
+ const onAbort = () => controller.abort();
140
+ outer?.addEventListener("abort", onAbort);
141
+ try {
142
+ return await run(controller.signal);
143
+ }
144
+ finally {
145
+ clearTimeout(timer);
146
+ outer?.removeEventListener("abort", onAbort);
147
+ }
148
+ };
149
+ const webSearch = {
150
+ name: "web_search",
151
+ label: "Buscar en la web",
152
+ description: "Busca en la web y devuelve resultados con título, URL y extracto. " +
153
+ "Úsalo para hechos que puedan haber cambiado o que no estén en el repositorio. " +
154
+ "Cita siempre la URL exacta: un resultado sin fuente no vale como evidencia.",
155
+ promptSnippet: "buscar en la web",
156
+ parameters: searchParams,
157
+ async execute(_toolCallId, input, signal) {
158
+ const query = String(input.query ?? "").trim();
159
+ if (!query)
160
+ return textResult("Error: 'query' es obligatorio.");
161
+ const count = Math.min(Math.max(Number(input.count) || 5, 1), 10);
162
+ // 1) Nativo del proveedor de modelo: la credencial que el usuario ya paga.
163
+ if (options.buscarNativo) {
164
+ try {
165
+ const nativos = await options.buscarNativo(query, count);
166
+ if (nativos !== null) {
167
+ if (nativos.length === 0)
168
+ return textResult(`Sin resultados para: ${query}`);
169
+ return textResult(formatearResultados(nativos));
170
+ }
171
+ // null: el proveedor activo no trae búsqueda propia — seguir al registro.
172
+ }
173
+ catch (error) {
174
+ return textResult(`La búsqueda con el modelo falló: ${error instanceof Error ? error.message : String(error)}`);
175
+ }
176
+ }
177
+ // 2) Registro de proveedores: clave configurada > sin clave. Los tres sin
178
+ // clave (duckduckgo, mojeek, ecosia) están siempre en la lista, así que
179
+ // esto SIEMPRE tiene algo que probar — nunca "no configurado".
180
+ try {
181
+ const { resultados } = await buscarConProveedores(query, count, {
182
+ obtenerClave: options.obtenerClave,
183
+ fetchImpl,
184
+ signal,
185
+ });
186
+ if (resultados.length === 0)
187
+ return textResult(`Sin resultados para: ${query}`);
188
+ return textResult(formatearResultados(resultados));
189
+ }
190
+ catch (error) {
191
+ // Un fallo de red o de todos los proveedores es un FALLO, no "sin
192
+ // resultados": el agente debe saber que no se ha buscado de verdad.
193
+ return textResult(`La búsqueda falló: ${error instanceof Error ? error.message : String(error)}`);
194
+ }
195
+ },
196
+ };
197
+ const webFetch = {
198
+ name: "web_fetch",
199
+ label: "Descargar URL",
200
+ description: "Descarga una URL y devuelve su texto. Úsalo tras web_search para leer una fuente concreta. " +
201
+ "Para registros de paquetes (npm, PyPI, crates.io…), GitHub, MDN, Stack Overflow y CVEs (NVD, CISA " +
202
+ "KEV) devuelve datos estructurados en vez de HTML. Solo http/https públicos: la red interna está bloqueada.",
203
+ promptSnippet: "leer el contenido de una URL",
204
+ parameters: fetchParams,
205
+ async execute(_toolCallId, input, signal) {
206
+ const raw = String(input.url ?? "").trim();
207
+ if (!raw)
208
+ return textResult("Error: 'url' es obligatorio.");
209
+ let url;
210
+ try {
211
+ url = assertFetchableUrl(raw);
212
+ }
213
+ catch (error) {
214
+ const motivo = error instanceof Error ? error.message : String(error);
215
+ // Un intento BLOQUEADO es tan auditable como una salida consumada, y es
216
+ // el único que no pasa por el `fetchImpl` envuelto: la guarda SSRF corta
217
+ // antes. Sin esta línea el libro solo tendría `permitido: true` y el
218
+ // campo `permitido` sería decorativo — un registro que dice siempre lo
219
+ // mismo no distingue nada.
220
+ try {
221
+ anotarRed?.(dominioDe(raw) ?? "(url ilegible)", false, motivo);
222
+ }
223
+ catch {
224
+ // best-effort, igual que arriba.
225
+ }
226
+ return textResult(`Error: ${motivo}`);
227
+ }
228
+ // Scraper especializado primero: datos estructurados de la API del sitio
229
+ // en vez del HTML de la página. Si no encaja o falla, se cae al fetch
230
+ // genérico de siempre — la URL sigue siendo legible aunque no se pueda
231
+ // enriquecer.
232
+ const descriptor = encontrarScraper(url);
233
+ if (descriptor) {
234
+ try {
235
+ const modulo = await descriptor.cargar();
236
+ const resultado = await modulo.scrapear(url, fetchImpl, signal);
237
+ if (resultado) {
238
+ return textResult(`${resultado.titulo}\n${resultado.url}\n\n${resultado.resumen}\n\nDatos estructurados:\n` +
239
+ JSON.stringify(resultado.datos, null, 2));
240
+ }
241
+ }
242
+ catch {
243
+ // El scraper falló: se cae al fetch genérico en vez de dejar la
244
+ // tool en blanco. La URL sigue siendo lo que el usuario pidió leer.
245
+ }
246
+ }
247
+ // La dirección, no el nombre. `assertFetchableUrl` compara cadenas y deja
248
+ // pasar todo lo que llega al mismo sitio por otro camino: medido,
249
+ // `[::ffff:127.0.0.1]` y un dominio que resuelve a 127.0.0.1 pasaban
250
+ // enteros. Ver `core/web/destino.ts`.
251
+ const rechazo = await destinoPermitido(url);
252
+ if (rechazo) {
253
+ anotarRed?.(url.hostname, false, rechazo.motivo);
254
+ return textResult(`Descarga bloqueada: ${rechazo.motivo}${rechazo.direccion ? ` (${rechazo.direccion})` : ""}. ` +
255
+ "Las tools web no alcanzan la red interna ni la propia máquina.");
256
+ }
257
+ try {
258
+ // `redirect: "manual"` y cada salto revalidado. Con `follow`, una URL
259
+ // pública que responde 302 hacia loopback llegaba igual, porque solo se
260
+ // miraba la primera — era el tercer camino abierto de los tres.
261
+ let destino = url;
262
+ let response;
263
+ for (let salto = 0; salto <= MAX_REDIRECCIONES; salto++) {
264
+ response = await withTimeout(signal, (s) => fetchImpl(destino.toString(), {
265
+ redirect: "manual",
266
+ signal: s,
267
+ headers: { "user-agent": "ada-cli" },
268
+ }));
269
+ if (response.status < 300 || response.status >= 400)
270
+ break;
271
+ const siguiente = response.headers.get("location");
272
+ if (!siguiente)
273
+ break;
274
+ if (salto === MAX_REDIRECCIONES) {
275
+ return textResult(`La descarga dio más de ${MAX_REDIRECCIONES} redirecciones y se ha parado.`);
276
+ }
277
+ // Relativa respecto al destino actual, como manda el estándar.
278
+ destino = new URL(siguiente, destino);
279
+ assertFetchableUrl(destino.toString());
280
+ const rechazoSalto = await destinoPermitido(destino);
281
+ if (rechazoSalto) {
282
+ anotarRed?.(destino.hostname, false, `redirección a ${rechazoSalto.motivo}`);
283
+ return textResult(`Descarga bloqueada: la redirección lleva a ${rechazoSalto.motivo}` +
284
+ `${rechazoSalto.direccion ? ` (${rechazoSalto.direccion})` : ""}.`);
285
+ }
286
+ anotarRed?.(destino.hostname, true, "redirección");
287
+ }
288
+ if (!response)
289
+ return textResult("La descarga no devolvió respuesta.");
290
+ if (!response.ok)
291
+ return textResult(`La descarga devolvió HTTP ${response.status}.`);
292
+ const body = await response.text();
293
+ const truncated = body.length > MAX_FETCH_BYTES;
294
+ const text = htmlToText(body.slice(0, MAX_FETCH_BYTES));
295
+ return textResult(truncated ? `${text}\n\n[truncado en ${MAX_FETCH_BYTES} bytes]` : text);
296
+ }
297
+ catch (error) {
298
+ return textResult(`La descarga falló: ${error instanceof Error ? error.message : String(error)}`);
299
+ }
300
+ },
301
+ };
302
+ return { web_search: webSearch, web_fetch: webFetch };
303
+ }
304
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Dónde vive la wiki y cómo se indexa.
3
+ *
4
+ * En `<proyecto>/<configDir>/wiki/`: páginas en Markdown y un `citas.json` con
5
+ * la huella de cada cita. Va dentro del proyecto y no en el agentDir a
6
+ * propósito — es documentación del repositorio, debe poder versionarse y
7
+ * revisarse en un pull request como cualquier otro fichero.
8
+ */
9
+ import { type Afirmacion } from "./citas.ts";
10
+ export interface Wiki {
11
+ version: 1;
12
+ afirmaciones: Afirmacion[];
13
+ }
14
+ export declare function rutaWiki(cwd: string, configDirName: string): string;
15
+ export declare function leerWiki(cwd: string, configDirName: string): Wiki;
16
+ export declare function escribirWiki(cwd: string, configDirName: string, wiki: Wiki): void;
17
+ /**
18
+ * Lector de ficheros del proyecto, con la raíz cerrada.
19
+ *
20
+ * Una cita es texto que puede haber escrito un modelo. Sin esta comprobación,
21
+ * `../../.ssh/id_rsa` en una página de la wiki haría que `wiki check` leyera
22
+ * cualquier cosa del disco.
23
+ */
24
+ export declare function lectorDelProyecto(cwd: string): (fichero: string) => string | null;
25
+ /**
26
+ * Indexa las páginas Markdown: saca sus citas y les calcula la huella.
27
+ *
28
+ * Cada párrafo no vacío es una afirmación. Es una regla tonta a propósito: si
29
+ * el troceado fuera listo, dos ejecuciones sobre el mismo texto podrían dar
30
+ * afirmaciones distintas y el fichero de citas cambiaría sin que cambiara nada.
31
+ */
32
+ export declare function indexarPaginas(cwd: string, configDirName: string): Wiki;
33
+ //# sourceMappingURL=almacen.d.ts.map
@@ -0,0 +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"]}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Dónde vive la wiki y cómo se indexa.
3
+ *
4
+ * En `<proyecto>/<configDir>/wiki/`: páginas en Markdown y un `citas.json` con
5
+ * la huella de cada cita. Va dentro del proyecto y no en el agentDir a
6
+ * propósito — es documentación del repositorio, debe poder versionarse y
7
+ * revisarse en un pull request como cualquier otro fichero.
8
+ */
9
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
10
+ import { join, relative, resolve } from "node:path";
11
+ import { extraerCitas, huellaDeTexto } from "./citas.js";
12
+ const VACIA = { version: 1, afirmaciones: [] };
13
+ export function rutaWiki(cwd, configDirName) {
14
+ return join(cwd, configDirName, "wiki");
15
+ }
16
+ export function leerWiki(cwd, configDirName) {
17
+ const fichero = join(rutaWiki(cwd, configDirName), "citas.json");
18
+ if (!existsSync(fichero))
19
+ return { ...VACIA };
20
+ try {
21
+ const datos = JSON.parse(readFileSync(fichero, "utf8"));
22
+ return Array.isArray(datos.afirmaciones) ? datos : { ...VACIA };
23
+ }
24
+ catch {
25
+ // Un citas.json corrupto no puede impedir regenerar la wiki.
26
+ return { ...VACIA };
27
+ }
28
+ }
29
+ export function escribirWiki(cwd, configDirName, wiki) {
30
+ const dir = rutaWiki(cwd, configDirName);
31
+ mkdirSync(dir, { recursive: true });
32
+ writeFileSync(join(dir, "citas.json"), `${JSON.stringify(wiki, null, 2)}\n`, "utf8");
33
+ }
34
+ /**
35
+ * Lector de ficheros del proyecto, con la raíz cerrada.
36
+ *
37
+ * Una cita es texto que puede haber escrito un modelo. Sin esta comprobación,
38
+ * `../../.ssh/id_rsa` en una página de la wiki haría que `wiki check` leyera
39
+ * cualquier cosa del disco.
40
+ */
41
+ export function lectorDelProyecto(cwd) {
42
+ const raiz = resolve(cwd);
43
+ return (fichero) => {
44
+ const absoluta = resolve(raiz, fichero);
45
+ const dentro = relative(raiz, absoluta);
46
+ if (dentro.startsWith("..") || resolve(raiz, dentro) !== absoluta)
47
+ return null;
48
+ try {
49
+ return readFileSync(absoluta, "utf8");
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ };
55
+ }
56
+ /**
57
+ * Indexa las páginas Markdown: saca sus citas y les calcula la huella.
58
+ *
59
+ * Cada párrafo no vacío es una afirmación. Es una regla tonta a propósito: si
60
+ * el troceado fuera listo, dos ejecuciones sobre el mismo texto podrían dar
61
+ * afirmaciones distintas y el fichero de citas cambiaría sin que cambiara nada.
62
+ */
63
+ export function indexarPaginas(cwd, configDirName) {
64
+ const dir = rutaWiki(cwd, configDirName);
65
+ if (!existsSync(dir))
66
+ return { ...VACIA };
67
+ const leer = lectorDelProyecto(cwd);
68
+ const afirmaciones = [];
69
+ for (const fichero of readdirSync(dir)
70
+ .filter((f) => f.endsWith(".md"))
71
+ .sort()) {
72
+ const contenido = readFileSync(join(dir, fichero), "utf8");
73
+ const parrafos = contenido
74
+ .split(/\n\s*\n/)
75
+ .map((p) => p.trim())
76
+ .filter(Boolean);
77
+ parrafos.forEach((parrafo, i) => {
78
+ const citas = [];
79
+ for (const sinHuella of extraerCitas(parrafo)) {
80
+ const fuente = leer(sinHuella.fichero);
81
+ if (fuente === null)
82
+ continue;
83
+ const lineas = fuente.split("\n").slice(sinHuella.desde - 1, sinHuella.hasta);
84
+ if (lineas.length === 0)
85
+ continue;
86
+ citas.push({ ...sinHuella, huella: huellaDeTexto(lineas) });
87
+ }
88
+ afirmaciones.push({ id: `${fichero}#${i}`, texto: parrafo.slice(0, 400), citas });
89
+ });
90
+ }
91
+ return { version: 1, afirmaciones };
92
+ }
93
+ //# sourceMappingURL=almacen.js.map