@hoilab/ada-cli 0.84.21 → 0.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -2
- package/README.es.md +174 -0
- package/README.md +203 -658
- 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/args.d.ts +3 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +11 -0
- package/dist/cli/args.js.map +1 -1
- 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/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +2 -1
- package/dist/cli/file-processor.js.map +1 -1
- 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/home-screen.d.ts.map +1 -1
- package/dist/cli/home-screen.js +2 -2
- package/dist/cli/home-screen.js.map +1 -1
- 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/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +9 -3
- package/dist/cli/startup-ui.js.map +1 -1
- 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 +3 -2
- 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 +85 -7
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +862 -78
- 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 +21 -8
- 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/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +3 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +4 -3
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +41 -32
- package/dist/core/compaction/compaction.js.map +1 -1
- 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/defaults.d.ts +1 -0
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/defaults.js +9 -0
- package/dist/core/defaults.js.map +1 -1
- 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/engine-personality.d.ts +12 -0
- package/dist/core/engine-personality.d.ts.map +1 -0
- package/dist/core/engine-personality.js +53 -0
- package/dist/core/engine-personality.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/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +21 -6
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +23 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.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/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -1
- package/dist/core/keybindings.js.map +1 -1
- 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 +56 -0
- package/dist/core/memory-engine/audit-export.d.ts.map +1 -0
- package/dist/core/memory-engine/audit-export.js +100 -0
- package/dist/core/memory-engine/audit-export.js.map +1 -0
- 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 +32 -50
- package/dist/core/memory-engine/audit.js.map +1 -1
- package/dist/core/memory-engine/engine.d.ts +21 -4
- package/dist/core/memory-engine/engine.d.ts.map +1 -1
- package/dist/core/memory-engine/engine.js +219 -55
- package/dist/core/memory-engine/engine.js.map +1 -1
- package/dist/core/memory-engine/inverted-index.d.ts.map +1 -1
- package/dist/core/memory-engine/inverted-index.js +67 -10
- package/dist/core/memory-engine/inverted-index.js.map +1 -1
- package/dist/core/memory-engine/keychain.d.ts.map +1 -1
- package/dist/core/memory-engine/keychain.js +1 -6
- package/dist/core/memory-engine/keychain.js.map +1 -1
- package/dist/core/memory-engine/observation-store.d.ts +0 -1
- package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
- package/dist/core/memory-engine/observation-store.js +40 -12
- 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/scanner.d.ts.map +1 -1
- package/dist/core/memory-engine/scanner.js +25 -5
- package/dist/core/memory-engine/scanner.js.map +1 -1
- package/dist/core/memory-engine/security.d.ts.map +1 -1
- package/dist/core/memory-engine/security.js +131 -23
- package/dist/core/memory-engine/security.js.map +1 -1
- package/dist/core/memory-engine/session-indexer.d.ts.map +1 -1
- package/dist/core/memory-engine/session-indexer.js +8 -2
- package/dist/core/memory-engine/session-indexer.js.map +1 -1
- package/dist/core/memory-engine/tools.d.ts +2 -2
- package/dist/core/memory-engine/tools.d.ts.map +1 -1
- package/dist/core/memory-engine/tools.js +41 -8
- 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/memory-engine/vault.d.ts.map +1 -1
- package/dist/core/memory-engine/vault.js +2 -2
- package/dist/core/memory-engine/vault.js.map +1 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +2 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +19 -7
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js +2 -1
- package/dist/core/models-store.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/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +11 -6
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-manifest.d.ts.map +1 -1
- package/dist/core/pi-manifest.js +2 -1
- package/dist/core/pi-manifest.js.map +1 -1
- 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/prompt-optimizer.d.ts +53 -0
- package/dist/core/prompt-optimizer.d.ts.map +1 -0
- package/dist/core/prompt-optimizer.js +138 -0
- package/dist/core/prompt-optimizer.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/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +2 -1
- package/dist/core/remote-catalog-provider.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 +58 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +326 -8
- 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/sdk.d.ts +8 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +11 -1
- package/dist/core/sdk.js.map +1 -1
- 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/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +2 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-diagnostics.d.ts +9 -0
- package/dist/core/settings-diagnostics.d.ts.map +1 -0
- package/dist/core/settings-diagnostics.js +21 -0
- package/dist/core/settings-diagnostics.js.map +1 -0
- package/dist/core/settings-manager.d.ts +156 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +255 -10
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +51 -33
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +2 -1
- 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 -12
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +234 -12
- 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 +28 -5
- 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/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +2 -2
- package/dist/core/tools/index.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/project-memory-tool.d.ts.map +1 -1
- package/dist/core/tools/project-memory-tool.js +4 -1
- package/dist/core/tools/project-memory-tool.js.map +1 -1
- 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/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +2 -1
- package/dist/core/trust-manager.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 +88 -0
- package/dist/core/workflows/agent-runner.d.ts.map +1 -0
- package/dist/core/workflows/agent-runner.js +312 -0
- package/dist/core/workflows/agent-runner.js.map +1 -0
- package/dist/core/workflows/builtins.d.ts +41 -0
- package/dist/core/workflows/builtins.d.ts.map +1 -0
- package/dist/core/workflows/builtins.js +283 -0
- package/dist/core/workflows/builtins.js.map +1 -0
- 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 +151 -0
- package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/engine.js +503 -0
- package/dist/core/workflows/goal-engine/engine.js.map +1 -0
- package/dist/core/workflows/goal-engine/errors.d.ts +7 -0
- package/dist/core/workflows/goal-engine/errors.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/errors.js +9 -0
- package/dist/core/workflows/goal-engine/errors.js.map +1 -0
- package/dist/core/workflows/goal-engine/index.d.ts +13 -0
- package/dist/core/workflows/goal-engine/index.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/index.js +8 -0
- package/dist/core/workflows/goal-engine/index.js.map +1 -0
- package/dist/core/workflows/goal-engine/persistence.d.ts +31 -0
- package/dist/core/workflows/goal-engine/persistence.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/persistence.js +145 -0
- package/dist/core/workflows/goal-engine/persistence.js.map +1 -0
- package/dist/core/workflows/goal-engine/prompts.d.ts +37 -0
- package/dist/core/workflows/goal-engine/prompts.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/prompts.js +131 -0
- package/dist/core/workflows/goal-engine/prompts.js.map +1 -0
- package/dist/core/workflows/goal-engine/state.d.ts +41 -0
- package/dist/core/workflows/goal-engine/state.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/state.js +397 -0
- package/dist/core/workflows/goal-engine/state.js.map +1 -0
- package/dist/core/workflows/goal-engine/tools.d.ts +31 -0
- package/dist/core/workflows/goal-engine/tools.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/tools.js +211 -0
- package/dist/core/workflows/goal-engine/tools.js.map +1 -0
- package/dist/core/workflows/goal-engine/types.d.ts +286 -0
- package/dist/core/workflows/goal-engine/types.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/types.js +17 -0
- package/dist/core/workflows/goal-engine/types.js.map +1 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts +23 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.js +72 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.js.map +1 -0
- package/dist/core/workflows/graph-sync.d.ts +67 -0
- package/dist/core/workflows/graph-sync.d.ts.map +1 -0
- package/dist/core/workflows/graph-sync.js +188 -0
- package/dist/core/workflows/graph-sync.js.map +1 -0
- package/dist/core/workflows/graph.d.ts +143 -0
- package/dist/core/workflows/graph.d.ts.map +1 -0
- package/dist/core/workflows/graph.js +319 -0
- package/dist/core/workflows/graph.js.map +1 -0
- package/dist/core/workflows/index.d.ts +26 -0
- package/dist/core/workflows/index.d.ts.map +1 -0
- package/dist/core/workflows/index.js +18 -0
- package/dist/core/workflows/index.js.map +1 -0
- package/dist/core/workflows/journal.d.ts +68 -0
- package/dist/core/workflows/journal.d.ts.map +1 -0
- package/dist/core/workflows/journal.js +83 -0
- package/dist/core/workflows/journal.js.map +1 -0
- package/dist/core/workflows/manager.d.ts +122 -0
- package/dist/core/workflows/manager.d.ts.map +1 -0
- package/dist/core/workflows/manager.js +351 -0
- package/dist/core/workflows/manager.js.map +1 -0
- package/dist/core/workflows/resolve-script.d.ts +35 -0
- package/dist/core/workflows/resolve-script.d.ts.map +1 -0
- package/dist/core/workflows/resolve-script.js +66 -0
- package/dist/core/workflows/resolve-script.js.map +1 -0
- package/dist/core/workflows/runtime.d.ts +62 -0
- package/dist/core/workflows/runtime.d.ts.map +1 -0
- package/dist/core/workflows/runtime.js +380 -0
- package/dist/core/workflows/runtime.js.map +1 -0
- 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/shared-store.d.ts +31 -0
- package/dist/core/workflows/shared-store.d.ts.map +1 -0
- package/dist/core/workflows/shared-store.js +80 -0
- package/dist/core/workflows/shared-store.js.map +1 -0
- package/dist/core/workflows/subagent-host.d.ts +50 -0
- package/dist/core/workflows/subagent-host.d.ts.map +1 -0
- package/dist/core/workflows/subagent-host.js +225 -0
- package/dist/core/workflows/subagent-host.js.map +1 -0
- package/dist/core/workflows/tool-workflow.d.ts +22 -0
- package/dist/core/workflows/tool-workflow.d.ts.map +1 -0
- package/dist/core/workflows/tool-workflow.js +120 -0
- package/dist/core/workflows/tool-workflow.js.map +1 -0
- package/dist/core/workflows/types.d.ts +191 -0
- package/dist/core/workflows/types.d.ts.map +1 -0
- package/dist/core/workflows/types.js +26 -0
- package/dist/core/workflows/types.js.map +1 -0
- package/dist/core/workflows/worktree.d.ts +42 -0
- package/dist/core/workflows/worktree.d.ts.map +1 -0
- package/dist/core/workflows/worktree.js +107 -0
- package/dist/core/workflows/worktree.js.map +1 -0
- package/dist/extensions/llama/index.d.ts.map +1 -1
- package/dist/extensions/llama/index.js +2 -0
- package/dist/extensions/llama/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +6 -2
- package/dist/extensions/llama/provider.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 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -13
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +4 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +26 -15
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +4 -3
- package/dist/migrations.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/home-screen.d.ts.map +1 -1
- package/dist/modes/interactive/components/home-screen.js +2 -2
- package/dist/modes/interactive/components/home-screen.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +9 -3
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +56 -12
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/prompt-optimization.d.ts +16 -0
- package/dist/modes/interactive/components/prompt-optimization.d.ts.map +1 -0
- package/dist/modes/interactive/components/prompt-optimization.js +46 -0
- package/dist/modes/interactive/components/prompt-optimization.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +19 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +180 -56
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-submenu.js +165 -0
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +74 -17
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +2 -1
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +21 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +709 -75
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +4 -3
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +16 -13
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +20 -6
- package/dist/modes/json-event.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/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +173 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +29 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.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/ada-engine/SKILL.md +153 -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/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +2 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/management-http.d.ts +5 -3
- package/dist/utils/management-http.d.ts.map +1 -1
- package/dist/utils/management-http.js +14 -10
- package/dist/utils/management-http.js.map +1 -1
- 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/text.d.ts +8 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +9 -0
- package/dist/utils/text.js.map +1 -0
- 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 +25 -10
- package/docs/compliance.md +241 -0
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +15 -12
- package/docs/development.md +47 -10
- package/docs/docs.json +14 -2
- package/docs/environment-variables.md +20 -17
- package/docs/extensions.md +62 -51
- package/docs/index.md +15 -21
- package/docs/json.md +10 -5
- package/docs/keybindings.md +5 -5
- package/docs/llama-cpp.md +9 -7
- package/docs/models.md +18 -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 +21 -15
- 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 +47 -22
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +14 -13
- 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/extensions/border-status-editor.ts +1 -1
- package/examples/extensions/git-checkpoint.ts +2 -2
- package/examples/extensions/notify.ts +3 -1
- package/examples/extensions/subagent/README.md +1 -1
- package/examples/extensions/subagent/index.ts +6 -1
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/rpc-extension-ui.ts +1 -1
- package/examples/sdk/06-extensions.ts +1 -1
- package/examples/sdk/12-full-control.ts +9 -0
- package/examples/sdk/README.md +1 -1
- package/npm-shrinkwrap.json +35 -261
- package/package.json +9 -3
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cuota de OpenAI Codex (ChatGPT) — endpoint interno de cuenta, no la API de
|
|
3
|
+
* pago por token. Vive en `chatgpt.com`, no en `api.openai.com`: no hay
|
|
4
|
+
* override de `baseUrl` que valga aquí, un proxy de streaming lo devolvería
|
|
5
|
+
* en 404.
|
|
6
|
+
*/
|
|
7
|
+
import { ErrorConsultaCuota } from "./tipos.js";
|
|
8
|
+
const ENDPOINT = "https://chatgpt.com/backend-api/wham/usage";
|
|
9
|
+
function aVentana(etiqueta, cubo) {
|
|
10
|
+
if (!cubo || typeof cubo.used_percent !== "number")
|
|
11
|
+
return undefined;
|
|
12
|
+
const seReinicia = typeof cubo.reset_at === "number" && cubo.reset_at > 0 ? cubo.reset_at * 1000 : null;
|
|
13
|
+
return {
|
|
14
|
+
etiqueta,
|
|
15
|
+
usado: Math.min(Math.max(cubo.used_percent, 0), 100),
|
|
16
|
+
limite: 100,
|
|
17
|
+
seReinicia,
|
|
18
|
+
unidad: "porcentaje",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export const consultorOpenAiCodex = {
|
|
22
|
+
id: "openai-codex",
|
|
23
|
+
soporta: (credencial) => credencial.type === "oauth",
|
|
24
|
+
async consultar({ credencial, fetch: fetchImpl = fetch, señal }) {
|
|
25
|
+
if (credencial.type !== "oauth")
|
|
26
|
+
return null;
|
|
27
|
+
const headers = { authorization: `Bearer ${credencial.access}` };
|
|
28
|
+
const accountId = credencial.accountId;
|
|
29
|
+
if (typeof accountId === "string" && accountId)
|
|
30
|
+
headers["chatgpt-account-id"] = accountId;
|
|
31
|
+
let respuesta;
|
|
32
|
+
try {
|
|
33
|
+
respuesta = await fetchImpl(ENDPOINT, { headers, signal: señal });
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
throw new ErrorConsultaCuota("openai-codex", `no se pudo contactar con OpenAI Codex: ${String(error)}`, {
|
|
37
|
+
cause: error,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (!respuesta.ok) {
|
|
41
|
+
throw new ErrorConsultaCuota("openai-codex", `OpenAI Codex respondió ${respuesta.status} ${respuesta.statusText}`);
|
|
42
|
+
}
|
|
43
|
+
let datos;
|
|
44
|
+
try {
|
|
45
|
+
datos = (await respuesta.json());
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
throw new ErrorConsultaCuota("openai-codex", `la respuesta de OpenAI Codex no es JSON válido: ${String(error)}`, {
|
|
49
|
+
cause: error,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const ventanas = [
|
|
53
|
+
aVentana("Ventana principal", datos.rate_limit?.primary_window),
|
|
54
|
+
aVentana("Ventana secundaria", datos.rate_limit?.secondary_window),
|
|
55
|
+
].filter((v) => v !== undefined);
|
|
56
|
+
return ventanas.length > 0 ? ventanas : null;
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=openai-codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-codex.js","sourceRoot":"","sources":["../../../../src/core/usage/cuota/openai-codex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAuB,kBAAkB,EAAqB,MAAM,YAAY,CAAC;AAExF,MAAM,QAAQ,GAAG,4CAA4C,CAAC;AAc9D,SAAS,QAAQ,CAAC,QAAgB,EAAE,IAAqC,EAA4B;IACpG,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACrE,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACxG,OAAO;QACN,QAAQ;QACR,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;QACpD,MAAM,EAAE,GAAG;QACX,UAAU;QACV,MAAM,EAAE,YAAY;KACpB,CAAC;AAAA,CACF;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IACnD,EAAE,EAAE,cAAc;IAClB,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO;IACpD,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,MAAK,EAAE,EAAE;QAChE,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QAE7C,MAAM,OAAO,GAA2B,EAAE,aAAa,EAAE,UAAU,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;QACzF,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACvC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS;YAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,SAAS,CAAC;QAE1F,IAAI,SAAmB,CAAC;QACxB,IAAI,CAAC;YACJ,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAK,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,kBAAkB,CAAC,cAAc,EAAE,0CAA0C,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;gBACvG,KAAK,EAAE,KAAK;aACZ,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,kBAAkB,CAC3B,cAAc,EACd,2BAA0B,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,UAAU,EAAE,CACpE,CAAC;QACH,CAAC;QAED,IAAI,KAAqB,CAAC;QAC1B,IAAI,CAAC;YACJ,KAAK,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAmB,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,kBAAkB,CAC3B,cAAc,EACd,oDAAmD,MAAM,CAAC,KAAK,CAAC,EAAE,EAClE;gBACC,KAAK,EAAE,KAAK;aACZ,CACD,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG;YAChB,QAAQ,CAAC,mBAAmB,EAAE,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC;YAC/D,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAC,UAAU,EAAE,gBAAgB,CAAC;SAClE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAqB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAAA,CAC7C;CACD,CAAC","sourcesContent":["/**\n * Cuota de OpenAI Codex (ChatGPT) — endpoint interno de cuenta, no la API de\n * pago por token. Vive en `chatgpt.com`, no en `api.openai.com`: no hay\n * override de `baseUrl` que valga aquí, un proxy de streaming lo devolvería\n * en 404.\n */\n\nimport { type ConsultorCuota, ErrorConsultaCuota, type VentanaCuota } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://chatgpt.com/backend-api/wham/usage\";\n\ninterface VentanaBruta {\n\tused_percent?: number;\n\treset_at?: number;\n}\n\ninterface RespuestaCodex {\n\trate_limit?: {\n\t\tprimary_window?: VentanaBruta | null;\n\t\tsecondary_window?: VentanaBruta | null;\n\t} | null;\n}\n\nfunction aVentana(etiqueta: string, cubo: VentanaBruta | null | undefined): VentanaCuota | undefined {\n\tif (!cubo || typeof cubo.used_percent !== \"number\") return undefined;\n\tconst seReinicia = typeof cubo.reset_at === \"number\" && cubo.reset_at > 0 ? cubo.reset_at * 1000 : null;\n\treturn {\n\t\tetiqueta,\n\t\tusado: Math.min(Math.max(cubo.used_percent, 0), 100),\n\t\tlimite: 100,\n\t\tseReinicia,\n\t\tunidad: \"porcentaje\",\n\t};\n}\n\nexport const consultorOpenAiCodex: ConsultorCuota = {\n\tid: \"openai-codex\",\n\tsoporta: (credencial) => credencial.type === \"oauth\",\n\tasync consultar({ credencial, fetch: fetchImpl = fetch, señal }) {\n\t\tif (credencial.type !== \"oauth\") return null;\n\n\t\tconst headers: Record<string, string> = { authorization: `Bearer ${credencial.access}` };\n\t\tconst accountId = credencial.accountId;\n\t\tif (typeof accountId === \"string\" && accountId) headers[\"chatgpt-account-id\"] = accountId;\n\n\t\tlet respuesta: Response;\n\t\ttry {\n\t\t\trespuesta = await fetchImpl(ENDPOINT, { headers, signal: señal });\n\t\t} catch (error) {\n\t\t\tthrow new ErrorConsultaCuota(\"openai-codex\", `no se pudo contactar con OpenAI Codex: ${String(error)}`, {\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new ErrorConsultaCuota(\n\t\t\t\t\"openai-codex\",\n\t\t\t\t`OpenAI Codex respondió ${respuesta.status} ${respuesta.statusText}`,\n\t\t\t);\n\t\t}\n\n\t\tlet datos: RespuestaCodex;\n\t\ttry {\n\t\t\tdatos = (await respuesta.json()) as RespuestaCodex;\n\t\t} catch (error) {\n\t\t\tthrow new ErrorConsultaCuota(\n\t\t\t\t\"openai-codex\",\n\t\t\t\t`la respuesta de OpenAI Codex no es JSON válido: ${String(error)}`,\n\t\t\t\t{\n\t\t\t\t\tcause: error,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tconst ventanas = [\n\t\t\taVentana(\"Ventana principal\", datos.rate_limit?.primary_window),\n\t\t\taVentana(\"Ventana secundaria\", datos.rate_limit?.secondary_window),\n\t\t].filter((v): v is VentanaCuota => v !== undefined);\n\t\treturn ventanas.length > 0 ? ventanas : null;\n\t},\n};\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cuota de OpenRouter — saldo de créditos, no una ventana de tiempo.
|
|
3
|
+
*
|
|
4
|
+
* `GET /credits` devuelve el total comprado y el total gastado. Una cuenta de
|
|
5
|
+
* pago-por-uso que nunca compró crédito no tiene techo: eso también es "no
|
|
6
|
+
* publica cuota", no "cero disponible".
|
|
7
|
+
*/
|
|
8
|
+
import { type ConsultorCuota } from "./tipos.ts";
|
|
9
|
+
export declare const consultorOpenRouter: ConsultorCuota;
|
|
10
|
+
//# sourceMappingURL=openrouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../../../src/core/usage/cuota/openrouter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,cAAc,EAAsB,MAAM,YAAY,CAAC;AAQrE,eAAO,MAAM,mBAAmB,EAAE,cAmCjC,CAAC","sourcesContent":["/**\n * Cuota de OpenRouter — saldo de créditos, no una ventana de tiempo.\n *\n * `GET /credits` devuelve el total comprado y el total gastado. Una cuenta de\n * pago-por-uso que nunca compró crédito no tiene techo: eso también es \"no\n * publica cuota\", no \"cero disponible\".\n */\n\nimport { type ConsultorCuota, ErrorConsultaCuota } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://openrouter.ai/api/v1/credits\";\n\ninterface RespuestaOpenRouter {\n\tdata?: { total_credits?: number; total_usage?: number };\n}\n\nexport const consultorOpenRouter: ConsultorCuota = {\n\tid: \"openrouter\",\n\tsoporta: (credencial) => credencial.type === \"api_key\" && Boolean(credencial.key),\n\tasync consultar({ credencial, fetch: fetchImpl = fetch, señal }) {\n\t\tif (credencial.type !== \"api_key\" || !credencial.key) return null;\n\n\t\tlet respuesta: Response;\n\t\ttry {\n\t\t\trespuesta = await fetchImpl(ENDPOINT, {\n\t\t\t\theaders: { authorization: `Bearer ${credencial.key}` },\n\t\t\t\tsignal: señal,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new ErrorConsultaCuota(\"openrouter\", `no se pudo contactar con OpenRouter: ${String(error)}`, {\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new ErrorConsultaCuota(\"openrouter\", `OpenRouter respondió ${respuesta.status} ${respuesta.statusText}`);\n\t\t}\n\n\t\tlet datos: RespuestaOpenRouter;\n\t\ttry {\n\t\t\tdatos = (await respuesta.json()) as RespuestaOpenRouter;\n\t\t} catch (error) {\n\t\t\tthrow new ErrorConsultaCuota(\"openrouter\", `la respuesta de OpenRouter no es JSON válido: ${String(error)}`, {\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\n\t\tconst limite = datos.data?.total_credits;\n\t\tconst usado = datos.data?.total_usage;\n\t\tif (typeof limite !== \"number\" || limite <= 0 || typeof usado !== \"number\") return null;\n\t\treturn [{ etiqueta: \"Saldo\", usado, limite, seReinicia: null, unidad: \"usd\" }];\n\t},\n};\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cuota de OpenRouter — saldo de créditos, no una ventana de tiempo.
|
|
3
|
+
*
|
|
4
|
+
* `GET /credits` devuelve el total comprado y el total gastado. Una cuenta de
|
|
5
|
+
* pago-por-uso que nunca compró crédito no tiene techo: eso también es "no
|
|
6
|
+
* publica cuota", no "cero disponible".
|
|
7
|
+
*/
|
|
8
|
+
import { ErrorConsultaCuota } from "./tipos.js";
|
|
9
|
+
const ENDPOINT = "https://openrouter.ai/api/v1/credits";
|
|
10
|
+
export const consultorOpenRouter = {
|
|
11
|
+
id: "openrouter",
|
|
12
|
+
soporta: (credencial) => credencial.type === "api_key" && Boolean(credencial.key),
|
|
13
|
+
async consultar({ credencial, fetch: fetchImpl = fetch, señal }) {
|
|
14
|
+
if (credencial.type !== "api_key" || !credencial.key)
|
|
15
|
+
return null;
|
|
16
|
+
let respuesta;
|
|
17
|
+
try {
|
|
18
|
+
respuesta = await fetchImpl(ENDPOINT, {
|
|
19
|
+
headers: { authorization: `Bearer ${credencial.key}` },
|
|
20
|
+
signal: señal,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
throw new ErrorConsultaCuota("openrouter", `no se pudo contactar con OpenRouter: ${String(error)}`, {
|
|
25
|
+
cause: error,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (!respuesta.ok) {
|
|
29
|
+
throw new ErrorConsultaCuota("openrouter", `OpenRouter respondió ${respuesta.status} ${respuesta.statusText}`);
|
|
30
|
+
}
|
|
31
|
+
let datos;
|
|
32
|
+
try {
|
|
33
|
+
datos = (await respuesta.json());
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
throw new ErrorConsultaCuota("openrouter", `la respuesta de OpenRouter no es JSON válido: ${String(error)}`, {
|
|
37
|
+
cause: error,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const limite = datos.data?.total_credits;
|
|
41
|
+
const usado = datos.data?.total_usage;
|
|
42
|
+
if (typeof limite !== "number" || limite <= 0 || typeof usado !== "number")
|
|
43
|
+
return null;
|
|
44
|
+
return [{ etiqueta: "Saldo", usado, limite, seReinicia: null, unidad: "usd" }];
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=openrouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../../src/core/usage/cuota/openrouter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAuB,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,QAAQ,GAAG,sCAAsC,CAAC;AAMxD,MAAM,CAAC,MAAM,mBAAmB,GAAmB;IAClD,EAAE,EAAE,YAAY;IAChB,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;IACjF,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,MAAK,EAAE,EAAE;QAChE,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAElE,IAAI,SAAmB,CAAC;QACxB,IAAI,CAAC;YACJ,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;gBACrC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,UAAU,CAAC,GAAG,EAAE,EAAE;gBACtD,MAAM,EAAE,MAAK;aACb,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,kBAAkB,CAAC,YAAY,EAAE,wCAAwC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;gBACnG,KAAK,EAAE,KAAK;aACZ,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,kBAAkB,CAAC,YAAY,EAAE,yBAAwB,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;QAChH,CAAC;QAED,IAAI,KAA0B,CAAC;QAC/B,IAAI,CAAC;YACJ,KAAK,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAwB,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,kBAAkB,CAAC,YAAY,EAAE,kDAAiD,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;gBAC5G,KAAK,EAAE,KAAK;aACZ,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC;QACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC;QACtC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACxF,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAAA,CAC/E;CACD,CAAC","sourcesContent":["/**\n * Cuota de OpenRouter — saldo de créditos, no una ventana de tiempo.\n *\n * `GET /credits` devuelve el total comprado y el total gastado. Una cuenta de\n * pago-por-uso que nunca compró crédito no tiene techo: eso también es \"no\n * publica cuota\", no \"cero disponible\".\n */\n\nimport { type ConsultorCuota, ErrorConsultaCuota } from \"./tipos.ts\";\n\nconst ENDPOINT = \"https://openrouter.ai/api/v1/credits\";\n\ninterface RespuestaOpenRouter {\n\tdata?: { total_credits?: number; total_usage?: number };\n}\n\nexport const consultorOpenRouter: ConsultorCuota = {\n\tid: \"openrouter\",\n\tsoporta: (credencial) => credencial.type === \"api_key\" && Boolean(credencial.key),\n\tasync consultar({ credencial, fetch: fetchImpl = fetch, señal }) {\n\t\tif (credencial.type !== \"api_key\" || !credencial.key) return null;\n\n\t\tlet respuesta: Response;\n\t\ttry {\n\t\t\trespuesta = await fetchImpl(ENDPOINT, {\n\t\t\t\theaders: { authorization: `Bearer ${credencial.key}` },\n\t\t\t\tsignal: señal,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new ErrorConsultaCuota(\"openrouter\", `no se pudo contactar con OpenRouter: ${String(error)}`, {\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new ErrorConsultaCuota(\"openrouter\", `OpenRouter respondió ${respuesta.status} ${respuesta.statusText}`);\n\t\t}\n\n\t\tlet datos: RespuestaOpenRouter;\n\t\ttry {\n\t\t\tdatos = (await respuesta.json()) as RespuestaOpenRouter;\n\t\t} catch (error) {\n\t\t\tthrow new ErrorConsultaCuota(\"openrouter\", `la respuesta de OpenRouter no es JSON válido: ${String(error)}`, {\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\n\t\tconst limite = datos.data?.total_credits;\n\t\tconst usado = datos.data?.total_usage;\n\t\tif (typeof limite !== \"number\" || limite <= 0 || typeof usado !== \"number\") return null;\n\t\treturn [{ etiqueta: \"Saldo\", usado, limite, seReinicia: null, unidad: \"usd\" }];\n\t},\n};\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cuánto QUEDA del plan, por proveedor — no cuánto se ha gastado.
|
|
3
|
+
*
|
|
4
|
+
* `ada-cli usage` (ver `../aggregate.ts`) lee los JSONL de sesión y suma lo
|
|
5
|
+
* que ya se consumió. Eso no dice si a un equipo le quedan dos peticiones o
|
|
6
|
+
* dos mil: ese dato no vive en la sesión, vive en el proveedor, así que hay
|
|
7
|
+
* que preguntárselo a él.
|
|
8
|
+
*/
|
|
9
|
+
import type { Credential } from "@earendil-works/pi-ai";
|
|
10
|
+
export type UnidadCuota = "porcentaje" | "peticiones" | "usd";
|
|
11
|
+
/** Una ventana de cuota ya lista para mostrar (p.ej. "5 horas" o "Semanal"). */
|
|
12
|
+
export interface VentanaCuota {
|
|
13
|
+
etiqueta: string;
|
|
14
|
+
usado: number;
|
|
15
|
+
limite: number;
|
|
16
|
+
/** Epoch ms en que se reinicia esta ventana; `null` si el proveedor no lo dice. */
|
|
17
|
+
seReinicia: number | null;
|
|
18
|
+
unidad: UnidadCuota;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* La consulta a la cuota falló de verdad (red, HTTP, JSON roto).
|
|
22
|
+
*
|
|
23
|
+
* A propósito NO es lo mismo que "el proveedor no publica cuota"
|
|
24
|
+
* (`consultar` devuelve `null` para eso): confundir ambos casos hace que un
|
|
25
|
+
* fallo de red se enseñe como "sin límite", que es la mentira que esta pieza
|
|
26
|
+
* existe para evitar.
|
|
27
|
+
*/
|
|
28
|
+
export declare class ErrorConsultaCuota extends Error {
|
|
29
|
+
readonly proveedor: string;
|
|
30
|
+
constructor(proveedor: string, mensaje: string, options?: ErrorOptions);
|
|
31
|
+
}
|
|
32
|
+
/** Lo mínimo para preguntarle a un proveedor: con qué credencial y por qué canal. */
|
|
33
|
+
export interface ContextoConsulta {
|
|
34
|
+
credencial: Credential;
|
|
35
|
+
fetch?: typeof fetch;
|
|
36
|
+
señal?: AbortSignal;
|
|
37
|
+
}
|
|
38
|
+
/** Un proveedor: cómo se llama y cómo se le pregunta cuánto queda. */
|
|
39
|
+
export interface ConsultorCuota {
|
|
40
|
+
id: string;
|
|
41
|
+
/** true si esta credencial es del tipo que este proveedor sabe consultar. */
|
|
42
|
+
soporta(credencial: Credential): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* `null` = el proveedor no publica cuota para esta credencial (p.ej. la
|
|
45
|
+
* API key de pago-por-token de Anthropic no tiene techo que consultar).
|
|
46
|
+
* Lanza {@link ErrorConsultaCuota} si la consulta falla de verdad.
|
|
47
|
+
*/
|
|
48
|
+
consultar(ctx: ContextoConsulta): Promise<VentanaCuota[] | null>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=tipos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tipos.d.ts","sourceRoot":"","sources":["../../../../src/core/usage/cuota/tipos.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,KAAK,CAAC;AAE9D,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,WAAW,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,YAAY,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAIrE;CACD;AAED,wFAAqF;AACrF,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,MAAK,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,yEAAsE;AACtE,MAAM,WAAW,cAAc;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,6EAA6E;IAC7E,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC;IACzC;;;;OAIG;IACH,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;CACjE","sourcesContent":["/**\n * Cuánto QUEDA del plan, por proveedor — no cuánto se ha gastado.\n *\n * `ada-cli usage` (ver `../aggregate.ts`) lee los JSONL de sesión y suma lo\n * que ya se consumió. Eso no dice si a un equipo le quedan dos peticiones o\n * dos mil: ese dato no vive en la sesión, vive en el proveedor, así que hay\n * que preguntárselo a él.\n */\n\nimport type { Credential } from \"@earendil-works/pi-ai\";\n\nexport type UnidadCuota = \"porcentaje\" | \"peticiones\" | \"usd\";\n\n/** Una ventana de cuota ya lista para mostrar (p.ej. \"5 horas\" o \"Semanal\"). */\nexport interface VentanaCuota {\n\tetiqueta: string;\n\tusado: number;\n\tlimite: number;\n\t/** Epoch ms en que se reinicia esta ventana; `null` si el proveedor no lo dice. */\n\tseReinicia: number | null;\n\tunidad: UnidadCuota;\n}\n\n/**\n * La consulta a la cuota falló de verdad (red, HTTP, JSON roto).\n *\n * A propósito NO es lo mismo que \"el proveedor no publica cuota\"\n * (`consultar` devuelve `null` para eso): confundir ambos casos hace que un\n * fallo de red se enseñe como \"sin límite\", que es la mentira que esta pieza\n * existe para evitar.\n */\nexport class ErrorConsultaCuota extends Error {\n\treadonly proveedor: string;\n\n\tconstructor(proveedor: string, mensaje: string, options?: ErrorOptions) {\n\t\tsuper(mensaje, options);\n\t\tthis.name = \"ErrorConsultaCuota\";\n\t\tthis.proveedor = proveedor;\n\t}\n}\n\n/** Lo mínimo para preguntarle a un proveedor: con qué credencial y por qué canal. */\nexport interface ContextoConsulta {\n\tcredencial: Credential;\n\tfetch?: typeof fetch;\n\tseñal?: AbortSignal;\n}\n\n/** Un proveedor: cómo se llama y cómo se le pregunta cuánto queda. */\nexport interface ConsultorCuota {\n\tid: string;\n\t/** true si esta credencial es del tipo que este proveedor sabe consultar. */\n\tsoporta(credencial: Credential): boolean;\n\t/**\n\t * `null` = el proveedor no publica cuota para esta credencial (p.ej. la\n\t * API key de pago-por-token de Anthropic no tiene techo que consultar).\n\t * Lanza {@link ErrorConsultaCuota} si la consulta falla de verdad.\n\t */\n\tconsultar(ctx: ContextoConsulta): Promise<VentanaCuota[] | null>;\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cuánto QUEDA del plan, por proveedor — no cuánto se ha gastado.
|
|
3
|
+
*
|
|
4
|
+
* `ada-cli usage` (ver `../aggregate.ts`) lee los JSONL de sesión y suma lo
|
|
5
|
+
* que ya se consumió. Eso no dice si a un equipo le quedan dos peticiones o
|
|
6
|
+
* dos mil: ese dato no vive en la sesión, vive en el proveedor, así que hay
|
|
7
|
+
* que preguntárselo a él.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* La consulta a la cuota falló de verdad (red, HTTP, JSON roto).
|
|
11
|
+
*
|
|
12
|
+
* A propósito NO es lo mismo que "el proveedor no publica cuota"
|
|
13
|
+
* (`consultar` devuelve `null` para eso): confundir ambos casos hace que un
|
|
14
|
+
* fallo de red se enseñe como "sin límite", que es la mentira que esta pieza
|
|
15
|
+
* existe para evitar.
|
|
16
|
+
*/
|
|
17
|
+
export class ErrorConsultaCuota extends Error {
|
|
18
|
+
proveedor;
|
|
19
|
+
constructor(proveedor, mensaje, options) {
|
|
20
|
+
super(mensaje, options);
|
|
21
|
+
this.name = "ErrorConsultaCuota";
|
|
22
|
+
this.proveedor = proveedor;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=tipos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tipos.js","sourceRoot":"","sources":["../../../../src/core/usage/cuota/tipos.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgBH;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACnC,SAAS,CAAS;IAE3B,YAAY,SAAiB,EAAE,OAAe,EAAE,OAAsB,EAAE;QACvE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAAA,CAC3B;CACD","sourcesContent":["/**\n * Cuánto QUEDA del plan, por proveedor — no cuánto se ha gastado.\n *\n * `ada-cli usage` (ver `../aggregate.ts`) lee los JSONL de sesión y suma lo\n * que ya se consumió. Eso no dice si a un equipo le quedan dos peticiones o\n * dos mil: ese dato no vive en la sesión, vive en el proveedor, así que hay\n * que preguntárselo a él.\n */\n\nimport type { Credential } from \"@earendil-works/pi-ai\";\n\nexport type UnidadCuota = \"porcentaje\" | \"peticiones\" | \"usd\";\n\n/** Una ventana de cuota ya lista para mostrar (p.ej. \"5 horas\" o \"Semanal\"). */\nexport interface VentanaCuota {\n\tetiqueta: string;\n\tusado: number;\n\tlimite: number;\n\t/** Epoch ms en que se reinicia esta ventana; `null` si el proveedor no lo dice. */\n\tseReinicia: number | null;\n\tunidad: UnidadCuota;\n}\n\n/**\n * La consulta a la cuota falló de verdad (red, HTTP, JSON roto).\n *\n * A propósito NO es lo mismo que \"el proveedor no publica cuota\"\n * (`consultar` devuelve `null` para eso): confundir ambos casos hace que un\n * fallo de red se enseñe como \"sin límite\", que es la mentira que esta pieza\n * existe para evitar.\n */\nexport class ErrorConsultaCuota extends Error {\n\treadonly proveedor: string;\n\n\tconstructor(proveedor: string, mensaje: string, options?: ErrorOptions) {\n\t\tsuper(mensaje, options);\n\t\tthis.name = \"ErrorConsultaCuota\";\n\t\tthis.proveedor = proveedor;\n\t}\n}\n\n/** Lo mínimo para preguntarle a un proveedor: con qué credencial y por qué canal. */\nexport interface ContextoConsulta {\n\tcredencial: Credential;\n\tfetch?: typeof fetch;\n\tseñal?: AbortSignal;\n}\n\n/** Un proveedor: cómo se llama y cómo se le pregunta cuánto queda. */\nexport interface ConsultorCuota {\n\tid: string;\n\t/** true si esta credencial es del tipo que este proveedor sabe consultar. */\n\tsoporta(credencial: Credential): boolean;\n\t/**\n\t * `null` = el proveedor no publica cuota para esta credencial (p.ej. la\n\t * API key de pago-por-token de Anthropic no tiene techo que consultar).\n\t * Lanza {@link ErrorConsultaCuota} si la consulta falla de verdad.\n\t */\n\tconsultar(ctx: ContextoConsulta): Promise<VentanaCuota[] | null>;\n}\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Búsqueda web con la credencial que el usuario YA tiene.
|
|
3
|
+
*
|
|
4
|
+
* Hasta ahora `web_search` exigía una clave de Serper aparte, así que la
|
|
5
|
+
* respuesta de fábrica era «Búsqueda web no configurada». Un agente de código
|
|
6
|
+
* que no puede mirar la documentación de una librería está cojo, y pedir una
|
|
7
|
+
* segunda cuenta para eso es una fricción que el usuario paga antes de haber
|
|
8
|
+
* visto ningún valor.
|
|
9
|
+
*
|
|
10
|
+
* Los modelos de Anthropic traen búsqueda de servidor (`web_search_20250305`).
|
|
11
|
+
* Si hay credencial de Anthropic —y la hay, porque es con lo que corre el
|
|
12
|
+
* agente— buscar puede funcionar sin configurar nada.
|
|
13
|
+
*
|
|
14
|
+
* Dos detalles que no son evidentes y que se descubrieron probándolo:
|
|
15
|
+
*
|
|
16
|
+
* 1. **Los resultados no llegan por el contenido del mensaje.** Nuestra capa de
|
|
17
|
+
* modelos normaliza la respuesta a texto/razonamiento/llamadas, y los
|
|
18
|
+
* bloques `web_search_tool_result` se pierden por el camino. Pedirle al
|
|
19
|
+
* modelo que los liste en el texto tampoco vale: se probó, y contesta la
|
|
20
|
+
* pregunta en vez de listar fuentes. Hay que leer el flujo crudo.
|
|
21
|
+
*
|
|
22
|
+
* 2. **Se lee sin tocar la capa de modelos**, pasando un `fetch` propio que
|
|
23
|
+
* duplica el cuerpo con `tee()`: una rama sigue al SDK intacta y la otra se
|
|
24
|
+
* analiza aquí. `agent-session.ts` y `packages/ai` son de upstream y el
|
|
25
|
+
* presupuesto de fork está en el tope; esto no cuesta ni un hunk.
|
|
26
|
+
*/
|
|
27
|
+
/** Un resultado, ya normalizado. */
|
|
28
|
+
export interface ResultadoWeb {
|
|
29
|
+
titulo: string;
|
|
30
|
+
url: string;
|
|
31
|
+
/** Antigüedad tal y como la da el proveedor ("3 weeks ago", "June 8, 2026"). */
|
|
32
|
+
edad?: string;
|
|
33
|
+
}
|
|
34
|
+
/** Proveedores cuyo modelo sabe buscar por su cuenta. */
|
|
35
|
+
export declare function soportaBusquedaNativa(proveedor: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Añade la tool de búsqueda a la carga de la petición, sin pisar las que haya.
|
|
38
|
+
*
|
|
39
|
+
* Pura y separada para poder probarla: si esto machacara `tools`, el modelo se
|
|
40
|
+
* quedaría sin sus herramientas y el fallo aparecería en cualquier otro sitio.
|
|
41
|
+
*/
|
|
42
|
+
export declare function conToolDeBusqueda(carga: unknown, maxUsos?: number): unknown;
|
|
43
|
+
/**
|
|
44
|
+
* Recorre cualquier estructura y recoge los resultados de búsqueda.
|
|
45
|
+
*
|
|
46
|
+
* Se busca por el campo `type` en vez de por la ruta exacta del evento a
|
|
47
|
+
* propósito: el formato de los eventos SSE puede cambiar de sitio los bloques,
|
|
48
|
+
* y un recolector que dependa de la ruta se rompe en silencio —devolviendo cero
|
|
49
|
+
* resultados, que se lee igual que «no hay nada»—.
|
|
50
|
+
*/
|
|
51
|
+
export declare function recolectarResultados(valor: unknown, acumulado?: ResultadoWeb[]): ResultadoWeb[];
|
|
52
|
+
/** Quita repetidos por URL, conservando el orden de aparición. */
|
|
53
|
+
export declare function sinRepetidos(resultados: ResultadoWeb[]): ResultadoWeb[];
|
|
54
|
+
/**
|
|
55
|
+
* Envuelve un `fetch` para leer los resultados sin estorbar a quien lo usa.
|
|
56
|
+
*
|
|
57
|
+
* `tee()` da dos flujos: uno se devuelve intacto —el SDK tiene que recibir
|
|
58
|
+
* exactamente lo que habría recibido— y el otro se analiza aquí. Si el análisis
|
|
59
|
+
* falla, falla solo: una búsqueda sin fuentes es peor que una con fuentes, pero
|
|
60
|
+
* una sesión rota por el analizador es mucho peor que las dos.
|
|
61
|
+
*/
|
|
62
|
+
export declare function fetchQueRecolecta(base: typeof fetch, destino: ResultadoWeb[]): typeof fetch;
|
|
63
|
+
/** Lo que hace falta para buscar, inyectado para poder probarlo sin red. */
|
|
64
|
+
export interface DependenciasBusqueda {
|
|
65
|
+
/** Ejecuta una consulta contra el modelo con las opciones dadas. */
|
|
66
|
+
completar: (consulta: string, opciones: {
|
|
67
|
+
fetch: typeof fetch;
|
|
68
|
+
onPayload: (c: unknown) => unknown;
|
|
69
|
+
}) => Promise<void>;
|
|
70
|
+
fetchBase?: typeof fetch;
|
|
71
|
+
maxResultados?: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Busca y devuelve las fuentes.
|
|
75
|
+
*
|
|
76
|
+
* No devuelve la síntesis del modelo a propósito: quien llama es el agente, que
|
|
77
|
+
* ya sabe leer. Lo que necesita de una búsqueda son URLs a las que ir con
|
|
78
|
+
* `web_fetch`, no un resumen de segunda mano que ya viene con la
|
|
79
|
+
* interpretación de otro modelo encima.
|
|
80
|
+
*/
|
|
81
|
+
export declare function buscarConElModelo(consulta: string, deps: DependenciasBusqueda): Promise<ResultadoWeb[]>;
|
|
82
|
+
//# sourceMappingURL=busqueda-nativa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"busqueda-nativa.d.ts","sourceRoot":"","sources":["../../../src/core/web/busqueda-nativa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,oCAAoC;AACpC,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,iFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAKD,yDAAyD;AACzD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,SAAI,GAAG,OAAO,CAKtE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,GAAE,YAAY,EAAO,GAAG,YAAY,EAAE,CAgBnG;AAED,mEAAkE;AAClE,wBAAgB,YAAY,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CASvE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,KAAK,CAgD3F;AAED,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACpC,oEAAoE;IACpE,SAAS,EAAE,CACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE;QAAE,KAAK,EAAE,OAAO,KAAK,CAAC;QAAC,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAA;KAAE,KACjE,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAO7G","sourcesContent":["/**\n * Búsqueda web con la credencial que el usuario YA tiene.\n *\n * Hasta ahora `web_search` exigía una clave de Serper aparte, así que la\n * respuesta de fábrica era «Búsqueda web no configurada». Un agente de código\n * que no puede mirar la documentación de una librería está cojo, y pedir una\n * segunda cuenta para eso es una fricción que el usuario paga antes de haber\n * visto ningún valor.\n *\n * Los modelos de Anthropic traen búsqueda de servidor (`web_search_20250305`).\n * Si hay credencial de Anthropic —y la hay, porque es con lo que corre el\n * agente— buscar puede funcionar sin configurar nada.\n *\n * Dos detalles que no son evidentes y que se descubrieron probándolo:\n *\n * 1. **Los resultados no llegan por el contenido del mensaje.** Nuestra capa de\n * modelos normaliza la respuesta a texto/razonamiento/llamadas, y los\n * bloques `web_search_tool_result` se pierden por el camino. Pedirle al\n * modelo que los liste en el texto tampoco vale: se probó, y contesta la\n * pregunta en vez de listar fuentes. Hay que leer el flujo crudo.\n *\n * 2. **Se lee sin tocar la capa de modelos**, pasando un `fetch` propio que\n * duplica el cuerpo con `tee()`: una rama sigue al SDK intacta y la otra se\n * analiza aquí. `agent-session.ts` y `packages/ai` son de upstream y el\n * presupuesto de fork está en el tope; esto no cuesta ni un hunk.\n */\n\n/** Un resultado, ya normalizado. */\nexport interface ResultadoWeb {\n\ttitulo: string;\n\turl: string;\n\t/** Antigüedad tal y como la da el proveedor (\"3 weeks ago\", \"June 8, 2026\"). */\n\tedad?: string;\n}\n\n/** La tool de servidor de Anthropic. */\nconst TOOL_BUSQUEDA = \"web_search_20250305\";\n\n/** Proveedores cuyo modelo sabe buscar por su cuenta. */\nexport function soportaBusquedaNativa(proveedor: string): boolean {\n\treturn proveedor === \"anthropic\";\n}\n\n/**\n * Añade la tool de búsqueda a la carga de la petición, sin pisar las que haya.\n *\n * Pura y separada para poder probarla: si esto machacara `tools`, el modelo se\n * quedaría sin sus herramientas y el fallo aparecería en cualquier otro sitio.\n */\nexport function conToolDeBusqueda(carga: unknown, maxUsos = 5): unknown {\n\tif (!carga || typeof carga !== \"object\") return carga;\n\tconst p = carga as { tools?: unknown[] };\n\tp.tools = [...(p.tools ?? []), { type: TOOL_BUSQUEDA, name: \"web_search\", max_uses: maxUsos }];\n\treturn p;\n}\n\n/**\n * Recorre cualquier estructura y recoge los resultados de búsqueda.\n *\n * Se busca por el campo `type` en vez de por la ruta exacta del evento a\n * propósito: el formato de los eventos SSE puede cambiar de sitio los bloques,\n * y un recolector que dependa de la ruta se rompe en silencio —devolviendo cero\n * resultados, que se lee igual que «no hay nada»—.\n */\nexport function recolectarResultados(valor: unknown, acumulado: ResultadoWeb[] = []): ResultadoWeb[] {\n\tif (Array.isArray(valor)) {\n\t\tfor (const v of valor) recolectarResultados(v, acumulado);\n\t\treturn acumulado;\n\t}\n\tif (!valor || typeof valor !== \"object\") return acumulado;\n\tconst o = valor as Record<string, unknown>;\n\tif (o.type === \"web_search_result\" && typeof o.url === \"string\") {\n\t\tacumulado.push({\n\t\t\ttitulo: typeof o.title === \"string\" ? o.title : o.url,\n\t\t\turl: o.url,\n\t\t\tedad: typeof o.page_age === \"string\" ? o.page_age : undefined,\n\t\t});\n\t}\n\tfor (const v of Object.values(o)) recolectarResultados(v, acumulado);\n\treturn acumulado;\n}\n\n/** Quita repetidos por URL, conservando el orden de aparición. */\nexport function sinRepetidos(resultados: ResultadoWeb[]): ResultadoWeb[] {\n\tconst vistas = new Set<string>();\n\tconst unicos: ResultadoWeb[] = [];\n\tfor (const r of resultados) {\n\t\tif (vistas.has(r.url)) continue;\n\t\tvistas.add(r.url);\n\t\tunicos.push(r);\n\t}\n\treturn unicos;\n}\n\n/**\n * Envuelve un `fetch` para leer los resultados sin estorbar a quien lo usa.\n *\n * `tee()` da dos flujos: uno se devuelve intacto —el SDK tiene que recibir\n * exactamente lo que habría recibido— y el otro se analiza aquí. Si el análisis\n * falla, falla solo: una búsqueda sin fuentes es peor que una con fuentes, pero\n * una sesión rota por el analizador es mucho peor que las dos.\n */\nexport function fetchQueRecolecta(base: typeof fetch, destino: ResultadoWeb[]): typeof fetch {\n\treturn async (...args) => {\n\t\tconst respuesta = await base(...args);\n\t\tif (!respuesta.body) return respuesta;\n\t\tconst [paraElSdk, paraNosotros] = respuesta.body.tee();\n\n\t\tvoid (async () => {\n\t\t\tconst lector = paraNosotros.getReader();\n\t\t\tconst decodificador = new TextDecoder();\n\t\t\tlet pendiente = \"\";\n\t\t\ttry {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst { done, value } = await lector.read();\n\t\t\t\t\tif (done) break;\n\t\t\t\t\tpendiente += decodificador.decode(value, { stream: true });\n\t\t\t\t\tconst lineas = pendiente.split(\"\\n\");\n\t\t\t\t\t// La última puede estar a medias: se queda para la próxima vuelta.\n\t\t\t\t\tpendiente = lineas.pop() ?? \"\";\n\t\t\t\t\tfor (const linea of lineas) {\n\t\t\t\t\t\tif (!linea.startsWith(\"data: \")) continue;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\trecolectarResultados(JSON.parse(linea.slice(6)), destino);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Una línea que no es JSON no dice nada del resto del flujo.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// El flujo puede acabar sin salto final, y entonces el último evento\n\t\t\t\t// se queda en `pendiente`. Perderlo silenciosamente equivaldría a\n\t\t\t\t// devolver una fuente menos sin que nadie lo note.\n\t\t\t\tif (pendiente.startsWith(\"data: \")) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\trecolectarResultados(JSON.parse(pendiente.slice(6)), destino);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Una cola incompleta no es un error: es una cola incompleta.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// La rama de análisis nunca puede tumbar la petición.\n\t\t\t}\n\t\t})();\n\n\t\treturn new Response(paraElSdk, {\n\t\t\tstatus: respuesta.status,\n\t\t\tstatusText: respuesta.statusText,\n\t\t\theaders: respuesta.headers,\n\t\t});\n\t};\n}\n\n/** Lo que hace falta para buscar, inyectado para poder probarlo sin red. */\nexport interface DependenciasBusqueda {\n\t/** Ejecuta una consulta contra el modelo con las opciones dadas. */\n\tcompletar: (\n\t\tconsulta: string,\n\t\topciones: { fetch: typeof fetch; onPayload: (c: unknown) => unknown },\n\t) => Promise<void>;\n\tfetchBase?: typeof fetch;\n\tmaxResultados?: number;\n}\n\n/**\n * Busca y devuelve las fuentes.\n *\n * No devuelve la síntesis del modelo a propósito: quien llama es el agente, que\n * ya sabe leer. Lo que necesita de una búsqueda son URLs a las que ir con\n * `web_fetch`, no un resumen de segunda mano que ya viene con la\n * interpretación de otro modelo encima.\n */\nexport async function buscarConElModelo(consulta: string, deps: DependenciasBusqueda): Promise<ResultadoWeb[]> {\n\tconst encontrados: ResultadoWeb[] = [];\n\tawait deps.completar(consulta, {\n\t\tfetch: fetchQueRecolecta(deps.fetchBase ?? fetch, encontrados),\n\t\tonPayload: (carga) => conToolDeBusqueda(carga),\n\t});\n\treturn sinRepetidos(encontrados).slice(0, deps.maxResultados ?? 10);\n}\n"]}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Búsqueda web con la credencial que el usuario YA tiene.
|
|
3
|
+
*
|
|
4
|
+
* Hasta ahora `web_search` exigía una clave de Serper aparte, así que la
|
|
5
|
+
* respuesta de fábrica era «Búsqueda web no configurada». Un agente de código
|
|
6
|
+
* que no puede mirar la documentación de una librería está cojo, y pedir una
|
|
7
|
+
* segunda cuenta para eso es una fricción que el usuario paga antes de haber
|
|
8
|
+
* visto ningún valor.
|
|
9
|
+
*
|
|
10
|
+
* Los modelos de Anthropic traen búsqueda de servidor (`web_search_20250305`).
|
|
11
|
+
* Si hay credencial de Anthropic —y la hay, porque es con lo que corre el
|
|
12
|
+
* agente— buscar puede funcionar sin configurar nada.
|
|
13
|
+
*
|
|
14
|
+
* Dos detalles que no son evidentes y que se descubrieron probándolo:
|
|
15
|
+
*
|
|
16
|
+
* 1. **Los resultados no llegan por el contenido del mensaje.** Nuestra capa de
|
|
17
|
+
* modelos normaliza la respuesta a texto/razonamiento/llamadas, y los
|
|
18
|
+
* bloques `web_search_tool_result` se pierden por el camino. Pedirle al
|
|
19
|
+
* modelo que los liste en el texto tampoco vale: se probó, y contesta la
|
|
20
|
+
* pregunta en vez de listar fuentes. Hay que leer el flujo crudo.
|
|
21
|
+
*
|
|
22
|
+
* 2. **Se lee sin tocar la capa de modelos**, pasando un `fetch` propio que
|
|
23
|
+
* duplica el cuerpo con `tee()`: una rama sigue al SDK intacta y la otra se
|
|
24
|
+
* analiza aquí. `agent-session.ts` y `packages/ai` son de upstream y el
|
|
25
|
+
* presupuesto de fork está en el tope; esto no cuesta ni un hunk.
|
|
26
|
+
*/
|
|
27
|
+
/** La tool de servidor de Anthropic. */
|
|
28
|
+
const TOOL_BUSQUEDA = "web_search_20250305";
|
|
29
|
+
/** Proveedores cuyo modelo sabe buscar por su cuenta. */
|
|
30
|
+
export function soportaBusquedaNativa(proveedor) {
|
|
31
|
+
return proveedor === "anthropic";
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Añade la tool de búsqueda a la carga de la petición, sin pisar las que haya.
|
|
35
|
+
*
|
|
36
|
+
* Pura y separada para poder probarla: si esto machacara `tools`, el modelo se
|
|
37
|
+
* quedaría sin sus herramientas y el fallo aparecería en cualquier otro sitio.
|
|
38
|
+
*/
|
|
39
|
+
export function conToolDeBusqueda(carga, maxUsos = 5) {
|
|
40
|
+
if (!carga || typeof carga !== "object")
|
|
41
|
+
return carga;
|
|
42
|
+
const p = carga;
|
|
43
|
+
p.tools = [...(p.tools ?? []), { type: TOOL_BUSQUEDA, name: "web_search", max_uses: maxUsos }];
|
|
44
|
+
return p;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Recorre cualquier estructura y recoge los resultados de búsqueda.
|
|
48
|
+
*
|
|
49
|
+
* Se busca por el campo `type` en vez de por la ruta exacta del evento a
|
|
50
|
+
* propósito: el formato de los eventos SSE puede cambiar de sitio los bloques,
|
|
51
|
+
* y un recolector que dependa de la ruta se rompe en silencio —devolviendo cero
|
|
52
|
+
* resultados, que se lee igual que «no hay nada»—.
|
|
53
|
+
*/
|
|
54
|
+
export function recolectarResultados(valor, acumulado = []) {
|
|
55
|
+
if (Array.isArray(valor)) {
|
|
56
|
+
for (const v of valor)
|
|
57
|
+
recolectarResultados(v, acumulado);
|
|
58
|
+
return acumulado;
|
|
59
|
+
}
|
|
60
|
+
if (!valor || typeof valor !== "object")
|
|
61
|
+
return acumulado;
|
|
62
|
+
const o = valor;
|
|
63
|
+
if (o.type === "web_search_result" && typeof o.url === "string") {
|
|
64
|
+
acumulado.push({
|
|
65
|
+
titulo: typeof o.title === "string" ? o.title : o.url,
|
|
66
|
+
url: o.url,
|
|
67
|
+
edad: typeof o.page_age === "string" ? o.page_age : undefined,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
for (const v of Object.values(o))
|
|
71
|
+
recolectarResultados(v, acumulado);
|
|
72
|
+
return acumulado;
|
|
73
|
+
}
|
|
74
|
+
/** Quita repetidos por URL, conservando el orden de aparición. */
|
|
75
|
+
export function sinRepetidos(resultados) {
|
|
76
|
+
const vistas = new Set();
|
|
77
|
+
const unicos = [];
|
|
78
|
+
for (const r of resultados) {
|
|
79
|
+
if (vistas.has(r.url))
|
|
80
|
+
continue;
|
|
81
|
+
vistas.add(r.url);
|
|
82
|
+
unicos.push(r);
|
|
83
|
+
}
|
|
84
|
+
return unicos;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Envuelve un `fetch` para leer los resultados sin estorbar a quien lo usa.
|
|
88
|
+
*
|
|
89
|
+
* `tee()` da dos flujos: uno se devuelve intacto —el SDK tiene que recibir
|
|
90
|
+
* exactamente lo que habría recibido— y el otro se analiza aquí. Si el análisis
|
|
91
|
+
* falla, falla solo: una búsqueda sin fuentes es peor que una con fuentes, pero
|
|
92
|
+
* una sesión rota por el analizador es mucho peor que las dos.
|
|
93
|
+
*/
|
|
94
|
+
export function fetchQueRecolecta(base, destino) {
|
|
95
|
+
return async (...args) => {
|
|
96
|
+
const respuesta = await base(...args);
|
|
97
|
+
if (!respuesta.body)
|
|
98
|
+
return respuesta;
|
|
99
|
+
const [paraElSdk, paraNosotros] = respuesta.body.tee();
|
|
100
|
+
void (async () => {
|
|
101
|
+
const lector = paraNosotros.getReader();
|
|
102
|
+
const decodificador = new TextDecoder();
|
|
103
|
+
let pendiente = "";
|
|
104
|
+
try {
|
|
105
|
+
for (;;) {
|
|
106
|
+
const { done, value } = await lector.read();
|
|
107
|
+
if (done)
|
|
108
|
+
break;
|
|
109
|
+
pendiente += decodificador.decode(value, { stream: true });
|
|
110
|
+
const lineas = pendiente.split("\n");
|
|
111
|
+
// La última puede estar a medias: se queda para la próxima vuelta.
|
|
112
|
+
pendiente = lineas.pop() ?? "";
|
|
113
|
+
for (const linea of lineas) {
|
|
114
|
+
if (!linea.startsWith("data: "))
|
|
115
|
+
continue;
|
|
116
|
+
try {
|
|
117
|
+
recolectarResultados(JSON.parse(linea.slice(6)), destino);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Una línea que no es JSON no dice nada del resto del flujo.
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// El flujo puede acabar sin salto final, y entonces el último evento
|
|
125
|
+
// se queda en `pendiente`. Perderlo silenciosamente equivaldría a
|
|
126
|
+
// devolver una fuente menos sin que nadie lo note.
|
|
127
|
+
if (pendiente.startsWith("data: ")) {
|
|
128
|
+
try {
|
|
129
|
+
recolectarResultados(JSON.parse(pendiente.slice(6)), destino);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Una cola incompleta no es un error: es una cola incompleta.
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// La rama de análisis nunca puede tumbar la petición.
|
|
138
|
+
}
|
|
139
|
+
})();
|
|
140
|
+
return new Response(paraElSdk, {
|
|
141
|
+
status: respuesta.status,
|
|
142
|
+
statusText: respuesta.statusText,
|
|
143
|
+
headers: respuesta.headers,
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Busca y devuelve las fuentes.
|
|
149
|
+
*
|
|
150
|
+
* No devuelve la síntesis del modelo a propósito: quien llama es el agente, que
|
|
151
|
+
* ya sabe leer. Lo que necesita de una búsqueda son URLs a las que ir con
|
|
152
|
+
* `web_fetch`, no un resumen de segunda mano que ya viene con la
|
|
153
|
+
* interpretación de otro modelo encima.
|
|
154
|
+
*/
|
|
155
|
+
export async function buscarConElModelo(consulta, deps) {
|
|
156
|
+
const encontrados = [];
|
|
157
|
+
await deps.completar(consulta, {
|
|
158
|
+
fetch: fetchQueRecolecta(deps.fetchBase ?? fetch, encontrados),
|
|
159
|
+
onPayload: (carga) => conToolDeBusqueda(carga),
|
|
160
|
+
});
|
|
161
|
+
return sinRepetidos(encontrados).slice(0, deps.maxResultados ?? 10);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=busqueda-nativa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"busqueda-nativa.js","sourceRoot":"","sources":["../../../src/core/web/busqueda-nativa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAUH,wCAAwC;AACxC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAE5C,yDAAyD;AACzD,MAAM,UAAU,qBAAqB,CAAC,SAAiB,EAAW;IACjE,OAAO,SAAS,KAAK,WAAW,CAAC;AAAA,CACjC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,OAAO,GAAG,CAAC,EAAW;IACvE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,KAA8B,CAAC;IACzC,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/F,OAAO,CAAC,CAAC;AAAA,CACT;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc,EAAE,SAAS,GAAmB,EAAE,EAAkB;IACpG,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,oBAAoB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1D,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,mBAAmB,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QACjE,SAAS,CAAC,IAAI,CAAC;YACd,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;YACrD,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SAC7D,CAAC,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAAE,oBAAoB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACrE,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,mEAAkE;AAClE,MAAM,UAAU,YAAY,CAAC,UAA0B,EAAkB;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,SAAS;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAkB,EAAE,OAAuB,EAAgB;IAC5F,OAAO,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QACtC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvD,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC;YACxC,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC;gBACJ,SAAS,CAAC;oBACT,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC5C,IAAI,IAAI;wBAAE,MAAM;oBAChB,SAAS,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACrC,qEAAmE;oBACnE,SAAS,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;oBAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;wBAC5B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;4BAAE,SAAS;wBAC1C,IAAI,CAAC;4BACJ,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBAC3D,CAAC;wBAAC,MAAM,CAAC;4BACR,8DAA6D;wBAC9D,CAAC;oBACF,CAAC;gBACF,CAAC;gBACD,sEAAqE;gBACrE,mEAAkE;gBAClE,mDAAmD;gBACnD,IAAI,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpC,IAAI,CAAC;wBACJ,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC/D,CAAC;oBAAC,MAAM,CAAC;wBACR,8DAA8D;oBAC/D,CAAC;gBACF,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,wDAAsD;YACvD,CAAC;QAAA,CACD,CAAC,EAAE,CAAC;QAEL,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE;YAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,OAAO,EAAE,SAAS,CAAC,OAAO;SAC1B,CAAC,CAAC;IAAA,CACH,CAAC;AAAA,CACF;AAaD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,IAA0B,EAA2B;IAC9G,MAAM,WAAW,GAAmB,EAAE,CAAC;IACvC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;QAC9B,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,EAAE,WAAW,CAAC;QAC9D,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;KAC9C,CAAC,CAAC;IACH,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;AAAA,CACpE","sourcesContent":["/**\n * Búsqueda web con la credencial que el usuario YA tiene.\n *\n * Hasta ahora `web_search` exigía una clave de Serper aparte, así que la\n * respuesta de fábrica era «Búsqueda web no configurada». Un agente de código\n * que no puede mirar la documentación de una librería está cojo, y pedir una\n * segunda cuenta para eso es una fricción que el usuario paga antes de haber\n * visto ningún valor.\n *\n * Los modelos de Anthropic traen búsqueda de servidor (`web_search_20250305`).\n * Si hay credencial de Anthropic —y la hay, porque es con lo que corre el\n * agente— buscar puede funcionar sin configurar nada.\n *\n * Dos detalles que no son evidentes y que se descubrieron probándolo:\n *\n * 1. **Los resultados no llegan por el contenido del mensaje.** Nuestra capa de\n * modelos normaliza la respuesta a texto/razonamiento/llamadas, y los\n * bloques `web_search_tool_result` se pierden por el camino. Pedirle al\n * modelo que los liste en el texto tampoco vale: se probó, y contesta la\n * pregunta en vez de listar fuentes. Hay que leer el flujo crudo.\n *\n * 2. **Se lee sin tocar la capa de modelos**, pasando un `fetch` propio que\n * duplica el cuerpo con `tee()`: una rama sigue al SDK intacta y la otra se\n * analiza aquí. `agent-session.ts` y `packages/ai` son de upstream y el\n * presupuesto de fork está en el tope; esto no cuesta ni un hunk.\n */\n\n/** Un resultado, ya normalizado. */\nexport interface ResultadoWeb {\n\ttitulo: string;\n\turl: string;\n\t/** Antigüedad tal y como la da el proveedor (\"3 weeks ago\", \"June 8, 2026\"). */\n\tedad?: string;\n}\n\n/** La tool de servidor de Anthropic. */\nconst TOOL_BUSQUEDA = \"web_search_20250305\";\n\n/** Proveedores cuyo modelo sabe buscar por su cuenta. */\nexport function soportaBusquedaNativa(proveedor: string): boolean {\n\treturn proveedor === \"anthropic\";\n}\n\n/**\n * Añade la tool de búsqueda a la carga de la petición, sin pisar las que haya.\n *\n * Pura y separada para poder probarla: si esto machacara `tools`, el modelo se\n * quedaría sin sus herramientas y el fallo aparecería en cualquier otro sitio.\n */\nexport function conToolDeBusqueda(carga: unknown, maxUsos = 5): unknown {\n\tif (!carga || typeof carga !== \"object\") return carga;\n\tconst p = carga as { tools?: unknown[] };\n\tp.tools = [...(p.tools ?? []), { type: TOOL_BUSQUEDA, name: \"web_search\", max_uses: maxUsos }];\n\treturn p;\n}\n\n/**\n * Recorre cualquier estructura y recoge los resultados de búsqueda.\n *\n * Se busca por el campo `type` en vez de por la ruta exacta del evento a\n * propósito: el formato de los eventos SSE puede cambiar de sitio los bloques,\n * y un recolector que dependa de la ruta se rompe en silencio —devolviendo cero\n * resultados, que se lee igual que «no hay nada»—.\n */\nexport function recolectarResultados(valor: unknown, acumulado: ResultadoWeb[] = []): ResultadoWeb[] {\n\tif (Array.isArray(valor)) {\n\t\tfor (const v of valor) recolectarResultados(v, acumulado);\n\t\treturn acumulado;\n\t}\n\tif (!valor || typeof valor !== \"object\") return acumulado;\n\tconst o = valor as Record<string, unknown>;\n\tif (o.type === \"web_search_result\" && typeof o.url === \"string\") {\n\t\tacumulado.push({\n\t\t\ttitulo: typeof o.title === \"string\" ? o.title : o.url,\n\t\t\turl: o.url,\n\t\t\tedad: typeof o.page_age === \"string\" ? o.page_age : undefined,\n\t\t});\n\t}\n\tfor (const v of Object.values(o)) recolectarResultados(v, acumulado);\n\treturn acumulado;\n}\n\n/** Quita repetidos por URL, conservando el orden de aparición. */\nexport function sinRepetidos(resultados: ResultadoWeb[]): ResultadoWeb[] {\n\tconst vistas = new Set<string>();\n\tconst unicos: ResultadoWeb[] = [];\n\tfor (const r of resultados) {\n\t\tif (vistas.has(r.url)) continue;\n\t\tvistas.add(r.url);\n\t\tunicos.push(r);\n\t}\n\treturn unicos;\n}\n\n/**\n * Envuelve un `fetch` para leer los resultados sin estorbar a quien lo usa.\n *\n * `tee()` da dos flujos: uno se devuelve intacto —el SDK tiene que recibir\n * exactamente lo que habría recibido— y el otro se analiza aquí. Si el análisis\n * falla, falla solo: una búsqueda sin fuentes es peor que una con fuentes, pero\n * una sesión rota por el analizador es mucho peor que las dos.\n */\nexport function fetchQueRecolecta(base: typeof fetch, destino: ResultadoWeb[]): typeof fetch {\n\treturn async (...args) => {\n\t\tconst respuesta = await base(...args);\n\t\tif (!respuesta.body) return respuesta;\n\t\tconst [paraElSdk, paraNosotros] = respuesta.body.tee();\n\n\t\tvoid (async () => {\n\t\t\tconst lector = paraNosotros.getReader();\n\t\t\tconst decodificador = new TextDecoder();\n\t\t\tlet pendiente = \"\";\n\t\t\ttry {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst { done, value } = await lector.read();\n\t\t\t\t\tif (done) break;\n\t\t\t\t\tpendiente += decodificador.decode(value, { stream: true });\n\t\t\t\t\tconst lineas = pendiente.split(\"\\n\");\n\t\t\t\t\t// La última puede estar a medias: se queda para la próxima vuelta.\n\t\t\t\t\tpendiente = lineas.pop() ?? \"\";\n\t\t\t\t\tfor (const linea of lineas) {\n\t\t\t\t\t\tif (!linea.startsWith(\"data: \")) continue;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\trecolectarResultados(JSON.parse(linea.slice(6)), destino);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Una línea que no es JSON no dice nada del resto del flujo.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// El flujo puede acabar sin salto final, y entonces el último evento\n\t\t\t\t// se queda en `pendiente`. Perderlo silenciosamente equivaldría a\n\t\t\t\t// devolver una fuente menos sin que nadie lo note.\n\t\t\t\tif (pendiente.startsWith(\"data: \")) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\trecolectarResultados(JSON.parse(pendiente.slice(6)), destino);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Una cola incompleta no es un error: es una cola incompleta.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// La rama de análisis nunca puede tumbar la petición.\n\t\t\t}\n\t\t})();\n\n\t\treturn new Response(paraElSdk, {\n\t\t\tstatus: respuesta.status,\n\t\t\tstatusText: respuesta.statusText,\n\t\t\theaders: respuesta.headers,\n\t\t});\n\t};\n}\n\n/** Lo que hace falta para buscar, inyectado para poder probarlo sin red. */\nexport interface DependenciasBusqueda {\n\t/** Ejecuta una consulta contra el modelo con las opciones dadas. */\n\tcompletar: (\n\t\tconsulta: string,\n\t\topciones: { fetch: typeof fetch; onPayload: (c: unknown) => unknown },\n\t) => Promise<void>;\n\tfetchBase?: typeof fetch;\n\tmaxResultados?: number;\n}\n\n/**\n * Busca y devuelve las fuentes.\n *\n * No devuelve la síntesis del modelo a propósito: quien llama es el agente, que\n * ya sabe leer. Lo que necesita de una búsqueda son URLs a las que ir con\n * `web_fetch`, no un resumen de segunda mano que ya viene con la\n * interpretación de otro modelo encima.\n */\nexport async function buscarConElModelo(consulta: string, deps: DependenciasBusqueda): Promise<ResultadoWeb[]> {\n\tconst encontrados: ResultadoWeb[] = [];\n\tawait deps.completar(consulta, {\n\t\tfetch: fetchQueRecolecta(deps.fetchBase ?? fetch, encontrados),\n\t\tonPayload: (carga) => conToolDeBusqueda(carga),\n\t});\n\treturn sinRepetidos(encontrados).slice(0, deps.maxResultados ?? 10);\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ¿A dónde va de verdad esta URL?
|
|
3
|
+
*
|
|
4
|
+
* EL FALLO. `assertFetchableUrl` compara el NOMBRE del host contra una lista y
|
|
5
|
+
* unas expresiones regulares. Eso para lo evidente y deja pasar todo lo que
|
|
6
|
+
* llega a la misma dirección por otro camino. Medido sobre nuestra guarda:
|
|
7
|
+
*
|
|
8
|
+
* http://127.0.0.1:8080/secreto bloqueado
|
|
9
|
+
* http://localhost:8080/secreto bloqueado
|
|
10
|
+
* http://[::1]:8080/secreto bloqueado
|
|
11
|
+
* http://[::ffff:127.0.0.1]:8080/secreto PASA ← IPv4 mapeada en IPv6
|
|
12
|
+
* http://localtest.me:8080/secreto PASA ← resuelve a 127.0.0.1
|
|
13
|
+
*
|
|
14
|
+
* Y había un tercero: `redirect: "follow"`. Una URL pública que responde 302
|
|
15
|
+
* hacia loopback llega igual, porque la guarda solo mira la primera.
|
|
16
|
+
*
|
|
17
|
+
* Para un agente esto es serio: el modelo puede pedir una descarga con una URL
|
|
18
|
+
* que parece de internet y acabar leyendo el panel de administración de la red
|
|
19
|
+
* interna, o el endpoint de metadatos de la nube — que es donde viven las
|
|
20
|
+
* credenciales de la máquina.
|
|
21
|
+
*
|
|
22
|
+
* LA CAUSA RAÍZ, y por eso este módulo existe aparte: un nombre no es un
|
|
23
|
+
* destino. Lo único que dice a dónde va una petición es la DIRECCIÓN a la que
|
|
24
|
+
* resuelve, así que hay que resolverla y mirarla. Las comprobaciones por nombre
|
|
25
|
+
* se quedan, pero como filtro barato de primera pasada, no como la defensa.
|
|
26
|
+
*
|
|
27
|
+
* LO QUE NO RESUELVE, dicho antes de que lo descubra nadie: entre que
|
|
28
|
+
* resolvemos y que la petición sale, el DNS puede cambiar de respuesta —el
|
|
29
|
+
* ataque clásico de «rebind». Cerrarlo del todo exige fijar la dirección
|
|
30
|
+
* resuelta al abrir la conexión, que es cosa del agente HTTP y no de aquí.
|
|
31
|
+
* Contra un servidor hostil que controle su propio DNS esto sube el listón; no
|
|
32
|
+
* lo cierra.
|
|
33
|
+
*/
|
|
34
|
+
/** Por qué se rechaza un destino. Nunca una lista vacía silenciosa. */
|
|
35
|
+
export interface DestinoRechazado {
|
|
36
|
+
motivo: string;
|
|
37
|
+
/** La dirección concreta que lo delató, cuando la hay. */
|
|
38
|
+
direccion?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* ¿Esta dirección IP es de una red que no debe alcanzarse desde una tool web?
|
|
42
|
+
*
|
|
43
|
+
* Se trabaja sobre la dirección ya resuelta, así que da igual cómo se escribió
|
|
44
|
+
* el host: decimal, octal, mapeada en IPv6 o un dominio que apunta ahí.
|
|
45
|
+
*/
|
|
46
|
+
export declare function direccionInterna(ip: string): string | null;
|
|
47
|
+
/**
|
|
48
|
+
* Resuelve el host y comprueba TODAS las direcciones que devuelve.
|
|
49
|
+
*
|
|
50
|
+
* Todas, no la primera: un dominio puede devolver una dirección pública y otra
|
|
51
|
+
* interna, y quedarse con una sola convierte la defensa en una moneda al aire.
|
|
52
|
+
*
|
|
53
|
+
* Un fallo de resolución NO es un permiso. Se devuelve rechazo con su motivo:
|
|
54
|
+
* «no he podido comprobarlo» y «está bien» son cosas distintas, y aquí
|
|
55
|
+
* confundirlas es abrir la puerta.
|
|
56
|
+
*/
|
|
57
|
+
export declare function destinoPermitido(url: URL): Promise<DestinoRechazado | null>;
|
|
58
|
+
//# sourceMappingURL=destino.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destino.d.ts","sourceRoot":"","sources":["../../../src/core/web/destino.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,yEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,4DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwC1D;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAwBjF","sourcesContent":["/**\n * ¿A dónde va de verdad esta URL?\n *\n * EL FALLO. `assertFetchableUrl` compara el NOMBRE del host contra una lista y\n * unas expresiones regulares. Eso para lo evidente y deja pasar todo lo que\n * llega a la misma dirección por otro camino. Medido sobre nuestra guarda:\n *\n * http://127.0.0.1:8080/secreto bloqueado\n * http://localhost:8080/secreto bloqueado\n * http://[::1]:8080/secreto bloqueado\n * http://[::ffff:127.0.0.1]:8080/secreto PASA ← IPv4 mapeada en IPv6\n * http://localtest.me:8080/secreto PASA ← resuelve a 127.0.0.1\n *\n * Y había un tercero: `redirect: \"follow\"`. Una URL pública que responde 302\n * hacia loopback llega igual, porque la guarda solo mira la primera.\n *\n * Para un agente esto es serio: el modelo puede pedir una descarga con una URL\n * que parece de internet y acabar leyendo el panel de administración de la red\n * interna, o el endpoint de metadatos de la nube — que es donde viven las\n * credenciales de la máquina.\n *\n * LA CAUSA RAÍZ, y por eso este módulo existe aparte: un nombre no es un\n * destino. Lo único que dice a dónde va una petición es la DIRECCIÓN a la que\n * resuelve, así que hay que resolverla y mirarla. Las comprobaciones por nombre\n * se quedan, pero como filtro barato de primera pasada, no como la defensa.\n *\n * LO QUE NO RESUELVE, dicho antes de que lo descubra nadie: entre que\n * resolvemos y que la petición sale, el DNS puede cambiar de respuesta —el\n * ataque clásico de «rebind». Cerrarlo del todo exige fijar la dirección\n * resuelta al abrir la conexión, que es cosa del agente HTTP y no de aquí.\n * Contra un servidor hostil que controle su propio DNS esto sube el listón; no\n * lo cierra.\n */\n\nimport { lookup } from \"node:dns/promises\";\n\n/** Por qué se rechaza un destino. Nunca una lista vacía silenciosa. */\nexport interface DestinoRechazado {\n\tmotivo: string;\n\t/** La dirección concreta que lo delató, cuando la hay. */\n\tdireccion?: string;\n}\n\n/**\n * ¿Esta dirección IP es de una red que no debe alcanzarse desde una tool web?\n *\n * Se trabaja sobre la dirección ya resuelta, así que da igual cómo se escribió\n * el host: decimal, octal, mapeada en IPv6 o un dominio que apunta ahí.\n */\nexport function direccionInterna(ip: string): string | null {\n\tconst limpia = ip.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\n\t// IPv4 mapeada en IPv6: se desenvuelve y se juzga como IPv4, que es lo que\n\t// era. Sin esto, `[::ffff:127.0.0.1]` pasaba entera.\n\t//\n\t// Hay que cubrir LAS DOS FORMAS, y esto casi se me escapa: `new URL()`\n\t// normaliza `[::ffff:127.0.0.1]` a `[::ffff:7f00:1]`, en hexadecimal. Una\n\t// guarda que solo mirara la forma decimal daría verde sobre la única forma\n\t// que llega de verdad desde una URL.\n\tlet dir = limpia;\n\tconst decimal = limpia.match(/^::ffff:(\\d+\\.\\d+\\.\\d+\\.\\d+)$/);\n\tif (decimal) {\n\t\tdir = decimal[1];\n\t} else {\n\t\tconst hex = limpia.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);\n\t\tif (hex) {\n\t\t\tconst alto = Number.parseInt(hex[1], 16);\n\t\t\tconst bajo = Number.parseInt(hex[2], 16);\n\t\t\tdir = `${alto >> 8}.${alto & 0xff}.${bajo >> 8}.${bajo & 0xff}`;\n\t\t}\n\t}\n\n\tif (/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(dir)) {\n\t\tconst [a, b] = dir.split(\".\").map(Number);\n\t\tif (a === 127) return \"loopback\";\n\t\tif (a === 10) return \"red privada (10/8)\";\n\t\tif (a === 172 && b >= 16 && b <= 31) return \"red privada (172.16/12)\";\n\t\tif (a === 192 && b === 168) return \"red privada (192.168/16)\";\n\t\tif (a === 169 && b === 254) return \"enlace local (169.254/16), donde vive el endpoint de metadatos\";\n\t\tif (a === 100 && b >= 64 && b <= 127) return \"CGNAT (100.64/10)\";\n\t\tif (a === 0) return \"esta red (0/8)\";\n\t\treturn null;\n\t}\n\n\tif (dir === \"::1\" || dir === \"::\") return \"loopback IPv6\";\n\t// `fc00::/7` son las direcciones únicas locales; `fe80::/10`, el enlace local.\n\tif (/^f[cd]/.test(dir)) return \"red privada IPv6 (fc00::/7)\";\n\tif (/^fe[89ab]/.test(dir)) return \"enlace local IPv6 (fe80::/10)\";\n\treturn null;\n}\n\n/**\n * Resuelve el host y comprueba TODAS las direcciones que devuelve.\n *\n * Todas, no la primera: un dominio puede devolver una dirección pública y otra\n * interna, y quedarse con una sola convierte la defensa en una moneda al aire.\n *\n * Un fallo de resolución NO es un permiso. Se devuelve rechazo con su motivo:\n * «no he podido comprobarlo» y «está bien» son cosas distintas, y aquí\n * confundirlas es abrir la puerta.\n */\nexport async function destinoPermitido(url: URL): Promise<DestinoRechazado | null> {\n\tconst host = url.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\n\t// Si el host YA es una dirección, no hay nada que resolver.\n\tconst directa = direccionInterna(host);\n\tif (directa) return { motivo: directa, direccion: host };\n\tif (/^[\\d.]+$/.test(host) || host.includes(\":\")) return null;\n\n\tlet direcciones: Array<{ address: string }>;\n\ttry {\n\t\tdirecciones = await lookup(host, { all: true });\n\t} catch (error) {\n\t\treturn {\n\t\t\tmotivo: `no se ha podido resolver el nombre (${(error as NodeJS.ErrnoException).code ?? \"error\"}), y sin saber a dónde apunta no se descarga`,\n\t\t};\n\t}\n\tif (direcciones.length === 0) {\n\t\treturn { motivo: \"el nombre no resuelve a ninguna dirección\" };\n\t}\n\tfor (const { address } of direcciones) {\n\t\tconst que = direccionInterna(address);\n\t\tif (que) return { motivo: `el nombre resuelve a ${que}`, direccion: address };\n\t}\n\treturn null;\n}\n"]}
|