@hoilab/ada-cli 0.84.22 → 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.
- package/CHANGELOG.md +29 -2
- package/README.es.md +17 -6
- package/README.md +109 -11
- package/dist/ada-publico.d.ts +35 -0
- package/dist/ada-publico.d.ts.map +1 -0
- package/dist/ada-publico.js +40 -0
- package/dist/ada-publico.js.map +1 -0
- package/dist/cli/audit-command.d.ts +15 -0
- package/dist/cli/audit-command.d.ts.map +1 -0
- package/dist/cli/audit-command.js +280 -0
- package/dist/cli/audit-command.js.map +1 -0
- package/dist/cli/banco-command.d.ts +15 -0
- package/dist/cli/banco-command.d.ts.map +1 -0
- package/dist/cli/banco-command.js +213 -0
- package/dist/cli/banco-command.js.map +1 -0
- package/dist/cli/cleanse-command.d.ts +11 -0
- package/dist/cli/cleanse-command.d.ts.map +1 -0
- package/dist/cli/cleanse-command.js +101 -0
- package/dist/cli/cleanse-command.js.map +1 -0
- package/dist/cli/commit-command.d.ts +31 -0
- package/dist/cli/commit-command.d.ts.map +1 -0
- package/dist/cli/commit-command.js +158 -0
- package/dist/cli/commit-command.js.map +1 -0
- package/dist/cli/computer-command.d.ts +12 -0
- package/dist/cli/computer-command.d.ts.map +1 -0
- package/dist/cli/computer-command.js +141 -0
- package/dist/cli/computer-command.js.map +1 -0
- package/dist/cli/discover-command.d.ts +18 -0
- package/dist/cli/discover-command.d.ts.map +1 -0
- package/dist/cli/discover-command.js +108 -0
- package/dist/cli/discover-command.js.map +1 -0
- package/dist/cli/hashline-command.d.ts +11 -0
- package/dist/cli/hashline-command.d.ts.map +1 -0
- package/dist/cli/hashline-command.js +106 -0
- package/dist/cli/hashline-command.js.map +1 -0
- package/dist/cli/import-command.d.ts +35 -0
- package/dist/cli/import-command.d.ts.map +1 -0
- package/dist/cli/import-command.js +164 -0
- package/dist/cli/import-command.js.map +1 -0
- package/dist/cli/politica-command.d.ts +20 -0
- package/dist/cli/politica-command.d.ts.map +1 -0
- package/dist/cli/politica-command.js +93 -0
- package/dist/cli/politica-command.js.map +1 -0
- package/dist/cli/refine-command.d.ts +18 -0
- package/dist/cli/refine-command.d.ts.map +1 -0
- package/dist/cli/refine-command.js +101 -0
- package/dist/cli/refine-command.js.map +1 -0
- package/dist/cli/review-command.d.ts +24 -0
- package/dist/cli/review-command.d.ts.map +1 -0
- package/dist/cli/review-command.js +168 -0
- package/dist/cli/review-command.js.map +1 -0
- package/dist/cli/schedule-command.d.ts +17 -0
- package/dist/cli/schedule-command.d.ts.map +1 -0
- package/dist/cli/schedule-command.js +117 -0
- package/dist/cli/schedule-command.js.map +1 -0
- package/dist/cli/serve-command.d.ts +72 -0
- package/dist/cli/serve-command.d.ts.map +1 -0
- package/dist/cli/serve-command.js +568 -0
- package/dist/cli/serve-command.js.map +1 -0
- package/dist/cli/telegram-command.d.ts +18 -0
- package/dist/cli/telegram-command.d.ts.map +1 -0
- package/dist/cli/telegram-command.js +137 -0
- package/dist/cli/telegram-command.js.map +1 -0
- package/dist/cli/telemetria-command.d.ts +22 -0
- package/dist/cli/telemetria-command.d.ts.map +1 -0
- package/dist/cli/telemetria-command.js +127 -0
- package/dist/cli/telemetria-command.js.map +1 -0
- package/dist/cli/undo-command.d.ts +9 -0
- package/dist/cli/undo-command.d.ts.map +1 -0
- package/dist/cli/undo-command.js +56 -0
- package/dist/cli/undo-command.js.map +1 -0
- package/dist/cli/usage-command.d.ts +10 -0
- package/dist/cli/usage-command.d.ts.map +1 -0
- package/dist/cli/usage-command.js +209 -0
- package/dist/cli/usage-command.js.map +1 -0
- package/dist/cli/wiki-command.d.ts +9 -0
- package/dist/cli/wiki-command.d.ts.map +1 -0
- package/dist/cli/wiki-command.js +76 -0
- package/dist/cli/wiki-command.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -11
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/ada.d.ts +58 -0
- package/dist/core/ada.d.ts.map +1 -0
- package/dist/core/ada.js +61 -0
- package/dist/core/ada.js.map +1 -0
- package/dist/core/advisor/guarda.d.ts +66 -0
- package/dist/core/advisor/guarda.d.ts.map +1 -0
- package/dist/core/advisor/guarda.js +191 -0
- package/dist/core/advisor/guarda.js.map +1 -0
- package/dist/core/advisor/runtime.d.ts +66 -0
- package/dist/core/advisor/runtime.d.ts.map +1 -0
- package/dist/core/advisor/runtime.js +121 -0
- package/dist/core/advisor/runtime.js.map +1 -0
- package/dist/core/advisor/sesion.d.ts +109 -0
- package/dist/core/advisor/sesion.d.ts.map +1 -0
- package/dist/core/advisor/sesion.js +139 -0
- package/dist/core/advisor/sesion.js.map +1 -0
- package/dist/core/agent-session.d.ts +30 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +430 -22
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents/loader.d.ts +77 -0
- package/dist/core/agents/loader.d.ts.map +1 -0
- package/dist/core/agents/loader.js +154 -0
- package/dist/core/agents/loader.js.map +1 -0
- package/dist/core/aprobacion/generados.d.ts +37 -0
- package/dist/core/aprobacion/generados.d.ts.map +1 -0
- package/dist/core/aprobacion/generados.js +85 -0
- package/dist/core/aprobacion/generados.js.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.js +212 -0
- package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
- package/dist/core/aprobacion/politica.d.ts +90 -0
- package/dist/core/aprobacion/politica.d.ts.map +1 -0
- package/dist/core/aprobacion/politica.js +375 -0
- package/dist/core/aprobacion/politica.js.map +1 -0
- package/dist/core/arranque/atajos.d.ts +46 -0
- package/dist/core/arranque/atajos.d.ts.map +1 -0
- package/dist/core/arranque/atajos.js +113 -0
- package/dist/core/arranque/atajos.js.map +1 -0
- package/dist/core/audit/exportacion.d.ts +54 -0
- package/dist/core/audit/exportacion.d.ts.map +1 -0
- package/dist/core/audit/exportacion.js +265 -0
- package/dist/core/audit/exportacion.js.map +1 -0
- package/dist/core/audit/libro.d.ts +318 -0
- package/dist/core/audit/libro.d.ts.map +1 -0
- package/dist/core/audit/libro.js +508 -0
- package/dist/core/audit/libro.js.map +1 -0
- package/dist/core/audit/registro-sesion.d.ts +78 -0
- package/dist/core/audit/registro-sesion.d.ts.map +1 -0
- package/dist/core/audit/registro-sesion.js +202 -0
- package/dist/core/audit/registro-sesion.js.map +1 -0
- package/dist/core/audit/retencion.d.ts +82 -0
- package/dist/core/audit/retencion.d.ts.map +1 -0
- package/dist/core/audit/retencion.js +152 -0
- package/dist/core/audit/retencion.js.map +1 -0
- package/dist/core/audit/rutas.d.ts +23 -0
- package/dist/core/audit/rutas.d.ts.map +1 -0
- package/dist/core/audit/rutas.js +23 -0
- package/dist/core/audit/rutas.js.map +1 -0
- package/dist/core/auth-storage.d.ts +0 -3
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +17 -5
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/banco/almacenamiento.d.ts +18 -0
- package/dist/core/banco/almacenamiento.d.ts.map +1 -0
- package/dist/core/banco/almacenamiento.js +50 -0
- package/dist/core/banco/almacenamiento.js.map +1 -0
- package/dist/core/banco/analisis.d.ts +37 -0
- package/dist/core/banco/analisis.d.ts.map +1 -0
- package/dist/core/banco/analisis.js +164 -0
- package/dist/core/banco/analisis.js.map +1 -0
- package/dist/core/banco/bloques.d.ts +39 -0
- package/dist/core/banco/bloques.d.ts.map +1 -0
- package/dist/core/banco/bloques.js +84 -0
- package/dist/core/banco/bloques.js.map +1 -0
- package/dist/core/banco/cargas.d.ts +84 -0
- package/dist/core/banco/cargas.d.ts.map +1 -0
- package/dist/core/banco/cargas.js +520 -0
- package/dist/core/banco/cargas.js.map +1 -0
- package/dist/core/banco/comparar.d.ts +29 -0
- package/dist/core/banco/comparar.d.ts.map +1 -0
- package/dist/core/banco/comparar.js +28 -0
- package/dist/core/banco/comparar.js.map +1 -0
- package/dist/core/banco/ejecutar.d.ts +44 -0
- package/dist/core/banco/ejecutar.d.ts.map +1 -0
- package/dist/core/banco/ejecutar.js +183 -0
- package/dist/core/banco/ejecutar.js.map +1 -0
- package/dist/core/banco/generar.d.ts +24 -0
- package/dist/core/banco/generar.d.ts.map +1 -0
- package/dist/core/banco/generar.js +159 -0
- package/dist/core/banco/generar.js.map +1 -0
- package/dist/core/banco/mutaciones.d.ts +25 -0
- package/dist/core/banco/mutaciones.d.ts.map +1 -0
- package/dist/core/banco/mutaciones.js +215 -0
- package/dist/core/banco/mutaciones.js.map +1 -0
- package/dist/core/banco/tipos.d.ts +121 -0
- package/dist/core/banco/tipos.d.ts.map +1 -0
- package/dist/core/banco/tipos.js +16 -0
- package/dist/core/banco/tipos.js.map +1 -0
- package/dist/core/blobs/almacen.d.ts +81 -0
- package/dist/core/blobs/almacen.d.ts.map +1 -0
- package/dist/core/blobs/almacen.js +198 -0
- package/dist/core/blobs/almacen.js.map +1 -0
- package/dist/core/blobs/broker.d.ts +103 -0
- package/dist/core/blobs/broker.d.ts.map +1 -0
- package/dist/core/blobs/broker.js +204 -0
- package/dist/core/blobs/broker.js.map +1 -0
- package/dist/core/blobs/index.d.ts +70 -0
- package/dist/core/blobs/index.d.ts.map +1 -0
- package/dist/core/blobs/index.js +232 -0
- package/dist/core/blobs/index.js.map +1 -0
- package/dist/core/blobs/payload.d.ts +55 -0
- package/dist/core/blobs/payload.d.ts.map +1 -0
- package/dist/core/blobs/payload.js +255 -0
- package/dist/core/blobs/payload.js.map +1 -0
- package/dist/core/blobs/proveedor.d.ts +85 -0
- package/dist/core/blobs/proveedor.d.ts.map +1 -0
- package/dist/core/blobs/proveedor.js +196 -0
- package/dist/core/blobs/proveedor.js.map +1 -0
- package/dist/core/browser/cdp.d.ts +41 -0
- package/dist/core/browser/cdp.d.ts.map +1 -0
- package/dist/core/browser/cdp.js +119 -0
- package/dist/core/browser/cdp.js.map +1 -0
- package/dist/core/browser/politica.d.ts +51 -0
- package/dist/core/browser/politica.d.ts.map +1 -0
- package/dist/core/browser/politica.js +123 -0
- package/dist/core/browser/politica.js.map +1 -0
- package/dist/core/browser/sesion.d.ts +52 -0
- package/dist/core/browser/sesion.d.ts.map +1 -0
- package/dist/core/browser/sesion.js +176 -0
- package/dist/core/browser/sesion.js.map +1 -0
- package/dist/core/browser/tools.d.ts +16 -0
- package/dist/core/browser/tools.d.ts.map +1 -0
- package/dist/core/browser/tools.js +279 -0
- package/dist/core/browser/tools.js.map +1 -0
- package/dist/core/commit/diff.d.ts +56 -0
- package/dist/core/commit/diff.d.ts.map +1 -0
- package/dist/core/commit/diff.js +145 -0
- package/dist/core/commit/diff.js.map +1 -0
- package/dist/core/commit/mensaje.d.ts +80 -0
- package/dist/core/commit/mensaje.d.ts.map +1 -0
- package/dist/core/commit/mensaje.js +207 -0
- package/dist/core/commit/mensaje.js.map +1 -0
- package/dist/core/compactar/index.d.ts +52 -0
- package/dist/core/compactar/index.d.ts.map +1 -0
- package/dist/core/compactar/index.js +91 -0
- package/dist/core/compactar/index.js.map +1 -0
- package/dist/core/compactar/registro-denso.d.ts +160 -0
- package/dist/core/compactar/registro-denso.d.ts.map +1 -0
- package/dist/core/compactar/registro-denso.js +620 -0
- package/dist/core/compactar/registro-denso.js.map +1 -0
- package/dist/core/computer/captura.d.ts +35 -0
- package/dist/core/computer/captura.d.ts.map +1 -0
- package/dist/core/computer/captura.js +140 -0
- package/dist/core/computer/captura.js.map +1 -0
- package/dist/core/computer/driver.d.ts +130 -0
- package/dist/core/computer/driver.d.ts.map +1 -0
- package/dist/core/computer/driver.js +206 -0
- package/dist/core/computer/driver.js.map +1 -0
- package/dist/core/computer/motor/actions.d.ts +109 -0
- package/dist/core/computer/motor/actions.d.ts.map +1 -0
- package/dist/core/computer/motor/actions.js +157 -0
- package/dist/core/computer/motor/actions.js.map +1 -0
- package/dist/core/computer/motor/bridge.d.ts +232 -0
- package/dist/core/computer/motor/bridge.d.ts.map +1 -0
- package/dist/core/computer/motor/bridge.js +2335 -0
- package/dist/core/computer/motor/bridge.js.map +1 -0
- package/dist/core/computer/motor/cdp.d.ts +107 -0
- package/dist/core/computer/motor/cdp.d.ts.map +1 -0
- package/dist/core/computer/motor/cdp.js +659 -0
- package/dist/core/computer/motor/cdp.js.map +1 -0
- package/dist/core/computer/motor/config.d.ts +23 -0
- package/dist/core/computer/motor/config.d.ts.map +1 -0
- package/dist/core/computer/motor/config.js +100 -0
- package/dist/core/computer/motor/config.js.map +1 -0
- package/dist/core/computer/motor/contract.d.ts +81 -0
- package/dist/core/computer/motor/contract.d.ts.map +1 -0
- package/dist/core/computer/motor/contract.js +14 -0
- package/dist/core/computer/motor/contract.js.map +1 -0
- package/dist/core/computer/motor/note.d.ts +37 -0
- package/dist/core/computer/motor/note.d.ts.map +1 -0
- package/dist/core/computer/motor/note.js +162 -0
- package/dist/core/computer/motor/note.js.map +1 -0
- package/dist/core/computer/motor/outline.d.ts +155 -0
- package/dist/core/computer/motor/outline.d.ts.map +1 -0
- package/dist/core/computer/motor/outline.js +590 -0
- package/dist/core/computer/motor/outline.js.map +1 -0
- package/dist/core/computer/motor/output.d.ts +18 -0
- package/dist/core/computer/motor/output.d.ts.map +1 -0
- package/dist/core/computer/motor/output.js +148 -0
- package/dist/core/computer/motor/output.js.map +1 -0
- package/dist/core/computer/motor/permissions.d.ts +41 -0
- package/dist/core/computer/motor/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/permissions.js +51 -0
- package/dist/core/computer/motor/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
- package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/architecture.js +21 -0
- package/dist/core/computer/motor/platform/architecture.js.map +1 -0
- package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
- package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/coerce.js +17 -0
- package/dist/core/computer/motor/platform/coerce.js.map +1 -0
- package/dist/core/computer/motor/platform/index.d.ts +4 -0
- package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/index.js +79 -0
- package/dist/core/computer/motor/platform/index.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.js +173 -0
- package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.js +261 -0
- package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.js +124 -0
- package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.js +101 -0
- package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper.js +277 -0
- package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
- package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/types.d.ts +263 -0
- package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/types.js +2 -0
- package/dist/core/computer/motor/platform/types.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.js +163 -0
- package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.js +174 -0
- package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
- package/dist/core/computer/motor/root-selection.d.ts +6 -0
- package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
- package/dist/core/computer/motor/root-selection.js +28 -0
- package/dist/core/computer/motor/root-selection.js.map +1 -0
- package/dist/core/computer/motor/runtime.d.ts +50 -0
- package/dist/core/computer/motor/runtime.d.ts.map +1 -0
- package/dist/core/computer/motor/runtime.js +119 -0
- package/dist/core/computer/motor/runtime.js.map +1 -0
- package/dist/core/computer/motor/state.d.ts +68 -0
- package/dist/core/computer/motor/state.d.ts.map +1 -0
- package/dist/core/computer/motor/state.js +100 -0
- package/dist/core/computer/motor/state.js.map +1 -0
- package/dist/core/computer/motor/view.d.ts +6 -0
- package/dist/core/computer/motor/view.d.ts.map +1 -0
- package/dist/core/computer/motor/view.js +185 -0
- package/dist/core/computer/motor/view.js.map +1 -0
- package/dist/core/computer/motor-ada.d.ts +159 -0
- package/dist/core/computer/motor-ada.d.ts.map +1 -0
- package/dist/core/computer/motor-ada.js +412 -0
- package/dist/core/computer/motor-ada.js.map +1 -0
- package/dist/core/computer/politica.d.ts +56 -0
- package/dist/core/computer/politica.d.ts.map +1 -0
- package/dist/core/computer/politica.js +163 -0
- package/dist/core/computer/politica.js.map +1 -0
- package/dist/core/computer/tools.d.ts +26 -0
- package/dist/core/computer/tools.d.ts.map +1 -0
- package/dist/core/computer/tools.js +399 -0
- package/dist/core/computer/tools.js.map +1 -0
- package/dist/core/context-breakdown.d.ts +80 -0
- package/dist/core/context-breakdown.d.ts.map +1 -0
- package/dist/core/context-breakdown.js +87 -0
- package/dist/core/context-breakdown.js.map +1 -0
- package/dist/core/credenciales/cliente.d.ts +60 -0
- package/dist/core/credenciales/cliente.d.ts.map +1 -0
- package/dist/core/credenciales/cliente.js +81 -0
- package/dist/core/credenciales/cliente.js.map +1 -0
- package/dist/core/credenciales/pool.d.ts +96 -0
- package/dist/core/credenciales/pool.d.ts.map +1 -0
- package/dist/core/credenciales/pool.js +128 -0
- package/dist/core/credenciales/pool.js.map +1 -0
- package/dist/core/credenciales/reposo.d.ts +93 -0
- package/dist/core/credenciales/reposo.d.ts.map +1 -0
- package/dist/core/credenciales/reposo.js +489 -0
- package/dist/core/credenciales/reposo.js.map +1 -0
- package/dist/core/credenciales/servidor.d.ts +55 -0
- package/dist/core/credenciales/servidor.d.ts.map +1 -0
- package/dist/core/credenciales/servidor.js +205 -0
- package/dist/core/credenciales/servidor.js.map +1 -0
- package/dist/core/descubrimiento/comandos.d.ts +30 -0
- package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
- package/dist/core/descubrimiento/comandos.js +76 -0
- package/dist/core/descubrimiento/comandos.js.map +1 -0
- package/dist/core/descubrimiento/mcp.d.ts +42 -0
- package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
- package/dist/core/descubrimiento/mcp.js +130 -0
- package/dist/core/descubrimiento/mcp.js.map +1 -0
- package/dist/core/descubrimiento/reglas.d.ts +61 -0
- package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
- package/dist/core/descubrimiento/reglas.js +134 -0
- package/dist/core/descubrimiento/reglas.js.map +1 -0
- package/dist/core/descubrimiento/skills.d.ts +57 -0
- package/dist/core/descubrimiento/skills.d.ts.map +1 -0
- package/dist/core/descubrimiento/skills.js +113 -0
- package/dist/core/descubrimiento/skills.js.map +1 -0
- package/dist/core/dificultad/clasificador.d.ts +133 -0
- package/dist/core/dificultad/clasificador.d.ts.map +1 -0
- package/dist/core/dificultad/clasificador.js +288 -0
- package/dist/core/dificultad/clasificador.js.map +1 -0
- package/dist/core/edicion/diario.d.ts +37 -0
- package/dist/core/edicion/diario.d.ts.map +1 -0
- package/dist/core/edicion/diario.js +51 -0
- package/dist/core/edicion/diario.js.map +1 -0
- package/dist/core/edicion/hashline.d.ts +71 -0
- package/dist/core/edicion/hashline.d.ts.map +1 -0
- package/dist/core/edicion/hashline.js +111 -0
- package/dist/core/edicion/hashline.js.map +1 -0
- package/dist/core/edicion/hueco.d.ts +64 -0
- package/dist/core/edicion/hueco.d.ts.map +1 -0
- package/dist/core/edicion/hueco.js +162 -0
- package/dist/core/edicion/hueco.js.map +1 -0
- package/dist/core/edicion/limpiar-carga.d.ts +39 -0
- package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
- package/dist/core/edicion/limpiar-carga.js +121 -0
- package/dist/core/edicion/limpiar-carga.js.map +1 -0
- package/dist/core/edicion/observador.d.ts +80 -0
- package/dist/core/edicion/observador.d.ts.map +1 -0
- package/dist/core/edicion/observador.js +183 -0
- package/dist/core/edicion/observador.js.map +1 -0
- package/dist/core/edicion/parecido.d.ts +53 -0
- package/dist/core/edicion/parecido.d.ts.map +1 -0
- package/dist/core/edicion/parecido.js +145 -0
- package/dist/core/edicion/parecido.js.map +1 -0
- package/dist/core/edicion/parseo.d.ts +58 -0
- package/dist/core/edicion/parseo.d.ts.map +1 -0
- package/dist/core/edicion/parseo.js +124 -0
- package/dist/core/edicion/parseo.js.map +1 -0
- package/dist/core/edicion/reparacion.d.ts +67 -0
- package/dist/core/edicion/reparacion.d.ts.map +1 -0
- package/dist/core/edicion/reparacion.js +202 -0
- package/dist/core/edicion/reparacion.js.map +1 -0
- package/dist/core/edicion/sangria.d.ts +121 -0
- package/dist/core/edicion/sangria.d.ts.map +1 -0
- package/dist/core/edicion/sangria.js +341 -0
- package/dist/core/edicion/sangria.js.map +1 -0
- package/dist/core/edicion/tipos.d.ts +58 -0
- package/dist/core/edicion/tipos.d.ts.map +1 -0
- package/dist/core/edicion/tipos.js +160 -0
- package/dist/core/edicion/tipos.js.map +1 -0
- package/dist/core/errores/proveedor.d.ts +53 -0
- package/dist/core/errores/proveedor.d.ts.map +1 -0
- package/dist/core/errores/proveedor.js +191 -0
- package/dist/core/errores/proveedor.js.map +1 -0
- package/dist/core/estructural/buscar.d.ts +61 -0
- package/dist/core/estructural/buscar.d.ts.map +1 -0
- package/dist/core/estructural/buscar.js +261 -0
- package/dist/core/estructural/buscar.js.map +1 -0
- package/dist/core/estructural/editar.d.ts +36 -0
- package/dist/core/estructural/editar.d.ts.map +1 -0
- package/dist/core/estructural/editar.js +123 -0
- package/dist/core/estructural/editar.js.map +1 -0
- package/dist/core/estructural/tools.d.ts +11 -0
- package/dist/core/estructural/tools.d.ts.map +1 -0
- package/dist/core/estructural/tools.js +100 -0
- package/dist/core/estructural/tools.js.map +1 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +10 -1
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensiones/suplantacion.d.ts +49 -0
- package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
- package/dist/core/extensiones/suplantacion.js +61 -0
- package/dist/core/extensiones/suplantacion.js.map +1 -0
- package/dist/core/extensiones/vigilancia.d.ts +54 -0
- package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
- package/dist/core/extensiones/vigilancia.js +217 -0
- package/dist/core/extensiones/vigilancia.js.map +1 -0
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +11 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
- package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
- package/dist/core/harness/fuentes-de-contexto.js +44 -0
- package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
- package/dist/core/harness/refine.d.ts +40 -0
- package/dist/core/harness/refine.d.ts.map +1 -0
- package/dist/core/harness/refine.js +109 -0
- package/dist/core/harness/refine.js.map +1 -0
- package/dist/core/harness/store.d.ts +75 -0
- package/dist/core/harness/store.d.ts.map +1 -0
- package/dist/core/harness/store.js +149 -0
- package/dist/core/harness/store.js.map +1 -0
- package/dist/core/hooks/contract.d.ts +85 -0
- package/dist/core/hooks/contract.d.ts.map +1 -0
- package/dist/core/hooks/contract.js +140 -0
- package/dist/core/hooks/contract.js.map +1 -0
- package/dist/core/hooks/runner.d.ts +42 -0
- package/dist/core/hooks/runner.d.ts.map +1 -0
- package/dist/core/hooks/runner.js +85 -0
- package/dist/core/hooks/runner.js.map +1 -0
- package/dist/core/hooks/session-hooks.d.ts +62 -0
- package/dist/core/hooks/session-hooks.d.ts.map +1 -0
- package/dist/core/hooks/session-hooks.js +84 -0
- package/dist/core/hooks/session-hooks.js.map +1 -0
- package/dist/core/importar/formatos.d.ts +69 -0
- package/dist/core/importar/formatos.d.ts.map +1 -0
- package/dist/core/importar/formatos.js +235 -0
- package/dist/core/importar/formatos.js.map +1 -0
- package/dist/core/interactivo/deteccion.d.ts +44 -0
- package/dist/core/interactivo/deteccion.d.ts.map +1 -0
- package/dist/core/interactivo/deteccion.js +82 -0
- package/dist/core/interactivo/deteccion.js.map +1 -0
- package/dist/core/interactivo/sesion.d.ts +50 -0
- package/dist/core/interactivo/sesion.d.ts.map +1 -0
- package/dist/core/interactivo/sesion.js +156 -0
- package/dist/core/interactivo/sesion.js.map +1 -0
- package/dist/core/interactivo/tools.d.ts +21 -0
- package/dist/core/interactivo/tools.d.ts.map +1 -0
- package/dist/core/interactivo/tools.js +122 -0
- package/dist/core/interactivo/tools.js.map +1 -0
- package/dist/core/lectura/mapa.d.ts +70 -0
- package/dist/core/lectura/mapa.d.ts.map +1 -0
- package/dist/core/lectura/mapa.js +177 -0
- package/dist/core/lectura/mapa.js.map +1 -0
- package/dist/core/lectura/pdf.d.ts +49 -0
- package/dist/core/lectura/pdf.d.ts.map +1 -0
- package/dist/core/lectura/pdf.js +337 -0
- package/dist/core/lectura/pdf.js.map +1 -0
- package/dist/core/limpieza/comprobadores.d.ts +28 -0
- package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
- package/dist/core/limpieza/comprobadores.js +311 -0
- package/dist/core/limpieza/comprobadores.js.map +1 -0
- package/dist/core/limpieza/parseo.d.ts +19 -0
- package/dist/core/limpieza/parseo.d.ts.map +1 -0
- package/dist/core/limpieza/parseo.js +124 -0
- package/dist/core/limpieza/parseo.js.map +1 -0
- package/dist/core/limpieza/reparacion.d.ts +77 -0
- package/dist/core/limpieza/reparacion.d.ts.map +1 -0
- package/dist/core/limpieza/reparacion.js +254 -0
- package/dist/core/limpieza/reparacion.js.map +1 -0
- package/dist/core/limpieza/tipos.d.ts +56 -0
- package/dist/core/limpieza/tipos.d.ts.map +1 -0
- package/dist/core/limpieza/tipos.js +9 -0
- package/dist/core/limpieza/tipos.js.map +1 -0
- package/dist/core/lsp/cliente.d.ts +52 -0
- package/dist/core/lsp/cliente.d.ts.map +1 -0
- package/dist/core/lsp/cliente.js +232 -0
- package/dist/core/lsp/cliente.js.map +1 -0
- package/dist/core/lsp/descubrimiento.d.ts +62 -0
- package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
- package/dist/core/lsp/descubrimiento.js +152 -0
- package/dist/core/lsp/descubrimiento.js.map +1 -0
- package/dist/core/lsp/ediciones.d.ts +59 -0
- package/dist/core/lsp/ediciones.d.ts.map +1 -0
- package/dist/core/lsp/ediciones.js +89 -0
- package/dist/core/lsp/ediciones.js.map +1 -0
- package/dist/core/lsp/extension.d.ts +28 -0
- package/dist/core/lsp/extension.d.ts.map +1 -0
- package/dist/core/lsp/extension.js +34 -0
- package/dist/core/lsp/extension.js.map +1 -0
- package/dist/core/lsp/tools.d.ts +45 -0
- package/dist/core/lsp/tools.d.ts.map +1 -0
- package/dist/core/lsp/tools.js +265 -0
- package/dist/core/lsp/tools.js.map +1 -0
- package/dist/core/mcp/client.d.ts +60 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +139 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/manager.d.ts +86 -0
- package/dist/core/mcp/manager.d.ts.map +1 -0
- package/dist/core/mcp/manager.js +124 -0
- package/dist/core/mcp/manager.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +15 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +84 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/memory-engine/audit-export.d.ts +12 -10
- package/dist/core/memory-engine/audit-export.d.ts.map +1 -1
- package/dist/core/memory-engine/audit-export.js +15 -0
- package/dist/core/memory-engine/audit-export.js.map +1 -1
- package/dist/core/memory-engine/audit-indice.d.ts +153 -0
- package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
- package/dist/core/memory-engine/audit-indice.js +271 -0
- package/dist/core/memory-engine/audit-indice.js.map +1 -0
- package/dist/core/memory-engine/audit.d.ts +18 -6
- package/dist/core/memory-engine/audit.d.ts.map +1 -1
- package/dist/core/memory-engine/audit.js +25 -42
- package/dist/core/memory-engine/audit.js.map +1 -1
- package/dist/core/memory-engine/engine.d.ts +19 -1
- package/dist/core/memory-engine/engine.d.ts.map +1 -1
- package/dist/core/memory-engine/engine.js +71 -5
- package/dist/core/memory-engine/engine.js.map +1 -1
- package/dist/core/memory-engine/observation-store.d.ts +0 -2
- package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
- package/dist/core/memory-engine/observation-store.js +4 -5
- package/dist/core/memory-engine/observation-store.js.map +1 -1
- package/dist/core/memory-engine/refinements.d.ts +51 -0
- package/dist/core/memory-engine/refinements.d.ts.map +1 -0
- package/dist/core/memory-engine/refinements.js +99 -0
- package/dist/core/memory-engine/refinements.js.map +1 -0
- package/dist/core/memory-engine/tools.d.ts.map +1 -1
- package/dist/core/memory-engine/tools.js +27 -1
- package/dist/core/memory-engine/tools.js.map +1 -1
- package/dist/core/memory-engine/types.d.ts +2 -0
- package/dist/core/memory-engine/types.d.ts.map +1 -1
- package/dist/core/memory-engine/types.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +7 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/muestreo-restringido.d.ts +49 -0
- package/dist/core/muestreo-restringido.d.ts.map +1 -0
- package/dist/core/muestreo-restringido.js +65 -0
- package/dist/core/muestreo-restringido.js.map +1 -0
- package/dist/core/orphan-process-journal.d.ts +48 -0
- package/dist/core/orphan-process-journal.d.ts.map +1 -0
- package/dist/core/orphan-process-journal.js +116 -0
- package/dist/core/orphan-process-journal.js.map +1 -0
- package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
- package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
- package/dist/core/privacidad/categorias-especiales.js +745 -0
- package/dist/core/privacidad/categorias-especiales.js.map +1 -0
- package/dist/core/privacidad/tapar.d.ts +48 -0
- package/dist/core/privacidad/tapar.d.ts.map +1 -0
- package/dist/core/privacidad/tapar.js +66 -0
- package/dist/core/privacidad/tapar.js.map +1 -0
- package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
- package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
- package/dist/core/prompt-cache/diagnostics.js +100 -0
- package/dist/core/prompt-cache/diagnostics.js.map +1 -0
- package/dist/core/prompt-cache/index.d.ts +33 -0
- package/dist/core/prompt-cache/index.d.ts.map +1 -0
- package/dist/core/prompt-cache/index.js +189 -0
- package/dist/core/prompt-cache/index.js.map +1 -0
- package/dist/core/prompt-cache/payload.d.ts +58 -0
- package/dist/core/prompt-cache/payload.d.ts.map +1 -0
- package/dist/core/prompt-cache/payload.js +122 -0
- package/dist/core/prompt-cache/payload.js.map +1 -0
- package/dist/core/prompt-cache/stabilize.d.ts +65 -0
- package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
- package/dist/core/prompt-cache/stabilize.js +137 -0
- package/dist/core/prompt-cache/stabilize.js.map +1 -0
- package/dist/core/prompt-cache/stats.d.ts +55 -0
- package/dist/core/prompt-cache/stats.d.ts.map +1 -0
- package/dist/core/prompt-cache/stats.js +158 -0
- package/dist/core/prompt-cache/stats.js.map +1 -0
- package/dist/core/prompt-eleccion.d.ts +38 -0
- package/dist/core/prompt-eleccion.d.ts.map +1 -0
- package/dist/core/prompt-eleccion.js +46 -0
- package/dist/core/prompt-eleccion.js.map +1 -0
- package/dist/core/prompts/montar.d.ts +75 -0
- package/dist/core/prompts/montar.d.ts.map +1 -0
- package/dist/core/prompts/montar.js +146 -0
- package/dist/core/prompts/montar.js.map +1 -0
- package/dist/core/prompts/plantilla.d.ts +54 -0
- package/dist/core/prompts/plantilla.d.ts.map +1 -0
- package/dist/core/prompts/plantilla.js +153 -0
- package/dist/core/prompts/plantilla.js.map +1 -0
- package/dist/core/prompts/sistema.md +134 -0
- package/dist/core/provider-attribution.d.ts +24 -2
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js +24 -42
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/remoto/destino.d.ts +38 -0
- package/dist/core/remoto/destino.d.ts.map +1 -0
- package/dist/core/remoto/destino.js +105 -0
- package/dist/core/remoto/destino.js.map +1 -0
- package/dist/core/remoto/ejecutor.d.ts +59 -0
- package/dist/core/remoto/ejecutor.d.ts.map +1 -0
- package/dist/core/remoto/ejecutor.js +225 -0
- package/dist/core/remoto/ejecutor.js.map +1 -0
- package/dist/core/remoto/ficheros.d.ts +29 -0
- package/dist/core/remoto/ficheros.d.ts.map +1 -0
- package/dist/core/remoto/ficheros.js +90 -0
- package/dist/core/remoto/ficheros.js.map +1 -0
- package/dist/core/remoto/registro-extension.d.ts +15 -0
- package/dist/core/remoto/registro-extension.d.ts.map +1 -0
- package/dist/core/remoto/registro-extension.js +17 -0
- package/dist/core/remoto/registro-extension.js.map +1 -0
- package/dist/core/remoto/tools.d.ts +28 -0
- package/dist/core/remoto/tools.d.ts.map +1 -0
- package/dist/core/remoto/tools.js +31 -0
- package/dist/core/remoto/tools.js.map +1 -0
- package/dist/core/resource-loader.d.ts +8 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +93 -1
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/revision/hallazgo.d.ts +51 -0
- package/dist/core/revision/hallazgo.d.ts.map +1 -0
- package/dist/core/revision/hallazgo.js +73 -0
- package/dist/core/revision/hallazgo.js.map +1 -0
- package/dist/core/revision/revisor.d.ts +81 -0
- package/dist/core/revision/revisor.d.ts.map +1 -0
- package/dist/core/revision/revisor.js +132 -0
- package/dist/core/revision/revisor.js.map +1 -0
- package/dist/core/revision/sarif.d.ts +30 -0
- package/dist/core/revision/sarif.d.ts.map +1 -0
- package/dist/core/revision/sarif.js +83 -0
- package/dist/core/revision/sarif.js.map +1 -0
- package/dist/core/scheduler/scheduler.d.ts +87 -0
- package/dist/core/scheduler/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler/scheduler.js +178 -0
- package/dist/core/scheduler/scheduler.js.map +1 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
- package/dist/core/settings-manager.d.ts +110 -6
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +53 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +3 -3
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts +17 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +13 -5
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetria/otlp.d.ts +122 -0
- package/dist/core/telemetria/otlp.d.ts.map +1 -0
- package/dist/core/telemetria/otlp.js +373 -0
- package/dist/core/telemetria/otlp.js.map +1 -0
- package/dist/core/tools/coercion-argumentos.d.ts +48 -0
- package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
- package/dist/core/tools/coercion-argumentos.js +99 -0
- package/dist/core/tools/coercion-argumentos.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +0 -7
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +232 -7
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +8 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +5 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/json-tolerante.d.ts +30 -0
- package/dist/core/tools/json-tolerante.d.ts.map +1 -0
- package/dist/core/tools/json-tolerante.js +70 -0
- package/dist/core/tools/json-tolerante.js.map +1 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +17 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +17 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/turno-vacio/detectar.d.ts +38 -0
- package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
- package/dist/core/turno-vacio/detectar.js +66 -0
- package/dist/core/turno-vacio/detectar.js.map +1 -0
- package/dist/core/undo/journal.d.ts +57 -0
- package/dist/core/undo/journal.d.ts.map +1 -0
- package/dist/core/undo/journal.js +178 -0
- package/dist/core/undo/journal.js.map +1 -0
- package/dist/core/urls-internas/auditoria.d.ts +10 -0
- package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
- package/dist/core/urls-internas/auditoria.js +42 -0
- package/dist/core/urls-internas/auditoria.js.map +1 -0
- package/dist/core/urls-internas/boveda.d.ts +13 -0
- package/dist/core/urls-internas/boveda.d.ts.map +1 -0
- package/dist/core/urls-internas/boveda.js +40 -0
- package/dist/core/urls-internas/boveda.js.map +1 -0
- package/dist/core/urls-internas/lector.d.ts +30 -0
- package/dist/core/urls-internas/lector.d.ts.map +1 -0
- package/dist/core/urls-internas/lector.js +56 -0
- package/dist/core/urls-internas/lector.js.map +1 -0
- package/dist/core/urls-internas/memoria.d.ts +11 -0
- package/dist/core/urls-internas/memoria.d.ts.map +1 -0
- package/dist/core/urls-internas/memoria.js +25 -0
- package/dist/core/urls-internas/memoria.js.map +1 -0
- package/dist/core/urls-internas/parse.d.ts +28 -0
- package/dist/core/urls-internas/parse.d.ts.map +1 -0
- package/dist/core/urls-internas/parse.js +32 -0
- package/dist/core/urls-internas/parse.js.map +1 -0
- package/dist/core/urls-internas/reglas.d.ts +10 -0
- package/dist/core/urls-internas/reglas.d.ts.map +1 -0
- package/dist/core/urls-internas/reglas.js +31 -0
- package/dist/core/urls-internas/reglas.js.map +1 -0
- package/dist/core/usage/aggregate.d.ts +68 -0
- package/dist/core/usage/aggregate.d.ts.map +1 -0
- package/dist/core/usage/aggregate.js +93 -0
- package/dist/core/usage/aggregate.js.map +1 -0
- package/dist/core/usage/cuota/anthropic.d.ts +10 -0
- package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
- package/dist/core/usage/cuota/anthropic.js +63 -0
- package/dist/core/usage/cuota/anthropic.js.map +1 -0
- package/dist/core/usage/cuota/cache.d.ts +20 -0
- package/dist/core/usage/cuota/cache.d.ts.map +1 -0
- package/dist/core/usage/cuota/cache.js +36 -0
- package/dist/core/usage/cuota/cache.js.map +1 -0
- package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
- package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
- package/dist/core/usage/cuota/github-copilot.js +67 -0
- package/dist/core/usage/cuota/github-copilot.js.map +1 -0
- package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
- package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
- package/dist/core/usage/cuota/google-gemini.js +72 -0
- package/dist/core/usage/cuota/google-gemini.js.map +1 -0
- package/dist/core/usage/cuota/index.d.ts +25 -0
- package/dist/core/usage/cuota/index.d.ts.map +1 -0
- package/dist/core/usage/cuota/index.js +50 -0
- package/dist/core/usage/cuota/index.js.map +1 -0
- package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
- package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
- package/dist/core/usage/cuota/openai-codex.js +59 -0
- package/dist/core/usage/cuota/openai-codex.js.map +1 -0
- package/dist/core/usage/cuota/openrouter.d.ts +10 -0
- package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
- package/dist/core/usage/cuota/openrouter.js +47 -0
- package/dist/core/usage/cuota/openrouter.js.map +1 -0
- package/dist/core/usage/cuota/tipos.d.ts +50 -0
- package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
- package/dist/core/usage/cuota/tipos.js +25 -0
- package/dist/core/usage/cuota/tipos.js.map +1 -0
- package/dist/core/web/busqueda-nativa.d.ts +82 -0
- package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
- package/dist/core/web/busqueda-nativa.js +163 -0
- package/dist/core/web/busqueda-nativa.js.map +1 -0
- package/dist/core/web/destino.d.ts +58 -0
- package/dist/core/web/destino.d.ts.map +1 -0
- package/dist/core/web/destino.js +127 -0
- package/dist/core/web/destino.js.map +1 -0
- package/dist/core/web/proveedores/brave.d.ts +6 -0
- package/dist/core/web/proveedores/brave.d.ts.map +1 -0
- package/dist/core/web/proveedores/brave.js +20 -0
- package/dist/core/web/proveedores/brave.js.map +1 -0
- package/dist/core/web/proveedores/claves.d.ts +19 -0
- package/dist/core/web/proveedores/claves.d.ts.map +1 -0
- package/dist/core/web/proveedores/claves.js +36 -0
- package/dist/core/web/proveedores/claves.js.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.js +109 -0
- package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
- package/dist/core/web/proveedores/ecosia.d.ts +3 -0
- package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
- package/dist/core/web/proveedores/ecosia.js +72 -0
- package/dist/core/web/proveedores/ecosia.js.map +1 -0
- package/dist/core/web/proveedores/exa.d.ts +6 -0
- package/dist/core/web/proveedores/exa.d.ts.map +1 -0
- package/dist/core/web/proveedores/exa.js +24 -0
- package/dist/core/web/proveedores/exa.js.map +1 -0
- package/dist/core/web/proveedores/mojeek.d.ts +3 -0
- package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
- package/dist/core/web/proveedores/mojeek.js +65 -0
- package/dist/core/web/proveedores/mojeek.js.map +1 -0
- package/dist/core/web/proveedores/navegador.d.ts +10 -0
- package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
- package/dist/core/web/proveedores/navegador.js +13 -0
- package/dist/core/web/proveedores/navegador.js.map +1 -0
- package/dist/core/web/proveedores/registro.d.ts +43 -0
- package/dist/core/web/proveedores/registro.d.ts.map +1 -0
- package/dist/core/web/proveedores/registro.js +49 -0
- package/dist/core/web/proveedores/registro.js.map +1 -0
- package/dist/core/web/proveedores/searxng.d.ts +9 -0
- package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
- package/dist/core/web/proveedores/searxng.js +17 -0
- package/dist/core/web/proveedores/searxng.js.map +1 -0
- package/dist/core/web/proveedores/serper.d.ts +9 -0
- package/dist/core/web/proveedores/serper.d.ts.map +1 -0
- package/dist/core/web/proveedores/serper.js +19 -0
- package/dist/core/web/proveedores/serper.js.map +1 -0
- package/dist/core/web/proveedores/tavily.d.ts +6 -0
- package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
- package/dist/core/web/proveedores/tavily.js +19 -0
- package/dist/core/web/proveedores/tavily.js.map +1 -0
- package/dist/core/web/proveedores/tipos.d.ts +36 -0
- package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
- package/dist/core/web/proveedores/tipos.js +10 -0
- package/dist/core/web/proveedores/tipos.js.map +1 -0
- package/dist/core/web/registro-red.d.ts +43 -0
- package/dist/core/web/registro-red.d.ts.map +1 -0
- package/dist/core/web/registro-red.js +86 -0
- package/dist/core/web/registro-red.js.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.js +38 -0
- package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
- package/dist/core/web/scrapers/crates-io.d.ts +11 -0
- package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
- package/dist/core/web/scrapers/crates-io.js +29 -0
- package/dist/core/web/scrapers/crates-io.js.map +1 -0
- package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
- package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
- package/dist/core/web/scrapers/docs-rs.js +35 -0
- package/dist/core/web/scrapers/docs-rs.js.map +1 -0
- package/dist/core/web/scrapers/github.d.ts +3 -0
- package/dist/core/web/scrapers/github.d.ts.map +1 -0
- package/dist/core/web/scrapers/github.js +72 -0
- package/dist/core/web/scrapers/github.js.map +1 -0
- package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
- package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
- package/dist/core/web/scrapers/go-pkg.js +30 -0
- package/dist/core/web/scrapers/go-pkg.js.map +1 -0
- package/dist/core/web/scrapers/hex.d.ts +6 -0
- package/dist/core/web/scrapers/hex.d.ts.map +1 -0
- package/dist/core/web/scrapers/hex.js +27 -0
- package/dist/core/web/scrapers/hex.js.map +1 -0
- package/dist/core/web/scrapers/maven.d.ts +8 -0
- package/dist/core/web/scrapers/maven.d.ts.map +1 -0
- package/dist/core/web/scrapers/maven.js +41 -0
- package/dist/core/web/scrapers/maven.js.map +1 -0
- package/dist/core/web/scrapers/mdn.d.ts +6 -0
- package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
- package/dist/core/web/scrapers/mdn.js +28 -0
- package/dist/core/web/scrapers/mdn.js.map +1 -0
- package/dist/core/web/scrapers/npm.d.ts +11 -0
- package/dist/core/web/scrapers/npm.d.ts.map +1 -0
- package/dist/core/web/scrapers/npm.js +57 -0
- package/dist/core/web/scrapers/npm.js.map +1 -0
- package/dist/core/web/scrapers/nuget.d.ts +8 -0
- package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
- package/dist/core/web/scrapers/nuget.js +22 -0
- package/dist/core/web/scrapers/nuget.js.map +1 -0
- package/dist/core/web/scrapers/nvd.d.ts +7 -0
- package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
- package/dist/core/web/scrapers/nvd.js +37 -0
- package/dist/core/web/scrapers/nvd.js.map +1 -0
- package/dist/core/web/scrapers/pypi.d.ts +6 -0
- package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
- package/dist/core/web/scrapers/pypi.js +31 -0
- package/dist/core/web/scrapers/pypi.js.map +1 -0
- package/dist/core/web/scrapers/registro.d.ts +13 -0
- package/dist/core/web/scrapers/registro.d.ts.map +1 -0
- package/dist/core/web/scrapers/registro.js +65 -0
- package/dist/core/web/scrapers/registro.js.map +1 -0
- package/dist/core/web/scrapers/rubygems.d.ts +6 -0
- package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
- package/dist/core/web/scrapers/rubygems.js +23 -0
- package/dist/core/web/scrapers/rubygems.js.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.js +46 -0
- package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
- package/dist/core/web/scrapers/tipos.d.ts +42 -0
- package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
- package/dist/core/web/scrapers/tipos.js +23 -0
- package/dist/core/web/scrapers/tipos.js.map +1 -0
- package/dist/core/web/texto.d.ts +10 -0
- package/dist/core/web/texto.d.ts.map +1 -0
- package/dist/core/web/texto.js +26 -0
- package/dist/core/web/texto.js.map +1 -0
- package/dist/core/web/tools.d.ts +91 -0
- package/dist/core/web/tools.d.ts.map +1 -0
- package/dist/core/web/tools.js +304 -0
- package/dist/core/web/tools.js.map +1 -0
- package/dist/core/wiki/almacen.d.ts +33 -0
- package/dist/core/wiki/almacen.d.ts.map +1 -0
- package/dist/core/wiki/almacen.js +93 -0
- package/dist/core/wiki/almacen.js.map +1 -0
- package/dist/core/wiki/citas.d.ts +111 -0
- package/dist/core/wiki/citas.d.ts.map +1 -0
- package/dist/core/wiki/citas.js +146 -0
- package/dist/core/wiki/citas.js.map +1 -0
- package/dist/core/workflows/agent-runner.d.ts +2 -0
- package/dist/core/workflows/agent-runner.d.ts.map +1 -1
- package/dist/core/workflows/agent-runner.js +131 -44
- package/dist/core/workflows/agent-runner.js.map +1 -1
- package/dist/core/workflows/builtins.d.ts.map +1 -1
- package/dist/core/workflows/builtins.js +1 -0
- package/dist/core/workflows/builtins.js.map +1 -1
- package/dist/core/workflows/contrato/esquema.d.ts +32 -0
- package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
- package/dist/core/workflows/contrato/esquema.js +25 -0
- package/dist/core/workflows/contrato/esquema.js.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
- package/dist/core/workflows/contrato/validador.d.ts +30 -0
- package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
- package/dist/core/workflows/contrato/validador.js +56 -0
- package/dist/core/workflows/contrato/validador.js.map +1 -0
- package/dist/core/workflows/contrato/yield.d.ts +65 -0
- package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
- package/dist/core/workflows/contrato/yield.js +80 -0
- package/dist/core/workflows/contrato/yield.js.map +1 -0
- package/dist/core/workflows/goal-engine/engine.d.ts +17 -0
- package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -1
- package/dist/core/workflows/goal-engine/engine.js +41 -0
- package/dist/core/workflows/goal-engine/engine.js.map +1 -1
- package/dist/core/workflows/index.d.ts +8 -0
- package/dist/core/workflows/index.d.ts.map +1 -1
- package/dist/core/workflows/index.js +4 -0
- package/dist/core/workflows/index.js.map +1 -1
- package/dist/core/workflows/manager.d.ts +10 -0
- package/dist/core/workflows/manager.d.ts.map +1 -1
- package/dist/core/workflows/manager.js +35 -11
- package/dist/core/workflows/manager.js.map +1 -1
- package/dist/core/workflows/runtime.d.ts +13 -0
- package/dist/core/workflows/runtime.d.ts.map +1 -1
- package/dist/core/workflows/runtime.js +80 -1
- package/dist/core/workflows/runtime.js.map +1 -1
- package/dist/core/workflows/save-as-skill.d.ts +27 -0
- package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
- package/dist/core/workflows/save-as-skill.js +54 -0
- package/dist/core/workflows/save-as-skill.js.map +1 -0
- package/dist/core/workflows/types.d.ts +49 -0
- package/dist/core/workflows/types.d.ts.map +1 -1
- package/dist/core/workflows/types.js.map +1 -1
- package/dist/extensions/remoto/index.d.ts +22 -0
- package/dist/extensions/remoto/index.d.ts.map +1 -0
- package/dist/extensions/remoto/index.js +54 -0
- package/dist/extensions/remoto/index.js.map +1 -0
- package/dist/index.d.ts +1 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -16
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +6 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts +42 -0
- package/dist/modes/acp/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp/acp-mode.js +190 -0
- package/dist/modes/acp/acp-mode.js.map +1 -0
- package/dist/modes/acp/events.d.ts +74 -0
- package/dist/modes/acp/events.d.ts.map +1 -0
- package/dist/modes/acp/events.js +116 -0
- package/dist/modes/acp/events.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +8 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +41 -7
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +1 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +9 -86
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +8 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +48 -17
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -7
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +137 -146
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +11 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +27 -5
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/server/attach.d.ts +56 -0
- package/dist/server/attach.d.ts.map +1 -0
- package/dist/server/attach.js +130 -0
- package/dist/server/attach.js.map +1 -0
- package/dist/server/extension-ops.d.ts +40 -0
- package/dist/server/extension-ops.d.ts.map +1 -0
- package/dist/server/extension-ops.js +146 -0
- package/dist/server/extension-ops.js.map +1 -0
- package/dist/server/pi-server-service.d.ts +85 -0
- package/dist/server/pi-server-service.d.ts.map +1 -0
- package/dist/server/pi-server-service.js +213 -0
- package/dist/server/pi-server-service.js.map +1 -0
- package/dist/server/scheduler-tick.d.ts +32 -0
- package/dist/server/scheduler-tick.d.ts.map +1 -0
- package/dist/server/scheduler-tick.js +47 -0
- package/dist/server/scheduler-tick.js.map +1 -0
- package/dist/server/serve.d.ts +25 -0
- package/dist/server/serve.d.ts.map +1 -0
- package/dist/server/serve.js +83 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/server/transcript.d.ts +38 -0
- package/dist/server/transcript.d.ts.map +1 -0
- package/dist/server/transcript.js +176 -0
- package/dist/server/transcript.js.map +1 -0
- package/dist/skills/skill-creator/SKILL.md +90 -0
- package/dist/telegram/api.d.ts +75 -0
- package/dist/telegram/api.d.ts.map +1 -0
- package/dist/telegram/api.js +104 -0
- package/dist/telegram/api.js.map +1 -0
- package/dist/telegram/bridge.d.ts +85 -0
- package/dist/telegram/bridge.d.ts.map +1 -0
- package/dist/telegram/bridge.js +182 -0
- package/dist/telegram/bridge.js.map +1 -0
- package/dist/telegram/journal.d.ts +67 -0
- package/dist/telegram/journal.d.ts.map +1 -0
- package/dist/telegram/journal.js +119 -0
- package/dist/telegram/journal.js.map +1 -0
- package/dist/telegram/servidor.d.ts +15 -0
- package/dist/telegram/servidor.d.ts.map +1 -0
- package/dist/telegram/servidor.js +74 -0
- package/dist/telegram/servidor.js.map +1 -0
- package/dist/utils/shell.d.ts +11 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +11 -0
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +29 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +10 -10
- package/docs/compliance.md +241 -0
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +10 -10
- package/docs/development.md +47 -10
- package/docs/docs.json +14 -2
- package/docs/environment-variables.md +20 -17
- package/docs/extensions.md +51 -49
- package/docs/index.md +15 -21
- package/docs/json.md +3 -3
- package/docs/keybindings.md +5 -5
- package/docs/llama-cpp.md +7 -7
- package/docs/models.md +12 -12
- package/docs/packages.md +45 -45
- package/docs/prompt-templates.md +5 -5
- package/docs/providers.md +12 -12
- package/docs/quickstart.md +39 -39
- package/docs/rpc.md +12 -12
- package/docs/sdk.md +38 -38
- package/docs/security.md +26 -21
- package/docs/session-format.md +7 -7
- package/docs/sessions.md +14 -14
- package/docs/settings.md +45 -20
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +11 -11
- package/docs/terminal-setup.md +14 -14
- package/docs/termux.md +7 -7
- package/docs/themes.md +11 -11
- package/docs/tmux.md +4 -4
- package/docs/tui.md +3 -3
- package/docs/usage.md +54 -54
- package/docs/windows.md +2 -2
- package/examples/sdk/12-full-control.ts +9 -0
- package/npm-shrinkwrap.json +35 -251
- package/package.json +10 -4
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const ENDPOINT = "https://google.serper.dev/search";
|
|
2
|
+
export const buscar = async (consulta, maximo, clave, fetchImpl, signal) => {
|
|
3
|
+
if (!clave)
|
|
4
|
+
throw new Error("Serper requiere clave.");
|
|
5
|
+
const respuesta = await fetchImpl(ENDPOINT, {
|
|
6
|
+
method: "POST",
|
|
7
|
+
headers: { "X-API-KEY": clave, "content-type": "application/json" },
|
|
8
|
+
body: JSON.stringify({ q: consulta, num: maximo }),
|
|
9
|
+
signal,
|
|
10
|
+
});
|
|
11
|
+
if (!respuesta.ok)
|
|
12
|
+
throw new Error(`Serper respondió HTTP ${respuesta.status}.`);
|
|
13
|
+
const datos = (await respuesta.json());
|
|
14
|
+
const resultados = (datos.organic ?? [])
|
|
15
|
+
.filter((r) => typeof r.link === "string" && r.link)
|
|
16
|
+
.map((r) => ({ titulo: r.title || r.link, url: r.link, resumen: r.snippet }));
|
|
17
|
+
return resultados.slice(0, maximo);
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=serper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serper.js","sourceRoot":"","sources":["../../../../src/core/web/proveedores/serper.ts"],"names":[],"mappings":"AAQA,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AAMpD,MAAM,CAAC,MAAM,MAAM,GAAkB,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1F,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;QAC3C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE;QACnE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QAClD,MAAM;KACN,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAAyB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAoB,CAAC;IAC1D,MAAM,UAAU,GAAyB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;SAC5D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC;SACnD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAK,EAAE,GAAG,EAAE,CAAC,CAAC,IAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACjF,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAAA,CACnC,CAAC","sourcesContent":["/**\n * Serper (Google Search API). Requiere clave (`serper` en el vault, o\n * SERPER_API_KEY). Es el proveedor histórico de Ada, anterior a este\n * registro: se mantiene aquí para que quien ya tenga la clave configurada\n * siga funcionando exactamente igual.\n */\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://google.serper.dev/search\";\n\ninterface RespuestaSerper {\n\torganic?: Array<{ title?: string; link?: string; snippet?: string }>;\n}\n\nexport const buscar: FuncionBuscar = async (consulta, maximo, clave, fetchImpl, signal) => {\n\tif (!clave) throw new Error(\"Serper requiere clave.\");\n\tconst respuesta = await fetchImpl(ENDPOINT, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"X-API-KEY\": clave, \"content-type\": \"application/json\" },\n\t\tbody: JSON.stringify({ q: consulta, num: maximo }),\n\t\tsignal,\n\t});\n\tif (!respuesta.ok) throw new Error(`Serper respondió HTTP ${respuesta.status}.`);\n\tconst datos = (await respuesta.json()) as RespuestaSerper;\n\tconst resultados: ResultadoProveedor[] = (datos.organic ?? [])\n\t\t.filter((r) => typeof r.link === \"string\" && r.link)\n\t\t.map((r) => ({ titulo: r.title || r.link!, url: r.link!, resumen: r.snippet }));\n\treturn resultados.slice(0, maximo);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tavily.d.ts","sourceRoot":"","sources":["../../../../src/core/web/proveedores/tavily.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,YAAY,CAAC;AAQpE,eAAO,MAAM,MAAM,EAAE,aAcpB,CAAC","sourcesContent":["/**\n * Tavily Search API. Requiere clave (`tavily` en el vault, o TAVILY_API_KEY).\n */\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://api.tavily.com/search\";\n\ninterface RespuestaTavily {\n\tresults?: Array<{ title?: string; url?: string; content?: string }>;\n}\n\nexport const buscar: FuncionBuscar = async (consulta, maximo, clave, fetchImpl, signal) => {\n\tif (!clave) throw new Error(\"Tavily requiere clave.\");\n\tconst respuesta = await fetchImpl(ENDPOINT, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"content-type\": \"application/json\", authorization: `Bearer ${clave}` },\n\t\tbody: JSON.stringify({ query: consulta, max_results: Math.min(Math.max(maximo, 1), 20), search_depth: \"basic\" }),\n\t\tsignal,\n\t});\n\tif (!respuesta.ok) throw new Error(`Tavily respondió HTTP ${respuesta.status}.`);\n\tconst datos = (await respuesta.json()) as RespuestaTavily;\n\tconst resultados: ResultadoProveedor[] = (datos.results ?? [])\n\t\t.filter((r) => typeof r.url === \"string\" && r.url)\n\t\t.map((r) => ({ titulo: r.title || r.url!, url: r.url!, resumen: r.content }));\n\treturn resultados.slice(0, maximo);\n};\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const ENDPOINT = "https://api.tavily.com/search";
|
|
2
|
+
export const buscar = async (consulta, maximo, clave, fetchImpl, signal) => {
|
|
3
|
+
if (!clave)
|
|
4
|
+
throw new Error("Tavily requiere clave.");
|
|
5
|
+
const respuesta = await fetchImpl(ENDPOINT, {
|
|
6
|
+
method: "POST",
|
|
7
|
+
headers: { "content-type": "application/json", authorization: `Bearer ${clave}` },
|
|
8
|
+
body: JSON.stringify({ query: consulta, max_results: Math.min(Math.max(maximo, 1), 20), search_depth: "basic" }),
|
|
9
|
+
signal,
|
|
10
|
+
});
|
|
11
|
+
if (!respuesta.ok)
|
|
12
|
+
throw new Error(`Tavily respondió HTTP ${respuesta.status}.`);
|
|
13
|
+
const datos = (await respuesta.json());
|
|
14
|
+
const resultados = (datos.results ?? [])
|
|
15
|
+
.filter((r) => typeof r.url === "string" && r.url)
|
|
16
|
+
.map((r) => ({ titulo: r.title || r.url, url: r.url, resumen: r.content }));
|
|
17
|
+
return resultados.slice(0, maximo);
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=tavily.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tavily.js","sourceRoot":"","sources":["../../../../src/core/web/proveedores/tavily.ts"],"names":[],"mappings":"AAKA,MAAM,QAAQ,GAAG,+BAA+B,CAAC;AAMjD,MAAM,CAAC,MAAM,MAAM,GAAkB,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1F,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;QAC3C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;QACjF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QAChH,MAAM;KACN,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAAyB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAoB,CAAC;IAC1D,MAAM,UAAU,GAAyB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;SAC5D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC;SACjD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/E,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAAA,CACnC,CAAC","sourcesContent":["/**\n * Tavily Search API. Requiere clave (`tavily` en el vault, o TAVILY_API_KEY).\n */\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://api.tavily.com/search\";\n\ninterface RespuestaTavily {\n\tresults?: Array<{ title?: string; url?: string; content?: string }>;\n}\n\nexport const buscar: FuncionBuscar = async (consulta, maximo, clave, fetchImpl, signal) => {\n\tif (!clave) throw new Error(\"Tavily requiere clave.\");\n\tconst respuesta = await fetchImpl(ENDPOINT, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"content-type\": \"application/json\", authorization: `Bearer ${clave}` },\n\t\tbody: JSON.stringify({ query: consulta, max_results: Math.min(Math.max(maximo, 1), 20), search_depth: \"basic\" }),\n\t\tsignal,\n\t});\n\tif (!respuesta.ok) throw new Error(`Tavily respondió HTTP ${respuesta.status}.`);\n\tconst datos = (await respuesta.json()) as RespuestaTavily;\n\tconst resultados: ResultadoProveedor[] = (datos.results ?? [])\n\t\t.filter((r) => typeof r.url === \"string\" && r.url)\n\t\t.map((r) => ({ titulo: r.title || r.url!, url: r.url!, resumen: r.content }));\n\treturn resultados.slice(0, maximo);\n};\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tipos compartidos por los proveedores de búsqueda web.
|
|
3
|
+
*
|
|
4
|
+
* Un proveedor es un módulo que se carga con `import()` la primera vez que se
|
|
5
|
+
* necesita: importar este fichero (o `registro.ts`) NO debe cargar ni un solo
|
|
6
|
+
* proveedor. Son pesados —cada uno trae su propio parseo— y como mucho se usa
|
|
7
|
+
* uno por sesión, así que cargarlos todos por adelantado es trabajo tirado.
|
|
8
|
+
*/
|
|
9
|
+
/** Un resultado de búsqueda ya normalizado, con snippet cuando el proveedor lo trae. */
|
|
10
|
+
export interface ResultadoProveedor {
|
|
11
|
+
titulo: string;
|
|
12
|
+
url: string;
|
|
13
|
+
resumen?: string;
|
|
14
|
+
/** Antigüedad tal y como la da el proveedor ("3 weeks ago", "2026-07-30"). */
|
|
15
|
+
edad?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Busca. Los proveedores SIN clave reciben `clave === undefined` y lo ignoran;
|
|
19
|
+
* el registro nunca llama a un proveedor CON clave sin haberla resuelto antes.
|
|
20
|
+
*
|
|
21
|
+
* Debe LANZAR en cualquier fallo real (red, HTTP, bloqueo anti-bot, JSON roto):
|
|
22
|
+
* el registro pasa al siguiente proveedor con ese error. Devolver `[]` es
|
|
23
|
+
* SOLO para «he preguntado y no hay resultados» — confundir las dos cosas es
|
|
24
|
+
* el error que la puerta de este hueco existe para atrapar.
|
|
25
|
+
*/
|
|
26
|
+
export type FuncionBuscar = (consulta: string, maximo: number, clave: string | undefined, fetchImpl: typeof fetch, signal?: AbortSignal) => Promise<ResultadoProveedor[]>;
|
|
27
|
+
export interface ModuloProveedor {
|
|
28
|
+
buscar: FuncionBuscar;
|
|
29
|
+
}
|
|
30
|
+
export interface DescriptorProveedor {
|
|
31
|
+
nombre: string;
|
|
32
|
+
necesitaClave: boolean;
|
|
33
|
+
/** Import perezoso: no se ejecuta hasta que el proveedor le toca en el orden. */
|
|
34
|
+
cargar: () => Promise<ModuloProveedor>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=tipos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tipos.d.ts","sourceRoot":"","sources":["../../../../src/core/web/proveedores/tipos.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,yFAAwF;AACxF,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,CAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,SAAS,EAAE,OAAO,KAAK,EACvB,MAAM,CAAC,EAAE,WAAW,KAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAEnC,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IACvB,iFAAiF;IACjF,MAAM,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;CACvC","sourcesContent":["/**\n * Tipos compartidos por los proveedores de búsqueda web.\n *\n * Un proveedor es un módulo que se carga con `import()` la primera vez que se\n * necesita: importar este fichero (o `registro.ts`) NO debe cargar ni un solo\n * proveedor. Son pesados —cada uno trae su propio parseo— y como mucho se usa\n * uno por sesión, así que cargarlos todos por adelantado es trabajo tirado.\n */\n\n/** Un resultado de búsqueda ya normalizado, con snippet cuando el proveedor lo trae. */\nexport interface ResultadoProveedor {\n\ttitulo: string;\n\turl: string;\n\tresumen?: string;\n\t/** Antigüedad tal y como la da el proveedor (\"3 weeks ago\", \"2026-07-30\"). */\n\tedad?: string;\n}\n\n/**\n * Busca. Los proveedores SIN clave reciben `clave === undefined` y lo ignoran;\n * el registro nunca llama a un proveedor CON clave sin haberla resuelto antes.\n *\n * Debe LANZAR en cualquier fallo real (red, HTTP, bloqueo anti-bot, JSON roto):\n * el registro pasa al siguiente proveedor con ese error. Devolver `[]` es\n * SOLO para «he preguntado y no hay resultados» — confundir las dos cosas es\n * el error que la puerta de este hueco existe para atrapar.\n */\nexport type FuncionBuscar = (\n\tconsulta: string,\n\tmaximo: number,\n\tclave: string | undefined,\n\tfetchImpl: typeof fetch,\n\tsignal?: AbortSignal,\n) => Promise<ResultadoProveedor[]>;\n\nexport interface ModuloProveedor {\n\tbuscar: FuncionBuscar;\n}\n\nexport interface DescriptorProveedor {\n\tnombre: string;\n\tnecesitaClave: boolean;\n\t/** Import perezoso: no se ejecuta hasta que el proveedor le toca en el orden. */\n\tcargar: () => Promise<ModuloProveedor>;\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tipos compartidos por los proveedores de búsqueda web.
|
|
3
|
+
*
|
|
4
|
+
* Un proveedor es un módulo que se carga con `import()` la primera vez que se
|
|
5
|
+
* necesita: importar este fichero (o `registro.ts`) NO debe cargar ni un solo
|
|
6
|
+
* proveedor. Son pesados —cada uno trae su propio parseo— y como mucho se usa
|
|
7
|
+
* uno por sesión, así que cargarlos todos por adelantado es trabajo tirado.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=tipos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tipos.js","sourceRoot":"","sources":["../../../../src/core/web/proveedores/tipos.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG","sourcesContent":["/**\n * Tipos compartidos por los proveedores de búsqueda web.\n *\n * Un proveedor es un módulo que se carga con `import()` la primera vez que se\n * necesita: importar este fichero (o `registro.ts`) NO debe cargar ni un solo\n * proveedor. Son pesados —cada uno trae su propio parseo— y como mucho se usa\n * uno por sesión, así que cargarlos todos por adelantado es trabajo tirado.\n */\n\n/** Un resultado de búsqueda ya normalizado, con snippet cuando el proveedor lo trae. */\nexport interface ResultadoProveedor {\n\ttitulo: string;\n\turl: string;\n\tresumen?: string;\n\t/** Antigüedad tal y como la da el proveedor (\"3 weeks ago\", \"2026-07-30\"). */\n\tedad?: string;\n}\n\n/**\n * Busca. Los proveedores SIN clave reciben `clave === undefined` y lo ignoran;\n * el registro nunca llama a un proveedor CON clave sin haberla resuelto antes.\n *\n * Debe LANZAR en cualquier fallo real (red, HTTP, bloqueo anti-bot, JSON roto):\n * el registro pasa al siguiente proveedor con ese error. Devolver `[]` es\n * SOLO para «he preguntado y no hay resultados» — confundir las dos cosas es\n * el error que la puerta de este hueco existe para atrapar.\n */\nexport type FuncionBuscar = (\n\tconsulta: string,\n\tmaximo: number,\n\tclave: string | undefined,\n\tfetchImpl: typeof fetch,\n\tsignal?: AbortSignal,\n) => Promise<ResultadoProveedor[]>;\n\nexport interface ModuloProveedor {\n\tbuscar: FuncionBuscar;\n}\n\nexport interface DescriptorProveedor {\n\tnombre: string;\n\tnecesitaClave: boolean;\n\t/** Import perezoso: no se ejecuta hasta que el proveedor le toca en el orden. */\n\tcargar: () => Promise<ModuloProveedor>;\n}\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Envolver un `fetch` para que cada salida quede en el libro de sesión.
|
|
3
|
+
*
|
|
4
|
+
* POR QUÉ VIVE APARTE. Esto nació dentro de `web/tools.ts`, envolviendo el
|
|
5
|
+
* `fetch` que reciben el fetch genérico, los scrapers y los proveedores de
|
|
6
|
+
* búsqueda. Cubría esos tres caminos y ninguno más, y el informe para el DPO
|
|
7
|
+
* escribía **«No hubo transferencias»** — una ausencia que el registro no podía
|
|
8
|
+
* sostener, porque el cliente MCP hablaba con servidores remotos sin pasar por
|
|
9
|
+
* aquí.
|
|
10
|
+
*
|
|
11
|
+
* Un DPO diría que contactar con un MCP remoto ES una transferencia (art. 44 y
|
|
12
|
+
* siguientes del RGPD), y tendría razón. Sacarlo a un módulo propio es lo que
|
|
13
|
+
* permite que cualquier camino de salida lo use, en vez de tener el registro
|
|
14
|
+
* atado al que se implementó primero.
|
|
15
|
+
*
|
|
16
|
+
* LO QUE REGISTRA Y LO QUE NO. El dominio y si se permitió, nunca la URL
|
|
17
|
+
* completa ni el cuerpo. Una ruta puede llevar un identificador y un cuerpo
|
|
18
|
+
* puede llevar datos personales; el libro guarda la FORMA de lo que pasó, no su
|
|
19
|
+
* contenido. Un registro de cumplimiento que copiara los datos sería un segundo
|
|
20
|
+
* almacén de justo lo que el RGPD quiere minimizar.
|
|
21
|
+
*/
|
|
22
|
+
/** Qué se le cuenta al libro. `motivo` solo cuando se bloquea. */
|
|
23
|
+
export type AnotarRed = (dominio: string, permitido: boolean, motivo?: string) => void;
|
|
24
|
+
/** El dominio de un destino de `fetch`, o `null` si no se puede determinar. */
|
|
25
|
+
export declare function dominioDeDestino(destino: Parameters<typeof fetch>[0]): string | null;
|
|
26
|
+
/**
|
|
27
|
+
* `fetch` que anota cada salida antes de hacerla.
|
|
28
|
+
*
|
|
29
|
+
* Si `anotar` es `undefined` devuelve el `fetch` original tal cual, sin
|
|
30
|
+
* envolver: quien no tiene libro no paga el coste ni ve un comportamiento
|
|
31
|
+
* distinto.
|
|
32
|
+
*
|
|
33
|
+
* El registro es best-effort y la petición no: si anotar falla, la descarga
|
|
34
|
+
* sigue. Al revés sería un libro que puede tumbar el producto, y eso acabaría
|
|
35
|
+
* con el libro desactivado.
|
|
36
|
+
*/
|
|
37
|
+
export declare function fetchConRegistro(base: typeof fetch, anotar: AnotarRed | undefined): typeof fetch;
|
|
38
|
+
export declare function publicarAnotarRed(anotar: AnotarRed | undefined): void;
|
|
39
|
+
/** `undefined` = no hay sesión con libro; quien llame no envuelve nada. */
|
|
40
|
+
export declare function anotarRedDeLaSesion(): AnotarRed | undefined;
|
|
41
|
+
/** Solo para pruebas. */
|
|
42
|
+
export declare function olvidarAnotarRed(): void;
|
|
43
|
+
//# sourceMappingURL=registro-red.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registro-red.d.ts","sourceRoot":"","sources":["../../../src/core/web/registro-red.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,mEAAkE;AAClE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAEvF,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAOpF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,KAAK,CAahG;AAmBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAErE;AAED,4EAA2E;AAC3E,wBAAgB,mBAAmB,IAAI,SAAS,GAAG,SAAS,CAE3D;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC","sourcesContent":["/**\n * Envolver un `fetch` para que cada salida quede en el libro de sesión.\n *\n * POR QUÉ VIVE APARTE. Esto nació dentro de `web/tools.ts`, envolviendo el\n * `fetch` que reciben el fetch genérico, los scrapers y los proveedores de\n * búsqueda. Cubría esos tres caminos y ninguno más, y el informe para el DPO\n * escribía **«No hubo transferencias»** — una ausencia que el registro no podía\n * sostener, porque el cliente MCP hablaba con servidores remotos sin pasar por\n * aquí.\n *\n * Un DPO diría que contactar con un MCP remoto ES una transferencia (art. 44 y\n * siguientes del RGPD), y tendría razón. Sacarlo a un módulo propio es lo que\n * permite que cualquier camino de salida lo use, en vez de tener el registro\n * atado al que se implementó primero.\n *\n * LO QUE REGISTRA Y LO QUE NO. El dominio y si se permitió, nunca la URL\n * completa ni el cuerpo. Una ruta puede llevar un identificador y un cuerpo\n * puede llevar datos personales; el libro guarda la FORMA de lo que pasó, no su\n * contenido. Un registro de cumplimiento que copiara los datos sería un segundo\n * almacén de justo lo que el RGPD quiere minimizar.\n */\n\n/** Qué se le cuenta al libro. `motivo` solo cuando se bloquea. */\nexport type AnotarRed = (dominio: string, permitido: boolean, motivo?: string) => void;\n\n/** El dominio de un destino de `fetch`, o `null` si no se puede determinar. */\nexport function dominioDeDestino(destino: Parameters<typeof fetch>[0]): string | null {\n\ttry {\n\t\tconst url = typeof destino === \"string\" ? destino : destino instanceof URL ? destino.href : destino.url;\n\t\treturn new URL(url).hostname || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * `fetch` que anota cada salida antes de hacerla.\n *\n * Si `anotar` es `undefined` devuelve el `fetch` original tal cual, sin\n * envolver: quien no tiene libro no paga el coste ni ve un comportamiento\n * distinto.\n *\n * El registro es best-effort y la petición no: si anotar falla, la descarga\n * sigue. Al revés sería un libro que puede tumbar el producto, y eso acabaría\n * con el libro desactivado.\n */\nexport function fetchConRegistro(base: typeof fetch, anotar: AnotarRed | undefined): typeof fetch {\n\tif (!anotar) return base;\n\treturn (destino, init) => {\n\t\tconst dominio = dominioDeDestino(destino);\n\t\tif (dominio) {\n\t\t\ttry {\n\t\t\t\tanotar(dominio, true);\n\t\t\t} catch {\n\t\t\t\t// Un fallo del libro no puede impedir una petición.\n\t\t\t}\n\t\t}\n\t\treturn base(destino, init);\n\t};\n}\n\n/**\n * El `anotarRed` de la sesión en curso, publicado.\n *\n * Los caminos de salida no nacen todos en el mismo sitio: las tools web se\n * crean en `agent-session.ts`, que SÍ tiene el libro a mano, y el cliente MCP\n * lo crea `resource-loader.ts`, que no. Enhebrar el libro hasta allí costaba\n * hunks del presupuesto de fork en un fichero de upstream; publicarlo cuesta\n * cero y es el mismo patrón ya usado —y validado— en\n * `core/extensiones/vigilancia.ts`.\n *\n * Es estado mutable de módulo, con lo que eso tiene de malo. Se acepta por lo\n * que compra: sin esto el informe para el DPO afirma «No hubo transferencias»\n * sobre una sesión que habló con un servidor de terceros, y esa es la clase de\n * afirmación que no se puede hacer a la ligera en un registro de cumplimiento.\n */\nlet anotarPublicado: AnotarRed | undefined;\n\nexport function publicarAnotarRed(anotar: AnotarRed | undefined): void {\n\tanotarPublicado = anotar;\n}\n\n/** `undefined` = no hay sesión con libro; quien llame no envuelve nada. */\nexport function anotarRedDeLaSesion(): AnotarRed | undefined {\n\treturn anotarPublicado;\n}\n\n/** Solo para pruebas. */\nexport function olvidarAnotarRed(): void {\n\tanotarPublicado = undefined;\n}\n"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Envolver un `fetch` para que cada salida quede en el libro de sesión.
|
|
3
|
+
*
|
|
4
|
+
* POR QUÉ VIVE APARTE. Esto nació dentro de `web/tools.ts`, envolviendo el
|
|
5
|
+
* `fetch` que reciben el fetch genérico, los scrapers y los proveedores de
|
|
6
|
+
* búsqueda. Cubría esos tres caminos y ninguno más, y el informe para el DPO
|
|
7
|
+
* escribía **«No hubo transferencias»** — una ausencia que el registro no podía
|
|
8
|
+
* sostener, porque el cliente MCP hablaba con servidores remotos sin pasar por
|
|
9
|
+
* aquí.
|
|
10
|
+
*
|
|
11
|
+
* Un DPO diría que contactar con un MCP remoto ES una transferencia (art. 44 y
|
|
12
|
+
* siguientes del RGPD), y tendría razón. Sacarlo a un módulo propio es lo que
|
|
13
|
+
* permite que cualquier camino de salida lo use, en vez de tener el registro
|
|
14
|
+
* atado al que se implementó primero.
|
|
15
|
+
*
|
|
16
|
+
* LO QUE REGISTRA Y LO QUE NO. El dominio y si se permitió, nunca la URL
|
|
17
|
+
* completa ni el cuerpo. Una ruta puede llevar un identificador y un cuerpo
|
|
18
|
+
* puede llevar datos personales; el libro guarda la FORMA de lo que pasó, no su
|
|
19
|
+
* contenido. Un registro de cumplimiento que copiara los datos sería un segundo
|
|
20
|
+
* almacén de justo lo que el RGPD quiere minimizar.
|
|
21
|
+
*/
|
|
22
|
+
/** El dominio de un destino de `fetch`, o `null` si no se puede determinar. */
|
|
23
|
+
export function dominioDeDestino(destino) {
|
|
24
|
+
try {
|
|
25
|
+
const url = typeof destino === "string" ? destino : destino instanceof URL ? destino.href : destino.url;
|
|
26
|
+
return new URL(url).hostname || null;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* `fetch` que anota cada salida antes de hacerla.
|
|
34
|
+
*
|
|
35
|
+
* Si `anotar` es `undefined` devuelve el `fetch` original tal cual, sin
|
|
36
|
+
* envolver: quien no tiene libro no paga el coste ni ve un comportamiento
|
|
37
|
+
* distinto.
|
|
38
|
+
*
|
|
39
|
+
* El registro es best-effort y la petición no: si anotar falla, la descarga
|
|
40
|
+
* sigue. Al revés sería un libro que puede tumbar el producto, y eso acabaría
|
|
41
|
+
* con el libro desactivado.
|
|
42
|
+
*/
|
|
43
|
+
export function fetchConRegistro(base, anotar) {
|
|
44
|
+
if (!anotar)
|
|
45
|
+
return base;
|
|
46
|
+
return (destino, init) => {
|
|
47
|
+
const dominio = dominioDeDestino(destino);
|
|
48
|
+
if (dominio) {
|
|
49
|
+
try {
|
|
50
|
+
anotar(dominio, true);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Un fallo del libro no puede impedir una petición.
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return base(destino, init);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* El `anotarRed` de la sesión en curso, publicado.
|
|
61
|
+
*
|
|
62
|
+
* Los caminos de salida no nacen todos en el mismo sitio: las tools web se
|
|
63
|
+
* crean en `agent-session.ts`, que SÍ tiene el libro a mano, y el cliente MCP
|
|
64
|
+
* lo crea `resource-loader.ts`, que no. Enhebrar el libro hasta allí costaba
|
|
65
|
+
* hunks del presupuesto de fork en un fichero de upstream; publicarlo cuesta
|
|
66
|
+
* cero y es el mismo patrón ya usado —y validado— en
|
|
67
|
+
* `core/extensiones/vigilancia.ts`.
|
|
68
|
+
*
|
|
69
|
+
* Es estado mutable de módulo, con lo que eso tiene de malo. Se acepta por lo
|
|
70
|
+
* que compra: sin esto el informe para el DPO afirma «No hubo transferencias»
|
|
71
|
+
* sobre una sesión que habló con un servidor de terceros, y esa es la clase de
|
|
72
|
+
* afirmación que no se puede hacer a la ligera en un registro de cumplimiento.
|
|
73
|
+
*/
|
|
74
|
+
let anotarPublicado;
|
|
75
|
+
export function publicarAnotarRed(anotar) {
|
|
76
|
+
anotarPublicado = anotar;
|
|
77
|
+
}
|
|
78
|
+
/** `undefined` = no hay sesión con libro; quien llame no envuelve nada. */
|
|
79
|
+
export function anotarRedDeLaSesion() {
|
|
80
|
+
return anotarPublicado;
|
|
81
|
+
}
|
|
82
|
+
/** Solo para pruebas. */
|
|
83
|
+
export function olvidarAnotarRed() {
|
|
84
|
+
anotarPublicado = undefined;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=registro-red.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registro-red.js","sourceRoot":"","sources":["../../../src/core/web/registro-red.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,OAAoC,EAAiB;IACrF,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,YAAY,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QACxG,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AAAA,CACD;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAkB,EAAE,MAA6B,EAAgB;IACjG,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACb,IAAI,CAAC;gBACJ,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACR,qDAAoD;YACrD,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAAA,CAC3B,CAAC;AAAA,CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,IAAI,eAAsC,CAAC;AAE3C,MAAM,UAAU,iBAAiB,CAAC,MAA6B,EAAQ;IACtE,eAAe,GAAG,MAAM,CAAC;AAAA,CACzB;AAED,4EAA2E;AAC3E,MAAM,UAAU,mBAAmB,GAA0B;IAC5D,OAAO,eAAe,CAAC;AAAA,CACvB;AAED,yBAAyB;AACzB,MAAM,UAAU,gBAAgB,GAAS;IACxC,eAAe,GAAG,SAAS,CAAC;AAAA,CAC5B","sourcesContent":["/**\n * Envolver un `fetch` para que cada salida quede en el libro de sesión.\n *\n * POR QUÉ VIVE APARTE. Esto nació dentro de `web/tools.ts`, envolviendo el\n * `fetch` que reciben el fetch genérico, los scrapers y los proveedores de\n * búsqueda. Cubría esos tres caminos y ninguno más, y el informe para el DPO\n * escribía **«No hubo transferencias»** — una ausencia que el registro no podía\n * sostener, porque el cliente MCP hablaba con servidores remotos sin pasar por\n * aquí.\n *\n * Un DPO diría que contactar con un MCP remoto ES una transferencia (art. 44 y\n * siguientes del RGPD), y tendría razón. Sacarlo a un módulo propio es lo que\n * permite que cualquier camino de salida lo use, en vez de tener el registro\n * atado al que se implementó primero.\n *\n * LO QUE REGISTRA Y LO QUE NO. El dominio y si se permitió, nunca la URL\n * completa ni el cuerpo. Una ruta puede llevar un identificador y un cuerpo\n * puede llevar datos personales; el libro guarda la FORMA de lo que pasó, no su\n * contenido. Un registro de cumplimiento que copiara los datos sería un segundo\n * almacén de justo lo que el RGPD quiere minimizar.\n */\n\n/** Qué se le cuenta al libro. `motivo` solo cuando se bloquea. */\nexport type AnotarRed = (dominio: string, permitido: boolean, motivo?: string) => void;\n\n/** El dominio de un destino de `fetch`, o `null` si no se puede determinar. */\nexport function dominioDeDestino(destino: Parameters<typeof fetch>[0]): string | null {\n\ttry {\n\t\tconst url = typeof destino === \"string\" ? destino : destino instanceof URL ? destino.href : destino.url;\n\t\treturn new URL(url).hostname || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * `fetch` que anota cada salida antes de hacerla.\n *\n * Si `anotar` es `undefined` devuelve el `fetch` original tal cual, sin\n * envolver: quien no tiene libro no paga el coste ni ve un comportamiento\n * distinto.\n *\n * El registro es best-effort y la petición no: si anotar falla, la descarga\n * sigue. Al revés sería un libro que puede tumbar el producto, y eso acabaría\n * con el libro desactivado.\n */\nexport function fetchConRegistro(base: typeof fetch, anotar: AnotarRed | undefined): typeof fetch {\n\tif (!anotar) return base;\n\treturn (destino, init) => {\n\t\tconst dominio = dominioDeDestino(destino);\n\t\tif (dominio) {\n\t\t\ttry {\n\t\t\t\tanotar(dominio, true);\n\t\t\t} catch {\n\t\t\t\t// Un fallo del libro no puede impedir una petición.\n\t\t\t}\n\t\t}\n\t\treturn base(destino, init);\n\t};\n}\n\n/**\n * El `anotarRed` de la sesión en curso, publicado.\n *\n * Los caminos de salida no nacen todos en el mismo sitio: las tools web se\n * crean en `agent-session.ts`, que SÍ tiene el libro a mano, y el cliente MCP\n * lo crea `resource-loader.ts`, que no. Enhebrar el libro hasta allí costaba\n * hunks del presupuesto de fork en un fichero de upstream; publicarlo cuesta\n * cero y es el mismo patrón ya usado —y validado— en\n * `core/extensiones/vigilancia.ts`.\n *\n * Es estado mutable de módulo, con lo que eso tiene de malo. Se acepta por lo\n * que compra: sin esto el informe para el DPO afirma «No hubo transferencias»\n * sobre una sesión que habló con un servidor de terceros, y esa es la clase de\n * afirmación que no se puede hacer a la ligera en un registro de cumplimiento.\n */\nlet anotarPublicado: AnotarRed | undefined;\n\nexport function publicarAnotarRed(anotar: AnotarRed | undefined): void {\n\tanotarPublicado = anotar;\n}\n\n/** `undefined` = no hay sesión con libro; quien llame no envuelve nada. */\nexport function anotarRedDeLaSesion(): AnotarRed | undefined {\n\treturn anotarPublicado;\n}\n\n/** Solo para pruebas. */\nexport function olvidarAnotarRed(): void {\n\tanotarPublicado = undefined;\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CISA KEV (Known Exploited Vulnerabilities), vía el feed JSON público.
|
|
3
|
+
*
|
|
4
|
+
* No hay endpoint por CVE: el feed es el catálogo entero (~1.5 MB). Se pide
|
|
5
|
+
* completo y se filtra en memoria — mismo coste de red que cualquier otra
|
|
6
|
+
* consulta a este catálogo, no hay forma más barata sin clave.
|
|
7
|
+
*/
|
|
8
|
+
import { type FuncionScraper } from "./tipos.ts";
|
|
9
|
+
export declare const scrapear: FuncionScraper;
|
|
10
|
+
//# sourceMappingURL=cisa-kev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cisa-kev.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/cisa-kev.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAgBpE,eAAO,MAAM,QAAQ,EAAE,cAwBtB,CAAC","sourcesContent":["/**\n * CISA KEV (Known Exploited Vulnerabilities), vía el feed JSON público.\n *\n * No hay endpoint por CVE: el feed es el catálogo entero (~1.5 MB). Se pide\n * completo y se filtra en memoria — mismo coste de red que cualquier otra\n * consulta a este catálogo, no hay forma más barata sin clave.\n */\nimport { esHostOSubdominio, type FuncionScraper } from \"./tipos.ts\";\n\nconst FEED_URL = \"https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json\";\nconst RE_CVE = /CVE-\\d{4}-\\d{4,7}/i;\n\ninterface EntradaKev {\n\tcveID?: string;\n\tvendorProject?: string;\n\tproduct?: string;\n\tvulnerabilityName?: string;\n\tshortDescription?: string;\n\tdateAdded?: string;\n\tdueDate?: string;\n\tknownRansomwareCampaignUse?: string;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (!esHostOSubdominio(url.hostname.toLowerCase(), \"cisa.gov\")) return null;\n\tconst cveMatch = url.pathname.match(RE_CVE) ?? url.search.match(RE_CVE);\n\tif (!cveMatch) return null;\n\tconst cveId = cveMatch[0].toUpperCase();\n\n\tconst respuesta = await fetchImpl(FEED_URL, { headers: { Accept: \"application/json\" }, signal });\n\tif (!respuesta.ok) throw new Error(`CISA KEV respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as { vulnerabilities?: EntradaKev[] };\n\tconst entrada = doc.vulnerabilities?.find((v) => v.cveID?.toUpperCase() === cveId);\n\tif (!entrada) return null; // el CVE es válido pero no está en el catálogo KEV\n\n\treturn {\n\t\ttitulo: `${entrada.cveID} — ${entrada.vulnerabilityName ?? \"explotado activamente (KEV)\"}`,\n\t\turl: `https://www.cisa.gov/known-exploited-vulnerabilities-catalog?search_api_fulltext=${entrada.cveID}`,\n\t\tresumen: entrada.shortDescription ?? \"\",\n\t\tdatos: {\n\t\t\tvendedor: entrada.vendorProject,\n\t\t\tproducto: entrada.product,\n\t\t\tañadido: entrada.dateAdded,\n\t\t\tfechaLimite: entrada.dueDate,\n\t\t\tusoEnRansomware: entrada.knownRansomwareCampaignUse,\n\t\t},\n\t};\n};\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CISA KEV (Known Exploited Vulnerabilities), vía el feed JSON público.
|
|
3
|
+
*
|
|
4
|
+
* No hay endpoint por CVE: el feed es el catálogo entero (~1.5 MB). Se pide
|
|
5
|
+
* completo y se filtra en memoria — mismo coste de red que cualquier otra
|
|
6
|
+
* consulta a este catálogo, no hay forma más barata sin clave.
|
|
7
|
+
*/
|
|
8
|
+
import { esHostOSubdominio } from "./tipos.js";
|
|
9
|
+
const FEED_URL = "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json";
|
|
10
|
+
const RE_CVE = /CVE-\d{4}-\d{4,7}/i;
|
|
11
|
+
export const scrapear = async (url, fetchImpl, signal) => {
|
|
12
|
+
if (!esHostOSubdominio(url.hostname.toLowerCase(), "cisa.gov"))
|
|
13
|
+
return null;
|
|
14
|
+
const cveMatch = url.pathname.match(RE_CVE) ?? url.search.match(RE_CVE);
|
|
15
|
+
if (!cveMatch)
|
|
16
|
+
return null;
|
|
17
|
+
const cveId = cveMatch[0].toUpperCase();
|
|
18
|
+
const respuesta = await fetchImpl(FEED_URL, { headers: { Accept: "application/json" }, signal });
|
|
19
|
+
if (!respuesta.ok)
|
|
20
|
+
throw new Error(`CISA KEV respondió HTTP ${respuesta.status}.`);
|
|
21
|
+
const doc = (await respuesta.json());
|
|
22
|
+
const entrada = doc.vulnerabilities?.find((v) => v.cveID?.toUpperCase() === cveId);
|
|
23
|
+
if (!entrada)
|
|
24
|
+
return null; // el CVE es válido pero no está en el catálogo KEV
|
|
25
|
+
return {
|
|
26
|
+
titulo: `${entrada.cveID} — ${entrada.vulnerabilityName ?? "explotado activamente (KEV)"}`,
|
|
27
|
+
url: `https://www.cisa.gov/known-exploited-vulnerabilities-catalog?search_api_fulltext=${entrada.cveID}`,
|
|
28
|
+
resumen: entrada.shortDescription ?? "",
|
|
29
|
+
datos: {
|
|
30
|
+
vendedor: entrada.vendorProject,
|
|
31
|
+
producto: entrada.product,
|
|
32
|
+
añadido: entrada.dateAdded,
|
|
33
|
+
fechaLimite: entrada.dueDate,
|
|
34
|
+
usoEnRansomware: entrada.knownRansomwareCampaignUse,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=cisa-kev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cisa-kev.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/cisa-kev.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,iBAAiB,EAAuB,MAAM,YAAY,CAAC;AAEpE,MAAM,QAAQ,GAAG,qFAAqF,CAAC;AACvG,MAAM,MAAM,GAAG,oBAAoB,CAAC;AAapC,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACzE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5E,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxE,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAExC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACjG,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA2B,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACnF,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAuC,CAAC;IAC3E,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;IACnF,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC,CAAC,sDAAmD;IAE9E,OAAO;QACN,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,QAAM,OAAO,CAAC,iBAAiB,IAAI,6BAA6B,EAAE;QAC1F,GAAG,EAAE,oFAAoF,OAAO,CAAC,KAAK,EAAE;QACxG,OAAO,EAAE,OAAO,CAAC,gBAAgB,IAAI,EAAE;QACvC,KAAK,EAAE;YACN,QAAQ,EAAE,OAAO,CAAC,aAAa;YAC/B,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,QAAO,EAAE,OAAO,CAAC,SAAS;YAC1B,WAAW,EAAE,OAAO,CAAC,OAAO;YAC5B,eAAe,EAAE,OAAO,CAAC,0BAA0B;SACnD;KACD,CAAC;AAAA,CACF,CAAC","sourcesContent":["/**\n * CISA KEV (Known Exploited Vulnerabilities), vía el feed JSON público.\n *\n * No hay endpoint por CVE: el feed es el catálogo entero (~1.5 MB). Se pide\n * completo y se filtra en memoria — mismo coste de red que cualquier otra\n * consulta a este catálogo, no hay forma más barata sin clave.\n */\nimport { esHostOSubdominio, type FuncionScraper } from \"./tipos.ts\";\n\nconst FEED_URL = \"https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json\";\nconst RE_CVE = /CVE-\\d{4}-\\d{4,7}/i;\n\ninterface EntradaKev {\n\tcveID?: string;\n\tvendorProject?: string;\n\tproduct?: string;\n\tvulnerabilityName?: string;\n\tshortDescription?: string;\n\tdateAdded?: string;\n\tdueDate?: string;\n\tknownRansomwareCampaignUse?: string;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (!esHostOSubdominio(url.hostname.toLowerCase(), \"cisa.gov\")) return null;\n\tconst cveMatch = url.pathname.match(RE_CVE) ?? url.search.match(RE_CVE);\n\tif (!cveMatch) return null;\n\tconst cveId = cveMatch[0].toUpperCase();\n\n\tconst respuesta = await fetchImpl(FEED_URL, { headers: { Accept: \"application/json\" }, signal });\n\tif (!respuesta.ok) throw new Error(`CISA KEV respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as { vulnerabilities?: EntradaKev[] };\n\tconst entrada = doc.vulnerabilities?.find((v) => v.cveID?.toUpperCase() === cveId);\n\tif (!entrada) return null; // el CVE es válido pero no está en el catálogo KEV\n\n\treturn {\n\t\ttitulo: `${entrada.cveID} — ${entrada.vulnerabilityName ?? \"explotado activamente (KEV)\"}`,\n\t\turl: `https://www.cisa.gov/known-exploited-vulnerabilities-catalog?search_api_fulltext=${entrada.cveID}`,\n\t\tresumen: entrada.shortDescription ?? \"\",\n\t\tdatos: {\n\t\t\tvendedor: entrada.vendorProject,\n\t\t\tproducto: entrada.product,\n\t\t\tañadido: entrada.dateAdded,\n\t\t\tfechaLimite: entrada.dueDate,\n\t\t\tusoEnRansomware: entrada.knownRansomwareCampaignUse,\n\t\t},\n\t};\n};\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crates.io, vía su API pública (`crates.io/api/v1/crates/<crate>`).
|
|
3
|
+
*
|
|
4
|
+
* La licencia no vive en el objeto `crate` sino en cada entrada de
|
|
5
|
+
* `versions`; se toma la de `max_stable_version` (la primera del array
|
|
6
|
+
* coincide salvo prereleases raras, pero se busca por número para no fiarse
|
|
7
|
+
* del orden).
|
|
8
|
+
*/
|
|
9
|
+
import type { FuncionScraper } from "./tipos.ts";
|
|
10
|
+
export declare const scrapear: FuncionScraper;
|
|
11
|
+
//# sourceMappingURL=crates-io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crates-io.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/crates-io.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAcjD,eAAO,MAAM,QAAQ,EAAE,cAyBtB,CAAC","sourcesContent":["/**\n * crates.io, vía su API pública (`crates.io/api/v1/crates/<crate>`).\n *\n * La licencia no vive en el objeto `crate` sino en cada entrada de\n * `versions`; se toma la de `max_stable_version` (la primera del array\n * coincide salvo prereleases raras, pero se busca por número para no fiarse\n * del orden).\n */\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocCratesIo {\n\tcrate?: {\n\t\tname?: string;\n\t\tmax_stable_version?: string;\n\t\tmax_version?: string;\n\t\tdescription?: string;\n\t\thomepage?: string;\n\t\trepository?: string;\n\t};\n\tversions?: Array<{ num?: string; license?: string }>;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"crates.io\") return null;\n\tconst match = url.pathname.match(/^\\/crates\\/([^/]+)/);\n\tif (!match) return null;\n\tconst nombre = decodeURIComponent(match[1]);\n\n\tconst respuesta = await fetchImpl(`https://crates.io/api/v1/crates/${nombre}`, {\n\t\theaders: { Accept: \"application/json\", \"User-Agent\": \"ada-cli (web_fetch scraper)\" },\n\t\tsignal,\n\t});\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`crates.io respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as DocCratesIo;\n\tconst crate = doc.crate;\n\tif (!crate?.name) return null;\n\n\tconst version = crate.max_stable_version ?? crate.max_version;\n\tconst licencia = doc.versions?.find((v) => v.num === version)?.license ?? doc.versions?.[0]?.license;\n\n\treturn {\n\t\ttitulo: `${crate.name}@${version ?? \"?\"}`,\n\t\turl: `https://crates.io/crates/${crate.name}`,\n\t\tresumen: crate.description ?? \"\",\n\t\tdatos: { nombre: crate.name, version, licencia, homepage: crate.homepage ?? crate.repository },\n\t};\n};\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export const scrapear = async (url, fetchImpl, signal) => {
|
|
2
|
+
if (url.hostname !== "crates.io")
|
|
3
|
+
return null;
|
|
4
|
+
const match = url.pathname.match(/^\/crates\/([^/]+)/);
|
|
5
|
+
if (!match)
|
|
6
|
+
return null;
|
|
7
|
+
const nombre = decodeURIComponent(match[1]);
|
|
8
|
+
const respuesta = await fetchImpl(`https://crates.io/api/v1/crates/${nombre}`, {
|
|
9
|
+
headers: { Accept: "application/json", "User-Agent": "ada-cli (web_fetch scraper)" },
|
|
10
|
+
signal,
|
|
11
|
+
});
|
|
12
|
+
if (respuesta.status === 404)
|
|
13
|
+
return null;
|
|
14
|
+
if (!respuesta.ok)
|
|
15
|
+
throw new Error(`crates.io respondió HTTP ${respuesta.status}.`);
|
|
16
|
+
const doc = (await respuesta.json());
|
|
17
|
+
const crate = doc.crate;
|
|
18
|
+
if (!crate?.name)
|
|
19
|
+
return null;
|
|
20
|
+
const version = crate.max_stable_version ?? crate.max_version;
|
|
21
|
+
const licencia = doc.versions?.find((v) => v.num === version)?.license ?? doc.versions?.[0]?.license;
|
|
22
|
+
return {
|
|
23
|
+
titulo: `${crate.name}@${version ?? "?"}`,
|
|
24
|
+
url: `https://crates.io/crates/${crate.name}`,
|
|
25
|
+
resumen: crate.description ?? "",
|
|
26
|
+
datos: { nombre: crate.name, version, licencia, homepage: crate.homepage ?? crate.repository },
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=crates-io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crates-io.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/crates-io.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACzE,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,mCAAmC,MAAM,EAAE,EAAE;QAC9E,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,6BAA6B,EAAE;QACpF,MAAM;KACN,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA4B,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAgB,CAAC;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,IAAI,CAAC,KAAK,EAAE,IAAI;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,WAAW,CAAC;IAC9D,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;IAErG,OAAO;QACN,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,OAAO,IAAI,GAAG,EAAE;QACzC,GAAG,EAAE,4BAA4B,KAAK,CAAC,IAAI,EAAE;QAC7C,OAAO,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;QAChC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,UAAU,EAAE;KAC9F,CAAC;AAAA,CACF,CAAC","sourcesContent":["/**\n * crates.io, vía su API pública (`crates.io/api/v1/crates/<crate>`).\n *\n * La licencia no vive en el objeto `crate` sino en cada entrada de\n * `versions`; se toma la de `max_stable_version` (la primera del array\n * coincide salvo prereleases raras, pero se busca por número para no fiarse\n * del orden).\n */\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocCratesIo {\n\tcrate?: {\n\t\tname?: string;\n\t\tmax_stable_version?: string;\n\t\tmax_version?: string;\n\t\tdescription?: string;\n\t\thomepage?: string;\n\t\trepository?: string;\n\t};\n\tversions?: Array<{ num?: string; license?: string }>;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"crates.io\") return null;\n\tconst match = url.pathname.match(/^\\/crates\\/([^/]+)/);\n\tif (!match) return null;\n\tconst nombre = decodeURIComponent(match[1]);\n\n\tconst respuesta = await fetchImpl(`https://crates.io/api/v1/crates/${nombre}`, {\n\t\theaders: { Accept: \"application/json\", \"User-Agent\": \"ada-cli (web_fetch scraper)\" },\n\t\tsignal,\n\t});\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`crates.io respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as DocCratesIo;\n\tconst crate = doc.crate;\n\tif (!crate?.name) return null;\n\n\tconst version = crate.max_stable_version ?? crate.max_version;\n\tconst licencia = doc.versions?.find((v) => v.num === version)?.license ?? doc.versions?.[0]?.license;\n\n\treturn {\n\t\ttitulo: `${crate.name}@${version ?? \"?\"}`,\n\t\turl: `https://crates.io/crates/${crate.name}`,\n\t\tresumen: crate.description ?? \"\",\n\t\tdatos: { nombre: crate.name, version, licencia, homepage: crate.homepage ?? crate.repository },\n\t};\n};\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* docs.rs no tiene una API JSON estable y pública para metadatos (el índice de
|
|
3
|
+
* búsqueda es un blob interno versionado). Lo que un agente quiere de una URL
|
|
4
|
+
* de docs.rs —versión y licencia del crate— SÍ lo tiene crates.io, así que se
|
|
5
|
+
* reutiliza su API: docs.rs y crates.io comparten el mismo nombre de crate por
|
|
6
|
+
* construcción (docs.rs se genera A PARTIR de lo publicado en crates.io).
|
|
7
|
+
*/
|
|
8
|
+
import type { FuncionScraper } from "./tipos.ts";
|
|
9
|
+
export declare const scrapear: FuncionScraper;
|
|
10
|
+
//# sourceMappingURL=docs-rs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-rs.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/docs-rs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAoBjD,eAAO,MAAM,QAAQ,EAAE,cAwBtB,CAAC","sourcesContent":["/**\n * docs.rs no tiene una API JSON estable y pública para metadatos (el índice de\n * búsqueda es un blob interno versionado). Lo que un agente quiere de una URL\n * de docs.rs —versión y licencia del crate— SÍ lo tiene crates.io, así que se\n * reutiliza su API: docs.rs y crates.io comparten el mismo nombre de crate por\n * construcción (docs.rs se genera A PARTIR de lo publicado en crates.io).\n */\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocCratesIo {\n\tcrate?: {\n\t\tname?: string;\n\t\tmax_stable_version?: string;\n\t\tmax_version?: string;\n\t\tdescription?: string;\n\t\thomepage?: string;\n\t};\n\tversions?: Array<{ num?: string; license?: string }>;\n}\n\n/** `/crate/<nombre>[/<version>]` o `/<nombre>/<version>/...` — ambas formas empiezan por el crate. */\nfunction crateDeRuta(pathname: string): string | undefined {\n\tconst partes = pathname.split(\"/\").filter(Boolean);\n\tif (partes.length === 0) return undefined;\n\treturn partes[0] === \"crate\" ? partes[1] : partes[0];\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"docs.rs\") return null;\n\tconst nombre = crateDeRuta(url.pathname);\n\tif (!nombre) return null;\n\n\tconst respuesta = await fetchImpl(`https://crates.io/api/v1/crates/${nombre}`, {\n\t\theaders: { Accept: \"application/json\", \"User-Agent\": \"ada-cli (web_fetch scraper)\" },\n\t\tsignal,\n\t});\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`docs.rs (vía crates.io) respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as DocCratesIo;\n\tconst crate = doc.crate;\n\tif (!crate?.name) return null;\n\n\tconst version = crate.max_stable_version ?? crate.max_version;\n\tconst licencia = doc.versions?.find((v) => v.num === version)?.license ?? doc.versions?.[0]?.license;\n\n\treturn {\n\t\ttitulo: `${crate.name}@${version ?? \"?\"} — docs.rs`,\n\t\turl: `https://docs.rs/${crate.name}/latest/${crate.name}/`,\n\t\tresumen: crate.description ?? \"\",\n\t\tdatos: { nombre: crate.name, version, licencia, homepage: crate.homepage },\n\t};\n};\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** `/crate/<nombre>[/<version>]` o `/<nombre>/<version>/...` — ambas formas empiezan por el crate. */
|
|
2
|
+
function crateDeRuta(pathname) {
|
|
3
|
+
const partes = pathname.split("/").filter(Boolean);
|
|
4
|
+
if (partes.length === 0)
|
|
5
|
+
return undefined;
|
|
6
|
+
return partes[0] === "crate" ? partes[1] : partes[0];
|
|
7
|
+
}
|
|
8
|
+
export const scrapear = async (url, fetchImpl, signal) => {
|
|
9
|
+
if (url.hostname !== "docs.rs")
|
|
10
|
+
return null;
|
|
11
|
+
const nombre = crateDeRuta(url.pathname);
|
|
12
|
+
if (!nombre)
|
|
13
|
+
return null;
|
|
14
|
+
const respuesta = await fetchImpl(`https://crates.io/api/v1/crates/${nombre}`, {
|
|
15
|
+
headers: { Accept: "application/json", "User-Agent": "ada-cli (web_fetch scraper)" },
|
|
16
|
+
signal,
|
|
17
|
+
});
|
|
18
|
+
if (respuesta.status === 404)
|
|
19
|
+
return null;
|
|
20
|
+
if (!respuesta.ok)
|
|
21
|
+
throw new Error(`docs.rs (vía crates.io) respondió HTTP ${respuesta.status}.`);
|
|
22
|
+
const doc = (await respuesta.json());
|
|
23
|
+
const crate = doc.crate;
|
|
24
|
+
if (!crate?.name)
|
|
25
|
+
return null;
|
|
26
|
+
const version = crate.max_stable_version ?? crate.max_version;
|
|
27
|
+
const licencia = doc.versions?.find((v) => v.num === version)?.license ?? doc.versions?.[0]?.license;
|
|
28
|
+
return {
|
|
29
|
+
titulo: `${crate.name}@${version ?? "?"} — docs.rs`,
|
|
30
|
+
url: `https://docs.rs/${crate.name}/latest/${crate.name}/`,
|
|
31
|
+
resumen: crate.description ?? "",
|
|
32
|
+
datos: { nombre: crate.name, version, licencia, homepage: crate.homepage },
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=docs-rs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-rs.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/docs-rs.ts"],"names":[],"mappings":"AAoBA,wGAAsG;AACtG,SAAS,WAAW,CAAC,QAAgB,EAAsB;IAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAAA,CACrD;AAED,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACzE,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,mCAAmC,MAAM,EAAE,EAAE;QAC9E,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,6BAA6B,EAAE;QACpF,MAAM;KACN,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA0C,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAClG,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAgB,CAAC;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,IAAI,CAAC,KAAK,EAAE,IAAI;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,WAAW,CAAC;IAC9D,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;IAErG,OAAO;QACN,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,OAAO,IAAI,GAAG,cAAY;QACnD,GAAG,EAAE,mBAAmB,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,IAAI,GAAG;QAC1D,OAAO,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;QAChC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;KAC1E,CAAC;AAAA,CACF,CAAC","sourcesContent":["/**\n * docs.rs no tiene una API JSON estable y pública para metadatos (el índice de\n * búsqueda es un blob interno versionado). Lo que un agente quiere de una URL\n * de docs.rs —versión y licencia del crate— SÍ lo tiene crates.io, así que se\n * reutiliza su API: docs.rs y crates.io comparten el mismo nombre de crate por\n * construcción (docs.rs se genera A PARTIR de lo publicado en crates.io).\n */\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocCratesIo {\n\tcrate?: {\n\t\tname?: string;\n\t\tmax_stable_version?: string;\n\t\tmax_version?: string;\n\t\tdescription?: string;\n\t\thomepage?: string;\n\t};\n\tversions?: Array<{ num?: string; license?: string }>;\n}\n\n/** `/crate/<nombre>[/<version>]` o `/<nombre>/<version>/...` — ambas formas empiezan por el crate. */\nfunction crateDeRuta(pathname: string): string | undefined {\n\tconst partes = pathname.split(\"/\").filter(Boolean);\n\tif (partes.length === 0) return undefined;\n\treturn partes[0] === \"crate\" ? partes[1] : partes[0];\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"docs.rs\") return null;\n\tconst nombre = crateDeRuta(url.pathname);\n\tif (!nombre) return null;\n\n\tconst respuesta = await fetchImpl(`https://crates.io/api/v1/crates/${nombre}`, {\n\t\theaders: { Accept: \"application/json\", \"User-Agent\": \"ada-cli (web_fetch scraper)\" },\n\t\tsignal,\n\t});\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`docs.rs (vía crates.io) respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as DocCratesIo;\n\tconst crate = doc.crate;\n\tif (!crate?.name) return null;\n\n\tconst version = crate.max_stable_version ?? crate.max_version;\n\tconst licencia = doc.versions?.find((v) => v.num === version)?.license ?? doc.versions?.[0]?.license;\n\n\treturn {\n\t\ttitulo: `${crate.name}@${version ?? \"?\"} — docs.rs`,\n\t\turl: `https://docs.rs/${crate.name}/latest/${crate.name}/`,\n\t\tresumen: crate.description ?? \"\",\n\t\tdatos: { nombre: crate.name, version, licencia, homepage: crate.homepage },\n\t};\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/github.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA+BjD,eAAO,MAAM,QAAQ,EAAE,cAoDtB,CAAC","sourcesContent":["/**\n * GitHub: repos e issues/PRs, vía la API REST pública (`api.github.com`).\n * Sin clave: 60 peticiones/hora por IP, suficiente para una consulta suelta.\n */\nimport { htmlToText } from \"../texto.ts\";\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocRepo {\n\tfull_name?: string;\n\tdescription?: string;\n\tlicense?: { spdx_id?: string };\n\tstargazers_count?: number;\n\topen_issues_count?: number;\n\tdefault_branch?: string;\n\tlanguage?: string;\n\thtml_url?: string;\n}\n\ninterface DocIssue {\n\ttitle?: string;\n\tbody?: string;\n\tstate?: string;\n\tnumber?: number;\n\tuser?: { login?: string };\n\tcomments?: number;\n\tpull_request?: unknown;\n\thtml_url?: string;\n}\n\nasync function pedirJson<T>(fetchImpl: typeof fetch, url: string, signal?: AbortSignal): Promise<T | null> {\n\tconst respuesta = await fetchImpl(url, { headers: { Accept: \"application/vnd.github+json\" }, signal });\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`GitHub respondió HTTP ${respuesta.status}.`);\n\treturn (await respuesta.json()) as T;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tlet owner: string;\n\tlet repo: string;\n\tlet apiBase: string;\n\tif (url.hostname === \"github.com\") {\n\t\tconst partes = url.pathname.split(\"/\").filter(Boolean);\n\t\tif (partes.length < 2) return null;\n\t\t[owner, repo] = partes;\n\t\tapiBase = `https://api.github.com/repos/${owner}/${repo}`;\n\n\t\tconst seccion = partes[2];\n\t\tconst numero = partes[3];\n\t\tif ((seccion === \"issues\" || seccion === \"pull\") && /^\\d+$/.test(numero ?? \"\")) {\n\t\t\tconst issue = await pedirJson<DocIssue>(fetchImpl, `${apiBase}/issues/${numero}`, signal);\n\t\t\tif (!issue?.title) return null;\n\t\t\treturn {\n\t\t\t\ttitulo: `${issue.pull_request ? \"PR\" : \"Issue\"} #${issue.number}: ${issue.title}`,\n\t\t\t\turl: issue.html_url ?? url.href,\n\t\t\t\tresumen: htmlToText(issue.body ?? \"\").slice(0, 600),\n\t\t\t\tdatos: {\n\t\t\t\t\tnumero: issue.number,\n\t\t\t\t\testado: issue.state,\n\t\t\t\t\tautor: issue.user?.login,\n\t\t\t\t\tcomentarios: issue.comments,\n\t\t\t\t\tesPR: Boolean(issue.pull_request),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tif (seccion !== undefined && seccion !== \"\") return null; // otras subrutas (blob, tree…) no son de este scraper\n\t} else if (url.hostname === \"api.github.com\") {\n\t\tapiBase = url.href.replace(/\\/issues\\/\\d+$/, \"\");\n\t\tconst match = url.pathname.match(/^\\/repos\\/([^/]+)\\/([^/]+)/);\n\t\tif (!match) return null;\n\t\t[, owner, repo] = match;\n\t} else {\n\t\treturn null;\n\t}\n\n\tconst repoDoc = await pedirJson<DocRepo>(fetchImpl, `https://api.github.com/repos/${owner}/${repo}`, signal);\n\tif (!repoDoc?.full_name) return null;\n\treturn {\n\t\ttitulo: repoDoc.full_name,\n\t\turl: repoDoc.html_url ?? `https://github.com/${owner}/${repo}`,\n\t\tresumen: repoDoc.description ?? \"\",\n\t\tdatos: {\n\t\t\tlicencia: repoDoc.license?.spdx_id,\n\t\t\testrellas: repoDoc.stargazers_count,\n\t\t\tissuesAbiertas: repoDoc.open_issues_count,\n\t\t\tramaPorDefecto: repoDoc.default_branch,\n\t\t\tlenguaje: repoDoc.language,\n\t\t},\n\t};\n};\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub: repos e issues/PRs, vía la API REST pública (`api.github.com`).
|
|
3
|
+
* Sin clave: 60 peticiones/hora por IP, suficiente para una consulta suelta.
|
|
4
|
+
*/
|
|
5
|
+
import { htmlToText } from "../texto.js";
|
|
6
|
+
async function pedirJson(fetchImpl, url, signal) {
|
|
7
|
+
const respuesta = await fetchImpl(url, { headers: { Accept: "application/vnd.github+json" }, signal });
|
|
8
|
+
if (respuesta.status === 404)
|
|
9
|
+
return null;
|
|
10
|
+
if (!respuesta.ok)
|
|
11
|
+
throw new Error(`GitHub respondió HTTP ${respuesta.status}.`);
|
|
12
|
+
return (await respuesta.json());
|
|
13
|
+
}
|
|
14
|
+
export const scrapear = async (url, fetchImpl, signal) => {
|
|
15
|
+
let owner;
|
|
16
|
+
let repo;
|
|
17
|
+
let apiBase;
|
|
18
|
+
if (url.hostname === "github.com") {
|
|
19
|
+
const partes = url.pathname.split("/").filter(Boolean);
|
|
20
|
+
if (partes.length < 2)
|
|
21
|
+
return null;
|
|
22
|
+
[owner, repo] = partes;
|
|
23
|
+
apiBase = `https://api.github.com/repos/${owner}/${repo}`;
|
|
24
|
+
const seccion = partes[2];
|
|
25
|
+
const numero = partes[3];
|
|
26
|
+
if ((seccion === "issues" || seccion === "pull") && /^\d+$/.test(numero ?? "")) {
|
|
27
|
+
const issue = await pedirJson(fetchImpl, `${apiBase}/issues/${numero}`, signal);
|
|
28
|
+
if (!issue?.title)
|
|
29
|
+
return null;
|
|
30
|
+
return {
|
|
31
|
+
titulo: `${issue.pull_request ? "PR" : "Issue"} #${issue.number}: ${issue.title}`,
|
|
32
|
+
url: issue.html_url ?? url.href,
|
|
33
|
+
resumen: htmlToText(issue.body ?? "").slice(0, 600),
|
|
34
|
+
datos: {
|
|
35
|
+
numero: issue.number,
|
|
36
|
+
estado: issue.state,
|
|
37
|
+
autor: issue.user?.login,
|
|
38
|
+
comentarios: issue.comments,
|
|
39
|
+
esPR: Boolean(issue.pull_request),
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (seccion !== undefined && seccion !== "")
|
|
44
|
+
return null; // otras subrutas (blob, tree…) no son de este scraper
|
|
45
|
+
}
|
|
46
|
+
else if (url.hostname === "api.github.com") {
|
|
47
|
+
apiBase = url.href.replace(/\/issues\/\d+$/, "");
|
|
48
|
+
const match = url.pathname.match(/^\/repos\/([^/]+)\/([^/]+)/);
|
|
49
|
+
if (!match)
|
|
50
|
+
return null;
|
|
51
|
+
[, owner, repo] = match;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const repoDoc = await pedirJson(fetchImpl, `https://api.github.com/repos/${owner}/${repo}`, signal);
|
|
57
|
+
if (!repoDoc?.full_name)
|
|
58
|
+
return null;
|
|
59
|
+
return {
|
|
60
|
+
titulo: repoDoc.full_name,
|
|
61
|
+
url: repoDoc.html_url ?? `https://github.com/${owner}/${repo}`,
|
|
62
|
+
resumen: repoDoc.description ?? "",
|
|
63
|
+
datos: {
|
|
64
|
+
licencia: repoDoc.license?.spdx_id,
|
|
65
|
+
estrellas: repoDoc.stargazers_count,
|
|
66
|
+
issuesAbiertas: repoDoc.open_issues_count,
|
|
67
|
+
ramaPorDefecto: repoDoc.default_branch,
|
|
68
|
+
lenguaje: repoDoc.language,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../src/core/web/scrapers/github.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAyBzC,KAAK,UAAU,SAAS,CAAI,SAAuB,EAAE,GAAW,EAAE,MAAoB,EAAqB;IAC1G,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACvG,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAAyB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACjF,OAAO,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAM,CAAC;AAAA,CACrC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAmB,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACzE,IAAI,KAAa,CAAC;IAClB,IAAI,IAAY,CAAC;IACjB,IAAI,OAAe,CAAC;IACpB,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC;QACvB,OAAO,GAAG,gCAAgC,KAAK,IAAI,IAAI,EAAE,CAAC;QAE1D,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;YAChF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAW,SAAS,EAAE,GAAG,OAAO,WAAW,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;YAC1F,IAAI,CAAC,KAAK,EAAE,KAAK;gBAAE,OAAO,IAAI,CAAC;YAC/B,OAAO;gBACN,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,EAAE;gBACjF,GAAG,EAAE,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI;gBAC/B,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBACnD,KAAK,EAAE;oBACN,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,MAAM,EAAE,KAAK,CAAC,KAAK;oBACnB,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK;oBACxB,WAAW,EAAE,KAAK,CAAC,QAAQ;oBAC3B,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;iBACjC;aACD,CAAC;QACH,CAAC;QACD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC,CAAC,wDAAsD;IACjH,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;QAC9C,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IACzB,CAAC;SAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAU,SAAS,EAAE,gCAAgC,KAAK,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7G,IAAI,CAAC,OAAO,EAAE,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO;QACN,MAAM,EAAE,OAAO,CAAC,SAAS;QACzB,GAAG,EAAE,OAAO,CAAC,QAAQ,IAAI,sBAAsB,KAAK,IAAI,IAAI,EAAE;QAC9D,OAAO,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QAClC,KAAK,EAAE;YACN,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO;YAClC,SAAS,EAAE,OAAO,CAAC,gBAAgB;YACnC,cAAc,EAAE,OAAO,CAAC,iBAAiB;YACzC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC1B;KACD,CAAC;AAAA,CACF,CAAC","sourcesContent":["/**\n * GitHub: repos e issues/PRs, vía la API REST pública (`api.github.com`).\n * Sin clave: 60 peticiones/hora por IP, suficiente para una consulta suelta.\n */\nimport { htmlToText } from \"../texto.ts\";\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocRepo {\n\tfull_name?: string;\n\tdescription?: string;\n\tlicense?: { spdx_id?: string };\n\tstargazers_count?: number;\n\topen_issues_count?: number;\n\tdefault_branch?: string;\n\tlanguage?: string;\n\thtml_url?: string;\n}\n\ninterface DocIssue {\n\ttitle?: string;\n\tbody?: string;\n\tstate?: string;\n\tnumber?: number;\n\tuser?: { login?: string };\n\tcomments?: number;\n\tpull_request?: unknown;\n\thtml_url?: string;\n}\n\nasync function pedirJson<T>(fetchImpl: typeof fetch, url: string, signal?: AbortSignal): Promise<T | null> {\n\tconst respuesta = await fetchImpl(url, { headers: { Accept: \"application/vnd.github+json\" }, signal });\n\tif (respuesta.status === 404) return null;\n\tif (!respuesta.ok) throw new Error(`GitHub respondió HTTP ${respuesta.status}.`);\n\treturn (await respuesta.json()) as T;\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tlet owner: string;\n\tlet repo: string;\n\tlet apiBase: string;\n\tif (url.hostname === \"github.com\") {\n\t\tconst partes = url.pathname.split(\"/\").filter(Boolean);\n\t\tif (partes.length < 2) return null;\n\t\t[owner, repo] = partes;\n\t\tapiBase = `https://api.github.com/repos/${owner}/${repo}`;\n\n\t\tconst seccion = partes[2];\n\t\tconst numero = partes[3];\n\t\tif ((seccion === \"issues\" || seccion === \"pull\") && /^\\d+$/.test(numero ?? \"\")) {\n\t\t\tconst issue = await pedirJson<DocIssue>(fetchImpl, `${apiBase}/issues/${numero}`, signal);\n\t\t\tif (!issue?.title) return null;\n\t\t\treturn {\n\t\t\t\ttitulo: `${issue.pull_request ? \"PR\" : \"Issue\"} #${issue.number}: ${issue.title}`,\n\t\t\t\turl: issue.html_url ?? url.href,\n\t\t\t\tresumen: htmlToText(issue.body ?? \"\").slice(0, 600),\n\t\t\t\tdatos: {\n\t\t\t\t\tnumero: issue.number,\n\t\t\t\t\testado: issue.state,\n\t\t\t\t\tautor: issue.user?.login,\n\t\t\t\t\tcomentarios: issue.comments,\n\t\t\t\t\tesPR: Boolean(issue.pull_request),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tif (seccion !== undefined && seccion !== \"\") return null; // otras subrutas (blob, tree…) no son de este scraper\n\t} else if (url.hostname === \"api.github.com\") {\n\t\tapiBase = url.href.replace(/\\/issues\\/\\d+$/, \"\");\n\t\tconst match = url.pathname.match(/^\\/repos\\/([^/]+)\\/([^/]+)/);\n\t\tif (!match) return null;\n\t\t[, owner, repo] = match;\n\t} else {\n\t\treturn null;\n\t}\n\n\tconst repoDoc = await pedirJson<DocRepo>(fetchImpl, `https://api.github.com/repos/${owner}/${repo}`, signal);\n\tif (!repoDoc?.full_name) return null;\n\treturn {\n\t\ttitulo: repoDoc.full_name,\n\t\turl: repoDoc.html_url ?? `https://github.com/${owner}/${repo}`,\n\t\tresumen: repoDoc.description ?? \"\",\n\t\tdatos: {\n\t\t\tlicencia: repoDoc.license?.spdx_id,\n\t\t\testrellas: repoDoc.stargazers_count,\n\t\t\tissuesAbiertas: repoDoc.open_issues_count,\n\t\t\tramaPorDefecto: repoDoc.default_branch,\n\t\t\tlenguaje: repoDoc.language,\n\t\t},\n\t};\n};\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pkg.go.dev, vía el proxy de módulos de Go (`proxy.golang.org`) — sin clave,
|
|
3
|
+
* es infraestructura pública del propio toolchain de Go.
|
|
4
|
+
*/
|
|
5
|
+
import type { FuncionScraper } from "./tipos.ts";
|
|
6
|
+
export declare const scrapear: FuncionScraper;
|
|
7
|
+
//# sourceMappingURL=go-pkg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go-pkg.d.ts","sourceRoot":"","sources":["../../../../src/core/web/scrapers/go-pkg.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAQjD,eAAO,MAAM,QAAQ,EAAE,cA0BtB,CAAC","sourcesContent":["/**\n * pkg.go.dev, vía el proxy de módulos de Go (`proxy.golang.org`) — sin clave,\n * es infraestructura pública del propio toolchain de Go.\n */\nimport type { FuncionScraper } from \"./tipos.ts\";\n\ninterface DocGoInfo {\n\tVersion?: string;\n\tTime?: string;\n\tOrigin?: { URL?: string };\n}\n\nexport const scrapear: FuncionScraper = async (url, fetchImpl, signal) => {\n\tif (url.hostname !== \"pkg.go.dev\") return null;\n\tconst ruta = url.pathname.slice(1);\n\tif (!ruta) return null;\n\n\t// Formas: /modulo, /modulo@version, /modulo/subpaquete[@version]. El proxy\n\t// solo entiende el módulo raíz, así que se descarta todo lo de después de `@`.\n\tconst arroba = ruta.indexOf(\"@\");\n\tconst modulo = arroba === -1 ? ruta : ruta.slice(0, arroba);\n\n\t// Limitación conocida: un subpaquete (p.ej. golang.org/x/text/encoding) no es\n\t// el módulo raíz (golang.org/x/text), y resolver eso implicaría ir probando\n\t// prefijos contra el proxy. Se deja sin resolver a propósito: un 404 aquí\n\t// cae al `web_fetch` genérico, que sí sabe leer la página humana.\n\tconst respuesta = await fetchImpl(`https://proxy.golang.org/${encodeURIComponent(modulo)}/@latest`, { signal });\n\tif (respuesta.status === 404 || respuesta.status === 410) return null;\n\tif (!respuesta.ok) throw new Error(`pkg.go.dev (vía proxy.golang.org) respondió HTTP ${respuesta.status}.`);\n\tconst doc = (await respuesta.json()) as DocGoInfo;\n\tif (!doc.Version) return null;\n\n\treturn {\n\t\ttitulo: `${modulo}@${doc.Version}`,\n\t\turl: `https://pkg.go.dev/${modulo}`,\n\t\tresumen: \"\",\n\t\tdatos: { modulo, version: doc.Version, publicado: doc.Time, origen: doc.Origin?.URL },\n\t};\n};\n"]}
|