@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,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DuckDuckGo, vía su frontend HTML sin JS (`html.duckduckgo.com/html/`).
|
|
3
|
+
*
|
|
4
|
+
* Sin clave: es el único de los tres proveedores gratuitos que responde con
|
|
5
|
+
* resultados reales desde una red de centro de datos en la práctica —Mojeek y
|
|
6
|
+
* Ecosia sirven un captcha o un firewall a cualquier cliente sin navegador
|
|
7
|
+
* real la mayoría de las veces—. Por eso va primero en el grupo sin clave: es
|
|
8
|
+
* el que de verdad sostiene la puerta «sin ninguna clave, hay resultados».
|
|
9
|
+
*
|
|
10
|
+
* DuckDuckGo enruta cada resultado por `//duckduckgo.com/l/?uddg=<url>` para
|
|
11
|
+
* medir clics; hay que desenvolverlo o el agente termina con enlaces inútiles.
|
|
12
|
+
*/
|
|
13
|
+
import { CABECERAS_NAVEGADOR } from "./navegador.js";
|
|
14
|
+
const ENDPOINT = "https://html.duckduckgo.com/html/";
|
|
15
|
+
/** `true` cuando la página es el modal anti-bot, no resultados. DDG mezcla 200 y 202 en este caso. */
|
|
16
|
+
function esBloqueoAntiBot(html) {
|
|
17
|
+
return html.includes("anomaly-modal") || html.includes("anomaly.js");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Desenvuelve la URL real de un resultado. Los orgánicos van envueltos en
|
|
21
|
+
* `uddg=`; los ANUNCIOS (`//duckduckgo.com/y.js?ad_domain=…`) no llevan ese
|
|
22
|
+
* envoltorio porque no apuntan a un destino final, sino al propio tracker de
|
|
23
|
+
* clics de DDG — por eso, tras desenvolver, cualquier URL que SIGA en
|
|
24
|
+
* duckduckgo.com se descarta: es un anuncio, no un resultado.
|
|
25
|
+
*/
|
|
26
|
+
function desenvolverUrl(href) {
|
|
27
|
+
const decodificado = href.replace(/&/gi, "&");
|
|
28
|
+
let resuelta;
|
|
29
|
+
const match = decodificado.match(/[?&]uddg=([^&]+)/);
|
|
30
|
+
if (match) {
|
|
31
|
+
try {
|
|
32
|
+
resuelta = decodeURIComponent(match[1]);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (decodificado.startsWith("//")) {
|
|
39
|
+
resuelta = `https:${decodificado}`;
|
|
40
|
+
}
|
|
41
|
+
else if (decodificado.startsWith("http://") || decodificado.startsWith("https://")) {
|
|
42
|
+
resuelta = decodificado;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
if (new URL(resuelta).hostname.endsWith("duckduckgo.com"))
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
return resuelta;
|
|
55
|
+
}
|
|
56
|
+
function limpiarTexto(html) {
|
|
57
|
+
return html
|
|
58
|
+
.replace(/<[^>]*>/g, " ")
|
|
59
|
+
.replace(/&/gi, "&")
|
|
60
|
+
.replace(/</gi, "<")
|
|
61
|
+
.replace(/>/gi, ">")
|
|
62
|
+
.replace(/"/gi, '"')
|
|
63
|
+
.replace(/'|'/gi, "'")
|
|
64
|
+
.replace(/ /gi, " ")
|
|
65
|
+
.replace(/\s+/g, " ")
|
|
66
|
+
.trim();
|
|
67
|
+
}
|
|
68
|
+
const RE_BLOQUE = /<div\b[^>]*\bclass="[^"]*\bresult\b[^"]*"[^>]*>([\s\S]*?)(?=<div\b[^>]*\bclass="[^"]*\bresult\b|<div\b[^>]*\bclass="[^"]*\bnav-link\b|$)/g;
|
|
69
|
+
const RE_TITULO = /<a\b[^>]*\bclass="[^"]*\bresult__a\b[^"]*"[^>]*\bhref="([^"]+)"[^>]*>([\s\S]*?)<\/a>/;
|
|
70
|
+
const RE_SNIPPET = /<(?:a|div|span)\b[^>]*\bclass="[^"]*\bresult__snippet\b[^"]*"[^>]*>([\s\S]*?)<\/(?:a|div|span)>/;
|
|
71
|
+
function parsear(html) {
|
|
72
|
+
const resultados = [];
|
|
73
|
+
for (const bloque of html.matchAll(RE_BLOQUE)) {
|
|
74
|
+
const titulo = bloque[1].match(RE_TITULO);
|
|
75
|
+
if (!titulo)
|
|
76
|
+
continue;
|
|
77
|
+
const url = desenvolverUrl(titulo[1]);
|
|
78
|
+
if (!url)
|
|
79
|
+
continue;
|
|
80
|
+
const tituloTexto = limpiarTexto(titulo[2]);
|
|
81
|
+
if (!tituloTexto)
|
|
82
|
+
continue;
|
|
83
|
+
const snippet = bloque[1].match(RE_SNIPPET);
|
|
84
|
+
resultados.push({
|
|
85
|
+
titulo: tituloTexto,
|
|
86
|
+
url,
|
|
87
|
+
resumen: snippet ? limpiarTexto(snippet[1]) || undefined : undefined,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return resultados;
|
|
91
|
+
}
|
|
92
|
+
export const buscar = async (consulta, maximo, _clave, fetchImpl, signal) => {
|
|
93
|
+
// GET, no POST: probado en vivo contra `html.duckduckgo.com` — el mismo
|
|
94
|
+
// endpoint trata el POST (el envío "de formulario real" que usan otros
|
|
95
|
+
// scrapers) con más sospecha que un GET con la consulta en la query, al
|
|
96
|
+
// menos desde redes de centro de datos. Con GET responde con resultados
|
|
97
|
+
// reales de forma consistente; con POST, con el modal anti-bot.
|
|
98
|
+
const url = new URL(ENDPOINT);
|
|
99
|
+
url.searchParams.set("q", consulta);
|
|
100
|
+
const respuesta = await fetchImpl(url, { headers: CABECERAS_NAVEGADOR, signal });
|
|
101
|
+
if (!respuesta.ok)
|
|
102
|
+
throw new Error(`DuckDuckGo respondió HTTP ${respuesta.status}.`);
|
|
103
|
+
const html = await respuesta.text();
|
|
104
|
+
if (esBloqueoAntiBot(html)) {
|
|
105
|
+
throw new Error("DuckDuckGo bloqueó la petición con su captcha anti-bot.");
|
|
106
|
+
}
|
|
107
|
+
return parsear(html).slice(0, maximo);
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=duckduckgo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckduckgo.js","sourceRoot":"","sources":["../../../../src/core/web/proveedores/duckduckgo.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DuckDuckGo, vía su frontend HTML sin JS (`html.duckduckgo.com/html/`).\n *\n * Sin clave: es el único de los tres proveedores gratuitos que responde con\n * resultados reales desde una red de centro de datos en la práctica —Mojeek y\n * Ecosia sirven un captcha o un firewall a cualquier cliente sin navegador\n * real la mayoría de las veces—. Por eso va primero en el grupo sin clave: es\n * el que de verdad sostiene la puerta «sin ninguna clave, hay resultados».\n *\n * DuckDuckGo enruta cada resultado por `//duckduckgo.com/l/?uddg=<url>` para\n * medir clics; hay que desenvolverlo o el agente termina con enlaces inútiles.\n */\nimport { CABECERAS_NAVEGADOR } from \"./navegador.ts\";\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://html.duckduckgo.com/html/\";\n\n/** `true` cuando la página es el modal anti-bot, no resultados. DDG mezcla 200 y 202 en este caso. */\nfunction esBloqueoAntiBot(html: string): boolean {\n\treturn html.includes(\"anomaly-modal\") || html.includes(\"anomaly.js\");\n}\n\n/**\n * Desenvuelve la URL real de un resultado. Los orgánicos van envueltos en\n * `uddg=`; los ANUNCIOS (`//duckduckgo.com/y.js?ad_domain=…`) no llevan ese\n * envoltorio porque no apuntan a un destino final, sino al propio tracker de\n * clics de DDG — por eso, tras desenvolver, cualquier URL que SIGA en\n * duckduckgo.com se descarta: es un anuncio, no un resultado.\n */\nfunction desenvolverUrl(href: string): string | undefined {\n\tconst decodificado = href.replace(/&/gi, \"&\");\n\tlet resuelta: string | undefined;\n\tconst match = decodificado.match(/[?&]uddg=([^&]+)/);\n\tif (match) {\n\t\ttry {\n\t\t\tresuelta = decodeURIComponent(match[1]);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t} else if (decodificado.startsWith(\"//\")) {\n\t\tresuelta = `https:${decodificado}`;\n\t} else if (decodificado.startsWith(\"http://\") || decodificado.startsWith(\"https://\")) {\n\t\tresuelta = decodificado;\n\t} else {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\tif (new URL(resuelta).hostname.endsWith(\"duckduckgo.com\")) return undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n\treturn resuelta;\n}\n\nfunction limpiarTexto(html: string): string {\n\treturn html\n\t\t.replace(/<[^>]*>/g, \" \")\n\t\t.replace(/&/gi, \"&\")\n\t\t.replace(/</gi, \"<\")\n\t\t.replace(/>/gi, \">\")\n\t\t.replace(/"/gi, '\"')\n\t\t.replace(/'|'/gi, \"'\")\n\t\t.replace(/ /gi, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nconst RE_BLOQUE =\n\t/<div\\b[^>]*\\bclass=\"[^\"]*\\bresult\\b[^\"]*\"[^>]*>([\\s\\S]*?)(?=<div\\b[^>]*\\bclass=\"[^\"]*\\bresult\\b|<div\\b[^>]*\\bclass=\"[^\"]*\\bnav-link\\b|$)/g;\nconst RE_TITULO = /<a\\b[^>]*\\bclass=\"[^\"]*\\bresult__a\\b[^\"]*\"[^>]*\\bhref=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>/;\nconst RE_SNIPPET = /<(?:a|div|span)\\b[^>]*\\bclass=\"[^\"]*\\bresult__snippet\\b[^\"]*\"[^>]*>([\\s\\S]*?)<\\/(?:a|div|span)>/;\n\nfunction parsear(html: string): ResultadoProveedor[] {\n\tconst resultados: ResultadoProveedor[] = [];\n\tfor (const bloque of html.matchAll(RE_BLOQUE)) {\n\t\tconst titulo = bloque[1].match(RE_TITULO);\n\t\tif (!titulo) continue;\n\t\tconst url = desenvolverUrl(titulo[1]);\n\t\tif (!url) continue;\n\t\tconst tituloTexto = limpiarTexto(titulo[2]);\n\t\tif (!tituloTexto) continue;\n\t\tconst snippet = bloque[1].match(RE_SNIPPET);\n\t\tresultados.push({\n\t\t\ttitulo: tituloTexto,\n\t\t\turl,\n\t\t\tresumen: snippet ? limpiarTexto(snippet[1]) || undefined : undefined,\n\t\t});\n\t}\n\treturn resultados;\n}\n\nexport const buscar: FuncionBuscar = async (consulta, maximo, _clave, fetchImpl, signal) => {\n\t// GET, no POST: probado en vivo contra `html.duckduckgo.com` — el mismo\n\t// endpoint trata el POST (el envío \"de formulario real\" que usan otros\n\t// scrapers) con más sospecha que un GET con la consulta en la query, al\n\t// menos desde redes de centro de datos. Con GET responde con resultados\n\t// reales de forma consistente; con POST, con el modal anti-bot.\n\tconst url = new URL(ENDPOINT);\n\turl.searchParams.set(\"q\", consulta);\n\tconst respuesta = await fetchImpl(url, { headers: CABECERAS_NAVEGADOR, signal });\n\tif (!respuesta.ok) throw new Error(`DuckDuckGo respondió HTTP ${respuesta.status}.`);\n\tconst html = await respuesta.text();\n\tif (esBloqueoAntiBot(html)) {\n\t\tthrow new Error(\"DuckDuckGo bloqueó la petición con su captcha anti-bot.\");\n\t}\n\treturn parsear(html).slice(0, maximo);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecosia.d.ts","sourceRoot":"","sources":["../../../../src/core/web/proveedores/ecosia.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,YAAY,CAAC;AAuDpE,eAAO,MAAM,MAAM,EAAE,aAUpB,CAAC","sourcesContent":["/**\n * Ecosia, vía su página HTML pública (`ecosia.org/search`).\n *\n * Sin clave. Su frontal Cloudflare bloquea con frecuencia a clientes sin\n * navegador real (403 \"Ecosia Firewall\"); igual que Mojeek, se implementa\n * porque cuando responde trae resultados reales y el registro salta al\n * siguiente proveedor cuando este lanza.\n */\nimport { CABECERAS_NAVEGADOR } from \"./navegador.ts\";\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://www.ecosia.org/search\";\n\nfunction esBloqueado(status: number, html: string): boolean {\n\treturn (\n\t\tstatus === 403 ||\n\t\tstatus === 429 ||\n\t\thtml.includes(\"Ecosia Firewall\") ||\n\t\thtml.includes(\"_cf_chl_opt\") ||\n\t\thtml.includes(\"/cdn-cgi/challenge-platform/\")\n\t);\n}\n\nfunction limpiarTexto(html: string): string {\n\treturn html\n\t\t.replace(/<[^>]*>/g, \" \")\n\t\t.replace(/&/gi, \"&\")\n\t\t.replace(/</gi, \"<\")\n\t\t.replace(/>/gi, \">\")\n\t\t.replace(/"/gi, '\"')\n\t\t.replace(/'|'/gi, \"'\")\n\t\t.replace(/ /gi, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\n/** Cada resultado orgánico es un `<article data-test-id=\"organic-result\">`. */\nconst RE_ARTICULO = /<article\\b[^>]*\\bdata-test-id=\"organic-result\"[^>]*>([\\s\\S]*?)<\\/article>/g;\nconst RE_ENLACE_TITULO = /<a\\b[^>]*\\bhref=\"([^\"]+)\"[^>]*>[\\s\\S]*?data-test-id=\"result-title\"[\\s\\S]*?<\\/a>/;\nconst RE_TITULO_TEXTO = /data-test-id=\"result-title\"[^>]*>([\\s\\S]*?)<\\/h2>/;\nconst RE_DESCRIPCION = /data-test-id=\"(?:web-result-description|result-description)\"[^>]*>([\\s\\S]*?)<\\/p>/;\n\nfunction parsear(html: string): ResultadoProveedor[] {\n\tconst resultados: ResultadoProveedor[] = [];\n\tfor (const articulo of html.matchAll(RE_ARTICULO)) {\n\t\tconst bloque = articulo[1];\n\t\tconst enlace = bloque.match(RE_ENLACE_TITULO);\n\t\tconst titulo = bloque.match(RE_TITULO_TEXTO);\n\t\tif (!enlace || !titulo) continue;\n\t\tconst href = enlace[1];\n\t\tif (!href.startsWith(\"http://\") && !href.startsWith(\"https://\")) continue;\n\t\tif (/^https?:\\/\\/(www\\.)?ecosia\\.org/i.test(href)) continue;\n\t\tconst tituloTexto = limpiarTexto(titulo[1]);\n\t\tif (!tituloTexto) continue;\n\t\tconst descripcion = bloque.match(RE_DESCRIPCION);\n\t\tresultados.push({\n\t\t\ttitulo: tituloTexto,\n\t\t\turl: href,\n\t\t\tresumen: descripcion ? limpiarTexto(descripcion[1]) || undefined : undefined,\n\t\t});\n\t}\n\treturn resultados;\n}\n\nexport const buscar: FuncionBuscar = async (consulta, maximo, _clave, fetchImpl, signal) => {\n\tconst url = new URL(ENDPOINT);\n\turl.searchParams.set(\"q\", consulta);\n\tconst respuesta = await fetchImpl(url, { headers: CABECERAS_NAVEGADOR, signal });\n\tconst html = await respuesta.text();\n\tif (esBloqueado(respuesta.status, html)) {\n\t\tthrow new Error(\"Ecosia bloqueó la petición con su firewall anti-bot.\");\n\t}\n\tif (!respuesta.ok) throw new Error(`Ecosia respondió HTTP ${respuesta.status}.`);\n\treturn parsear(html).slice(0, maximo);\n};\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ecosia, vía su página HTML pública (`ecosia.org/search`).
|
|
3
|
+
*
|
|
4
|
+
* Sin clave. Su frontal Cloudflare bloquea con frecuencia a clientes sin
|
|
5
|
+
* navegador real (403 "Ecosia Firewall"); igual que Mojeek, se implementa
|
|
6
|
+
* porque cuando responde trae resultados reales y el registro salta al
|
|
7
|
+
* siguiente proveedor cuando este lanza.
|
|
8
|
+
*/
|
|
9
|
+
import { CABECERAS_NAVEGADOR } from "./navegador.js";
|
|
10
|
+
const ENDPOINT = "https://www.ecosia.org/search";
|
|
11
|
+
function esBloqueado(status, html) {
|
|
12
|
+
return (status === 403 ||
|
|
13
|
+
status === 429 ||
|
|
14
|
+
html.includes("Ecosia Firewall") ||
|
|
15
|
+
html.includes("_cf_chl_opt") ||
|
|
16
|
+
html.includes("/cdn-cgi/challenge-platform/"));
|
|
17
|
+
}
|
|
18
|
+
function limpiarTexto(html) {
|
|
19
|
+
return html
|
|
20
|
+
.replace(/<[^>]*>/g, " ")
|
|
21
|
+
.replace(/&/gi, "&")
|
|
22
|
+
.replace(/</gi, "<")
|
|
23
|
+
.replace(/>/gi, ">")
|
|
24
|
+
.replace(/"/gi, '"')
|
|
25
|
+
.replace(/'|'/gi, "'")
|
|
26
|
+
.replace(/ /gi, " ")
|
|
27
|
+
.replace(/\s+/g, " ")
|
|
28
|
+
.trim();
|
|
29
|
+
}
|
|
30
|
+
/** Cada resultado orgánico es un `<article data-test-id="organic-result">`. */
|
|
31
|
+
const RE_ARTICULO = /<article\b[^>]*\bdata-test-id="organic-result"[^>]*>([\s\S]*?)<\/article>/g;
|
|
32
|
+
const RE_ENLACE_TITULO = /<a\b[^>]*\bhref="([^"]+)"[^>]*>[\s\S]*?data-test-id="result-title"[\s\S]*?<\/a>/;
|
|
33
|
+
const RE_TITULO_TEXTO = /data-test-id="result-title"[^>]*>([\s\S]*?)<\/h2>/;
|
|
34
|
+
const RE_DESCRIPCION = /data-test-id="(?:web-result-description|result-description)"[^>]*>([\s\S]*?)<\/p>/;
|
|
35
|
+
function parsear(html) {
|
|
36
|
+
const resultados = [];
|
|
37
|
+
for (const articulo of html.matchAll(RE_ARTICULO)) {
|
|
38
|
+
const bloque = articulo[1];
|
|
39
|
+
const enlace = bloque.match(RE_ENLACE_TITULO);
|
|
40
|
+
const titulo = bloque.match(RE_TITULO_TEXTO);
|
|
41
|
+
if (!enlace || !titulo)
|
|
42
|
+
continue;
|
|
43
|
+
const href = enlace[1];
|
|
44
|
+
if (!href.startsWith("http://") && !href.startsWith("https://"))
|
|
45
|
+
continue;
|
|
46
|
+
if (/^https?:\/\/(www\.)?ecosia\.org/i.test(href))
|
|
47
|
+
continue;
|
|
48
|
+
const tituloTexto = limpiarTexto(titulo[1]);
|
|
49
|
+
if (!tituloTexto)
|
|
50
|
+
continue;
|
|
51
|
+
const descripcion = bloque.match(RE_DESCRIPCION);
|
|
52
|
+
resultados.push({
|
|
53
|
+
titulo: tituloTexto,
|
|
54
|
+
url: href,
|
|
55
|
+
resumen: descripcion ? limpiarTexto(descripcion[1]) || undefined : undefined,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return resultados;
|
|
59
|
+
}
|
|
60
|
+
export const buscar = async (consulta, maximo, _clave, fetchImpl, signal) => {
|
|
61
|
+
const url = new URL(ENDPOINT);
|
|
62
|
+
url.searchParams.set("q", consulta);
|
|
63
|
+
const respuesta = await fetchImpl(url, { headers: CABECERAS_NAVEGADOR, signal });
|
|
64
|
+
const html = await respuesta.text();
|
|
65
|
+
if (esBloqueado(respuesta.status, html)) {
|
|
66
|
+
throw new Error("Ecosia bloqueó la petición con su firewall anti-bot.");
|
|
67
|
+
}
|
|
68
|
+
if (!respuesta.ok)
|
|
69
|
+
throw new Error(`Ecosia respondió HTTP ${respuesta.status}.`);
|
|
70
|
+
return parsear(html).slice(0, maximo);
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=ecosia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecosia.js","sourceRoot":"","sources":["../../../../src/core/web/proveedores/ecosia.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Ecosia, vía su página HTML pública (`ecosia.org/search`).\n *\n * Sin clave. Su frontal Cloudflare bloquea con frecuencia a clientes sin\n * navegador real (403 \"Ecosia Firewall\"); igual que Mojeek, se implementa\n * porque cuando responde trae resultados reales y el registro salta al\n * siguiente proveedor cuando este lanza.\n */\nimport { CABECERAS_NAVEGADOR } from \"./navegador.ts\";\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://www.ecosia.org/search\";\n\nfunction esBloqueado(status: number, html: string): boolean {\n\treturn (\n\t\tstatus === 403 ||\n\t\tstatus === 429 ||\n\t\thtml.includes(\"Ecosia Firewall\") ||\n\t\thtml.includes(\"_cf_chl_opt\") ||\n\t\thtml.includes(\"/cdn-cgi/challenge-platform/\")\n\t);\n}\n\nfunction limpiarTexto(html: string): string {\n\treturn html\n\t\t.replace(/<[^>]*>/g, \" \")\n\t\t.replace(/&/gi, \"&\")\n\t\t.replace(/</gi, \"<\")\n\t\t.replace(/>/gi, \">\")\n\t\t.replace(/"/gi, '\"')\n\t\t.replace(/'|'/gi, \"'\")\n\t\t.replace(/ /gi, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\n/** Cada resultado orgánico es un `<article data-test-id=\"organic-result\">`. */\nconst RE_ARTICULO = /<article\\b[^>]*\\bdata-test-id=\"organic-result\"[^>]*>([\\s\\S]*?)<\\/article>/g;\nconst RE_ENLACE_TITULO = /<a\\b[^>]*\\bhref=\"([^\"]+)\"[^>]*>[\\s\\S]*?data-test-id=\"result-title\"[\\s\\S]*?<\\/a>/;\nconst RE_TITULO_TEXTO = /data-test-id=\"result-title\"[^>]*>([\\s\\S]*?)<\\/h2>/;\nconst RE_DESCRIPCION = /data-test-id=\"(?:web-result-description|result-description)\"[^>]*>([\\s\\S]*?)<\\/p>/;\n\nfunction parsear(html: string): ResultadoProveedor[] {\n\tconst resultados: ResultadoProveedor[] = [];\n\tfor (const articulo of html.matchAll(RE_ARTICULO)) {\n\t\tconst bloque = articulo[1];\n\t\tconst enlace = bloque.match(RE_ENLACE_TITULO);\n\t\tconst titulo = bloque.match(RE_TITULO_TEXTO);\n\t\tif (!enlace || !titulo) continue;\n\t\tconst href = enlace[1];\n\t\tif (!href.startsWith(\"http://\") && !href.startsWith(\"https://\")) continue;\n\t\tif (/^https?:\\/\\/(www\\.)?ecosia\\.org/i.test(href)) continue;\n\t\tconst tituloTexto = limpiarTexto(titulo[1]);\n\t\tif (!tituloTexto) continue;\n\t\tconst descripcion = bloque.match(RE_DESCRIPCION);\n\t\tresultados.push({\n\t\t\ttitulo: tituloTexto,\n\t\t\turl: href,\n\t\t\tresumen: descripcion ? limpiarTexto(descripcion[1]) || undefined : undefined,\n\t\t});\n\t}\n\treturn resultados;\n}\n\nexport const buscar: FuncionBuscar = async (consulta, maximo, _clave, fetchImpl, signal) => {\n\tconst url = new URL(ENDPOINT);\n\turl.searchParams.set(\"q\", consulta);\n\tconst respuesta = await fetchImpl(url, { headers: CABECERAS_NAVEGADOR, signal });\n\tconst html = await respuesta.text();\n\tif (esBloqueado(respuesta.status, html)) {\n\t\tthrow new Error(\"Ecosia bloqueó la petición con su firewall anti-bot.\");\n\t}\n\tif (!respuesta.ok) throw new Error(`Ecosia respondió HTTP ${respuesta.status}.`);\n\treturn parsear(html).slice(0, maximo);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exa.d.ts","sourceRoot":"","sources":["../../../../src/core/web/proveedores/exa.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,YAAY,CAAC;AAQpE,eAAO,MAAM,MAAM,EAAE,aAmBpB,CAAC","sourcesContent":["/**\n * Exa Search API. Requiere clave (`exa` en el vault, o EXA_API_KEY).\n */\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://api.exa.ai/search\";\n\ninterface RespuestaExa {\n\tresults?: Array<{ title?: string; url?: string; text?: string; summary?: string }>;\n}\n\nexport const buscar: FuncionBuscar = async (consulta, maximo, clave, fetchImpl, signal) => {\n\tif (!clave) throw new Error(\"Exa requiere clave.\");\n\tconst respuesta = await fetchImpl(ENDPOINT, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"content-type\": \"application/json\", \"x-api-key\": clave },\n\t\tbody: JSON.stringify({\n\t\t\tquery: consulta,\n\t\t\tnumResults: Math.min(Math.max(maximo, 1), 20),\n\t\t\ttype: \"auto\",\n\t\t\tcontents: { summary: { query: consulta } },\n\t\t}),\n\t\tsignal,\n\t});\n\tif (!respuesta.ok) throw new Error(`Exa respondió HTTP ${respuesta.status}.`);\n\tconst datos = (await respuesta.json()) as RespuestaExa;\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.summary || r.text }));\n\treturn resultados.slice(0, maximo);\n};\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const ENDPOINT = "https://api.exa.ai/search";
|
|
2
|
+
export const buscar = async (consulta, maximo, clave, fetchImpl, signal) => {
|
|
3
|
+
if (!clave)
|
|
4
|
+
throw new Error("Exa requiere clave.");
|
|
5
|
+
const respuesta = await fetchImpl(ENDPOINT, {
|
|
6
|
+
method: "POST",
|
|
7
|
+
headers: { "content-type": "application/json", "x-api-key": clave },
|
|
8
|
+
body: JSON.stringify({
|
|
9
|
+
query: consulta,
|
|
10
|
+
numResults: Math.min(Math.max(maximo, 1), 20),
|
|
11
|
+
type: "auto",
|
|
12
|
+
contents: { summary: { query: consulta } },
|
|
13
|
+
}),
|
|
14
|
+
signal,
|
|
15
|
+
});
|
|
16
|
+
if (!respuesta.ok)
|
|
17
|
+
throw new Error(`Exa respondió HTTP ${respuesta.status}.`);
|
|
18
|
+
const datos = (await respuesta.json());
|
|
19
|
+
const resultados = (datos.results ?? [])
|
|
20
|
+
.filter((r) => typeof r.url === "string" && r.url)
|
|
21
|
+
.map((r) => ({ titulo: r.title || r.url, url: r.url, resumen: r.summary || r.text }));
|
|
22
|
+
return resultados.slice(0, maximo);
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=exa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exa.js","sourceRoot":"","sources":["../../../../src/core/web/proveedores/exa.ts"],"names":[],"mappings":"AAKA,MAAM,QAAQ,GAAG,2BAA2B,CAAC;AAM7C,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,qBAAqB,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;QAC3C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,KAAK,EAAE;QACnE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;SAC1C,CAAC;QACF,MAAM;KACN,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAsB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAiB,CAAC;IACvD,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,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzF,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAAA,CACnC,CAAC","sourcesContent":["/**\n * Exa Search API. Requiere clave (`exa` en el vault, o EXA_API_KEY).\n */\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://api.exa.ai/search\";\n\ninterface RespuestaExa {\n\tresults?: Array<{ title?: string; url?: string; text?: string; summary?: string }>;\n}\n\nexport const buscar: FuncionBuscar = async (consulta, maximo, clave, fetchImpl, signal) => {\n\tif (!clave) throw new Error(\"Exa requiere clave.\");\n\tconst respuesta = await fetchImpl(ENDPOINT, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"content-type\": \"application/json\", \"x-api-key\": clave },\n\t\tbody: JSON.stringify({\n\t\t\tquery: consulta,\n\t\t\tnumResults: Math.min(Math.max(maximo, 1), 20),\n\t\t\ttype: \"auto\",\n\t\t\tcontents: { summary: { query: consulta } },\n\t\t}),\n\t\tsignal,\n\t});\n\tif (!respuesta.ok) throw new Error(`Exa respondió HTTP ${respuesta.status}.`);\n\tconst datos = (await respuesta.json()) as RespuestaExa;\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.summary || r.text }));\n\treturn resultados.slice(0, maximo);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mojeek.d.ts","sourceRoot":"","sources":["../../../../src/core/web/proveedores/mojeek.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,YAAY,CAAC;AA8CpE,eAAO,MAAM,MAAM,EAAE,aAWpB,CAAC","sourcesContent":["/**\n * Mojeek, vía su página HTML pública (`mojeek.com/search`).\n *\n * Índice propio, sin clave. En la práctica bloquea con un captcha (ALTCHA) a\n * casi cualquier cliente sin navegador real bastante a menudo — se implementa\n * igualmente porque cuando SÍ contesta trae resultados reales, y el registro\n * ya está pensado para saltar al siguiente proveedor cuando este lanza.\n */\nimport { CABECERAS_NAVEGADOR } from \"./navegador.ts\";\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://www.mojeek.com/search\";\n\nfunction esBloqueoAntiBot(html: string): boolean {\n\treturn html.includes(\"altcha-widget\") || html.includes(\"captcha-wrap\") || /sending automated queries/i.test(html);\n}\n\nfunction limpiarTexto(html: string): string {\n\treturn html\n\t\t.replace(/<[^>]*>/g, \" \")\n\t\t.replace(/&/gi, \"&\")\n\t\t.replace(/</gi, \"<\")\n\t\t.replace(/>/gi, \">\")\n\t\t.replace(/"/gi, '\"')\n\t\t.replace(/'|'/gi, \"'\")\n\t\t.replace(/ /gi, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\n/** Cada resultado orgánico es un `<li>` de `ul.results-standard`, con el título en `h2 > a.title`. */\nconst RE_ITEM =\n\t/<li\\b[^>]*>[\\s\\S]*?<h2[^>]*>\\s*<a\\b[^>]*\\bclass=\"[^\"]*\\btitle\\b[^\"]*\"[^>]*\\bhref=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>[\\s\\S]*?<\\/li>/g;\nconst RE_SNIPPET = /<p\\b[^>]*\\bclass=\"[^\"]*\\bs\\b[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/;\n\nfunction parsear(html: string): ResultadoProveedor[] {\n\tconst bloque = html.match(/<ul\\b[^>]*\\bclass=\"[^\"]*\\bresults-standard\\b[^\"]*\"[^>]*>([\\s\\S]*?)<\\/ul>/);\n\tif (!bloque) return [];\n\tconst resultados: ResultadoProveedor[] = [];\n\tfor (const item of bloque[1].matchAll(RE_ITEM)) {\n\t\tconst href = item[1];\n\t\tif (!href.startsWith(\"http://\") && !href.startsWith(\"https://\")) continue;\n\t\tif (/mojeek\\.(com|co\\.uk|fr|de)/i.test(href)) continue; // navegación interna, no resultado\n\t\tconst tituloTexto = limpiarTexto(item[2]);\n\t\tif (!tituloTexto) continue;\n\t\tconst snippet = item[0].match(RE_SNIPPET);\n\t\tresultados.push({\n\t\t\ttitulo: tituloTexto,\n\t\t\turl: href,\n\t\t\tresumen: snippet ? limpiarTexto(snippet[1]) || undefined : undefined,\n\t\t});\n\t}\n\treturn resultados;\n}\n\nexport const buscar: FuncionBuscar = async (consulta, maximo, _clave, fetchImpl, signal) => {\n\tconst url = new URL(ENDPOINT);\n\turl.searchParams.set(\"q\", consulta);\n\turl.searchParams.set(\"t\", String(maximo));\n\tconst respuesta = await fetchImpl(url, { headers: CABECERAS_NAVEGADOR, signal });\n\tconst html = await respuesta.text();\n\tif (esBloqueoAntiBot(html)) {\n\t\tthrow new Error(\"Mojeek bloqueó la petición con su captcha anti-bot.\");\n\t}\n\tif (!respuesta.ok) throw new Error(`Mojeek respondió HTTP ${respuesta.status}.`);\n\treturn parsear(html).slice(0, maximo);\n};\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mojeek, vía su página HTML pública (`mojeek.com/search`).
|
|
3
|
+
*
|
|
4
|
+
* Índice propio, sin clave. En la práctica bloquea con un captcha (ALTCHA) a
|
|
5
|
+
* casi cualquier cliente sin navegador real bastante a menudo — se implementa
|
|
6
|
+
* igualmente porque cuando SÍ contesta trae resultados reales, y el registro
|
|
7
|
+
* ya está pensado para saltar al siguiente proveedor cuando este lanza.
|
|
8
|
+
*/
|
|
9
|
+
import { CABECERAS_NAVEGADOR } from "./navegador.js";
|
|
10
|
+
const ENDPOINT = "https://www.mojeek.com/search";
|
|
11
|
+
function esBloqueoAntiBot(html) {
|
|
12
|
+
return html.includes("altcha-widget") || html.includes("captcha-wrap") || /sending automated queries/i.test(html);
|
|
13
|
+
}
|
|
14
|
+
function limpiarTexto(html) {
|
|
15
|
+
return html
|
|
16
|
+
.replace(/<[^>]*>/g, " ")
|
|
17
|
+
.replace(/&/gi, "&")
|
|
18
|
+
.replace(/</gi, "<")
|
|
19
|
+
.replace(/>/gi, ">")
|
|
20
|
+
.replace(/"/gi, '"')
|
|
21
|
+
.replace(/'|'/gi, "'")
|
|
22
|
+
.replace(/ /gi, " ")
|
|
23
|
+
.replace(/\s+/g, " ")
|
|
24
|
+
.trim();
|
|
25
|
+
}
|
|
26
|
+
/** Cada resultado orgánico es un `<li>` de `ul.results-standard`, con el título en `h2 > a.title`. */
|
|
27
|
+
const RE_ITEM = /<li\b[^>]*>[\s\S]*?<h2[^>]*>\s*<a\b[^>]*\bclass="[^"]*\btitle\b[^"]*"[^>]*\bhref="([^"]+)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<\/li>/g;
|
|
28
|
+
const RE_SNIPPET = /<p\b[^>]*\bclass="[^"]*\bs\b[^"]*"[^>]*>([\s\S]*?)<\/p>/;
|
|
29
|
+
function parsear(html) {
|
|
30
|
+
const bloque = html.match(/<ul\b[^>]*\bclass="[^"]*\bresults-standard\b[^"]*"[^>]*>([\s\S]*?)<\/ul>/);
|
|
31
|
+
if (!bloque)
|
|
32
|
+
return [];
|
|
33
|
+
const resultados = [];
|
|
34
|
+
for (const item of bloque[1].matchAll(RE_ITEM)) {
|
|
35
|
+
const href = item[1];
|
|
36
|
+
if (!href.startsWith("http://") && !href.startsWith("https://"))
|
|
37
|
+
continue;
|
|
38
|
+
if (/mojeek\.(com|co\.uk|fr|de)/i.test(href))
|
|
39
|
+
continue; // navegación interna, no resultado
|
|
40
|
+
const tituloTexto = limpiarTexto(item[2]);
|
|
41
|
+
if (!tituloTexto)
|
|
42
|
+
continue;
|
|
43
|
+
const snippet = item[0].match(RE_SNIPPET);
|
|
44
|
+
resultados.push({
|
|
45
|
+
titulo: tituloTexto,
|
|
46
|
+
url: href,
|
|
47
|
+
resumen: snippet ? limpiarTexto(snippet[1]) || undefined : undefined,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return resultados;
|
|
51
|
+
}
|
|
52
|
+
export const buscar = async (consulta, maximo, _clave, fetchImpl, signal) => {
|
|
53
|
+
const url = new URL(ENDPOINT);
|
|
54
|
+
url.searchParams.set("q", consulta);
|
|
55
|
+
url.searchParams.set("t", String(maximo));
|
|
56
|
+
const respuesta = await fetchImpl(url, { headers: CABECERAS_NAVEGADOR, signal });
|
|
57
|
+
const html = await respuesta.text();
|
|
58
|
+
if (esBloqueoAntiBot(html)) {
|
|
59
|
+
throw new Error("Mojeek bloqueó la petición con su captcha anti-bot.");
|
|
60
|
+
}
|
|
61
|
+
if (!respuesta.ok)
|
|
62
|
+
throw new Error(`Mojeek respondió HTTP ${respuesta.status}.`);
|
|
63
|
+
return parsear(html).slice(0, maximo);
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=mojeek.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mojeek.js","sourceRoot":"","sources":["../../../../src/core/web/proveedores/mojeek.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Mojeek, vía su página HTML pública (`mojeek.com/search`).\n *\n * Índice propio, sin clave. En la práctica bloquea con un captcha (ALTCHA) a\n * casi cualquier cliente sin navegador real bastante a menudo — se implementa\n * igualmente porque cuando SÍ contesta trae resultados reales, y el registro\n * ya está pensado para saltar al siguiente proveedor cuando este lanza.\n */\nimport { CABECERAS_NAVEGADOR } from \"./navegador.ts\";\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://www.mojeek.com/search\";\n\nfunction esBloqueoAntiBot(html: string): boolean {\n\treturn html.includes(\"altcha-widget\") || html.includes(\"captcha-wrap\") || /sending automated queries/i.test(html);\n}\n\nfunction limpiarTexto(html: string): string {\n\treturn html\n\t\t.replace(/<[^>]*>/g, \" \")\n\t\t.replace(/&/gi, \"&\")\n\t\t.replace(/</gi, \"<\")\n\t\t.replace(/>/gi, \">\")\n\t\t.replace(/"/gi, '\"')\n\t\t.replace(/'|'/gi, \"'\")\n\t\t.replace(/ /gi, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\n/** Cada resultado orgánico es un `<li>` de `ul.results-standard`, con el título en `h2 > a.title`. */\nconst RE_ITEM =\n\t/<li\\b[^>]*>[\\s\\S]*?<h2[^>]*>\\s*<a\\b[^>]*\\bclass=\"[^\"]*\\btitle\\b[^\"]*\"[^>]*\\bhref=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>[\\s\\S]*?<\\/li>/g;\nconst RE_SNIPPET = /<p\\b[^>]*\\bclass=\"[^\"]*\\bs\\b[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/;\n\nfunction parsear(html: string): ResultadoProveedor[] {\n\tconst bloque = html.match(/<ul\\b[^>]*\\bclass=\"[^\"]*\\bresults-standard\\b[^\"]*\"[^>]*>([\\s\\S]*?)<\\/ul>/);\n\tif (!bloque) return [];\n\tconst resultados: ResultadoProveedor[] = [];\n\tfor (const item of bloque[1].matchAll(RE_ITEM)) {\n\t\tconst href = item[1];\n\t\tif (!href.startsWith(\"http://\") && !href.startsWith(\"https://\")) continue;\n\t\tif (/mojeek\\.(com|co\\.uk|fr|de)/i.test(href)) continue; // navegación interna, no resultado\n\t\tconst tituloTexto = limpiarTexto(item[2]);\n\t\tif (!tituloTexto) continue;\n\t\tconst snippet = item[0].match(RE_SNIPPET);\n\t\tresultados.push({\n\t\t\ttitulo: tituloTexto,\n\t\t\turl: href,\n\t\t\tresumen: snippet ? limpiarTexto(snippet[1]) || undefined : undefined,\n\t\t});\n\t}\n\treturn resultados;\n}\n\nexport const buscar: FuncionBuscar = async (consulta, maximo, _clave, fetchImpl, signal) => {\n\tconst url = new URL(ENDPOINT);\n\turl.searchParams.set(\"q\", consulta);\n\turl.searchParams.set(\"t\", String(maximo));\n\tconst respuesta = await fetchImpl(url, { headers: CABECERAS_NAVEGADOR, signal });\n\tconst html = await respuesta.text();\n\tif (esBloqueoAntiBot(html)) {\n\t\tthrow new Error(\"Mojeek bloqueó la petición con su captcha anti-bot.\");\n\t}\n\tif (!respuesta.ok) throw new Error(`Mojeek respondió HTTP ${respuesta.status}.`);\n\treturn parsear(html).slice(0, maximo);\n};\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cabeceras de navegador para los proveedores sin clave.
|
|
3
|
+
*
|
|
4
|
+
* DuckDuckGo, Mojeek y Ecosia sirven HTML pensado para un navegador: sin un
|
|
5
|
+
* User-Agent y un Accept-Language plausibles, varios devuelven directamente la
|
|
6
|
+
* página de captcha en vez de resultados. No es spoofing agresivo —un único
|
|
7
|
+
* perfil fijo, no rotación— solo lo mínimo para no parecer un script desnudo.
|
|
8
|
+
*/
|
|
9
|
+
export declare const CABECERAS_NAVEGADOR: Record<string, string>;
|
|
10
|
+
//# sourceMappingURL=navegador.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navegador.d.ts","sourceRoot":"","sources":["../../../../src/core/web/proveedores/navegador.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAItD,CAAC","sourcesContent":["/**\n * Cabeceras de navegador para los proveedores sin clave.\n *\n * DuckDuckGo, Mojeek y Ecosia sirven HTML pensado para un navegador: sin un\n * User-Agent y un Accept-Language plausibles, varios devuelven directamente la\n * página de captcha en vez de resultados. No es spoofing agresivo —un único\n * perfil fijo, no rotación— solo lo mínimo para no parecer un script desnudo.\n */\nexport const CABECERAS_NAVEGADOR: Record<string, string> = {\n\t\"user-agent\":\n\t\t\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36\",\n\t\"accept-language\": \"en-US,en;q=0.9\",\n};\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cabeceras de navegador para los proveedores sin clave.
|
|
3
|
+
*
|
|
4
|
+
* DuckDuckGo, Mojeek y Ecosia sirven HTML pensado para un navegador: sin un
|
|
5
|
+
* User-Agent y un Accept-Language plausibles, varios devuelven directamente la
|
|
6
|
+
* página de captcha en vez de resultados. No es spoofing agresivo —un único
|
|
7
|
+
* perfil fijo, no rotación— solo lo mínimo para no parecer un script desnudo.
|
|
8
|
+
*/
|
|
9
|
+
export const CABECERAS_NAVEGADOR = {
|
|
10
|
+
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",
|
|
11
|
+
"accept-language": "en-US,en;q=0.9",
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=navegador.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navegador.js","sourceRoot":"","sources":["../../../../src/core/web/proveedores/navegador.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IAC1D,YAAY,EACX,mHAAmH;IACpH,iBAAiB,EAAE,gBAAgB;CACnC,CAAC","sourcesContent":["/**\n * Cabeceras de navegador para los proveedores sin clave.\n *\n * DuckDuckGo, Mojeek y Ecosia sirven HTML pensado para un navegador: sin un\n * User-Agent y un Accept-Language plausibles, varios devuelven directamente la\n * página de captcha en vez de resultados. No es spoofing agresivo —un único\n * perfil fijo, no rotación— solo lo mínimo para no parecer un script desnudo.\n */\nexport const CABECERAS_NAVEGADOR: Record<string, string> = {\n\t\"user-agent\":\n\t\t\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36\",\n\t\"accept-language\": \"en-US,en;q=0.9\",\n};\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registro perezoso de proveedores de búsqueda web.
|
|
3
|
+
*
|
|
4
|
+
* Importar este fichero no carga NINGÚN proveedor: cada `cargar()` es un
|
|
5
|
+
* `import()` dinámico que solo se ejecuta cuando le toca el turno en
|
|
6
|
+
* `buscarConProveedores`. Son módulos pesados —parseo de HTML, clientes de
|
|
7
|
+
* API— y como mucho se usa uno por sesión; cargarlos todos al arrancar sería
|
|
8
|
+
* trabajo tirado para el 99% de las sesiones que no los necesitan.
|
|
9
|
+
*
|
|
10
|
+
* Orden: la búsqueda nativa del modelo (Anthropic) se resuelve ANTES de
|
|
11
|
+
* llegar aquí, en `tools.ts`. Dentro de este registro: clave configurada >
|
|
12
|
+
* sin clave — lo explícito que el usuario ha pagado y configurado gana a lo
|
|
13
|
+
* gratuito. Entre proveedores con clave, el orden es el de esta lista; el
|
|
14
|
+
* primero con clave disponible es el que se prueba primero.
|
|
15
|
+
*/
|
|
16
|
+
import type { DescriptorProveedor, ResultadoProveedor } from "./tipos.ts";
|
|
17
|
+
/** Metadatos de todos los proveedores, en orden de intento. Ningún `cargar()` se ejecuta aquí. */
|
|
18
|
+
export declare const PROVEEDORES: readonly DescriptorProveedor[];
|
|
19
|
+
export interface ResultadoBusquedaProveedores {
|
|
20
|
+
proveedor: string;
|
|
21
|
+
resultados: ResultadoProveedor[];
|
|
22
|
+
}
|
|
23
|
+
export interface OpcionesBusquedaProveedores {
|
|
24
|
+
/** Vault primero, variable de entorno después — lo resuelve quien llama. */
|
|
25
|
+
obtenerClave: (nombreProveedor: string) => Promise<string | undefined>;
|
|
26
|
+
fetchImpl?: typeof fetch;
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Prueba los proveedores en orden hasta que uno responda (con o sin
|
|
31
|
+
* resultados) o se agoten todos.
|
|
32
|
+
*
|
|
33
|
+
* Un proveedor sin clave configurada se SALTA sin contar como fallo — no está
|
|
34
|
+
* disponible, no ha fallado. Un proveedor que lanza SÍ cuenta como fallo y se
|
|
35
|
+
* acumula su motivo. Los tres proveedores sin clave (duckduckgo, mojeek,
|
|
36
|
+
* ecosia) están SIEMPRE en la lista, así que siempre hay al menos uno que
|
|
37
|
+
* intentar: si el bucle se agota es porque todos lanzaron, nunca porque no
|
|
38
|
+
* hubiera nada que probar. Por eso el único error que se lanza aquí es
|
|
39
|
+
* «fallaron», nunca «no configurado» — decir lo contrario sería mentir sobre
|
|
40
|
+
* qué pasó.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buscarConProveedores(consulta: string, maximo: number, opciones: OpcionesBusquedaProveedores): Promise<ResultadoBusquedaProveedores>;
|
|
43
|
+
//# sourceMappingURL=registro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registro.d.ts","sourceRoot":"","sources":["../../../../src/core/web/proveedores/registro.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAgB1E,oGAAkG;AAClG,eAAO,MAAM,WAAW,EAAE,SAAS,mBAAmB,EAAiC,CAAC;AAExF,MAAM,WAAW,4BAA4B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,2BAA2B;IAC3C,+EAA4E;IAC5E,YAAY,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACzC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,2BAA2B,GACnC,OAAO,CAAC,4BAA4B,CAAC,CAoBvC","sourcesContent":["/**\n * Registro perezoso de proveedores de búsqueda web.\n *\n * Importar este fichero no carga NINGÚN proveedor: cada `cargar()` es un\n * `import()` dinámico que solo se ejecuta cuando le toca el turno en\n * `buscarConProveedores`. Son módulos pesados —parseo de HTML, clientes de\n * API— y como mucho se usa uno por sesión; cargarlos todos al arrancar sería\n * trabajo tirado para el 99% de las sesiones que no los necesitan.\n *\n * Orden: la búsqueda nativa del modelo (Anthropic) se resuelve ANTES de\n * llegar aquí, en `tools.ts`. Dentro de este registro: clave configurada >\n * sin clave — lo explícito que el usuario ha pagado y configurado gana a lo\n * gratuito. Entre proveedores con clave, el orden es el de esta lista; el\n * primero con clave disponible es el que se prueba primero.\n */\nimport type { DescriptorProveedor, ResultadoProveedor } from \"./tipos.ts\";\n\nconst CON_CLAVE: DescriptorProveedor[] = [\n\t{ nombre: \"brave\", necesitaClave: true, cargar: () => import(\"./brave.ts\") },\n\t{ nombre: \"tavily\", necesitaClave: true, cargar: () => import(\"./tavily.ts\") },\n\t{ nombre: \"exa\", necesitaClave: true, cargar: () => import(\"./exa.ts\") },\n\t{ nombre: \"searxng\", necesitaClave: true, cargar: () => import(\"./searxng.ts\") },\n\t{ nombre: \"serper\", necesitaClave: true, cargar: () => import(\"./serper.ts\") },\n];\n\nconst SIN_CLAVE: DescriptorProveedor[] = [\n\t{ nombre: \"duckduckgo\", necesitaClave: false, cargar: () => import(\"./duckduckgo.ts\") },\n\t{ nombre: \"mojeek\", necesitaClave: false, cargar: () => import(\"./mojeek.ts\") },\n\t{ nombre: \"ecosia\", necesitaClave: false, cargar: () => import(\"./ecosia.ts\") },\n];\n\n/** Metadatos de todos los proveedores, en orden de intento. Ningún `cargar()` se ejecuta aquí. */\nexport const PROVEEDORES: readonly DescriptorProveedor[] = [...CON_CLAVE, ...SIN_CLAVE];\n\nexport interface ResultadoBusquedaProveedores {\n\tproveedor: string;\n\tresultados: ResultadoProveedor[];\n}\n\nexport interface OpcionesBusquedaProveedores {\n\t/** Vault primero, variable de entorno después — lo resuelve quien llama. */\n\tobtenerClave: (nombreProveedor: string) => Promise<string | undefined>;\n\tfetchImpl?: typeof fetch;\n\tsignal?: AbortSignal;\n}\n\n/**\n * Prueba los proveedores en orden hasta que uno responda (con o sin\n * resultados) o se agoten todos.\n *\n * Un proveedor sin clave configurada se SALTA sin contar como fallo — no está\n * disponible, no ha fallado. Un proveedor que lanza SÍ cuenta como fallo y se\n * acumula su motivo. Los tres proveedores sin clave (duckduckgo, mojeek,\n * ecosia) están SIEMPRE en la lista, así que siempre hay al menos uno que\n * intentar: si el bucle se agota es porque todos lanzaron, nunca porque no\n * hubiera nada que probar. Por eso el único error que se lanza aquí es\n * «fallaron», nunca «no configurado» — decir lo contrario sería mentir sobre\n * qué pasó.\n */\nexport async function buscarConProveedores(\n\tconsulta: string,\n\tmaximo: number,\n\topciones: OpcionesBusquedaProveedores,\n): Promise<ResultadoBusquedaProveedores> {\n\tconst fetchImpl = opciones.fetchImpl ?? fetch;\n\tconst errores: string[] = [];\n\n\tfor (const descriptor of PROVEEDORES) {\n\t\tlet clave: string | undefined;\n\t\tif (descriptor.necesitaClave) {\n\t\t\tclave = await opciones.obtenerClave(descriptor.nombre);\n\t\t\tif (!clave) continue; // no configurado: no es un fallo, es \"no disponible\"\n\t\t}\n\t\ttry {\n\t\t\tconst modulo = await descriptor.cargar();\n\t\t\tconst resultados = await modulo.buscar(consulta, maximo, clave, fetchImpl, opciones.signal);\n\t\t\treturn { proveedor: descriptor.nombre, resultados };\n\t\t} catch (error) {\n\t\t\terrores.push(`${descriptor.nombre}: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tthrow new Error(`Todos los proveedores de búsqueda fallaron: ${errores.join(\" | \")}`);\n}\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const CON_CLAVE = [
|
|
2
|
+
{ nombre: "brave", necesitaClave: true, cargar: () => import("./brave.js") },
|
|
3
|
+
{ nombre: "tavily", necesitaClave: true, cargar: () => import("./tavily.js") },
|
|
4
|
+
{ nombre: "exa", necesitaClave: true, cargar: () => import("./exa.js") },
|
|
5
|
+
{ nombre: "searxng", necesitaClave: true, cargar: () => import("./searxng.js") },
|
|
6
|
+
{ nombre: "serper", necesitaClave: true, cargar: () => import("./serper.js") },
|
|
7
|
+
];
|
|
8
|
+
const SIN_CLAVE = [
|
|
9
|
+
{ nombre: "duckduckgo", necesitaClave: false, cargar: () => import("./duckduckgo.js") },
|
|
10
|
+
{ nombre: "mojeek", necesitaClave: false, cargar: () => import("./mojeek.js") },
|
|
11
|
+
{ nombre: "ecosia", necesitaClave: false, cargar: () => import("./ecosia.js") },
|
|
12
|
+
];
|
|
13
|
+
/** Metadatos de todos los proveedores, en orden de intento. Ningún `cargar()` se ejecuta aquí. */
|
|
14
|
+
export const PROVEEDORES = [...CON_CLAVE, ...SIN_CLAVE];
|
|
15
|
+
/**
|
|
16
|
+
* Prueba los proveedores en orden hasta que uno responda (con o sin
|
|
17
|
+
* resultados) o se agoten todos.
|
|
18
|
+
*
|
|
19
|
+
* Un proveedor sin clave configurada se SALTA sin contar como fallo — no está
|
|
20
|
+
* disponible, no ha fallado. Un proveedor que lanza SÍ cuenta como fallo y se
|
|
21
|
+
* acumula su motivo. Los tres proveedores sin clave (duckduckgo, mojeek,
|
|
22
|
+
* ecosia) están SIEMPRE en la lista, así que siempre hay al menos uno que
|
|
23
|
+
* intentar: si el bucle se agota es porque todos lanzaron, nunca porque no
|
|
24
|
+
* hubiera nada que probar. Por eso el único error que se lanza aquí es
|
|
25
|
+
* «fallaron», nunca «no configurado» — decir lo contrario sería mentir sobre
|
|
26
|
+
* qué pasó.
|
|
27
|
+
*/
|
|
28
|
+
export async function buscarConProveedores(consulta, maximo, opciones) {
|
|
29
|
+
const fetchImpl = opciones.fetchImpl ?? fetch;
|
|
30
|
+
const errores = [];
|
|
31
|
+
for (const descriptor of PROVEEDORES) {
|
|
32
|
+
let clave;
|
|
33
|
+
if (descriptor.necesitaClave) {
|
|
34
|
+
clave = await opciones.obtenerClave(descriptor.nombre);
|
|
35
|
+
if (!clave)
|
|
36
|
+
continue; // no configurado: no es un fallo, es "no disponible"
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const modulo = await descriptor.cargar();
|
|
40
|
+
const resultados = await modulo.buscar(consulta, maximo, clave, fetchImpl, opciones.signal);
|
|
41
|
+
return { proveedor: descriptor.nombre, resultados };
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
errores.push(`${descriptor.nombre}: ${error instanceof Error ? error.message : String(error)}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
throw new Error(`Todos los proveedores de búsqueda fallaron: ${errores.join(" | ")}`);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=registro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registro.js","sourceRoot":"","sources":["../../../../src/core/web/proveedores/registro.ts"],"names":[],"mappings":"AAiBA,MAAM,SAAS,GAA0B;IACxC,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;IAC5E,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;IAC9E,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;IACxE,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;IAChF,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;CAC9E,CAAC;AAEF,MAAM,SAAS,GAA0B;IACxC,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE;IACvF,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;IAC/E,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;CAC/E,CAAC;AAEF,oGAAkG;AAClG,MAAM,CAAC,MAAM,WAAW,GAAmC,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC;AAcxF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,QAAgB,EAChB,MAAc,EACd,QAAqC,EACG;IACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC;IAC9C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACtC,IAAI,KAAyB,CAAC;QAC9B,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;YAC9B,KAAK,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK;gBAAE,SAAS,CAAC,qDAAqD;QAC5E,CAAC;QACD,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC5F,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACF,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gDAA+C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAAA,CACtF","sourcesContent":["/**\n * Registro perezoso de proveedores de búsqueda web.\n *\n * Importar este fichero no carga NINGÚN proveedor: cada `cargar()` es un\n * `import()` dinámico que solo se ejecuta cuando le toca el turno en\n * `buscarConProveedores`. Son módulos pesados —parseo de HTML, clientes de\n * API— y como mucho se usa uno por sesión; cargarlos todos al arrancar sería\n * trabajo tirado para el 99% de las sesiones que no los necesitan.\n *\n * Orden: la búsqueda nativa del modelo (Anthropic) se resuelve ANTES de\n * llegar aquí, en `tools.ts`. Dentro de este registro: clave configurada >\n * sin clave — lo explícito que el usuario ha pagado y configurado gana a lo\n * gratuito. Entre proveedores con clave, el orden es el de esta lista; el\n * primero con clave disponible es el que se prueba primero.\n */\nimport type { DescriptorProveedor, ResultadoProveedor } from \"./tipos.ts\";\n\nconst CON_CLAVE: DescriptorProveedor[] = [\n\t{ nombre: \"brave\", necesitaClave: true, cargar: () => import(\"./brave.ts\") },\n\t{ nombre: \"tavily\", necesitaClave: true, cargar: () => import(\"./tavily.ts\") },\n\t{ nombre: \"exa\", necesitaClave: true, cargar: () => import(\"./exa.ts\") },\n\t{ nombre: \"searxng\", necesitaClave: true, cargar: () => import(\"./searxng.ts\") },\n\t{ nombre: \"serper\", necesitaClave: true, cargar: () => import(\"./serper.ts\") },\n];\n\nconst SIN_CLAVE: DescriptorProveedor[] = [\n\t{ nombre: \"duckduckgo\", necesitaClave: false, cargar: () => import(\"./duckduckgo.ts\") },\n\t{ nombre: \"mojeek\", necesitaClave: false, cargar: () => import(\"./mojeek.ts\") },\n\t{ nombre: \"ecosia\", necesitaClave: false, cargar: () => import(\"./ecosia.ts\") },\n];\n\n/** Metadatos de todos los proveedores, en orden de intento. Ningún `cargar()` se ejecuta aquí. */\nexport const PROVEEDORES: readonly DescriptorProveedor[] = [...CON_CLAVE, ...SIN_CLAVE];\n\nexport interface ResultadoBusquedaProveedores {\n\tproveedor: string;\n\tresultados: ResultadoProveedor[];\n}\n\nexport interface OpcionesBusquedaProveedores {\n\t/** Vault primero, variable de entorno después — lo resuelve quien llama. */\n\tobtenerClave: (nombreProveedor: string) => Promise<string | undefined>;\n\tfetchImpl?: typeof fetch;\n\tsignal?: AbortSignal;\n}\n\n/**\n * Prueba los proveedores en orden hasta que uno responda (con o sin\n * resultados) o se agoten todos.\n *\n * Un proveedor sin clave configurada se SALTA sin contar como fallo — no está\n * disponible, no ha fallado. Un proveedor que lanza SÍ cuenta como fallo y se\n * acumula su motivo. Los tres proveedores sin clave (duckduckgo, mojeek,\n * ecosia) están SIEMPRE en la lista, así que siempre hay al menos uno que\n * intentar: si el bucle se agota es porque todos lanzaron, nunca porque no\n * hubiera nada que probar. Por eso el único error que se lanza aquí es\n * «fallaron», nunca «no configurado» — decir lo contrario sería mentir sobre\n * qué pasó.\n */\nexport async function buscarConProveedores(\n\tconsulta: string,\n\tmaximo: number,\n\topciones: OpcionesBusquedaProveedores,\n): Promise<ResultadoBusquedaProveedores> {\n\tconst fetchImpl = opciones.fetchImpl ?? fetch;\n\tconst errores: string[] = [];\n\n\tfor (const descriptor of PROVEEDORES) {\n\t\tlet clave: string | undefined;\n\t\tif (descriptor.necesitaClave) {\n\t\t\tclave = await opciones.obtenerClave(descriptor.nombre);\n\t\t\tif (!clave) continue; // no configurado: no es un fallo, es \"no disponible\"\n\t\t}\n\t\ttry {\n\t\t\tconst modulo = await descriptor.cargar();\n\t\t\tconst resultados = await modulo.buscar(consulta, maximo, clave, fetchImpl, opciones.signal);\n\t\t\treturn { proveedor: descriptor.nombre, resultados };\n\t\t} catch (error) {\n\t\t\terrores.push(`${descriptor.nombre}: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tthrow new Error(`Todos los proveedores de búsqueda fallaron: ${errores.join(\" | \")}`);\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SearXNG: metabuscador autoalojado. No tiene clave propia en el sentido
|
|
3
|
+
* habitual —lo que hace falta es la URL de LA instancia del usuario—, pero
|
|
4
|
+
* cuenta como «con clave» porque, igual que una API key, no funciona de
|
|
5
|
+
* fábrica: hay que configurarla (vault `searxng`, o SEARXNG_URL).
|
|
6
|
+
*/
|
|
7
|
+
import type { FuncionBuscar } from "./tipos.ts";
|
|
8
|
+
export declare const buscar: FuncionBuscar;
|
|
9
|
+
//# sourceMappingURL=searxng.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searxng.d.ts","sourceRoot":"","sources":["../../../../src/core/web/proveedores/searxng.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,YAAY,CAAC;AAMpE,eAAO,MAAM,MAAM,EAAE,aAapB,CAAC","sourcesContent":["/**\n * SearXNG: metabuscador autoalojado. No tiene clave propia en el sentido\n * habitual —lo que hace falta es la URL de LA instancia del usuario—, pero\n * cuenta como «con clave» porque, igual que una API key, no funciona de\n * fábrica: hay que configurarla (vault `searxng`, o SEARXNG_URL).\n */\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\ninterface RespuestaSearxng {\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(\"SearXNG requiere la URL de una instancia.\");\n\tconst base = clave.replace(/\\/+$/, \"\");\n\tconst url = new URL(`${base}/search`);\n\turl.searchParams.set(\"q\", consulta);\n\turl.searchParams.set(\"format\", \"json\");\n\tconst respuesta = await fetchImpl(url, { headers: { Accept: \"application/json\" }, signal });\n\tif (!respuesta.ok) throw new Error(`SearXNG respondió HTTP ${respuesta.status}.`);\n\tconst datos = (await respuesta.json()) as RespuestaSearxng;\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,17 @@
|
|
|
1
|
+
export const buscar = async (consulta, maximo, clave, fetchImpl, signal) => {
|
|
2
|
+
if (!clave)
|
|
3
|
+
throw new Error("SearXNG requiere la URL de una instancia.");
|
|
4
|
+
const base = clave.replace(/\/+$/, "");
|
|
5
|
+
const url = new URL(`${base}/search`);
|
|
6
|
+
url.searchParams.set("q", consulta);
|
|
7
|
+
url.searchParams.set("format", "json");
|
|
8
|
+
const respuesta = await fetchImpl(url, { headers: { Accept: "application/json" }, signal });
|
|
9
|
+
if (!respuesta.ok)
|
|
10
|
+
throw new Error(`SearXNG respondió HTTP ${respuesta.status}.`);
|
|
11
|
+
const datos = (await respuesta.json());
|
|
12
|
+
const resultados = (datos.results ?? [])
|
|
13
|
+
.filter((r) => typeof r.url === "string" && r.url)
|
|
14
|
+
.map((r) => ({ titulo: r.title || r.url, url: r.url, resumen: r.content }));
|
|
15
|
+
return resultados.slice(0, maximo);
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=searxng.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searxng.js","sourceRoot":"","sources":["../../../../src/core/web/proveedores/searxng.ts"],"names":[],"mappings":"AAYA,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,2CAA2C,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;IACtC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACpC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5F,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA0B,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAqB,CAAC;IAC3D,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 * SearXNG: metabuscador autoalojado. No tiene clave propia en el sentido\n * habitual —lo que hace falta es la URL de LA instancia del usuario—, pero\n * cuenta como «con clave» porque, igual que una API key, no funciona de\n * fábrica: hay que configurarla (vault `searxng`, o SEARXNG_URL).\n */\nimport type { FuncionBuscar, ResultadoProveedor } from \"./tipos.ts\";\n\ninterface RespuestaSearxng {\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(\"SearXNG requiere la URL de una instancia.\");\n\tconst base = clave.replace(/\\/+$/, \"\");\n\tconst url = new URL(`${base}/search`);\n\turl.searchParams.set(\"q\", consulta);\n\turl.searchParams.set(\"format\", \"json\");\n\tconst respuesta = await fetchImpl(url, { headers: { Accept: \"application/json\" }, signal });\n\tif (!respuesta.ok) throw new Error(`SearXNG respondió HTTP ${respuesta.status}.`);\n\tconst datos = (await respuesta.json()) as RespuestaSearxng;\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,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serper (Google Search API). Requiere clave (`serper` en el vault, o
|
|
3
|
+
* SERPER_API_KEY). Es el proveedor histórico de Ada, anterior a este
|
|
4
|
+
* registro: se mantiene aquí para que quien ya tenga la clave configurada
|
|
5
|
+
* siga funcionando exactamente igual.
|
|
6
|
+
*/
|
|
7
|
+
import type { FuncionBuscar } from "./tipos.ts";
|
|
8
|
+
export declare const buscar: FuncionBuscar;
|
|
9
|
+
//# sourceMappingURL=serper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serper.d.ts","sourceRoot":"","sources":["../../../../src/core/web/proveedores/serper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,YAAY,CAAC;AAQpE,eAAO,MAAM,MAAM,EAAE,aAcpB,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"]}
|