@hoilab/ada-cli 0.84.22 → 0.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -2
- package/README.es.md +17 -6
- package/README.md +109 -11
- package/dist/ada-publico.d.ts +35 -0
- package/dist/ada-publico.d.ts.map +1 -0
- package/dist/ada-publico.js +40 -0
- package/dist/ada-publico.js.map +1 -0
- package/dist/cli/audit-command.d.ts +15 -0
- package/dist/cli/audit-command.d.ts.map +1 -0
- package/dist/cli/audit-command.js +280 -0
- package/dist/cli/audit-command.js.map +1 -0
- package/dist/cli/banco-command.d.ts +15 -0
- package/dist/cli/banco-command.d.ts.map +1 -0
- package/dist/cli/banco-command.js +213 -0
- package/dist/cli/banco-command.js.map +1 -0
- package/dist/cli/cleanse-command.d.ts +11 -0
- package/dist/cli/cleanse-command.d.ts.map +1 -0
- package/dist/cli/cleanse-command.js +101 -0
- package/dist/cli/cleanse-command.js.map +1 -0
- package/dist/cli/commit-command.d.ts +31 -0
- package/dist/cli/commit-command.d.ts.map +1 -0
- package/dist/cli/commit-command.js +158 -0
- package/dist/cli/commit-command.js.map +1 -0
- package/dist/cli/computer-command.d.ts +12 -0
- package/dist/cli/computer-command.d.ts.map +1 -0
- package/dist/cli/computer-command.js +141 -0
- package/dist/cli/computer-command.js.map +1 -0
- package/dist/cli/discover-command.d.ts +18 -0
- package/dist/cli/discover-command.d.ts.map +1 -0
- package/dist/cli/discover-command.js +108 -0
- package/dist/cli/discover-command.js.map +1 -0
- package/dist/cli/hashline-command.d.ts +11 -0
- package/dist/cli/hashline-command.d.ts.map +1 -0
- package/dist/cli/hashline-command.js +106 -0
- package/dist/cli/hashline-command.js.map +1 -0
- package/dist/cli/import-command.d.ts +35 -0
- package/dist/cli/import-command.d.ts.map +1 -0
- package/dist/cli/import-command.js +164 -0
- package/dist/cli/import-command.js.map +1 -0
- package/dist/cli/politica-command.d.ts +20 -0
- package/dist/cli/politica-command.d.ts.map +1 -0
- package/dist/cli/politica-command.js +93 -0
- package/dist/cli/politica-command.js.map +1 -0
- package/dist/cli/refine-command.d.ts +18 -0
- package/dist/cli/refine-command.d.ts.map +1 -0
- package/dist/cli/refine-command.js +101 -0
- package/dist/cli/refine-command.js.map +1 -0
- package/dist/cli/review-command.d.ts +24 -0
- package/dist/cli/review-command.d.ts.map +1 -0
- package/dist/cli/review-command.js +168 -0
- package/dist/cli/review-command.js.map +1 -0
- package/dist/cli/schedule-command.d.ts +17 -0
- package/dist/cli/schedule-command.d.ts.map +1 -0
- package/dist/cli/schedule-command.js +117 -0
- package/dist/cli/schedule-command.js.map +1 -0
- package/dist/cli/serve-command.d.ts +72 -0
- package/dist/cli/serve-command.d.ts.map +1 -0
- package/dist/cli/serve-command.js +568 -0
- package/dist/cli/serve-command.js.map +1 -0
- package/dist/cli/telegram-command.d.ts +18 -0
- package/dist/cli/telegram-command.d.ts.map +1 -0
- package/dist/cli/telegram-command.js +137 -0
- package/dist/cli/telegram-command.js.map +1 -0
- package/dist/cli/telemetria-command.d.ts +22 -0
- package/dist/cli/telemetria-command.d.ts.map +1 -0
- package/dist/cli/telemetria-command.js +127 -0
- package/dist/cli/telemetria-command.js.map +1 -0
- package/dist/cli/undo-command.d.ts +9 -0
- package/dist/cli/undo-command.d.ts.map +1 -0
- package/dist/cli/undo-command.js +56 -0
- package/dist/cli/undo-command.js.map +1 -0
- package/dist/cli/usage-command.d.ts +10 -0
- package/dist/cli/usage-command.d.ts.map +1 -0
- package/dist/cli/usage-command.js +209 -0
- package/dist/cli/usage-command.js.map +1 -0
- package/dist/cli/wiki-command.d.ts +9 -0
- package/dist/cli/wiki-command.d.ts.map +1 -0
- package/dist/cli/wiki-command.js +76 -0
- package/dist/cli/wiki-command.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -11
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/ada.d.ts +58 -0
- package/dist/core/ada.d.ts.map +1 -0
- package/dist/core/ada.js +61 -0
- package/dist/core/ada.js.map +1 -0
- package/dist/core/advisor/guarda.d.ts +66 -0
- package/dist/core/advisor/guarda.d.ts.map +1 -0
- package/dist/core/advisor/guarda.js +191 -0
- package/dist/core/advisor/guarda.js.map +1 -0
- package/dist/core/advisor/runtime.d.ts +66 -0
- package/dist/core/advisor/runtime.d.ts.map +1 -0
- package/dist/core/advisor/runtime.js +121 -0
- package/dist/core/advisor/runtime.js.map +1 -0
- package/dist/core/advisor/sesion.d.ts +109 -0
- package/dist/core/advisor/sesion.d.ts.map +1 -0
- package/dist/core/advisor/sesion.js +139 -0
- package/dist/core/advisor/sesion.js.map +1 -0
- package/dist/core/agent-session.d.ts +30 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +430 -22
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents/loader.d.ts +77 -0
- package/dist/core/agents/loader.d.ts.map +1 -0
- package/dist/core/agents/loader.js +154 -0
- package/dist/core/agents/loader.js.map +1 -0
- package/dist/core/aprobacion/generados.d.ts +37 -0
- package/dist/core/aprobacion/generados.d.ts.map +1 -0
- package/dist/core/aprobacion/generados.js +85 -0
- package/dist/core/aprobacion/generados.js.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.js +212 -0
- package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
- package/dist/core/aprobacion/politica.d.ts +90 -0
- package/dist/core/aprobacion/politica.d.ts.map +1 -0
- package/dist/core/aprobacion/politica.js +375 -0
- package/dist/core/aprobacion/politica.js.map +1 -0
- package/dist/core/arranque/atajos.d.ts +46 -0
- package/dist/core/arranque/atajos.d.ts.map +1 -0
- package/dist/core/arranque/atajos.js +113 -0
- package/dist/core/arranque/atajos.js.map +1 -0
- package/dist/core/audit/exportacion.d.ts +54 -0
- package/dist/core/audit/exportacion.d.ts.map +1 -0
- package/dist/core/audit/exportacion.js +265 -0
- package/dist/core/audit/exportacion.js.map +1 -0
- package/dist/core/audit/libro.d.ts +318 -0
- package/dist/core/audit/libro.d.ts.map +1 -0
- package/dist/core/audit/libro.js +508 -0
- package/dist/core/audit/libro.js.map +1 -0
- package/dist/core/audit/registro-sesion.d.ts +78 -0
- package/dist/core/audit/registro-sesion.d.ts.map +1 -0
- package/dist/core/audit/registro-sesion.js +202 -0
- package/dist/core/audit/registro-sesion.js.map +1 -0
- package/dist/core/audit/retencion.d.ts +82 -0
- package/dist/core/audit/retencion.d.ts.map +1 -0
- package/dist/core/audit/retencion.js +152 -0
- package/dist/core/audit/retencion.js.map +1 -0
- package/dist/core/audit/rutas.d.ts +23 -0
- package/dist/core/audit/rutas.d.ts.map +1 -0
- package/dist/core/audit/rutas.js +23 -0
- package/dist/core/audit/rutas.js.map +1 -0
- package/dist/core/auth-storage.d.ts +0 -3
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +17 -5
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/banco/almacenamiento.d.ts +18 -0
- package/dist/core/banco/almacenamiento.d.ts.map +1 -0
- package/dist/core/banco/almacenamiento.js +50 -0
- package/dist/core/banco/almacenamiento.js.map +1 -0
- package/dist/core/banco/analisis.d.ts +37 -0
- package/dist/core/banco/analisis.d.ts.map +1 -0
- package/dist/core/banco/analisis.js +164 -0
- package/dist/core/banco/analisis.js.map +1 -0
- package/dist/core/banco/bloques.d.ts +39 -0
- package/dist/core/banco/bloques.d.ts.map +1 -0
- package/dist/core/banco/bloques.js +84 -0
- package/dist/core/banco/bloques.js.map +1 -0
- package/dist/core/banco/cargas.d.ts +84 -0
- package/dist/core/banco/cargas.d.ts.map +1 -0
- package/dist/core/banco/cargas.js +520 -0
- package/dist/core/banco/cargas.js.map +1 -0
- package/dist/core/banco/comparar.d.ts +29 -0
- package/dist/core/banco/comparar.d.ts.map +1 -0
- package/dist/core/banco/comparar.js +28 -0
- package/dist/core/banco/comparar.js.map +1 -0
- package/dist/core/banco/ejecutar.d.ts +44 -0
- package/dist/core/banco/ejecutar.d.ts.map +1 -0
- package/dist/core/banco/ejecutar.js +183 -0
- package/dist/core/banco/ejecutar.js.map +1 -0
- package/dist/core/banco/generar.d.ts +24 -0
- package/dist/core/banco/generar.d.ts.map +1 -0
- package/dist/core/banco/generar.js +159 -0
- package/dist/core/banco/generar.js.map +1 -0
- package/dist/core/banco/mutaciones.d.ts +25 -0
- package/dist/core/banco/mutaciones.d.ts.map +1 -0
- package/dist/core/banco/mutaciones.js +215 -0
- package/dist/core/banco/mutaciones.js.map +1 -0
- package/dist/core/banco/tipos.d.ts +121 -0
- package/dist/core/banco/tipos.d.ts.map +1 -0
- package/dist/core/banco/tipos.js +16 -0
- package/dist/core/banco/tipos.js.map +1 -0
- package/dist/core/blobs/almacen.d.ts +81 -0
- package/dist/core/blobs/almacen.d.ts.map +1 -0
- package/dist/core/blobs/almacen.js +198 -0
- package/dist/core/blobs/almacen.js.map +1 -0
- package/dist/core/blobs/broker.d.ts +103 -0
- package/dist/core/blobs/broker.d.ts.map +1 -0
- package/dist/core/blobs/broker.js +204 -0
- package/dist/core/blobs/broker.js.map +1 -0
- package/dist/core/blobs/index.d.ts +70 -0
- package/dist/core/blobs/index.d.ts.map +1 -0
- package/dist/core/blobs/index.js +232 -0
- package/dist/core/blobs/index.js.map +1 -0
- package/dist/core/blobs/payload.d.ts +55 -0
- package/dist/core/blobs/payload.d.ts.map +1 -0
- package/dist/core/blobs/payload.js +255 -0
- package/dist/core/blobs/payload.js.map +1 -0
- package/dist/core/blobs/proveedor.d.ts +85 -0
- package/dist/core/blobs/proveedor.d.ts.map +1 -0
- package/dist/core/blobs/proveedor.js +196 -0
- package/dist/core/blobs/proveedor.js.map +1 -0
- package/dist/core/browser/cdp.d.ts +41 -0
- package/dist/core/browser/cdp.d.ts.map +1 -0
- package/dist/core/browser/cdp.js +119 -0
- package/dist/core/browser/cdp.js.map +1 -0
- package/dist/core/browser/politica.d.ts +51 -0
- package/dist/core/browser/politica.d.ts.map +1 -0
- package/dist/core/browser/politica.js +123 -0
- package/dist/core/browser/politica.js.map +1 -0
- package/dist/core/browser/sesion.d.ts +52 -0
- package/dist/core/browser/sesion.d.ts.map +1 -0
- package/dist/core/browser/sesion.js +176 -0
- package/dist/core/browser/sesion.js.map +1 -0
- package/dist/core/browser/tools.d.ts +16 -0
- package/dist/core/browser/tools.d.ts.map +1 -0
- package/dist/core/browser/tools.js +279 -0
- package/dist/core/browser/tools.js.map +1 -0
- package/dist/core/commit/diff.d.ts +56 -0
- package/dist/core/commit/diff.d.ts.map +1 -0
- package/dist/core/commit/diff.js +145 -0
- package/dist/core/commit/diff.js.map +1 -0
- package/dist/core/commit/mensaje.d.ts +80 -0
- package/dist/core/commit/mensaje.d.ts.map +1 -0
- package/dist/core/commit/mensaje.js +207 -0
- package/dist/core/commit/mensaje.js.map +1 -0
- package/dist/core/compactar/index.d.ts +52 -0
- package/dist/core/compactar/index.d.ts.map +1 -0
- package/dist/core/compactar/index.js +91 -0
- package/dist/core/compactar/index.js.map +1 -0
- package/dist/core/compactar/registro-denso.d.ts +160 -0
- package/dist/core/compactar/registro-denso.d.ts.map +1 -0
- package/dist/core/compactar/registro-denso.js +620 -0
- package/dist/core/compactar/registro-denso.js.map +1 -0
- package/dist/core/computer/captura.d.ts +35 -0
- package/dist/core/computer/captura.d.ts.map +1 -0
- package/dist/core/computer/captura.js +140 -0
- package/dist/core/computer/captura.js.map +1 -0
- package/dist/core/computer/driver.d.ts +130 -0
- package/dist/core/computer/driver.d.ts.map +1 -0
- package/dist/core/computer/driver.js +206 -0
- package/dist/core/computer/driver.js.map +1 -0
- package/dist/core/computer/motor/actions.d.ts +109 -0
- package/dist/core/computer/motor/actions.d.ts.map +1 -0
- package/dist/core/computer/motor/actions.js +157 -0
- package/dist/core/computer/motor/actions.js.map +1 -0
- package/dist/core/computer/motor/bridge.d.ts +232 -0
- package/dist/core/computer/motor/bridge.d.ts.map +1 -0
- package/dist/core/computer/motor/bridge.js +2335 -0
- package/dist/core/computer/motor/bridge.js.map +1 -0
- package/dist/core/computer/motor/cdp.d.ts +107 -0
- package/dist/core/computer/motor/cdp.d.ts.map +1 -0
- package/dist/core/computer/motor/cdp.js +659 -0
- package/dist/core/computer/motor/cdp.js.map +1 -0
- package/dist/core/computer/motor/config.d.ts +23 -0
- package/dist/core/computer/motor/config.d.ts.map +1 -0
- package/dist/core/computer/motor/config.js +100 -0
- package/dist/core/computer/motor/config.js.map +1 -0
- package/dist/core/computer/motor/contract.d.ts +81 -0
- package/dist/core/computer/motor/contract.d.ts.map +1 -0
- package/dist/core/computer/motor/contract.js +14 -0
- package/dist/core/computer/motor/contract.js.map +1 -0
- package/dist/core/computer/motor/note.d.ts +37 -0
- package/dist/core/computer/motor/note.d.ts.map +1 -0
- package/dist/core/computer/motor/note.js +162 -0
- package/dist/core/computer/motor/note.js.map +1 -0
- package/dist/core/computer/motor/outline.d.ts +155 -0
- package/dist/core/computer/motor/outline.d.ts.map +1 -0
- package/dist/core/computer/motor/outline.js +590 -0
- package/dist/core/computer/motor/outline.js.map +1 -0
- package/dist/core/computer/motor/output.d.ts +18 -0
- package/dist/core/computer/motor/output.d.ts.map +1 -0
- package/dist/core/computer/motor/output.js +148 -0
- package/dist/core/computer/motor/output.js.map +1 -0
- package/dist/core/computer/motor/permissions.d.ts +41 -0
- package/dist/core/computer/motor/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/permissions.js +51 -0
- package/dist/core/computer/motor/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
- package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/architecture.js +21 -0
- package/dist/core/computer/motor/platform/architecture.js.map +1 -0
- package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
- package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/coerce.js +17 -0
- package/dist/core/computer/motor/platform/coerce.js.map +1 -0
- package/dist/core/computer/motor/platform/index.d.ts +4 -0
- package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/index.js +79 -0
- package/dist/core/computer/motor/platform/index.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.js +173 -0
- package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.js +261 -0
- package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.js +124 -0
- package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.js +101 -0
- package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper.js +277 -0
- package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
- package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/types.d.ts +263 -0
- package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/types.js +2 -0
- package/dist/core/computer/motor/platform/types.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.js +163 -0
- package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.js +174 -0
- package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
- package/dist/core/computer/motor/root-selection.d.ts +6 -0
- package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
- package/dist/core/computer/motor/root-selection.js +28 -0
- package/dist/core/computer/motor/root-selection.js.map +1 -0
- package/dist/core/computer/motor/runtime.d.ts +50 -0
- package/dist/core/computer/motor/runtime.d.ts.map +1 -0
- package/dist/core/computer/motor/runtime.js +119 -0
- package/dist/core/computer/motor/runtime.js.map +1 -0
- package/dist/core/computer/motor/state.d.ts +68 -0
- package/dist/core/computer/motor/state.d.ts.map +1 -0
- package/dist/core/computer/motor/state.js +100 -0
- package/dist/core/computer/motor/state.js.map +1 -0
- package/dist/core/computer/motor/view.d.ts +6 -0
- package/dist/core/computer/motor/view.d.ts.map +1 -0
- package/dist/core/computer/motor/view.js +185 -0
- package/dist/core/computer/motor/view.js.map +1 -0
- package/dist/core/computer/motor-ada.d.ts +159 -0
- package/dist/core/computer/motor-ada.d.ts.map +1 -0
- package/dist/core/computer/motor-ada.js +412 -0
- package/dist/core/computer/motor-ada.js.map +1 -0
- package/dist/core/computer/politica.d.ts +56 -0
- package/dist/core/computer/politica.d.ts.map +1 -0
- package/dist/core/computer/politica.js +163 -0
- package/dist/core/computer/politica.js.map +1 -0
- package/dist/core/computer/tools.d.ts +26 -0
- package/dist/core/computer/tools.d.ts.map +1 -0
- package/dist/core/computer/tools.js +399 -0
- package/dist/core/computer/tools.js.map +1 -0
- package/dist/core/context-breakdown.d.ts +80 -0
- package/dist/core/context-breakdown.d.ts.map +1 -0
- package/dist/core/context-breakdown.js +87 -0
- package/dist/core/context-breakdown.js.map +1 -0
- package/dist/core/credenciales/cliente.d.ts +60 -0
- package/dist/core/credenciales/cliente.d.ts.map +1 -0
- package/dist/core/credenciales/cliente.js +81 -0
- package/dist/core/credenciales/cliente.js.map +1 -0
- package/dist/core/credenciales/pool.d.ts +96 -0
- package/dist/core/credenciales/pool.d.ts.map +1 -0
- package/dist/core/credenciales/pool.js +128 -0
- package/dist/core/credenciales/pool.js.map +1 -0
- package/dist/core/credenciales/reposo.d.ts +93 -0
- package/dist/core/credenciales/reposo.d.ts.map +1 -0
- package/dist/core/credenciales/reposo.js +489 -0
- package/dist/core/credenciales/reposo.js.map +1 -0
- package/dist/core/credenciales/servidor.d.ts +55 -0
- package/dist/core/credenciales/servidor.d.ts.map +1 -0
- package/dist/core/credenciales/servidor.js +205 -0
- package/dist/core/credenciales/servidor.js.map +1 -0
- package/dist/core/descubrimiento/comandos.d.ts +30 -0
- package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
- package/dist/core/descubrimiento/comandos.js +76 -0
- package/dist/core/descubrimiento/comandos.js.map +1 -0
- package/dist/core/descubrimiento/mcp.d.ts +42 -0
- package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
- package/dist/core/descubrimiento/mcp.js +130 -0
- package/dist/core/descubrimiento/mcp.js.map +1 -0
- package/dist/core/descubrimiento/reglas.d.ts +61 -0
- package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
- package/dist/core/descubrimiento/reglas.js +134 -0
- package/dist/core/descubrimiento/reglas.js.map +1 -0
- package/dist/core/descubrimiento/skills.d.ts +57 -0
- package/dist/core/descubrimiento/skills.d.ts.map +1 -0
- package/dist/core/descubrimiento/skills.js +113 -0
- package/dist/core/descubrimiento/skills.js.map +1 -0
- package/dist/core/dificultad/clasificador.d.ts +133 -0
- package/dist/core/dificultad/clasificador.d.ts.map +1 -0
- package/dist/core/dificultad/clasificador.js +288 -0
- package/dist/core/dificultad/clasificador.js.map +1 -0
- package/dist/core/edicion/diario.d.ts +37 -0
- package/dist/core/edicion/diario.d.ts.map +1 -0
- package/dist/core/edicion/diario.js +51 -0
- package/dist/core/edicion/diario.js.map +1 -0
- package/dist/core/edicion/hashline.d.ts +71 -0
- package/dist/core/edicion/hashline.d.ts.map +1 -0
- package/dist/core/edicion/hashline.js +111 -0
- package/dist/core/edicion/hashline.js.map +1 -0
- package/dist/core/edicion/hueco.d.ts +64 -0
- package/dist/core/edicion/hueco.d.ts.map +1 -0
- package/dist/core/edicion/hueco.js +162 -0
- package/dist/core/edicion/hueco.js.map +1 -0
- package/dist/core/edicion/limpiar-carga.d.ts +39 -0
- package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
- package/dist/core/edicion/limpiar-carga.js +121 -0
- package/dist/core/edicion/limpiar-carga.js.map +1 -0
- package/dist/core/edicion/observador.d.ts +80 -0
- package/dist/core/edicion/observador.d.ts.map +1 -0
- package/dist/core/edicion/observador.js +183 -0
- package/dist/core/edicion/observador.js.map +1 -0
- package/dist/core/edicion/parecido.d.ts +53 -0
- package/dist/core/edicion/parecido.d.ts.map +1 -0
- package/dist/core/edicion/parecido.js +145 -0
- package/dist/core/edicion/parecido.js.map +1 -0
- package/dist/core/edicion/parseo.d.ts +58 -0
- package/dist/core/edicion/parseo.d.ts.map +1 -0
- package/dist/core/edicion/parseo.js +124 -0
- package/dist/core/edicion/parseo.js.map +1 -0
- package/dist/core/edicion/reparacion.d.ts +67 -0
- package/dist/core/edicion/reparacion.d.ts.map +1 -0
- package/dist/core/edicion/reparacion.js +202 -0
- package/dist/core/edicion/reparacion.js.map +1 -0
- package/dist/core/edicion/sangria.d.ts +121 -0
- package/dist/core/edicion/sangria.d.ts.map +1 -0
- package/dist/core/edicion/sangria.js +341 -0
- package/dist/core/edicion/sangria.js.map +1 -0
- package/dist/core/edicion/tipos.d.ts +58 -0
- package/dist/core/edicion/tipos.d.ts.map +1 -0
- package/dist/core/edicion/tipos.js +160 -0
- package/dist/core/edicion/tipos.js.map +1 -0
- package/dist/core/errores/proveedor.d.ts +53 -0
- package/dist/core/errores/proveedor.d.ts.map +1 -0
- package/dist/core/errores/proveedor.js +191 -0
- package/dist/core/errores/proveedor.js.map +1 -0
- package/dist/core/estructural/buscar.d.ts +61 -0
- package/dist/core/estructural/buscar.d.ts.map +1 -0
- package/dist/core/estructural/buscar.js +261 -0
- package/dist/core/estructural/buscar.js.map +1 -0
- package/dist/core/estructural/editar.d.ts +36 -0
- package/dist/core/estructural/editar.d.ts.map +1 -0
- package/dist/core/estructural/editar.js +123 -0
- package/dist/core/estructural/editar.js.map +1 -0
- package/dist/core/estructural/tools.d.ts +11 -0
- package/dist/core/estructural/tools.d.ts.map +1 -0
- package/dist/core/estructural/tools.js +100 -0
- package/dist/core/estructural/tools.js.map +1 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +10 -1
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensiones/suplantacion.d.ts +49 -0
- package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
- package/dist/core/extensiones/suplantacion.js +61 -0
- package/dist/core/extensiones/suplantacion.js.map +1 -0
- package/dist/core/extensiones/vigilancia.d.ts +54 -0
- package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
- package/dist/core/extensiones/vigilancia.js +217 -0
- package/dist/core/extensiones/vigilancia.js.map +1 -0
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +11 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
- package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
- package/dist/core/harness/fuentes-de-contexto.js +44 -0
- package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
- package/dist/core/harness/refine.d.ts +40 -0
- package/dist/core/harness/refine.d.ts.map +1 -0
- package/dist/core/harness/refine.js +109 -0
- package/dist/core/harness/refine.js.map +1 -0
- package/dist/core/harness/store.d.ts +75 -0
- package/dist/core/harness/store.d.ts.map +1 -0
- package/dist/core/harness/store.js +149 -0
- package/dist/core/harness/store.js.map +1 -0
- package/dist/core/hooks/contract.d.ts +85 -0
- package/dist/core/hooks/contract.d.ts.map +1 -0
- package/dist/core/hooks/contract.js +140 -0
- package/dist/core/hooks/contract.js.map +1 -0
- package/dist/core/hooks/runner.d.ts +42 -0
- package/dist/core/hooks/runner.d.ts.map +1 -0
- package/dist/core/hooks/runner.js +85 -0
- package/dist/core/hooks/runner.js.map +1 -0
- package/dist/core/hooks/session-hooks.d.ts +62 -0
- package/dist/core/hooks/session-hooks.d.ts.map +1 -0
- package/dist/core/hooks/session-hooks.js +84 -0
- package/dist/core/hooks/session-hooks.js.map +1 -0
- package/dist/core/importar/formatos.d.ts +69 -0
- package/dist/core/importar/formatos.d.ts.map +1 -0
- package/dist/core/importar/formatos.js +235 -0
- package/dist/core/importar/formatos.js.map +1 -0
- package/dist/core/interactivo/deteccion.d.ts +44 -0
- package/dist/core/interactivo/deteccion.d.ts.map +1 -0
- package/dist/core/interactivo/deteccion.js +82 -0
- package/dist/core/interactivo/deteccion.js.map +1 -0
- package/dist/core/interactivo/sesion.d.ts +50 -0
- package/dist/core/interactivo/sesion.d.ts.map +1 -0
- package/dist/core/interactivo/sesion.js +156 -0
- package/dist/core/interactivo/sesion.js.map +1 -0
- package/dist/core/interactivo/tools.d.ts +21 -0
- package/dist/core/interactivo/tools.d.ts.map +1 -0
- package/dist/core/interactivo/tools.js +122 -0
- package/dist/core/interactivo/tools.js.map +1 -0
- package/dist/core/lectura/mapa.d.ts +70 -0
- package/dist/core/lectura/mapa.d.ts.map +1 -0
- package/dist/core/lectura/mapa.js +177 -0
- package/dist/core/lectura/mapa.js.map +1 -0
- package/dist/core/lectura/pdf.d.ts +49 -0
- package/dist/core/lectura/pdf.d.ts.map +1 -0
- package/dist/core/lectura/pdf.js +337 -0
- package/dist/core/lectura/pdf.js.map +1 -0
- package/dist/core/limpieza/comprobadores.d.ts +28 -0
- package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
- package/dist/core/limpieza/comprobadores.js +311 -0
- package/dist/core/limpieza/comprobadores.js.map +1 -0
- package/dist/core/limpieza/parseo.d.ts +19 -0
- package/dist/core/limpieza/parseo.d.ts.map +1 -0
- package/dist/core/limpieza/parseo.js +124 -0
- package/dist/core/limpieza/parseo.js.map +1 -0
- package/dist/core/limpieza/reparacion.d.ts +77 -0
- package/dist/core/limpieza/reparacion.d.ts.map +1 -0
- package/dist/core/limpieza/reparacion.js +254 -0
- package/dist/core/limpieza/reparacion.js.map +1 -0
- package/dist/core/limpieza/tipos.d.ts +56 -0
- package/dist/core/limpieza/tipos.d.ts.map +1 -0
- package/dist/core/limpieza/tipos.js +9 -0
- package/dist/core/limpieza/tipos.js.map +1 -0
- package/dist/core/lsp/cliente.d.ts +52 -0
- package/dist/core/lsp/cliente.d.ts.map +1 -0
- package/dist/core/lsp/cliente.js +232 -0
- package/dist/core/lsp/cliente.js.map +1 -0
- package/dist/core/lsp/descubrimiento.d.ts +62 -0
- package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
- package/dist/core/lsp/descubrimiento.js +152 -0
- package/dist/core/lsp/descubrimiento.js.map +1 -0
- package/dist/core/lsp/ediciones.d.ts +59 -0
- package/dist/core/lsp/ediciones.d.ts.map +1 -0
- package/dist/core/lsp/ediciones.js +89 -0
- package/dist/core/lsp/ediciones.js.map +1 -0
- package/dist/core/lsp/extension.d.ts +28 -0
- package/dist/core/lsp/extension.d.ts.map +1 -0
- package/dist/core/lsp/extension.js +34 -0
- package/dist/core/lsp/extension.js.map +1 -0
- package/dist/core/lsp/tools.d.ts +45 -0
- package/dist/core/lsp/tools.d.ts.map +1 -0
- package/dist/core/lsp/tools.js +265 -0
- package/dist/core/lsp/tools.js.map +1 -0
- package/dist/core/mcp/client.d.ts +60 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +139 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/manager.d.ts +86 -0
- package/dist/core/mcp/manager.d.ts.map +1 -0
- package/dist/core/mcp/manager.js +124 -0
- package/dist/core/mcp/manager.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +15 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +84 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/memory-engine/audit-export.d.ts +12 -10
- package/dist/core/memory-engine/audit-export.d.ts.map +1 -1
- package/dist/core/memory-engine/audit-export.js +15 -0
- package/dist/core/memory-engine/audit-export.js.map +1 -1
- package/dist/core/memory-engine/audit-indice.d.ts +153 -0
- package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
- package/dist/core/memory-engine/audit-indice.js +271 -0
- package/dist/core/memory-engine/audit-indice.js.map +1 -0
- package/dist/core/memory-engine/audit.d.ts +18 -6
- package/dist/core/memory-engine/audit.d.ts.map +1 -1
- package/dist/core/memory-engine/audit.js +25 -42
- package/dist/core/memory-engine/audit.js.map +1 -1
- package/dist/core/memory-engine/engine.d.ts +19 -1
- package/dist/core/memory-engine/engine.d.ts.map +1 -1
- package/dist/core/memory-engine/engine.js +71 -5
- package/dist/core/memory-engine/engine.js.map +1 -1
- package/dist/core/memory-engine/observation-store.d.ts +0 -2
- package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
- package/dist/core/memory-engine/observation-store.js +4 -5
- package/dist/core/memory-engine/observation-store.js.map +1 -1
- package/dist/core/memory-engine/refinements.d.ts +51 -0
- package/dist/core/memory-engine/refinements.d.ts.map +1 -0
- package/dist/core/memory-engine/refinements.js +99 -0
- package/dist/core/memory-engine/refinements.js.map +1 -0
- package/dist/core/memory-engine/tools.d.ts.map +1 -1
- package/dist/core/memory-engine/tools.js +27 -1
- package/dist/core/memory-engine/tools.js.map +1 -1
- package/dist/core/memory-engine/types.d.ts +2 -0
- package/dist/core/memory-engine/types.d.ts.map +1 -1
- package/dist/core/memory-engine/types.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +7 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/muestreo-restringido.d.ts +49 -0
- package/dist/core/muestreo-restringido.d.ts.map +1 -0
- package/dist/core/muestreo-restringido.js +65 -0
- package/dist/core/muestreo-restringido.js.map +1 -0
- package/dist/core/orphan-process-journal.d.ts +48 -0
- package/dist/core/orphan-process-journal.d.ts.map +1 -0
- package/dist/core/orphan-process-journal.js +116 -0
- package/dist/core/orphan-process-journal.js.map +1 -0
- package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
- package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
- package/dist/core/privacidad/categorias-especiales.js +745 -0
- package/dist/core/privacidad/categorias-especiales.js.map +1 -0
- package/dist/core/privacidad/tapar.d.ts +48 -0
- package/dist/core/privacidad/tapar.d.ts.map +1 -0
- package/dist/core/privacidad/tapar.js +66 -0
- package/dist/core/privacidad/tapar.js.map +1 -0
- package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
- package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
- package/dist/core/prompt-cache/diagnostics.js +100 -0
- package/dist/core/prompt-cache/diagnostics.js.map +1 -0
- package/dist/core/prompt-cache/index.d.ts +33 -0
- package/dist/core/prompt-cache/index.d.ts.map +1 -0
- package/dist/core/prompt-cache/index.js +189 -0
- package/dist/core/prompt-cache/index.js.map +1 -0
- package/dist/core/prompt-cache/payload.d.ts +58 -0
- package/dist/core/prompt-cache/payload.d.ts.map +1 -0
- package/dist/core/prompt-cache/payload.js +122 -0
- package/dist/core/prompt-cache/payload.js.map +1 -0
- package/dist/core/prompt-cache/stabilize.d.ts +65 -0
- package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
- package/dist/core/prompt-cache/stabilize.js +137 -0
- package/dist/core/prompt-cache/stabilize.js.map +1 -0
- package/dist/core/prompt-cache/stats.d.ts +55 -0
- package/dist/core/prompt-cache/stats.d.ts.map +1 -0
- package/dist/core/prompt-cache/stats.js +158 -0
- package/dist/core/prompt-cache/stats.js.map +1 -0
- package/dist/core/prompt-eleccion.d.ts +38 -0
- package/dist/core/prompt-eleccion.d.ts.map +1 -0
- package/dist/core/prompt-eleccion.js +46 -0
- package/dist/core/prompt-eleccion.js.map +1 -0
- package/dist/core/prompts/montar.d.ts +75 -0
- package/dist/core/prompts/montar.d.ts.map +1 -0
- package/dist/core/prompts/montar.js +146 -0
- package/dist/core/prompts/montar.js.map +1 -0
- package/dist/core/prompts/plantilla.d.ts +54 -0
- package/dist/core/prompts/plantilla.d.ts.map +1 -0
- package/dist/core/prompts/plantilla.js +153 -0
- package/dist/core/prompts/plantilla.js.map +1 -0
- package/dist/core/prompts/sistema.md +134 -0
- package/dist/core/provider-attribution.d.ts +24 -2
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js +24 -42
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/remoto/destino.d.ts +38 -0
- package/dist/core/remoto/destino.d.ts.map +1 -0
- package/dist/core/remoto/destino.js +105 -0
- package/dist/core/remoto/destino.js.map +1 -0
- package/dist/core/remoto/ejecutor.d.ts +59 -0
- package/dist/core/remoto/ejecutor.d.ts.map +1 -0
- package/dist/core/remoto/ejecutor.js +225 -0
- package/dist/core/remoto/ejecutor.js.map +1 -0
- package/dist/core/remoto/ficheros.d.ts +29 -0
- package/dist/core/remoto/ficheros.d.ts.map +1 -0
- package/dist/core/remoto/ficheros.js +90 -0
- package/dist/core/remoto/ficheros.js.map +1 -0
- package/dist/core/remoto/registro-extension.d.ts +15 -0
- package/dist/core/remoto/registro-extension.d.ts.map +1 -0
- package/dist/core/remoto/registro-extension.js +17 -0
- package/dist/core/remoto/registro-extension.js.map +1 -0
- package/dist/core/remoto/tools.d.ts +28 -0
- package/dist/core/remoto/tools.d.ts.map +1 -0
- package/dist/core/remoto/tools.js +31 -0
- package/dist/core/remoto/tools.js.map +1 -0
- package/dist/core/resource-loader.d.ts +8 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +93 -1
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/revision/hallazgo.d.ts +51 -0
- package/dist/core/revision/hallazgo.d.ts.map +1 -0
- package/dist/core/revision/hallazgo.js +73 -0
- package/dist/core/revision/hallazgo.js.map +1 -0
- package/dist/core/revision/revisor.d.ts +81 -0
- package/dist/core/revision/revisor.d.ts.map +1 -0
- package/dist/core/revision/revisor.js +132 -0
- package/dist/core/revision/revisor.js.map +1 -0
- package/dist/core/revision/sarif.d.ts +30 -0
- package/dist/core/revision/sarif.d.ts.map +1 -0
- package/dist/core/revision/sarif.js +83 -0
- package/dist/core/revision/sarif.js.map +1 -0
- package/dist/core/scheduler/scheduler.d.ts +87 -0
- package/dist/core/scheduler/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler/scheduler.js +178 -0
- package/dist/core/scheduler/scheduler.js.map +1 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
- package/dist/core/settings-manager.d.ts +110 -6
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +53 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +3 -3
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts +17 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +13 -5
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetria/otlp.d.ts +122 -0
- package/dist/core/telemetria/otlp.d.ts.map +1 -0
- package/dist/core/telemetria/otlp.js +373 -0
- package/dist/core/telemetria/otlp.js.map +1 -0
- package/dist/core/tools/coercion-argumentos.d.ts +48 -0
- package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
- package/dist/core/tools/coercion-argumentos.js +99 -0
- package/dist/core/tools/coercion-argumentos.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +0 -7
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +232 -7
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +8 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +5 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/json-tolerante.d.ts +30 -0
- package/dist/core/tools/json-tolerante.d.ts.map +1 -0
- package/dist/core/tools/json-tolerante.js +70 -0
- package/dist/core/tools/json-tolerante.js.map +1 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +17 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +17 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/turno-vacio/detectar.d.ts +38 -0
- package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
- package/dist/core/turno-vacio/detectar.js +66 -0
- package/dist/core/turno-vacio/detectar.js.map +1 -0
- package/dist/core/undo/journal.d.ts +57 -0
- package/dist/core/undo/journal.d.ts.map +1 -0
- package/dist/core/undo/journal.js +178 -0
- package/dist/core/undo/journal.js.map +1 -0
- package/dist/core/urls-internas/auditoria.d.ts +10 -0
- package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
- package/dist/core/urls-internas/auditoria.js +42 -0
- package/dist/core/urls-internas/auditoria.js.map +1 -0
- package/dist/core/urls-internas/boveda.d.ts +13 -0
- package/dist/core/urls-internas/boveda.d.ts.map +1 -0
- package/dist/core/urls-internas/boveda.js +40 -0
- package/dist/core/urls-internas/boveda.js.map +1 -0
- package/dist/core/urls-internas/lector.d.ts +30 -0
- package/dist/core/urls-internas/lector.d.ts.map +1 -0
- package/dist/core/urls-internas/lector.js +56 -0
- package/dist/core/urls-internas/lector.js.map +1 -0
- package/dist/core/urls-internas/memoria.d.ts +11 -0
- package/dist/core/urls-internas/memoria.d.ts.map +1 -0
- package/dist/core/urls-internas/memoria.js +25 -0
- package/dist/core/urls-internas/memoria.js.map +1 -0
- package/dist/core/urls-internas/parse.d.ts +28 -0
- package/dist/core/urls-internas/parse.d.ts.map +1 -0
- package/dist/core/urls-internas/parse.js +32 -0
- package/dist/core/urls-internas/parse.js.map +1 -0
- package/dist/core/urls-internas/reglas.d.ts +10 -0
- package/dist/core/urls-internas/reglas.d.ts.map +1 -0
- package/dist/core/urls-internas/reglas.js +31 -0
- package/dist/core/urls-internas/reglas.js.map +1 -0
- package/dist/core/usage/aggregate.d.ts +68 -0
- package/dist/core/usage/aggregate.d.ts.map +1 -0
- package/dist/core/usage/aggregate.js +93 -0
- package/dist/core/usage/aggregate.js.map +1 -0
- package/dist/core/usage/cuota/anthropic.d.ts +10 -0
- package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
- package/dist/core/usage/cuota/anthropic.js +63 -0
- package/dist/core/usage/cuota/anthropic.js.map +1 -0
- package/dist/core/usage/cuota/cache.d.ts +20 -0
- package/dist/core/usage/cuota/cache.d.ts.map +1 -0
- package/dist/core/usage/cuota/cache.js +36 -0
- package/dist/core/usage/cuota/cache.js.map +1 -0
- package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
- package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
- package/dist/core/usage/cuota/github-copilot.js +67 -0
- package/dist/core/usage/cuota/github-copilot.js.map +1 -0
- package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
- package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
- package/dist/core/usage/cuota/google-gemini.js +72 -0
- package/dist/core/usage/cuota/google-gemini.js.map +1 -0
- package/dist/core/usage/cuota/index.d.ts +25 -0
- package/dist/core/usage/cuota/index.d.ts.map +1 -0
- package/dist/core/usage/cuota/index.js +50 -0
- package/dist/core/usage/cuota/index.js.map +1 -0
- package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
- package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
- package/dist/core/usage/cuota/openai-codex.js +59 -0
- package/dist/core/usage/cuota/openai-codex.js.map +1 -0
- package/dist/core/usage/cuota/openrouter.d.ts +10 -0
- package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
- package/dist/core/usage/cuota/openrouter.js +47 -0
- package/dist/core/usage/cuota/openrouter.js.map +1 -0
- package/dist/core/usage/cuota/tipos.d.ts +50 -0
- package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
- package/dist/core/usage/cuota/tipos.js +25 -0
- package/dist/core/usage/cuota/tipos.js.map +1 -0
- package/dist/core/web/busqueda-nativa.d.ts +82 -0
- package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
- package/dist/core/web/busqueda-nativa.js +163 -0
- package/dist/core/web/busqueda-nativa.js.map +1 -0
- package/dist/core/web/destino.d.ts +58 -0
- package/dist/core/web/destino.d.ts.map +1 -0
- package/dist/core/web/destino.js +127 -0
- package/dist/core/web/destino.js.map +1 -0
- package/dist/core/web/proveedores/brave.d.ts +6 -0
- package/dist/core/web/proveedores/brave.d.ts.map +1 -0
- package/dist/core/web/proveedores/brave.js +20 -0
- package/dist/core/web/proveedores/brave.js.map +1 -0
- package/dist/core/web/proveedores/claves.d.ts +19 -0
- package/dist/core/web/proveedores/claves.d.ts.map +1 -0
- package/dist/core/web/proveedores/claves.js +36 -0
- package/dist/core/web/proveedores/claves.js.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.js +109 -0
- package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
- package/dist/core/web/proveedores/ecosia.d.ts +3 -0
- package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
- package/dist/core/web/proveedores/ecosia.js +72 -0
- package/dist/core/web/proveedores/ecosia.js.map +1 -0
- package/dist/core/web/proveedores/exa.d.ts +6 -0
- package/dist/core/web/proveedores/exa.d.ts.map +1 -0
- package/dist/core/web/proveedores/exa.js +24 -0
- package/dist/core/web/proveedores/exa.js.map +1 -0
- package/dist/core/web/proveedores/mojeek.d.ts +3 -0
- package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
- package/dist/core/web/proveedores/mojeek.js +65 -0
- package/dist/core/web/proveedores/mojeek.js.map +1 -0
- package/dist/core/web/proveedores/navegador.d.ts +10 -0
- package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
- package/dist/core/web/proveedores/navegador.js +13 -0
- package/dist/core/web/proveedores/navegador.js.map +1 -0
- package/dist/core/web/proveedores/registro.d.ts +43 -0
- package/dist/core/web/proveedores/registro.d.ts.map +1 -0
- package/dist/core/web/proveedores/registro.js +49 -0
- package/dist/core/web/proveedores/registro.js.map +1 -0
- package/dist/core/web/proveedores/searxng.d.ts +9 -0
- package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
- package/dist/core/web/proveedores/searxng.js +17 -0
- package/dist/core/web/proveedores/searxng.js.map +1 -0
- package/dist/core/web/proveedores/serper.d.ts +9 -0
- package/dist/core/web/proveedores/serper.d.ts.map +1 -0
- package/dist/core/web/proveedores/serper.js +19 -0
- package/dist/core/web/proveedores/serper.js.map +1 -0
- package/dist/core/web/proveedores/tavily.d.ts +6 -0
- package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
- package/dist/core/web/proveedores/tavily.js +19 -0
- package/dist/core/web/proveedores/tavily.js.map +1 -0
- package/dist/core/web/proveedores/tipos.d.ts +36 -0
- package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
- package/dist/core/web/proveedores/tipos.js +10 -0
- package/dist/core/web/proveedores/tipos.js.map +1 -0
- package/dist/core/web/registro-red.d.ts +43 -0
- package/dist/core/web/registro-red.d.ts.map +1 -0
- package/dist/core/web/registro-red.js +86 -0
- package/dist/core/web/registro-red.js.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.js +38 -0
- package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
- package/dist/core/web/scrapers/crates-io.d.ts +11 -0
- package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
- package/dist/core/web/scrapers/crates-io.js +29 -0
- package/dist/core/web/scrapers/crates-io.js.map +1 -0
- package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
- package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
- package/dist/core/web/scrapers/docs-rs.js +35 -0
- package/dist/core/web/scrapers/docs-rs.js.map +1 -0
- package/dist/core/web/scrapers/github.d.ts +3 -0
- package/dist/core/web/scrapers/github.d.ts.map +1 -0
- package/dist/core/web/scrapers/github.js +72 -0
- package/dist/core/web/scrapers/github.js.map +1 -0
- package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
- package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
- package/dist/core/web/scrapers/go-pkg.js +30 -0
- package/dist/core/web/scrapers/go-pkg.js.map +1 -0
- package/dist/core/web/scrapers/hex.d.ts +6 -0
- package/dist/core/web/scrapers/hex.d.ts.map +1 -0
- package/dist/core/web/scrapers/hex.js +27 -0
- package/dist/core/web/scrapers/hex.js.map +1 -0
- package/dist/core/web/scrapers/maven.d.ts +8 -0
- package/dist/core/web/scrapers/maven.d.ts.map +1 -0
- package/dist/core/web/scrapers/maven.js +41 -0
- package/dist/core/web/scrapers/maven.js.map +1 -0
- package/dist/core/web/scrapers/mdn.d.ts +6 -0
- package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
- package/dist/core/web/scrapers/mdn.js +28 -0
- package/dist/core/web/scrapers/mdn.js.map +1 -0
- package/dist/core/web/scrapers/npm.d.ts +11 -0
- package/dist/core/web/scrapers/npm.d.ts.map +1 -0
- package/dist/core/web/scrapers/npm.js +57 -0
- package/dist/core/web/scrapers/npm.js.map +1 -0
- package/dist/core/web/scrapers/nuget.d.ts +8 -0
- package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
- package/dist/core/web/scrapers/nuget.js +22 -0
- package/dist/core/web/scrapers/nuget.js.map +1 -0
- package/dist/core/web/scrapers/nvd.d.ts +7 -0
- package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
- package/dist/core/web/scrapers/nvd.js +37 -0
- package/dist/core/web/scrapers/nvd.js.map +1 -0
- package/dist/core/web/scrapers/pypi.d.ts +6 -0
- package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
- package/dist/core/web/scrapers/pypi.js +31 -0
- package/dist/core/web/scrapers/pypi.js.map +1 -0
- package/dist/core/web/scrapers/registro.d.ts +13 -0
- package/dist/core/web/scrapers/registro.d.ts.map +1 -0
- package/dist/core/web/scrapers/registro.js +65 -0
- package/dist/core/web/scrapers/registro.js.map +1 -0
- package/dist/core/web/scrapers/rubygems.d.ts +6 -0
- package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
- package/dist/core/web/scrapers/rubygems.js +23 -0
- package/dist/core/web/scrapers/rubygems.js.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.js +46 -0
- package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
- package/dist/core/web/scrapers/tipos.d.ts +42 -0
- package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
- package/dist/core/web/scrapers/tipos.js +23 -0
- package/dist/core/web/scrapers/tipos.js.map +1 -0
- package/dist/core/web/texto.d.ts +10 -0
- package/dist/core/web/texto.d.ts.map +1 -0
- package/dist/core/web/texto.js +26 -0
- package/dist/core/web/texto.js.map +1 -0
- package/dist/core/web/tools.d.ts +91 -0
- package/dist/core/web/tools.d.ts.map +1 -0
- package/dist/core/web/tools.js +304 -0
- package/dist/core/web/tools.js.map +1 -0
- package/dist/core/wiki/almacen.d.ts +33 -0
- package/dist/core/wiki/almacen.d.ts.map +1 -0
- package/dist/core/wiki/almacen.js +93 -0
- package/dist/core/wiki/almacen.js.map +1 -0
- package/dist/core/wiki/citas.d.ts +111 -0
- package/dist/core/wiki/citas.d.ts.map +1 -0
- package/dist/core/wiki/citas.js +146 -0
- package/dist/core/wiki/citas.js.map +1 -0
- package/dist/core/workflows/agent-runner.d.ts +2 -0
- package/dist/core/workflows/agent-runner.d.ts.map +1 -1
- package/dist/core/workflows/agent-runner.js +131 -44
- package/dist/core/workflows/agent-runner.js.map +1 -1
- package/dist/core/workflows/builtins.d.ts.map +1 -1
- package/dist/core/workflows/builtins.js +1 -0
- package/dist/core/workflows/builtins.js.map +1 -1
- package/dist/core/workflows/contrato/esquema.d.ts +32 -0
- package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
- package/dist/core/workflows/contrato/esquema.js +25 -0
- package/dist/core/workflows/contrato/esquema.js.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
- package/dist/core/workflows/contrato/validador.d.ts +30 -0
- package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
- package/dist/core/workflows/contrato/validador.js +56 -0
- package/dist/core/workflows/contrato/validador.js.map +1 -0
- package/dist/core/workflows/contrato/yield.d.ts +65 -0
- package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
- package/dist/core/workflows/contrato/yield.js +80 -0
- package/dist/core/workflows/contrato/yield.js.map +1 -0
- package/dist/core/workflows/goal-engine/engine.d.ts +17 -0
- package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -1
- package/dist/core/workflows/goal-engine/engine.js +41 -0
- package/dist/core/workflows/goal-engine/engine.js.map +1 -1
- package/dist/core/workflows/index.d.ts +8 -0
- package/dist/core/workflows/index.d.ts.map +1 -1
- package/dist/core/workflows/index.js +4 -0
- package/dist/core/workflows/index.js.map +1 -1
- package/dist/core/workflows/manager.d.ts +10 -0
- package/dist/core/workflows/manager.d.ts.map +1 -1
- package/dist/core/workflows/manager.js +35 -11
- package/dist/core/workflows/manager.js.map +1 -1
- package/dist/core/workflows/runtime.d.ts +13 -0
- package/dist/core/workflows/runtime.d.ts.map +1 -1
- package/dist/core/workflows/runtime.js +80 -1
- package/dist/core/workflows/runtime.js.map +1 -1
- package/dist/core/workflows/save-as-skill.d.ts +27 -0
- package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
- package/dist/core/workflows/save-as-skill.js +54 -0
- package/dist/core/workflows/save-as-skill.js.map +1 -0
- package/dist/core/workflows/types.d.ts +49 -0
- package/dist/core/workflows/types.d.ts.map +1 -1
- package/dist/core/workflows/types.js.map +1 -1
- package/dist/extensions/remoto/index.d.ts +22 -0
- package/dist/extensions/remoto/index.d.ts.map +1 -0
- package/dist/extensions/remoto/index.js +54 -0
- package/dist/extensions/remoto/index.js.map +1 -0
- package/dist/index.d.ts +1 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -16
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +6 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts +42 -0
- package/dist/modes/acp/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp/acp-mode.js +190 -0
- package/dist/modes/acp/acp-mode.js.map +1 -0
- package/dist/modes/acp/events.d.ts +74 -0
- package/dist/modes/acp/events.d.ts.map +1 -0
- package/dist/modes/acp/events.js +116 -0
- package/dist/modes/acp/events.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +8 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +41 -7
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +1 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +9 -86
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +8 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +48 -17
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -7
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +137 -146
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +11 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +27 -5
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/server/attach.d.ts +56 -0
- package/dist/server/attach.d.ts.map +1 -0
- package/dist/server/attach.js +130 -0
- package/dist/server/attach.js.map +1 -0
- package/dist/server/extension-ops.d.ts +40 -0
- package/dist/server/extension-ops.d.ts.map +1 -0
- package/dist/server/extension-ops.js +146 -0
- package/dist/server/extension-ops.js.map +1 -0
- package/dist/server/pi-server-service.d.ts +85 -0
- package/dist/server/pi-server-service.d.ts.map +1 -0
- package/dist/server/pi-server-service.js +213 -0
- package/dist/server/pi-server-service.js.map +1 -0
- package/dist/server/scheduler-tick.d.ts +32 -0
- package/dist/server/scheduler-tick.d.ts.map +1 -0
- package/dist/server/scheduler-tick.js +47 -0
- package/dist/server/scheduler-tick.js.map +1 -0
- package/dist/server/serve.d.ts +25 -0
- package/dist/server/serve.d.ts.map +1 -0
- package/dist/server/serve.js +83 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/server/transcript.d.ts +38 -0
- package/dist/server/transcript.d.ts.map +1 -0
- package/dist/server/transcript.js +176 -0
- package/dist/server/transcript.js.map +1 -0
- package/dist/skills/skill-creator/SKILL.md +90 -0
- package/dist/telegram/api.d.ts +75 -0
- package/dist/telegram/api.d.ts.map +1 -0
- package/dist/telegram/api.js +104 -0
- package/dist/telegram/api.js.map +1 -0
- package/dist/telegram/bridge.d.ts +85 -0
- package/dist/telegram/bridge.d.ts.map +1 -0
- package/dist/telegram/bridge.js +182 -0
- package/dist/telegram/bridge.js.map +1 -0
- package/dist/telegram/journal.d.ts +67 -0
- package/dist/telegram/journal.d.ts.map +1 -0
- package/dist/telegram/journal.js +119 -0
- package/dist/telegram/journal.js.map +1 -0
- package/dist/telegram/servidor.d.ts +15 -0
- package/dist/telegram/servidor.d.ts.map +1 -0
- package/dist/telegram/servidor.js +74 -0
- package/dist/telegram/servidor.js.map +1 -0
- package/dist/utils/shell.d.ts +11 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +11 -0
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +29 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +10 -10
- package/docs/compliance.md +241 -0
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +10 -10
- package/docs/development.md +47 -10
- package/docs/docs.json +14 -2
- package/docs/environment-variables.md +20 -17
- package/docs/extensions.md +51 -49
- package/docs/index.md +15 -21
- package/docs/json.md +3 -3
- package/docs/keybindings.md +5 -5
- package/docs/llama-cpp.md +7 -7
- package/docs/models.md +12 -12
- package/docs/packages.md +45 -45
- package/docs/prompt-templates.md +5 -5
- package/docs/providers.md +12 -12
- package/docs/quickstart.md +39 -39
- package/docs/rpc.md +12 -12
- package/docs/sdk.md +38 -38
- package/docs/security.md +26 -21
- package/docs/session-format.md +7 -7
- package/docs/sessions.md +14 -14
- package/docs/settings.md +45 -20
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +11 -11
- package/docs/terminal-setup.md +14 -14
- package/docs/termux.md +7 -7
- package/docs/themes.md +11 -11
- package/docs/tmux.md +4 -4
- package/docs/tui.md +3 -3
- package/docs/usage.md +54 -54
- package/docs/windows.md +2 -2
- package/examples/sdk/12-full-control.ts +9 -0
- package/npm-shrinkwrap.json +35 -251
- package/package.json +10 -4
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Desglose de qué está llenando la ventana de contexto.
|
|
3
|
+
*
|
|
4
|
+
* POR QUÉ IMPORTA AQUÍ MÁS QUE EN OTROS PRODUCTOS: con caché por prefijo, el
|
|
5
|
+
* coste de un cambio depende de su POSICIÓN, no de su tamaño. Saber que las
|
|
6
|
+
* definiciones de tools ocupan 11 K y van delante te dice que tocarlas invalida
|
|
7
|
+
* todo lo que viene detrás. Sin este desglose, optimizar la caché es a ciegas.
|
|
8
|
+
*
|
|
9
|
+
* HONESTIDAD DEL DATO — la parte que las referencias no resuelven:
|
|
10
|
+
*
|
|
11
|
+
* El único número REAL es el total, que lo da el proveedor en el `usage` de la
|
|
12
|
+
* última respuesta. Los trozos se estiman con `chars/4`, que es una heurística.
|
|
13
|
+
* Presentar estimaciones como si fueran medidas sería mentir con precisión
|
|
14
|
+
* falsa, así que:
|
|
15
|
+
*
|
|
16
|
+
* - Si hay total real, se REPARTE ese total según las proporciones estimadas.
|
|
17
|
+
* El total cuadra siempre y el reparto se marca como estimado.
|
|
18
|
+
* - Si no lo hay (recién compactado, antes de la primera respuesta), se
|
|
19
|
+
* devuelve la suma de estimaciones y se dice que TODO es estimado.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Estimación de tokens de un texto.
|
|
23
|
+
*
|
|
24
|
+
* `chars/4` es la misma heurística que ya usa la compactación
|
|
25
|
+
* (`compaction.ts:estimateTokens`). Se mantiene idéntica a propósito: dos
|
|
26
|
+
* estimadores distintos darían cifras que no cuadran entre la barra de contexto
|
|
27
|
+
* y el momento en que salta la compactación, y el usuario no tendría forma de
|
|
28
|
+
* saber cuál creer.
|
|
29
|
+
*/
|
|
30
|
+
export function estimarTokensTexto(texto) {
|
|
31
|
+
return Math.ceil(texto.length / 4);
|
|
32
|
+
}
|
|
33
|
+
function sumar(textos) {
|
|
34
|
+
let total = 0;
|
|
35
|
+
for (const t of textos)
|
|
36
|
+
total += estimarTokensTexto(t);
|
|
37
|
+
return total;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Construye el desglose.
|
|
41
|
+
*
|
|
42
|
+
* Las categorías con cero tokens se omiten: una lista con seis ceros no informa
|
|
43
|
+
* de nada y esconde las dos que sí pesan.
|
|
44
|
+
*/
|
|
45
|
+
export function construirDesglose(entrada) {
|
|
46
|
+
const crudos = [
|
|
47
|
+
["systemPrompt", estimarTokensTexto(entrada.systemPrompt)],
|
|
48
|
+
["toolDefinitions", sumar(entrada.toolDefinitions)],
|
|
49
|
+
["skills", sumar(entrada.skills)],
|
|
50
|
+
["mcpTools", sumar(entrada.mcpTools)],
|
|
51
|
+
["contextFiles", sumar(entrada.contextFiles)],
|
|
52
|
+
["memory", sumar(entrada.memory)],
|
|
53
|
+
["conversation", Math.max(0, entrada.conversationTokens)],
|
|
54
|
+
];
|
|
55
|
+
const sumaEstimada = crudos.reduce((s, [, n]) => s + n, 0);
|
|
56
|
+
const totalExacto = entrada.tokensReales !== null && entrada.tokensReales > 0;
|
|
57
|
+
const total = totalExacto ? entrada.tokensReales : sumaEstimada;
|
|
58
|
+
// Reparto proporcional sobre el total real. Si la suma estimada es cero no se
|
|
59
|
+
// puede repartir nada: se devuelven las piezas a cero en vez de dividir por
|
|
60
|
+
// cero y producir NaN, que en la interfaz se vería como "—" o como 0 aleatorio.
|
|
61
|
+
const escala = totalExacto && sumaEstimada > 0 ? entrada.tokensReales / sumaEstimada : 1;
|
|
62
|
+
const piezas = crudos
|
|
63
|
+
.filter(([, n]) => n > 0)
|
|
64
|
+
.map(([categoria, n]) => {
|
|
65
|
+
const tokens = Math.round(n * escala);
|
|
66
|
+
return { categoria, tokens, fraccion: total > 0 ? tokens / total : 0 };
|
|
67
|
+
})
|
|
68
|
+
.sort((a, b) => b.tokens - a.tokens);
|
|
69
|
+
return {
|
|
70
|
+
total,
|
|
71
|
+
contextWindow: entrada.contextWindow,
|
|
72
|
+
ocupacion: entrada.contextWindow > 0 ? Math.min(1, total / entrada.contextWindow) : 0,
|
|
73
|
+
totalExacto,
|
|
74
|
+
piezas,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Etiquetas legibles. La interfaz traduce; esto es el orden y el nombre canónico. */
|
|
78
|
+
export const ETIQUETAS_CONTEXTO = {
|
|
79
|
+
systemPrompt: "System prompt",
|
|
80
|
+
toolDefinitions: "Tool definitions",
|
|
81
|
+
skills: "Skills",
|
|
82
|
+
mcpTools: "MCP tools",
|
|
83
|
+
contextFiles: "Context files",
|
|
84
|
+
memory: "Memory",
|
|
85
|
+
conversation: "Conversation",
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=context-breakdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-breakdown.js","sourceRoot":"","sources":["../../src/core/context-breakdown.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Desglose de qué está llenando la ventana de contexto.\n *\n * POR QUÉ IMPORTA AQUÍ MÁS QUE EN OTROS PRODUCTOS: con caché por prefijo, el\n * coste de un cambio depende de su POSICIÓN, no de su tamaño. Saber que las\n * definiciones de tools ocupan 11 K y van delante te dice que tocarlas invalida\n * todo lo que viene detrás. Sin este desglose, optimizar la caché es a ciegas.\n *\n * HONESTIDAD DEL DATO — la parte que las referencias no resuelven:\n *\n * El único número REAL es el total, que lo da el proveedor en el `usage` de la\n * última respuesta. Los trozos se estiman con `chars/4`, que es una heurística.\n * Presentar estimaciones como si fueran medidas sería mentir con precisión\n * falsa, así que:\n *\n * - Si hay total real, se REPARTE ese total según las proporciones estimadas.\n * El total cuadra siempre y el reparto se marca como estimado.\n * - Si no lo hay (recién compactado, antes de la primera respuesta), se\n * devuelve la suma de estimaciones y se dice que TODO es estimado.\n */\n\n/** Categorías. El orden es el del prompt: lo estable primero. */\nexport type CategoriaContexto =\n\t| \"systemPrompt\"\n\t| \"toolDefinitions\"\n\t| \"skills\"\n\t| \"mcpTools\"\n\t| \"contextFiles\"\n\t| \"memory\"\n\t| \"conversation\";\n\nexport interface PiezaContexto {\n\tcategoria: CategoriaContexto;\n\t/** Tokens atribuidos. Estimados salvo que `exacto` sea true. */\n\ttokens: number;\n\t/** Fracción del total, entre 0 y 1. */\n\tfraccion: number;\n}\n\nexport interface DesgloseContexto {\n\t/** Total de tokens en contexto. Exacto si vino del proveedor. */\n\ttotal: number;\n\tcontextWindow: number;\n\t/** Fracción de la ventana ocupada, entre 0 y 1. */\n\tocupacion: number;\n\t/**\n\t * True cuando `total` viene del `usage` del proveedor. False significa que\n\t * todo el desglose, total incluido, es una estimación.\n\t */\n\ttotalExacto: boolean;\n\tpiezas: PiezaContexto[];\n}\n\n/**\n * Estimación de tokens de un texto.\n *\n * `chars/4` es la misma heurística que ya usa la compactación\n * (`compaction.ts:estimateTokens`). Se mantiene idéntica a propósito: dos\n * estimadores distintos darían cifras que no cuadran entre la barra de contexto\n * y el momento en que salta la compactación, y el usuario no tendría forma de\n * saber cuál creer.\n */\nexport function estimarTokensTexto(texto: string): number {\n\treturn Math.ceil(texto.length / 4);\n}\n\nexport interface EntradaDesglose {\n\tcontextWindow: number;\n\t/** Tokens reales del proveedor. `null` = desconocido (p. ej. tras compactar). */\n\ttokensReales: number | null;\n\tsystemPrompt: string;\n\t/** Nombre + descripción + esquema serializado de cada tool. */\n\ttoolDefinitions: string[];\n\t/** Nombre + descripción de cada skill visible para el modelo. */\n\tskills: string[];\n\t/** Definiciones de tools MCP, aparte porque son las que más se disparan. */\n\tmcpTools: string[];\n\t/** Ficheros de contexto inyectados (AGENTS.md y compañía). */\n\tcontextFiles: string[];\n\t/** Bloques de memoria inyectados. */\n\tmemory: string[];\n\t/** Tokens de la conversación, ya estimados por el llamante. */\n\tconversationTokens: number;\n}\n\nfunction sumar(textos: string[]): number {\n\tlet total = 0;\n\tfor (const t of textos) total += estimarTokensTexto(t);\n\treturn total;\n}\n\n/**\n * Construye el desglose.\n *\n * Las categorías con cero tokens se omiten: una lista con seis ceros no informa\n * de nada y esconde las dos que sí pesan.\n */\nexport function construirDesglose(entrada: EntradaDesglose): DesgloseContexto {\n\tconst crudos: Array<[CategoriaContexto, number]> = [\n\t\t[\"systemPrompt\", estimarTokensTexto(entrada.systemPrompt)],\n\t\t[\"toolDefinitions\", sumar(entrada.toolDefinitions)],\n\t\t[\"skills\", sumar(entrada.skills)],\n\t\t[\"mcpTools\", sumar(entrada.mcpTools)],\n\t\t[\"contextFiles\", sumar(entrada.contextFiles)],\n\t\t[\"memory\", sumar(entrada.memory)],\n\t\t[\"conversation\", Math.max(0, entrada.conversationTokens)],\n\t];\n\n\tconst sumaEstimada = crudos.reduce((s, [, n]) => s + n, 0);\n\tconst totalExacto = entrada.tokensReales !== null && entrada.tokensReales > 0;\n\tconst total = totalExacto ? (entrada.tokensReales as number) : sumaEstimada;\n\n\t// Reparto proporcional sobre el total real. Si la suma estimada es cero no se\n\t// puede repartir nada: se devuelven las piezas a cero en vez de dividir por\n\t// cero y producir NaN, que en la interfaz se vería como \"—\" o como 0 aleatorio.\n\tconst escala = totalExacto && sumaEstimada > 0 ? (entrada.tokensReales as number) / sumaEstimada : 1;\n\n\tconst piezas: PiezaContexto[] = crudos\n\t\t.filter(([, n]) => n > 0)\n\t\t.map(([categoria, n]) => {\n\t\t\tconst tokens = Math.round(n * escala);\n\t\t\treturn { categoria, tokens, fraccion: total > 0 ? tokens / total : 0 };\n\t\t})\n\t\t.sort((a, b) => b.tokens - a.tokens);\n\n\treturn {\n\t\ttotal,\n\t\tcontextWindow: entrada.contextWindow,\n\t\tocupacion: entrada.contextWindow > 0 ? Math.min(1, total / entrada.contextWindow) : 0,\n\t\ttotalExacto,\n\t\tpiezas,\n\t};\n}\n\n/** Etiquetas legibles. La interfaz traduce; esto es el orden y el nombre canónico. */\nexport const ETIQUETAS_CONTEXTO: Record<CategoriaContexto, string> = {\n\tsystemPrompt: \"System prompt\",\n\ttoolDefinitions: \"Tool definitions\",\n\tskills: \"Skills\",\n\tmcpTools: \"MCP tools\",\n\tcontextFiles: \"Context files\",\n\tmemory: \"Memory\",\n\tconversation: \"Conversation\",\n};\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cliente del broker de credenciales.
|
|
3
|
+
*
|
|
4
|
+
* Regla de diseño, y es la que hace verificable "el cliente no tiene el token
|
|
5
|
+
* en su proceso": el secreto que devuelve `resolverCredencial` NUNCA se asigna
|
|
6
|
+
* a un campo de esta clase. Sale de la función, el llamador decide qué hacer
|
|
7
|
+
* con él, y esta instancia no guarda nada más que la URL y el bearer del
|
|
8
|
+
* broker (que no son el secreto de ningún proveedor). Ningún método escribe a
|
|
9
|
+
* disco — la credencial vive, como mucho, en la pila de quien la usó para una
|
|
10
|
+
* sola petición.
|
|
11
|
+
*/
|
|
12
|
+
export interface OpcionesClienteBroker {
|
|
13
|
+
url: string;
|
|
14
|
+
token: string;
|
|
15
|
+
/** Nombre identificador de este cliente, para que el libro de sesión diga quién pidió qué. */
|
|
16
|
+
cliente?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface CredencialResuelta {
|
|
19
|
+
id: string;
|
|
20
|
+
valor: string;
|
|
21
|
+
}
|
|
22
|
+
export type ResultadoDeUso = {
|
|
23
|
+
ok: true;
|
|
24
|
+
} | {
|
|
25
|
+
ok: false;
|
|
26
|
+
estadoHttp?: number;
|
|
27
|
+
mensaje: string;
|
|
28
|
+
};
|
|
29
|
+
export interface EfectoDeUso {
|
|
30
|
+
clase: string;
|
|
31
|
+
estado: "activa" | "bloqueada";
|
|
32
|
+
}
|
|
33
|
+
export interface FilaSnapshot {
|
|
34
|
+
id: string;
|
|
35
|
+
proveedor: string;
|
|
36
|
+
estado: "activa" | "bloqueada";
|
|
37
|
+
motivoBloqueo?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare class ClienteBroker {
|
|
40
|
+
private readonly url;
|
|
41
|
+
private readonly token;
|
|
42
|
+
private readonly nombreCliente?;
|
|
43
|
+
constructor(opciones: OpcionesClienteBroker);
|
|
44
|
+
private cabeceras;
|
|
45
|
+
/**
|
|
46
|
+
* Pide una credencial al broker y la devuelve para uso inmediato.
|
|
47
|
+
*
|
|
48
|
+
* `null` = el broker no tiene ninguna credencial activa para ese proveedor
|
|
49
|
+
* (todas bloqueadas, o proveedor sin dar de alta) — "no hay nada", que se
|
|
50
|
+
* distingue de una excepción, que es "no he podido hablar con el broker".
|
|
51
|
+
*/
|
|
52
|
+
resolverCredencial(proveedor: string, promptCacheKey?: string): Promise<CredencialResuelta | null>;
|
|
53
|
+
/** Reporta cómo fue usar una credencial ya entregada. El broker distingue 401 de 429 con esto. */
|
|
54
|
+
reportarUso(id: string, resultado: ResultadoDeUso): Promise<EfectoDeUso | null>;
|
|
55
|
+
/** Vista del pool sin secretos: qué credenciales hay y en qué estado. */
|
|
56
|
+
snapshot(): Promise<FilaSnapshot[]>;
|
|
57
|
+
/** Liveness sin bearer. `false` en cualquier fallo de red, no lanza. */
|
|
58
|
+
salud(): Promise<boolean>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=cliente.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliente.d.ts","sourceRoot":"","sources":["../../../src/core/credenciales/cliente.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,qBAAqB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,kGAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhG,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IAExC,YAAY,QAAQ,EAAE,qBAAqB,EAI1C;IAED,OAAO,CAAC,SAAS;IAIjB;;;;;;OAMG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAcvG;IAED,mGAAkG;IAC5F,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAWpF;IAED,2EAAyE;IACnE,QAAQ,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAOxC;IAED,wEAAwE;IAClE,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAO9B;CACD","sourcesContent":["/**\n * Cliente del broker de credenciales.\n *\n * Regla de diseño, y es la que hace verificable \"el cliente no tiene el token\n * en su proceso\": el secreto que devuelve `resolverCredencial` NUNCA se asigna\n * a un campo de esta clase. Sale de la función, el llamador decide qué hacer\n * con él, y esta instancia no guarda nada más que la URL y el bearer del\n * broker (que no son el secreto de ningún proveedor). Ningún método escribe a\n * disco — la credencial vive, como mucho, en la pila de quien la usó para una\n * sola petición.\n */\n\nexport interface OpcionesClienteBroker {\n\turl: string;\n\ttoken: string;\n\t/** Nombre identificador de este cliente, para que el libro de sesión diga quién pidió qué. */\n\tcliente?: string;\n}\n\nexport interface CredencialResuelta {\n\tid: string;\n\tvalor: string;\n}\n\nexport type ResultadoDeUso = { ok: true } | { ok: false; estadoHttp?: number; mensaje: string };\n\nexport interface EfectoDeUso {\n\tclase: string;\n\testado: \"activa\" | \"bloqueada\";\n}\n\nexport interface FilaSnapshot {\n\tid: string;\n\tproveedor: string;\n\testado: \"activa\" | \"bloqueada\";\n\tmotivoBloqueo?: string;\n}\n\nexport class ClienteBroker {\n\tprivate readonly url: string;\n\tprivate readonly token: string;\n\tprivate readonly nombreCliente?: string;\n\n\tconstructor(opciones: OpcionesClienteBroker) {\n\t\tthis.url = opciones.url.replace(/\\/$/, \"\");\n\t\tthis.token = opciones.token;\n\t\tthis.nombreCliente = opciones.cliente;\n\t}\n\n\tprivate cabeceras(): Record<string, string> {\n\t\treturn { \"content-type\": \"application/json\", authorization: `Bearer ${this.token}` };\n\t}\n\n\t/**\n\t * Pide una credencial al broker y la devuelve para uso inmediato.\n\t *\n\t * `null` = el broker no tiene ninguna credencial activa para ese proveedor\n\t * (todas bloqueadas, o proveedor sin dar de alta) — \"no hay nada\", que se\n\t * distingue de una excepción, que es \"no he podido hablar con el broker\".\n\t */\n\tasync resolverCredencial(proveedor: string, promptCacheKey?: string): Promise<CredencialResuelta | null> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/credential`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: this.cabeceras(),\n\t\t\tbody: JSON.stringify({ proveedor, promptCacheKey, cliente: this.nombreCliente }),\n\t\t});\n\t\tif (respuesta.status === 404) return null;\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/credential: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\tconst datos = (await respuesta.json()) as { id: string; valor: string };\n\t\t// Deliberado: no `this.ultimaCredencial = datos` ni nada parecido. El\n\t\t// valor cruza esta función y desaparece de aquí.\n\t\treturn { id: datos.id, valor: datos.valor };\n\t}\n\n\t/** Reporta cómo fue usar una credencial ya entregada. El broker distingue 401 de 429 con esto. */\n\tasync reportarUso(id: string, resultado: ResultadoDeUso): Promise<EfectoDeUso | null> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/usage`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: this.cabeceras(),\n\t\t\tbody: JSON.stringify({ id, ...resultado }),\n\t\t});\n\t\tif (respuesta.status === 404) return null;\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/usage: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\treturn (await respuesta.json()) as EfectoDeUso;\n\t}\n\n\t/** Vista del pool sin secretos: qué credenciales hay y en qué estado. */\n\tasync snapshot(): Promise<FilaSnapshot[]> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/snapshot`, { headers: this.cabeceras() });\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/snapshot: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\tconst datos = (await respuesta.json()) as { credenciales: FilaSnapshot[] };\n\t\treturn datos.credenciales;\n\t}\n\n\t/** Liveness sin bearer. `false` en cualquier fallo de red, no lanza. */\n\tasync salud(): Promise<boolean> {\n\t\ttry {\n\t\t\tconst respuesta = await fetch(`${this.url}/v1/health`);\n\t\t\treturn respuesta.ok;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cliente del broker de credenciales.
|
|
3
|
+
*
|
|
4
|
+
* Regla de diseño, y es la que hace verificable "el cliente no tiene el token
|
|
5
|
+
* en su proceso": el secreto que devuelve `resolverCredencial` NUNCA se asigna
|
|
6
|
+
* a un campo de esta clase. Sale de la función, el llamador decide qué hacer
|
|
7
|
+
* con él, y esta instancia no guarda nada más que la URL y el bearer del
|
|
8
|
+
* broker (que no son el secreto de ningún proveedor). Ningún método escribe a
|
|
9
|
+
* disco — la credencial vive, como mucho, en la pila de quien la usó para una
|
|
10
|
+
* sola petición.
|
|
11
|
+
*/
|
|
12
|
+
export class ClienteBroker {
|
|
13
|
+
url;
|
|
14
|
+
token;
|
|
15
|
+
nombreCliente;
|
|
16
|
+
constructor(opciones) {
|
|
17
|
+
this.url = opciones.url.replace(/\/$/, "");
|
|
18
|
+
this.token = opciones.token;
|
|
19
|
+
this.nombreCliente = opciones.cliente;
|
|
20
|
+
}
|
|
21
|
+
cabeceras() {
|
|
22
|
+
return { "content-type": "application/json", authorization: `Bearer ${this.token}` };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Pide una credencial al broker y la devuelve para uso inmediato.
|
|
26
|
+
*
|
|
27
|
+
* `null` = el broker no tiene ninguna credencial activa para ese proveedor
|
|
28
|
+
* (todas bloqueadas, o proveedor sin dar de alta) — "no hay nada", que se
|
|
29
|
+
* distingue de una excepción, que es "no he podido hablar con el broker".
|
|
30
|
+
*/
|
|
31
|
+
async resolverCredencial(proveedor, promptCacheKey) {
|
|
32
|
+
const respuesta = await fetch(`${this.url}/v1/credential`, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: this.cabeceras(),
|
|
35
|
+
body: JSON.stringify({ proveedor, promptCacheKey, cliente: this.nombreCliente }),
|
|
36
|
+
});
|
|
37
|
+
if (respuesta.status === 404)
|
|
38
|
+
return null;
|
|
39
|
+
if (!respuesta.ok) {
|
|
40
|
+
throw new Error(`broker /v1/credential: ${respuesta.status} ${await respuesta.text()}`);
|
|
41
|
+
}
|
|
42
|
+
const datos = (await respuesta.json());
|
|
43
|
+
// Deliberado: no `this.ultimaCredencial = datos` ni nada parecido. El
|
|
44
|
+
// valor cruza esta función y desaparece de aquí.
|
|
45
|
+
return { id: datos.id, valor: datos.valor };
|
|
46
|
+
}
|
|
47
|
+
/** Reporta cómo fue usar una credencial ya entregada. El broker distingue 401 de 429 con esto. */
|
|
48
|
+
async reportarUso(id, resultado) {
|
|
49
|
+
const respuesta = await fetch(`${this.url}/v1/usage`, {
|
|
50
|
+
method: "POST",
|
|
51
|
+
headers: this.cabeceras(),
|
|
52
|
+
body: JSON.stringify({ id, ...resultado }),
|
|
53
|
+
});
|
|
54
|
+
if (respuesta.status === 404)
|
|
55
|
+
return null;
|
|
56
|
+
if (!respuesta.ok) {
|
|
57
|
+
throw new Error(`broker /v1/usage: ${respuesta.status} ${await respuesta.text()}`);
|
|
58
|
+
}
|
|
59
|
+
return (await respuesta.json());
|
|
60
|
+
}
|
|
61
|
+
/** Vista del pool sin secretos: qué credenciales hay y en qué estado. */
|
|
62
|
+
async snapshot() {
|
|
63
|
+
const respuesta = await fetch(`${this.url}/v1/snapshot`, { headers: this.cabeceras() });
|
|
64
|
+
if (!respuesta.ok) {
|
|
65
|
+
throw new Error(`broker /v1/snapshot: ${respuesta.status} ${await respuesta.text()}`);
|
|
66
|
+
}
|
|
67
|
+
const datos = (await respuesta.json());
|
|
68
|
+
return datos.credenciales;
|
|
69
|
+
}
|
|
70
|
+
/** Liveness sin bearer. `false` en cualquier fallo de red, no lanza. */
|
|
71
|
+
async salud() {
|
|
72
|
+
try {
|
|
73
|
+
const respuesta = await fetch(`${this.url}/v1/health`);
|
|
74
|
+
return respuesta.ok;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=cliente.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliente.js","sourceRoot":"","sources":["../../../src/core/credenciales/cliente.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cliente del broker de credenciales.\n *\n * Regla de diseño, y es la que hace verificable \"el cliente no tiene el token\n * en su proceso\": el secreto que devuelve `resolverCredencial` NUNCA se asigna\n * a un campo de esta clase. Sale de la función, el llamador decide qué hacer\n * con él, y esta instancia no guarda nada más que la URL y el bearer del\n * broker (que no son el secreto de ningún proveedor). Ningún método escribe a\n * disco — la credencial vive, como mucho, en la pila de quien la usó para una\n * sola petición.\n */\n\nexport interface OpcionesClienteBroker {\n\turl: string;\n\ttoken: string;\n\t/** Nombre identificador de este cliente, para que el libro de sesión diga quién pidió qué. */\n\tcliente?: string;\n}\n\nexport interface CredencialResuelta {\n\tid: string;\n\tvalor: string;\n}\n\nexport type ResultadoDeUso = { ok: true } | { ok: false; estadoHttp?: number; mensaje: string };\n\nexport interface EfectoDeUso {\n\tclase: string;\n\testado: \"activa\" | \"bloqueada\";\n}\n\nexport interface FilaSnapshot {\n\tid: string;\n\tproveedor: string;\n\testado: \"activa\" | \"bloqueada\";\n\tmotivoBloqueo?: string;\n}\n\nexport class ClienteBroker {\n\tprivate readonly url: string;\n\tprivate readonly token: string;\n\tprivate readonly nombreCliente?: string;\n\n\tconstructor(opciones: OpcionesClienteBroker) {\n\t\tthis.url = opciones.url.replace(/\\/$/, \"\");\n\t\tthis.token = opciones.token;\n\t\tthis.nombreCliente = opciones.cliente;\n\t}\n\n\tprivate cabeceras(): Record<string, string> {\n\t\treturn { \"content-type\": \"application/json\", authorization: `Bearer ${this.token}` };\n\t}\n\n\t/**\n\t * Pide una credencial al broker y la devuelve para uso inmediato.\n\t *\n\t * `null` = el broker no tiene ninguna credencial activa para ese proveedor\n\t * (todas bloqueadas, o proveedor sin dar de alta) — \"no hay nada\", que se\n\t * distingue de una excepción, que es \"no he podido hablar con el broker\".\n\t */\n\tasync resolverCredencial(proveedor: string, promptCacheKey?: string): Promise<CredencialResuelta | null> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/credential`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: this.cabeceras(),\n\t\t\tbody: JSON.stringify({ proveedor, promptCacheKey, cliente: this.nombreCliente }),\n\t\t});\n\t\tif (respuesta.status === 404) return null;\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/credential: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\tconst datos = (await respuesta.json()) as { id: string; valor: string };\n\t\t// Deliberado: no `this.ultimaCredencial = datos` ni nada parecido. El\n\t\t// valor cruza esta función y desaparece de aquí.\n\t\treturn { id: datos.id, valor: datos.valor };\n\t}\n\n\t/** Reporta cómo fue usar una credencial ya entregada. El broker distingue 401 de 429 con esto. */\n\tasync reportarUso(id: string, resultado: ResultadoDeUso): Promise<EfectoDeUso | null> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/usage`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: this.cabeceras(),\n\t\t\tbody: JSON.stringify({ id, ...resultado }),\n\t\t});\n\t\tif (respuesta.status === 404) return null;\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/usage: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\treturn (await respuesta.json()) as EfectoDeUso;\n\t}\n\n\t/** Vista del pool sin secretos: qué credenciales hay y en qué estado. */\n\tasync snapshot(): Promise<FilaSnapshot[]> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/snapshot`, { headers: this.cabeceras() });\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/snapshot: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\tconst datos = (await respuesta.json()) as { credenciales: FilaSnapshot[] };\n\t\treturn datos.credenciales;\n\t}\n\n\t/** Liveness sin bearer. `false` en cualquier fallo de red, no lanza. */\n\tasync salud(): Promise<boolean> {\n\t\ttry {\n\t\t\tconst respuesta = await fetch(`${this.url}/v1/health`);\n\t\t\treturn respuesta.ok;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Piscina de credenciales por proveedor.
|
|
3
|
+
*
|
|
4
|
+
* El hueco que esto tapa: hoy cada desarrollador tiene sus claves en su propio
|
|
5
|
+
* portátil. `oh-my-pi` (packages/ai/src/auth-broker de ese repo) resuelve esto
|
|
6
|
+
* con un servidor que guarda las credenciales y las reparte; lo que se copia
|
|
7
|
+
* aquí de su diseño son dos decisiones concretas, no el código:
|
|
8
|
+
*
|
|
9
|
+
* 1. **Conmutación a una hermana cuando una cuenta falla de verdad.** Un 401
|
|
10
|
+
* (`credencial-invalida` o `sin-credencial` en la taxonomía de
|
|
11
|
+
* `../errores/proveedor.ts`) saca la credencial del pool: la siguiente
|
|
12
|
+
* petición usa otra. Un 429 (`limite-de-tasa`) NO la saca — la cuenta sigue
|
|
13
|
+
* siendo buena, solo está ocupada un rato. Confundir los dos es el fallo
|
|
14
|
+
* que quema cuentas sanas: se ha visto documentado en el propio
|
|
15
|
+
* `errores/proveedor.ts` como el error más caro de mezclar.
|
|
16
|
+
* 2. **Pegajosidad por sesión vía `prompt_cache_key`.** Sin esto, repartir
|
|
17
|
+
* entre cuentas rompería el caché de prompts del proveedor en cada turno —
|
|
18
|
+
* cada petición de la misma conversación pagaría el prefijo entero de
|
|
19
|
+
* nuevo. Una `prompt_cache_key` se queda pegada a la misma credencial
|
|
20
|
+
* mientras esa credencial siga activa; solo se realoja cuando la que tenía
|
|
21
|
+
* pegada se bloquea.
|
|
22
|
+
*
|
|
23
|
+
* Lo que NO se copia: el pool vive en memoria del proceso `ada-cli serve
|
|
24
|
+
* --broker`, no en SQLite. Reiniciar el broker olvida qué estaba bloqueado y
|
|
25
|
+
* la pegajosidad — aceptable para el alcance de hoy (equipos pequeños, un
|
|
26
|
+
* broker por equipo); si hace falta sobrevivir a reinicios, el punto de
|
|
27
|
+
* extensión es cargar/guardar `estado()` a un fichero en `iniciar`/`cerrar`.
|
|
28
|
+
*/
|
|
29
|
+
/** Una credencial tal como la da quien configura el pool: sin estado todavía. */
|
|
30
|
+
export interface CredencialDelPool {
|
|
31
|
+
id: string;
|
|
32
|
+
proveedor: string;
|
|
33
|
+
valor: string;
|
|
34
|
+
}
|
|
35
|
+
export type EstadoCredencial = "activa" | "bloqueada";
|
|
36
|
+
/** Lo que se le enseña a un cliente que pide credencial: el secreto, para usarlo. */
|
|
37
|
+
export interface CredencialElegida {
|
|
38
|
+
id: string;
|
|
39
|
+
proveedor: string;
|
|
40
|
+
valor: string;
|
|
41
|
+
}
|
|
42
|
+
/** Lo que reporta el cliente tras usar una credencial. */
|
|
43
|
+
export type ResultadoDeUso = {
|
|
44
|
+
ok: true;
|
|
45
|
+
} | {
|
|
46
|
+
ok: false;
|
|
47
|
+
estadoHttp?: number;
|
|
48
|
+
mensaje: string;
|
|
49
|
+
};
|
|
50
|
+
/** Lo que devuelve `marcarUso`: la clase de error (o "ok") y el estado resultante. */
|
|
51
|
+
export interface EfectoDeUso {
|
|
52
|
+
clase: string;
|
|
53
|
+
estado: EstadoCredencial;
|
|
54
|
+
}
|
|
55
|
+
/** Fila sin el secreto — lo que se puede enseñar por `/v1/snapshot` sin filtrar nada. */
|
|
56
|
+
export interface FilaPublica {
|
|
57
|
+
id: string;
|
|
58
|
+
proveedor: string;
|
|
59
|
+
estado: EstadoCredencial;
|
|
60
|
+
motivoBloqueo?: string;
|
|
61
|
+
}
|
|
62
|
+
export declare class CredencialPool {
|
|
63
|
+
private readonly porId;
|
|
64
|
+
private readonly porProveedor;
|
|
65
|
+
/** `proveedor\0promptCacheKey` -> id de la credencial pegada a esa sesión. */
|
|
66
|
+
private readonly pegajosidad;
|
|
67
|
+
/** Cursor de reparto round-robin por proveedor, para las peticiones sin pegajosidad. */
|
|
68
|
+
private readonly cursores;
|
|
69
|
+
constructor(credenciales: Record<string, CredencialDelPool[]>);
|
|
70
|
+
private clavePegajosidad;
|
|
71
|
+
private siguiente;
|
|
72
|
+
/**
|
|
73
|
+
* Elige una credencial activa para `proveedor`.
|
|
74
|
+
*
|
|
75
|
+
* Sin `promptCacheKey`: reparto round-robin entre las activas. Con
|
|
76
|
+
* `promptCacheKey`: si la sesión ya tenía una credencial pegada y sigue
|
|
77
|
+
* activa, se reutiliza (no rompe el caché de prompts); si no, se elige una
|
|
78
|
+
* nueva y se fija para las próximas llamadas con la misma clave.
|
|
79
|
+
*
|
|
80
|
+
* `null` = no hay ninguna credencial activa para ese proveedor. Es "no hay
|
|
81
|
+
* nada", no "no he podido" — todas las filas existen, todas están
|
|
82
|
+
* bloqueadas, y decirlo así es lo que distingue esto de un fallo del pool.
|
|
83
|
+
*/
|
|
84
|
+
elegir(proveedor: string, promptCacheKey?: string): CredencialElegida | null;
|
|
85
|
+
/**
|
|
86
|
+
* Registra el resultado de usar una credencial ya entregada.
|
|
87
|
+
*
|
|
88
|
+
* `null` = id desconocido (no hay tal credencial en el pool) — se distingue
|
|
89
|
+
* de "la marcó y sigue activa" para que quien llama pueda contestar 404 en
|
|
90
|
+
* vez de fingir un 200.
|
|
91
|
+
*/
|
|
92
|
+
marcarUso(id: string, resultado: ResultadoDeUso): EfectoDeUso | null;
|
|
93
|
+
/** Vista pública del pool: sin secretos, para `/v1/snapshot`. */
|
|
94
|
+
snapshot(): FilaPublica[];
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../src/core/credenciales/pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,kFAAiF;AACjF,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,WAAW,CAAC;AAQtD,sFAAqF;AACrF,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,0DAA0D;AAC1D,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhG,sFAAsF;AACtF,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;CACzB;AAED,4FAAyF;AACzF,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,+EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD,YAAY,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,EAM5D;IAED,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,SAAS;IAMjB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAqB3E;IAED;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,WAAW,GAAG,IAAI,CAyBnE;IAED,kEAAiE;IACjE,QAAQ,IAAI,WAAW,EAAE,CAOxB;CACD","sourcesContent":["/**\n * Piscina de credenciales por proveedor.\n *\n * El hueco que esto tapa: hoy cada desarrollador tiene sus claves en su propio\n * portátil. `oh-my-pi` (packages/ai/src/auth-broker de ese repo) resuelve esto\n * con un servidor que guarda las credenciales y las reparte; lo que se copia\n * aquí de su diseño son dos decisiones concretas, no el código:\n *\n * 1. **Conmutación a una hermana cuando una cuenta falla de verdad.** Un 401\n * (`credencial-invalida` o `sin-credencial` en la taxonomía de\n * `../errores/proveedor.ts`) saca la credencial del pool: la siguiente\n * petición usa otra. Un 429 (`limite-de-tasa`) NO la saca — la cuenta sigue\n * siendo buena, solo está ocupada un rato. Confundir los dos es el fallo\n * que quema cuentas sanas: se ha visto documentado en el propio\n * `errores/proveedor.ts` como el error más caro de mezclar.\n * 2. **Pegajosidad por sesión vía `prompt_cache_key`.** Sin esto, repartir\n * entre cuentas rompería el caché de prompts del proveedor en cada turno —\n * cada petición de la misma conversación pagaría el prefijo entero de\n * nuevo. Una `prompt_cache_key` se queda pegada a la misma credencial\n * mientras esa credencial siga activa; solo se realoja cuando la que tenía\n * pegada se bloquea.\n *\n * Lo que NO se copia: el pool vive en memoria del proceso `ada-cli serve\n * --broker`, no en SQLite. Reiniciar el broker olvida qué estaba bloqueado y\n * la pegajosidad — aceptable para el alcance de hoy (equipos pequeños, un\n * broker por equipo); si hace falta sobrevivir a reinicios, el punto de\n * extensión es cargar/guardar `estado()` a un fichero en `iniciar`/`cerrar`.\n */\n\nimport { clasificarError } from \"../errores/proveedor.ts\";\n\n/** Una credencial tal como la da quien configura el pool: sin estado todavía. */\nexport interface CredencialDelPool {\n\tid: string;\n\tproveedor: string;\n\tvalor: string;\n}\n\nexport type EstadoCredencial = \"activa\" | \"bloqueada\";\n\ninterface Fila extends CredencialDelPool {\n\testado: EstadoCredencial;\n\tmotivoBloqueo?: string;\n\tbloqueadaEn?: number;\n}\n\n/** Lo que se le enseña a un cliente que pide credencial: el secreto, para usarlo. */\nexport interface CredencialElegida {\n\tid: string;\n\tproveedor: string;\n\tvalor: string;\n}\n\n/** Lo que reporta el cliente tras usar una credencial. */\nexport type ResultadoDeUso = { ok: true } | { ok: false; estadoHttp?: number; mensaje: string };\n\n/** Lo que devuelve `marcarUso`: la clase de error (o \"ok\") y el estado resultante. */\nexport interface EfectoDeUso {\n\tclase: string;\n\testado: EstadoCredencial;\n}\n\n/** Fila sin el secreto — lo que se puede enseñar por `/v1/snapshot` sin filtrar nada. */\nexport interface FilaPublica {\n\tid: string;\n\tproveedor: string;\n\testado: EstadoCredencial;\n\tmotivoBloqueo?: string;\n}\n\nexport class CredencialPool {\n\tprivate readonly porId = new Map<string, Fila>();\n\tprivate readonly porProveedor = new Map<string, Fila[]>();\n\t/** `proveedor\\0promptCacheKey` -> id de la credencial pegada a esa sesión. */\n\tprivate readonly pegajosidad = new Map<string, string>();\n\t/** Cursor de reparto round-robin por proveedor, para las peticiones sin pegajosidad. */\n\tprivate readonly cursores = new Map<string, number>();\n\n\tconstructor(credenciales: Record<string, CredencialDelPool[]>) {\n\t\tfor (const [proveedor, lista] of Object.entries(credenciales)) {\n\t\t\tconst filas = lista.map((c): Fila => ({ ...c, proveedor, estado: \"activa\" }));\n\t\t\tthis.porProveedor.set(proveedor, filas);\n\t\t\tfor (const fila of filas) this.porId.set(fila.id, fila);\n\t\t}\n\t}\n\n\tprivate clavePegajosidad(proveedor: string, promptCacheKey: string): string {\n\t\treturn `${proveedor} ${promptCacheKey}`;\n\t}\n\n\tprivate siguiente(proveedor: string, activas: Fila[]): Fila {\n\t\tconst cursor = this.cursores.get(proveedor) ?? 0;\n\t\tthis.cursores.set(proveedor, cursor + 1);\n\t\treturn activas[cursor % activas.length];\n\t}\n\n\t/**\n\t * Elige una credencial activa para `proveedor`.\n\t *\n\t * Sin `promptCacheKey`: reparto round-robin entre las activas. Con\n\t * `promptCacheKey`: si la sesión ya tenía una credencial pegada y sigue\n\t * activa, se reutiliza (no rompe el caché de prompts); si no, se elige una\n\t * nueva y se fija para las próximas llamadas con la misma clave.\n\t *\n\t * `null` = no hay ninguna credencial activa para ese proveedor. Es \"no hay\n\t * nada\", no \"no he podido\" — todas las filas existen, todas están\n\t * bloqueadas, y decirlo así es lo que distingue esto de un fallo del pool.\n\t */\n\telegir(proveedor: string, promptCacheKey?: string): CredencialElegida | null {\n\t\tconst filas = this.porProveedor.get(proveedor) ?? [];\n\t\tconst activas = filas.filter((f) => f.estado === \"activa\");\n\t\tif (activas.length === 0) return null;\n\n\t\tif (promptCacheKey) {\n\t\t\tconst clave = this.clavePegajosidad(proveedor, promptCacheKey);\n\t\t\tconst idPegado = this.pegajosidad.get(clave);\n\t\t\tconst fila = idPegado ? this.porId.get(idPegado) : undefined;\n\t\t\tif (fila && fila.estado === \"activa\") {\n\t\t\t\treturn { id: fila.id, proveedor, valor: fila.valor };\n\t\t\t}\n\t\t\t// Sin pegajosidad válida (primera vez, o la que tenía pegada se bloqueó):\n\t\t\t// elige una hermana y la fija para las próximas peticiones de esta sesión.\n\t\t\tconst elegida = this.siguiente(proveedor, activas);\n\t\t\tthis.pegajosidad.set(clave, elegida.id);\n\t\t\treturn { id: elegida.id, proveedor, valor: elegida.valor };\n\t\t}\n\n\t\tconst elegida = this.siguiente(proveedor, activas);\n\t\treturn { id: elegida.id, proveedor, valor: elegida.valor };\n\t}\n\n\t/**\n\t * Registra el resultado de usar una credencial ya entregada.\n\t *\n\t * `null` = id desconocido (no hay tal credencial en el pool) — se distingue\n\t * de \"la marcó y sigue activa\" para que quien llama pueda contestar 404 en\n\t * vez de fingir un 200.\n\t */\n\tmarcarUso(id: string, resultado: ResultadoDeUso): EfectoDeUso | null {\n\t\tconst fila = this.porId.get(id);\n\t\tif (!fila) return null;\n\n\t\tif (resultado.ok) return { clase: \"ok\", estado: fila.estado };\n\n\t\tconst clasificado = clasificarError({ mensaje: resultado.mensaje, estado: resultado.estadoHttp });\n\n\t\t// Solo un 401/403 de credencial mala saca la fila del pool. Un 429\n\t\t// (`limite-de-tasa`) deja `fila.estado` intacto a propósito: es la\n\t\t// distinción que pide la tarea, y confundirla quema cuentas que solo\n\t\t// estaban ocupadas.\n\t\tif (clasificado.clase === \"credencial-invalida\" || clasificado.clase === \"sin-credencial\") {\n\t\t\tfila.estado = \"bloqueada\";\n\t\t\tfila.motivoBloqueo = clasificado.clase;\n\t\t\tfila.bloqueadaEn = Date.now();\n\t\t\t// Toda sesión pegada a esta credencial se suelta: la próxima `elegir`\n\t\t\t// con la misma prompt_cache_key tiene que caer en una hermana, no\n\t\t\t// seguir devolviendo la que ya sabemos que está mala.\n\t\t\tfor (const [clave, idPegado] of this.pegajosidad) {\n\t\t\t\tif (idPegado === id) this.pegajosidad.delete(clave);\n\t\t\t}\n\t\t}\n\n\t\treturn { clase: clasificado.clase, estado: fila.estado };\n\t}\n\n\t/** Vista pública del pool: sin secretos, para `/v1/snapshot`. */\n\tsnapshot(): FilaPublica[] {\n\t\treturn [...this.porId.values()].map((f) => ({\n\t\t\tid: f.id,\n\t\t\tproveedor: f.proveedor,\n\t\t\testado: f.estado,\n\t\t\tmotivoBloqueo: f.motivoBloqueo,\n\t\t}));\n\t}\n}\n"]}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Piscina de credenciales por proveedor.
|
|
3
|
+
*
|
|
4
|
+
* El hueco que esto tapa: hoy cada desarrollador tiene sus claves en su propio
|
|
5
|
+
* portátil. `oh-my-pi` (packages/ai/src/auth-broker de ese repo) resuelve esto
|
|
6
|
+
* con un servidor que guarda las credenciales y las reparte; lo que se copia
|
|
7
|
+
* aquí de su diseño son dos decisiones concretas, no el código:
|
|
8
|
+
*
|
|
9
|
+
* 1. **Conmutación a una hermana cuando una cuenta falla de verdad.** Un 401
|
|
10
|
+
* (`credencial-invalida` o `sin-credencial` en la taxonomía de
|
|
11
|
+
* `../errores/proveedor.ts`) saca la credencial del pool: la siguiente
|
|
12
|
+
* petición usa otra. Un 429 (`limite-de-tasa`) NO la saca — la cuenta sigue
|
|
13
|
+
* siendo buena, solo está ocupada un rato. Confundir los dos es el fallo
|
|
14
|
+
* que quema cuentas sanas: se ha visto documentado en el propio
|
|
15
|
+
* `errores/proveedor.ts` como el error más caro de mezclar.
|
|
16
|
+
* 2. **Pegajosidad por sesión vía `prompt_cache_key`.** Sin esto, repartir
|
|
17
|
+
* entre cuentas rompería el caché de prompts del proveedor en cada turno —
|
|
18
|
+
* cada petición de la misma conversación pagaría el prefijo entero de
|
|
19
|
+
* nuevo. Una `prompt_cache_key` se queda pegada a la misma credencial
|
|
20
|
+
* mientras esa credencial siga activa; solo se realoja cuando la que tenía
|
|
21
|
+
* pegada se bloquea.
|
|
22
|
+
*
|
|
23
|
+
* Lo que NO se copia: el pool vive en memoria del proceso `ada-cli serve
|
|
24
|
+
* --broker`, no en SQLite. Reiniciar el broker olvida qué estaba bloqueado y
|
|
25
|
+
* la pegajosidad — aceptable para el alcance de hoy (equipos pequeños, un
|
|
26
|
+
* broker por equipo); si hace falta sobrevivir a reinicios, el punto de
|
|
27
|
+
* extensión es cargar/guardar `estado()` a un fichero en `iniciar`/`cerrar`.
|
|
28
|
+
*/
|
|
29
|
+
import { clasificarError } from "../errores/proveedor.js";
|
|
30
|
+
export class CredencialPool {
|
|
31
|
+
porId = new Map();
|
|
32
|
+
porProveedor = new Map();
|
|
33
|
+
/** `proveedor\0promptCacheKey` -> id de la credencial pegada a esa sesión. */
|
|
34
|
+
pegajosidad = new Map();
|
|
35
|
+
/** Cursor de reparto round-robin por proveedor, para las peticiones sin pegajosidad. */
|
|
36
|
+
cursores = new Map();
|
|
37
|
+
constructor(credenciales) {
|
|
38
|
+
for (const [proveedor, lista] of Object.entries(credenciales)) {
|
|
39
|
+
const filas = lista.map((c) => ({ ...c, proveedor, estado: "activa" }));
|
|
40
|
+
this.porProveedor.set(proveedor, filas);
|
|
41
|
+
for (const fila of filas)
|
|
42
|
+
this.porId.set(fila.id, fila);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
clavePegajosidad(proveedor, promptCacheKey) {
|
|
46
|
+
return `${proveedor} ${promptCacheKey}`;
|
|
47
|
+
}
|
|
48
|
+
siguiente(proveedor, activas) {
|
|
49
|
+
const cursor = this.cursores.get(proveedor) ?? 0;
|
|
50
|
+
this.cursores.set(proveedor, cursor + 1);
|
|
51
|
+
return activas[cursor % activas.length];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Elige una credencial activa para `proveedor`.
|
|
55
|
+
*
|
|
56
|
+
* Sin `promptCacheKey`: reparto round-robin entre las activas. Con
|
|
57
|
+
* `promptCacheKey`: si la sesión ya tenía una credencial pegada y sigue
|
|
58
|
+
* activa, se reutiliza (no rompe el caché de prompts); si no, se elige una
|
|
59
|
+
* nueva y se fija para las próximas llamadas con la misma clave.
|
|
60
|
+
*
|
|
61
|
+
* `null` = no hay ninguna credencial activa para ese proveedor. Es "no hay
|
|
62
|
+
* nada", no "no he podido" — todas las filas existen, todas están
|
|
63
|
+
* bloqueadas, y decirlo así es lo que distingue esto de un fallo del pool.
|
|
64
|
+
*/
|
|
65
|
+
elegir(proveedor, promptCacheKey) {
|
|
66
|
+
const filas = this.porProveedor.get(proveedor) ?? [];
|
|
67
|
+
const activas = filas.filter((f) => f.estado === "activa");
|
|
68
|
+
if (activas.length === 0)
|
|
69
|
+
return null;
|
|
70
|
+
if (promptCacheKey) {
|
|
71
|
+
const clave = this.clavePegajosidad(proveedor, promptCacheKey);
|
|
72
|
+
const idPegado = this.pegajosidad.get(clave);
|
|
73
|
+
const fila = idPegado ? this.porId.get(idPegado) : undefined;
|
|
74
|
+
if (fila && fila.estado === "activa") {
|
|
75
|
+
return { id: fila.id, proveedor, valor: fila.valor };
|
|
76
|
+
}
|
|
77
|
+
// Sin pegajosidad válida (primera vez, o la que tenía pegada se bloqueó):
|
|
78
|
+
// elige una hermana y la fija para las próximas peticiones de esta sesión.
|
|
79
|
+
const elegida = this.siguiente(proveedor, activas);
|
|
80
|
+
this.pegajosidad.set(clave, elegida.id);
|
|
81
|
+
return { id: elegida.id, proveedor, valor: elegida.valor };
|
|
82
|
+
}
|
|
83
|
+
const elegida = this.siguiente(proveedor, activas);
|
|
84
|
+
return { id: elegida.id, proveedor, valor: elegida.valor };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Registra el resultado de usar una credencial ya entregada.
|
|
88
|
+
*
|
|
89
|
+
* `null` = id desconocido (no hay tal credencial en el pool) — se distingue
|
|
90
|
+
* de "la marcó y sigue activa" para que quien llama pueda contestar 404 en
|
|
91
|
+
* vez de fingir un 200.
|
|
92
|
+
*/
|
|
93
|
+
marcarUso(id, resultado) {
|
|
94
|
+
const fila = this.porId.get(id);
|
|
95
|
+
if (!fila)
|
|
96
|
+
return null;
|
|
97
|
+
if (resultado.ok)
|
|
98
|
+
return { clase: "ok", estado: fila.estado };
|
|
99
|
+
const clasificado = clasificarError({ mensaje: resultado.mensaje, estado: resultado.estadoHttp });
|
|
100
|
+
// Solo un 401/403 de credencial mala saca la fila del pool. Un 429
|
|
101
|
+
// (`limite-de-tasa`) deja `fila.estado` intacto a propósito: es la
|
|
102
|
+
// distinción que pide la tarea, y confundirla quema cuentas que solo
|
|
103
|
+
// estaban ocupadas.
|
|
104
|
+
if (clasificado.clase === "credencial-invalida" || clasificado.clase === "sin-credencial") {
|
|
105
|
+
fila.estado = "bloqueada";
|
|
106
|
+
fila.motivoBloqueo = clasificado.clase;
|
|
107
|
+
fila.bloqueadaEn = Date.now();
|
|
108
|
+
// Toda sesión pegada a esta credencial se suelta: la próxima `elegir`
|
|
109
|
+
// con la misma prompt_cache_key tiene que caer en una hermana, no
|
|
110
|
+
// seguir devolviendo la que ya sabemos que está mala.
|
|
111
|
+
for (const [clave, idPegado] of this.pegajosidad) {
|
|
112
|
+
if (idPegado === id)
|
|
113
|
+
this.pegajosidad.delete(clave);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return { clase: clasificado.clase, estado: fila.estado };
|
|
117
|
+
}
|
|
118
|
+
/** Vista pública del pool: sin secretos, para `/v1/snapshot`. */
|
|
119
|
+
snapshot() {
|
|
120
|
+
return [...this.porId.values()].map((f) => ({
|
|
121
|
+
id: f.id,
|
|
122
|
+
proveedor: f.proveedor,
|
|
123
|
+
estado: f.estado,
|
|
124
|
+
motivoBloqueo: f.motivoBloqueo,
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../src/core/credenciales/pool.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Piscina de credenciales por proveedor.\n *\n * El hueco que esto tapa: hoy cada desarrollador tiene sus claves en su propio\n * portátil. `oh-my-pi` (packages/ai/src/auth-broker de ese repo) resuelve esto\n * con un servidor que guarda las credenciales y las reparte; lo que se copia\n * aquí de su diseño son dos decisiones concretas, no el código:\n *\n * 1. **Conmutación a una hermana cuando una cuenta falla de verdad.** Un 401\n * (`credencial-invalida` o `sin-credencial` en la taxonomía de\n * `../errores/proveedor.ts`) saca la credencial del pool: la siguiente\n * petición usa otra. Un 429 (`limite-de-tasa`) NO la saca — la cuenta sigue\n * siendo buena, solo está ocupada un rato. Confundir los dos es el fallo\n * que quema cuentas sanas: se ha visto documentado en el propio\n * `errores/proveedor.ts` como el error más caro de mezclar.\n * 2. **Pegajosidad por sesión vía `prompt_cache_key`.** Sin esto, repartir\n * entre cuentas rompería el caché de prompts del proveedor en cada turno —\n * cada petición de la misma conversación pagaría el prefijo entero de\n * nuevo. Una `prompt_cache_key` se queda pegada a la misma credencial\n * mientras esa credencial siga activa; solo se realoja cuando la que tenía\n * pegada se bloquea.\n *\n * Lo que NO se copia: el pool vive en memoria del proceso `ada-cli serve\n * --broker`, no en SQLite. Reiniciar el broker olvida qué estaba bloqueado y\n * la pegajosidad — aceptable para el alcance de hoy (equipos pequeños, un\n * broker por equipo); si hace falta sobrevivir a reinicios, el punto de\n * extensión es cargar/guardar `estado()` a un fichero en `iniciar`/`cerrar`.\n */\n\nimport { clasificarError } from \"../errores/proveedor.ts\";\n\n/** Una credencial tal como la da quien configura el pool: sin estado todavía. */\nexport interface CredencialDelPool {\n\tid: string;\n\tproveedor: string;\n\tvalor: string;\n}\n\nexport type EstadoCredencial = \"activa\" | \"bloqueada\";\n\ninterface Fila extends CredencialDelPool {\n\testado: EstadoCredencial;\n\tmotivoBloqueo?: string;\n\tbloqueadaEn?: number;\n}\n\n/** Lo que se le enseña a un cliente que pide credencial: el secreto, para usarlo. */\nexport interface CredencialElegida {\n\tid: string;\n\tproveedor: string;\n\tvalor: string;\n}\n\n/** Lo que reporta el cliente tras usar una credencial. */\nexport type ResultadoDeUso = { ok: true } | { ok: false; estadoHttp?: number; mensaje: string };\n\n/** Lo que devuelve `marcarUso`: la clase de error (o \"ok\") y el estado resultante. */\nexport interface EfectoDeUso {\n\tclase: string;\n\testado: EstadoCredencial;\n}\n\n/** Fila sin el secreto — lo que se puede enseñar por `/v1/snapshot` sin filtrar nada. */\nexport interface FilaPublica {\n\tid: string;\n\tproveedor: string;\n\testado: EstadoCredencial;\n\tmotivoBloqueo?: string;\n}\n\nexport class CredencialPool {\n\tprivate readonly porId = new Map<string, Fila>();\n\tprivate readonly porProveedor = new Map<string, Fila[]>();\n\t/** `proveedor\\0promptCacheKey` -> id de la credencial pegada a esa sesión. */\n\tprivate readonly pegajosidad = new Map<string, string>();\n\t/** Cursor de reparto round-robin por proveedor, para las peticiones sin pegajosidad. */\n\tprivate readonly cursores = new Map<string, number>();\n\n\tconstructor(credenciales: Record<string, CredencialDelPool[]>) {\n\t\tfor (const [proveedor, lista] of Object.entries(credenciales)) {\n\t\t\tconst filas = lista.map((c): Fila => ({ ...c, proveedor, estado: \"activa\" }));\n\t\t\tthis.porProveedor.set(proveedor, filas);\n\t\t\tfor (const fila of filas) this.porId.set(fila.id, fila);\n\t\t}\n\t}\n\n\tprivate clavePegajosidad(proveedor: string, promptCacheKey: string): string {\n\t\treturn `${proveedor} ${promptCacheKey}`;\n\t}\n\n\tprivate siguiente(proveedor: string, activas: Fila[]): Fila {\n\t\tconst cursor = this.cursores.get(proveedor) ?? 0;\n\t\tthis.cursores.set(proveedor, cursor + 1);\n\t\treturn activas[cursor % activas.length];\n\t}\n\n\t/**\n\t * Elige una credencial activa para `proveedor`.\n\t *\n\t * Sin `promptCacheKey`: reparto round-robin entre las activas. Con\n\t * `promptCacheKey`: si la sesión ya tenía una credencial pegada y sigue\n\t * activa, se reutiliza (no rompe el caché de prompts); si no, se elige una\n\t * nueva y se fija para las próximas llamadas con la misma clave.\n\t *\n\t * `null` = no hay ninguna credencial activa para ese proveedor. Es \"no hay\n\t * nada\", no \"no he podido\" — todas las filas existen, todas están\n\t * bloqueadas, y decirlo así es lo que distingue esto de un fallo del pool.\n\t */\n\telegir(proveedor: string, promptCacheKey?: string): CredencialElegida | null {\n\t\tconst filas = this.porProveedor.get(proveedor) ?? [];\n\t\tconst activas = filas.filter((f) => f.estado === \"activa\");\n\t\tif (activas.length === 0) return null;\n\n\t\tif (promptCacheKey) {\n\t\t\tconst clave = this.clavePegajosidad(proveedor, promptCacheKey);\n\t\t\tconst idPegado = this.pegajosidad.get(clave);\n\t\t\tconst fila = idPegado ? this.porId.get(idPegado) : undefined;\n\t\t\tif (fila && fila.estado === \"activa\") {\n\t\t\t\treturn { id: fila.id, proveedor, valor: fila.valor };\n\t\t\t}\n\t\t\t// Sin pegajosidad válida (primera vez, o la que tenía pegada se bloqueó):\n\t\t\t// elige una hermana y la fija para las próximas peticiones de esta sesión.\n\t\t\tconst elegida = this.siguiente(proveedor, activas);\n\t\t\tthis.pegajosidad.set(clave, elegida.id);\n\t\t\treturn { id: elegida.id, proveedor, valor: elegida.valor };\n\t\t}\n\n\t\tconst elegida = this.siguiente(proveedor, activas);\n\t\treturn { id: elegida.id, proveedor, valor: elegida.valor };\n\t}\n\n\t/**\n\t * Registra el resultado de usar una credencial ya entregada.\n\t *\n\t * `null` = id desconocido (no hay tal credencial en el pool) — se distingue\n\t * de \"la marcó y sigue activa\" para que quien llama pueda contestar 404 en\n\t * vez de fingir un 200.\n\t */\n\tmarcarUso(id: string, resultado: ResultadoDeUso): EfectoDeUso | null {\n\t\tconst fila = this.porId.get(id);\n\t\tif (!fila) return null;\n\n\t\tif (resultado.ok) return { clase: \"ok\", estado: fila.estado };\n\n\t\tconst clasificado = clasificarError({ mensaje: resultado.mensaje, estado: resultado.estadoHttp });\n\n\t\t// Solo un 401/403 de credencial mala saca la fila del pool. Un 429\n\t\t// (`limite-de-tasa`) deja `fila.estado` intacto a propósito: es la\n\t\t// distinción que pide la tarea, y confundirla quema cuentas que solo\n\t\t// estaban ocupadas.\n\t\tif (clasificado.clase === \"credencial-invalida\" || clasificado.clase === \"sin-credencial\") {\n\t\t\tfila.estado = \"bloqueada\";\n\t\t\tfila.motivoBloqueo = clasificado.clase;\n\t\t\tfila.bloqueadaEn = Date.now();\n\t\t\t// Toda sesión pegada a esta credencial se suelta: la próxima `elegir`\n\t\t\t// con la misma prompt_cache_key tiene que caer en una hermana, no\n\t\t\t// seguir devolviendo la que ya sabemos que está mala.\n\t\t\tfor (const [clave, idPegado] of this.pegajosidad) {\n\t\t\t\tif (idPegado === id) this.pegajosidad.delete(clave);\n\t\t\t}\n\t\t}\n\n\t\treturn { clase: clasificado.clase, estado: fila.estado };\n\t}\n\n\t/** Vista pública del pool: sin secretos, para `/v1/snapshot`. */\n\tsnapshot(): FilaPublica[] {\n\t\treturn [...this.porId.values()].map((f) => ({\n\t\t\tid: f.id,\n\t\t\tproveedor: f.proveedor,\n\t\t\testado: f.estado,\n\t\t\tmotivoBloqueo: f.motivoBloqueo,\n\t\t}));\n\t}\n}\n"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cifrado en reposo de `<agentDir>/auth.json`.
|
|
3
|
+
*
|
|
4
|
+
* EL HUECO: vendemos "vault cifrado con clasificación y auditoría"
|
|
5
|
+
* (memory-engine/vault.ts) mientras las claves de API y los tokens OAuth de
|
|
6
|
+
* los proveedores viven en auth.json EN CLARO, con permisos 0600 pero
|
|
7
|
+
* legibles por cualquier proceso del usuario. La política de aprobación
|
|
8
|
+
* (aprobacion/politica.ts) ya le impide leerlo a NUESTRO agente; esto le
|
|
9
|
+
* cierra la puerta a cualquier OTRO proceso.
|
|
10
|
+
*
|
|
11
|
+
* DISEÑO — envolver, no sustituir:
|
|
12
|
+
* `auth-storage.ts` es de upstream y el presupuesto de fork está agotado
|
|
13
|
+
* (ver scripts/sync-ada.sh --check). No podemos reescribir su lectura/
|
|
14
|
+
* escritura de fichero ni su bloqueo entre procesos (proper-lockfile) sin
|
|
15
|
+
* pagar hunks que no tenemos. En vez de eso, ENVOLVEMOS su
|
|
16
|
+
* `AuthStorageBackend`: el interior (`FileAuthStorageBackend`) sigue
|
|
17
|
+
* poseyendo el candado y el `ensureFileExists`/`ensureParentDir`; nosotros
|
|
18
|
+
* solo transformamos el CONTENIDO que entra y sale del candado. Todo el
|
|
19
|
+
* cifrado ocurre DENTRO de la sección crítica del candado que ya existía,
|
|
20
|
+
* así que la seguridad frente a otros procesos de Ada no cambia.
|
|
21
|
+
*
|
|
22
|
+
* CLAVE: un secreto aleatorio de 256 bits en el LLAVERO del sistema (no una
|
|
23
|
+
* passphrase memorizable — nadie va a teclear una contraseña para que el
|
|
24
|
+
* CLI arranque). Se deriva de nada: se genera con randomBytes y se guarda
|
|
25
|
+
* en Keychain la primera vez que hace falta. Sin llavero disponible (CI,
|
|
26
|
+
* contenedor, Linux sin secret-service) NO SE CIFRA: una clave que vive en
|
|
27
|
+
* el mismo disco que el fichero que protege es ofuscación, no cifrado, y
|
|
28
|
+
* llamarlo cifrado sería mentir en la única parte del producto donde no se
|
|
29
|
+
* puede mentir. Se avisa una vez, con una línea clara, y se sigue
|
|
30
|
+
* funcionando en claro (mismo comportamiento que hoy).
|
|
31
|
+
*
|
|
32
|
+
* FORMATO: una cabecera literal al principio del fichero distingue claro de
|
|
33
|
+
* cifrado — nunca adivinamos intentando JSON.parse (un fichero cifrado
|
|
34
|
+
* corrupto a medias podría parsear igual como JSON basura y confundirse con
|
|
35
|
+
* "en claro", perdiendo credenciales calladamente).
|
|
36
|
+
*
|
|
37
|
+
* MIGRACIÓN: en cada lectura, si el contenido está en claro se devuelve tal
|
|
38
|
+
* cual (nunca bloquea al llamador) y se agenda un recifrado en segundo
|
|
39
|
+
* plano con `setImmediate` — nunca DENTRO del candado que la propia lectura
|
|
40
|
+
* mantiene abierto, porque volver a pedirlo desde dentro se autobloquearía.
|
|
41
|
+
* En cada escritura (a través del wrapper) se cifra antes de tocar disco,
|
|
42
|
+
* con copia de seguridad y escritura atómica (fichero temporal + rename):
|
|
43
|
+
* si esto corrompe auth.json, el usuario pierde el acceso a TODOS sus
|
|
44
|
+
* proveedores, así que no se sustituye el fichero real hasta que el
|
|
45
|
+
* temporal esté completo en disco.
|
|
46
|
+
*/
|
|
47
|
+
import type { Credential } from "@earendil-works/pi-ai";
|
|
48
|
+
import type { AuthStorageBackend } from "../auth-storage.ts";
|
|
49
|
+
/**
|
|
50
|
+
* True cuando hay un llavero de sistema utilizable en esta máquina.
|
|
51
|
+
*
|
|
52
|
+
* `ADA_SIN_LLAVERO=1` fuerza "no disponible" aunque estemos en macOS — es la
|
|
53
|
+
* única forma de probar de verdad la rama "sin llavero" (headless/CI) sin
|
|
54
|
+
* necesitar una máquina Linux, y también sirve de escape manual para quien
|
|
55
|
+
* quiera desactivar el uso del Keychain explícitamente.
|
|
56
|
+
*/
|
|
57
|
+
export declare function hayLlaveroDisponible(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* auth.json cifrado que no se puede leer: auth tag inválido, JSON del sobre
|
|
60
|
+
* truncado, o llavero sin la clave que lo cifró (p.ej. copiado desde otra
|
|
61
|
+
* máquina). "no he podido leerlo" y "no hay credenciales" son cosas
|
|
62
|
+
* distintas: esto SIEMPRE es lo primero, nunca se confunde con un auth.json
|
|
63
|
+
* vacío legítimo.
|
|
64
|
+
*/
|
|
65
|
+
export declare class AuthJsonCorruptoError extends Error {
|
|
66
|
+
constructor(authPath: string, causa: unknown);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Envuelve un `AuthStorageBackend` (normalmente un `FileAuthStorageBackend`
|
|
70
|
+
* ya construido, que sigue poseyendo el candado entre procesos) para que
|
|
71
|
+
* cifre/descifre en reposo de forma transparente para quien lo use.
|
|
72
|
+
*/
|
|
73
|
+
export declare function envolverBackendCifrado(interno: AuthStorageBackend, authPath: string): AuthStorageBackend;
|
|
74
|
+
/**
|
|
75
|
+
* Lectura síncrona de UNA credencial ya guardada, descifrando si hace falta.
|
|
76
|
+
*
|
|
77
|
+
* Sustituye a `readStoredCredential` (upstream, `auth-storage.ts`), exportada
|
|
78
|
+
* en `index.ts` como parte de la API pública del SDK (`@hoilab/ada-cli`) para
|
|
79
|
+
* lecturas puntuales sin instanciar `AuthStorage`. Esa función hace su propio
|
|
80
|
+
* `readFileSync` + `JSON.parse` sin pasar por este módulo: con auth.json ya
|
|
81
|
+
* migrado a cifrado, la cabecera `ADA-AUTHJSON-CIFRADO-V1\n` delante del JSON
|
|
82
|
+
* hace que `JSON.parse` lance un `SyntaxError` que su `catch { return
|
|
83
|
+
* undefined; }` convierte en "no hay credencial" — indistinguible de un
|
|
84
|
+
* proveedor sin configurar, para CUALQUIER consumidor de esta función
|
|
85
|
+
* pública, presente o futuro. Mismo nombre y misma firma (con el mismo valor
|
|
86
|
+
* por defecto de `authPath`) para seguir siendo un reemplazo directo.
|
|
87
|
+
*/
|
|
88
|
+
export declare function leerCredencialGuardada(providerId: string, authPath?: string): Credential | undefined;
|
|
89
|
+
/** Solo para pruebas: limpia el estado en memoria del módulo entre casos. */
|
|
90
|
+
export declare function __resetEstadoParaPruebas(): void;
|
|
91
|
+
/** Solo para pruebas: borra la clave maestra del llavero real de esta máquina. */
|
|
92
|
+
export declare function __eliminarClaveDeLlaveroParaPruebas(): void;
|
|
93
|
+
//# sourceMappingURL=reposo.d.ts.map
|