@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 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../src/core/hooks/contract.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Contrato de los hooks: qué se dispara, y qué puede decidir.\n *\n * Este fichero es PURO a propósito — no lanza procesos ni toca disco. Aquí vive\n * la parte que hay que poder probar sin montar nada: qué hooks casan con un\n * evento, y cómo se combinan sus respuestas.\n *\n * La regla que nos separa del contrato que copiamos: **un hook solo puede\n * estrechar permisos, nunca ampliarlos**. Si un hook pudiera responder \"allow\"\n * y saltarse el modo activo, instalar un plugin de terceros equivaldría a\n * desactivar la gobernanza del producto — que es justo lo que vendemos. Un\n * \"deny\" siempre vale; un \"allow\" solo vale donde el modo ya permitía.\n */\n\n/** Los 7 momentos en los que se puede enganchar algo. */\nexport const EVENTOS_HOOK = [\n\t\"session_start\",\n\t\"user_prompt_submit\",\n\t\"pre_tool_use\",\n\t\"post_tool_use\",\n\t\"notification\",\n\t\"stop\",\n\t\"subagent_stop\",\n] as const;\n\nexport type EventoHook = (typeof EVENTOS_HOOK)[number];\n\nexport type NivelPermiso = \"plan\" | \"manual\" | \"auto\" | \"yolo\";\n\nexport type DecisionPermiso = \"allow\" | \"deny\" | \"ask\";\n\nexport interface HookDefinido {\n\t/** Expresión regular contra el nombre de la herramienta (o el evento). */\n\tmatcher?: string;\n\tcommand: string;\n\ttimeoutMs?: number;\n}\n\nexport interface ConfigHooks {\n\tenabled?: boolean;\n\t/** Sin terminal donde preguntar, un hook que falla debe bloquear, no colar. */\n\tfailClosedHeadless?: boolean;\n\tevents?: Partial<Record<EventoHook, HookDefinido[]>>;\n}\n\nexport interface RespuestaHook {\n\t/** 0 = siguió; 2 = bloquea; cualquier otro = el hook falló. */\n\texitCode: number;\n\tstdout?: string;\n\tstderr?: string;\n}\n\nexport interface DecisionHook {\n\tpermissionDecision?: DecisionPermiso;\n\treason?: string;\n}\n\n/**\n * Qué hooks corren para un evento.\n *\n * El matcher se prueba contra `objetivo` — el nombre de la herramienta en\n * `pre_tool_use`/`post_tool_use`, y el propio evento en los demás. Un matcher\n * ausente casa con todo.\n *\n * Un matcher con una expresión regular inválida NO casa y no revienta: un\n * `settings.json` con una errata no puede tumbar la sesión, y tampoco puede\n * convertirse en un comodín silencioso que dispare hooks de más.\n */\nexport function planificarHooks(config: ConfigHooks | undefined, evento: EventoHook, objetivo: string): HookDefinido[] {\n\tif (!config || config.enabled === false) return [];\n\tconst definidos = config.events?.[evento] ?? [];\n\treturn definidos.filter((hook) => {\n\t\tif (!hook.command) return false;\n\t\tif (!hook.matcher) return true;\n\t\ttry {\n\t\t\treturn new RegExp(hook.matcher).test(objetivo);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t});\n}\n\n/**\n * Lee la decisión que un hook escribe en stdout.\n *\n * Devuelve `null` si no dijo nada legible, que es el caso normal: la mayoría de\n * los hooks solo quieren correr y salir con 0.\n */\nexport function leerDecision(respuesta: RespuestaHook): DecisionHook | null {\n\tconst texto = (respuesta.stdout ?? \"\").trim();\n\tif (!texto) return null;\n\ttry {\n\t\tconst dato = JSON.parse(texto) as Record<string, unknown>;\n\t\tconst decision = dato.permissionDecision;\n\t\tif (decision !== \"allow\" && decision !== \"deny\" && decision !== \"ask\") {\n\t\t\treturn typeof dato.reason === \"string\" ? { reason: dato.reason } : null;\n\t\t}\n\t\treturn {\n\t\t\tpermissionDecision: decision,\n\t\t\treason: typeof dato.reason === \"string\" ? dato.reason : undefined,\n\t\t};\n\t} catch {\n\t\t// stdout que no es JSON es solo registro del hook, no una decisión.\n\t\treturn null;\n\t}\n}\n\n/** Lo que el modo activo concede por sí solo, sin hooks de por medio. */\nfunction techoDelModo(nivel: NivelPermiso): DecisionPermiso {\n\tswitch (nivel) {\n\t\tcase \"plan\":\n\t\t\treturn \"deny\";\n\t\tcase \"manual\":\n\t\t\treturn \"ask\";\n\t\tdefault:\n\t\t\treturn \"allow\";\n\t}\n}\n\nconst ORDEN: Record<DecisionPermiso, number> = { allow: 0, ask: 1, deny: 2 };\n\n/**\n * Combina las respuestas de todos los hooks de un evento con el modo activo.\n *\n * Gana siempre la más restrictiva, incluido el techo del modo. Por eso un hook\n * que responde \"allow\" en modo manual acaba en \"ask\", y en modo plan en \"deny\":\n * puede apretar, no aflojar.\n *\n * Salir con 2 equivale a \"deny\" aunque el hook no escriba JSON — es el atajo\n * del contrato para un script de una línea. Salir con cualquier otro código\n * distinto de 0 es un hook roto: bloquea si `failClosed`, y si no se ignora\n * (pero el motivo se devuelve para poder registrarlo).\n */\nexport function resolverDecision(\n\trespuestas: RespuestaHook[],\n\tnivel: NivelPermiso,\n\tfailClosed: boolean,\n): { decision: DecisionPermiso; motivos: string[] } {\n\tlet peor: DecisionPermiso = techoDelModo(nivel);\n\tconst motivos: string[] = [];\n\n\tfor (const respuesta of respuestas) {\n\t\tconst leida = leerDecision(respuesta);\n\t\tif (leida?.reason) motivos.push(leida.reason);\n\n\t\tlet candidata: DecisionPermiso | null = null;\n\t\tif (respuesta.exitCode === 2) {\n\t\t\tcandidata = \"deny\";\n\t\t\tif (!leida?.reason && respuesta.stderr?.trim()) motivos.push(respuesta.stderr.trim());\n\t\t} else if (respuesta.exitCode !== 0) {\n\t\t\tif (failClosed) {\n\t\t\t\tcandidata = \"deny\";\n\t\t\t\tmotivos.push(`hook falló con código ${respuesta.exitCode}`);\n\t\t\t}\n\t\t} else if (leida?.permissionDecision) {\n\t\t\tcandidata = leida.permissionDecision;\n\t\t}\n\n\t\tif (candidata && ORDEN[candidata] > ORDEN[peor]) peor = candidata;\n\t}\n\n\treturn { decision: peor, motivos };\n}\n\n/** Cuántas veces seguidas puede un hook `stop` impedir que el turno termine. */\nexport const MAX_BLOQUEOS_STOP = 3;\n\n/**\n * ¿Se honra este bloqueo de `stop`?\n *\n * Con tope, porque sin él un hook mal escrito deja al agente dando vueltas para\n * siempre y consumiendo dinero. A la cuarta se ignora y el turno termina.\n */\nexport function permiteBloquearParada(bloqueosPrevios: number): boolean {\n\treturn bloqueosPrevios < MAX_BLOQUEOS_STOP;\n}\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ejecuta los hooks. Todo lo que decide vive en `contract.ts`; aquí solo se
|
|
3
|
+
* lanzan procesos y se recogen sus respuestas.
|
|
4
|
+
*
|
|
5
|
+
* El contrato con el proceso es deliberadamente pobre, para que escribir un
|
|
6
|
+
* hook sea cosa de tres líneas de shell: recibe un JSON por stdin, y contesta
|
|
7
|
+
* con su código de salida (0 sigue, 2 bloquea) y, si quiere afinar, un JSON por
|
|
8
|
+
* stdout.
|
|
9
|
+
*/
|
|
10
|
+
import type { EventoHook, HookDefinido, RespuestaHook } from "./contract.ts";
|
|
11
|
+
export interface ContextoHook {
|
|
12
|
+
evento: EventoHook;
|
|
13
|
+
sessionId: string;
|
|
14
|
+
cwd: string;
|
|
15
|
+
toolName?: string;
|
|
16
|
+
toolInput?: unknown;
|
|
17
|
+
toolResult?: unknown;
|
|
18
|
+
prompt?: string;
|
|
19
|
+
message?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Lanza un hook y espera su respuesta.
|
|
23
|
+
*
|
|
24
|
+
* Nunca lanza excepción: un hook que no existe, que peta o que se cuelga se
|
|
25
|
+
* traduce a un `exitCode` distinto de 0, y es `resolverDecision` quien decide
|
|
26
|
+
* si eso bloquea o se ignora. Si esto lanzara, un hook roto tumbaría el turno
|
|
27
|
+
* saltándose la política de `failClosed`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function ejecutarHook(hook: HookDefinido, contexto: ContextoHook, opciones?: {
|
|
30
|
+
env?: NodeJS.ProcessEnv;
|
|
31
|
+
}): Promise<RespuestaHook>;
|
|
32
|
+
/**
|
|
33
|
+
* Ejecuta varios hooks en serie.
|
|
34
|
+
*
|
|
35
|
+
* En serie y no en paralelo a propósito: los hooks de `pre_tool_use` existen
|
|
36
|
+
* para vetar, y dos vetos concurrentes sobre el mismo fichero se pisan. El
|
|
37
|
+
* coste es aceptable porque cada uno tiene su propio tope de tiempo.
|
|
38
|
+
*/
|
|
39
|
+
export declare function ejecutarHooks(hooks: HookDefinido[], contexto: ContextoHook, opciones?: {
|
|
40
|
+
env?: NodeJS.ProcessEnv;
|
|
41
|
+
}): Promise<RespuestaHook[]>;
|
|
42
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAM7E,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CACjC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,YAAY,EACtB,QAAQ,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAO,GACxC,OAAO,CAAC,aAAa,CAAC,CAiDxB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,YAAY,EAAE,EACrB,QAAQ,EAAE,YAAY,EACtB,QAAQ,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAO,GACxC,OAAO,CAAC,aAAa,EAAE,CAAC,CAM1B","sourcesContent":["/**\n * Ejecuta los hooks. Todo lo que decide vive en `contract.ts`; aquí solo se\n * lanzan procesos y se recogen sus respuestas.\n *\n * El contrato con el proceso es deliberadamente pobre, para que escribir un\n * hook sea cosa de tres líneas de shell: recibe un JSON por stdin, y contesta\n * con su código de salida (0 sigue, 2 bloquea) y, si quiere afinar, un JSON por\n * stdout.\n */\n\nimport { spawn } from \"node:child_process\";\nimport type { EventoHook, HookDefinido, RespuestaHook } from \"./contract.ts\";\n\n/** Un hook que escupe sin parar no puede tumbar el proceso del agente. */\nconst MAX_SALIDA = 64 * 1024;\nconst TIMEOUT_POR_DEFECTO_MS = 10_000;\n\nexport interface ContextoHook {\n\tevento: EventoHook;\n\tsessionId: string;\n\tcwd: string;\n\ttoolName?: string;\n\ttoolInput?: unknown;\n\ttoolResult?: unknown;\n\tprompt?: string;\n\tmessage?: string;\n}\n\n/**\n * Lanza un hook y espera su respuesta.\n *\n * Nunca lanza excepción: un hook que no existe, que peta o que se cuelga se\n * traduce a un `exitCode` distinto de 0, y es `resolverDecision` quien decide\n * si eso bloquea o se ignora. Si esto lanzara, un hook roto tumbaría el turno\n * saltándose la política de `failClosed`.\n */\nexport async function ejecutarHook(\n\thook: HookDefinido,\n\tcontexto: ContextoHook,\n\topciones: { env?: NodeJS.ProcessEnv } = {},\n): Promise<RespuestaHook> {\n\tconst entrada = JSON.stringify(contexto);\n\tconst timeoutMs = hook.timeoutMs && hook.timeoutMs > 0 ? hook.timeoutMs : TIMEOUT_POR_DEFECTO_MS;\n\n\treturn new Promise<RespuestaHook>((resolve) => {\n\t\tlet hijo: ReturnType<typeof spawn>;\n\t\ttry {\n\t\t\thijo = spawn(hook.command, {\n\t\t\t\tshell: true,\n\t\t\t\tcwd: contexto.cwd,\n\t\t\t\t// El evento va también por entorno: un hook de una línea puede\n\t\t\t\t// ramificar con `$ADA_HOOK_EVENT` sin parsear el JSON.\n\t\t\t\tenv: { ...process.env, ...opciones.env, ADA_HOOK_EVENT: contexto.evento },\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tresolve({ exitCode: 127, stderr: error instanceof Error ? error.message : String(error) });\n\t\t\treturn;\n\t\t}\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet resuelto = false;\n\t\tconst terminar = (respuesta: RespuestaHook) => {\n\t\t\tif (resuelto) return;\n\t\t\tresuelto = true;\n\t\t\tclearTimeout(reloj);\n\t\t\tresolve(respuesta);\n\t\t};\n\n\t\tconst reloj = setTimeout(() => {\n\t\t\thijo.kill(\"SIGKILL\");\n\t\t\tterminar({ exitCode: 124, stdout, stderr: `${stderr}\\nhook agotó su tiempo (${timeoutMs} ms)` });\n\t\t}, timeoutMs);\n\n\t\thijo.stdout?.on(\"data\", (trozo: Buffer) => {\n\t\t\tif (stdout.length < MAX_SALIDA) stdout += trozo.toString(\"utf8\");\n\t\t});\n\t\thijo.stderr?.on(\"data\", (trozo: Buffer) => {\n\t\t\tif (stderr.length < MAX_SALIDA) stderr += trozo.toString(\"utf8\");\n\t\t});\n\t\thijo.on(\"error\", (error) => terminar({ exitCode: 127, stdout, stderr: error.message }));\n\t\thijo.on(\"close\", (codigo) => terminar({ exitCode: codigo ?? 0, stdout, stderr }));\n\n\t\t// Cerrar stdin siempre: sin esto, un hook que lea hasta EOF se cuelga\n\t\t// hasta agotar el temporizador y todo el turno espera con él.\n\t\thijo.stdin?.on(\"error\", () => {});\n\t\thijo.stdin?.end(entrada);\n\t});\n}\n\n/**\n * Ejecuta varios hooks en serie.\n *\n * En serie y no en paralelo a propósito: los hooks de `pre_tool_use` existen\n * para vetar, y dos vetos concurrentes sobre el mismo fichero se pisan. El\n * coste es aceptable porque cada uno tiene su propio tope de tiempo.\n */\nexport async function ejecutarHooks(\n\thooks: HookDefinido[],\n\tcontexto: ContextoHook,\n\topciones: { env?: NodeJS.ProcessEnv } = {},\n): Promise<RespuestaHook[]> {\n\tconst respuestas: RespuestaHook[] = [];\n\tfor (const hook of hooks) {\n\t\trespuestas.push(await ejecutarHook(hook, contexto, opciones));\n\t}\n\treturn respuestas;\n}\n"]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ejecuta los hooks. Todo lo que decide vive en `contract.ts`; aquí solo se
|
|
3
|
+
* lanzan procesos y se recogen sus respuestas.
|
|
4
|
+
*
|
|
5
|
+
* El contrato con el proceso es deliberadamente pobre, para que escribir un
|
|
6
|
+
* hook sea cosa de tres líneas de shell: recibe un JSON por stdin, y contesta
|
|
7
|
+
* con su código de salida (0 sigue, 2 bloquea) y, si quiere afinar, un JSON por
|
|
8
|
+
* stdout.
|
|
9
|
+
*/
|
|
10
|
+
import { spawn } from "node:child_process";
|
|
11
|
+
/** Un hook que escupe sin parar no puede tumbar el proceso del agente. */
|
|
12
|
+
const MAX_SALIDA = 64 * 1024;
|
|
13
|
+
const TIMEOUT_POR_DEFECTO_MS = 10_000;
|
|
14
|
+
/**
|
|
15
|
+
* Lanza un hook y espera su respuesta.
|
|
16
|
+
*
|
|
17
|
+
* Nunca lanza excepción: un hook que no existe, que peta o que se cuelga se
|
|
18
|
+
* traduce a un `exitCode` distinto de 0, y es `resolverDecision` quien decide
|
|
19
|
+
* si eso bloquea o se ignora. Si esto lanzara, un hook roto tumbaría el turno
|
|
20
|
+
* saltándose la política de `failClosed`.
|
|
21
|
+
*/
|
|
22
|
+
export async function ejecutarHook(hook, contexto, opciones = {}) {
|
|
23
|
+
const entrada = JSON.stringify(contexto);
|
|
24
|
+
const timeoutMs = hook.timeoutMs && hook.timeoutMs > 0 ? hook.timeoutMs : TIMEOUT_POR_DEFECTO_MS;
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
let hijo;
|
|
27
|
+
try {
|
|
28
|
+
hijo = spawn(hook.command, {
|
|
29
|
+
shell: true,
|
|
30
|
+
cwd: contexto.cwd,
|
|
31
|
+
// El evento va también por entorno: un hook de una línea puede
|
|
32
|
+
// ramificar con `$ADA_HOOK_EVENT` sin parsear el JSON.
|
|
33
|
+
env: { ...process.env, ...opciones.env, ADA_HOOK_EVENT: contexto.evento },
|
|
34
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
resolve({ exitCode: 127, stderr: error instanceof Error ? error.message : String(error) });
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
let stdout = "";
|
|
42
|
+
let stderr = "";
|
|
43
|
+
let resuelto = false;
|
|
44
|
+
const terminar = (respuesta) => {
|
|
45
|
+
if (resuelto)
|
|
46
|
+
return;
|
|
47
|
+
resuelto = true;
|
|
48
|
+
clearTimeout(reloj);
|
|
49
|
+
resolve(respuesta);
|
|
50
|
+
};
|
|
51
|
+
const reloj = setTimeout(() => {
|
|
52
|
+
hijo.kill("SIGKILL");
|
|
53
|
+
terminar({ exitCode: 124, stdout, stderr: `${stderr}\nhook agotó su tiempo (${timeoutMs} ms)` });
|
|
54
|
+
}, timeoutMs);
|
|
55
|
+
hijo.stdout?.on("data", (trozo) => {
|
|
56
|
+
if (stdout.length < MAX_SALIDA)
|
|
57
|
+
stdout += trozo.toString("utf8");
|
|
58
|
+
});
|
|
59
|
+
hijo.stderr?.on("data", (trozo) => {
|
|
60
|
+
if (stderr.length < MAX_SALIDA)
|
|
61
|
+
stderr += trozo.toString("utf8");
|
|
62
|
+
});
|
|
63
|
+
hijo.on("error", (error) => terminar({ exitCode: 127, stdout, stderr: error.message }));
|
|
64
|
+
hijo.on("close", (codigo) => terminar({ exitCode: codigo ?? 0, stdout, stderr }));
|
|
65
|
+
// Cerrar stdin siempre: sin esto, un hook que lea hasta EOF se cuelga
|
|
66
|
+
// hasta agotar el temporizador y todo el turno espera con él.
|
|
67
|
+
hijo.stdin?.on("error", () => { });
|
|
68
|
+
hijo.stdin?.end(entrada);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Ejecuta varios hooks en serie.
|
|
73
|
+
*
|
|
74
|
+
* En serie y no en paralelo a propósito: los hooks de `pre_tool_use` existen
|
|
75
|
+
* para vetar, y dos vetos concurrentes sobre el mismo fichero se pisan. El
|
|
76
|
+
* coste es aceptable porque cada uno tiene su propio tope de tiempo.
|
|
77
|
+
*/
|
|
78
|
+
export async function ejecutarHooks(hooks, contexto, opciones = {}) {
|
|
79
|
+
const respuestas = [];
|
|
80
|
+
for (const hook of hooks) {
|
|
81
|
+
respuestas.push(await ejecutarHook(hook, contexto, opciones));
|
|
82
|
+
}
|
|
83
|
+
return respuestas;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/core/hooks/runner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Ejecuta los hooks. Todo lo que decide vive en `contract.ts`; aquí solo se\n * lanzan procesos y se recogen sus respuestas.\n *\n * El contrato con el proceso es deliberadamente pobre, para que escribir un\n * hook sea cosa de tres líneas de shell: recibe un JSON por stdin, y contesta\n * con su código de salida (0 sigue, 2 bloquea) y, si quiere afinar, un JSON por\n * stdout.\n */\n\nimport { spawn } from \"node:child_process\";\nimport type { EventoHook, HookDefinido, RespuestaHook } from \"./contract.ts\";\n\n/** Un hook que escupe sin parar no puede tumbar el proceso del agente. */\nconst MAX_SALIDA = 64 * 1024;\nconst TIMEOUT_POR_DEFECTO_MS = 10_000;\n\nexport interface ContextoHook {\n\tevento: EventoHook;\n\tsessionId: string;\n\tcwd: string;\n\ttoolName?: string;\n\ttoolInput?: unknown;\n\ttoolResult?: unknown;\n\tprompt?: string;\n\tmessage?: string;\n}\n\n/**\n * Lanza un hook y espera su respuesta.\n *\n * Nunca lanza excepción: un hook que no existe, que peta o que se cuelga se\n * traduce a un `exitCode` distinto de 0, y es `resolverDecision` quien decide\n * si eso bloquea o se ignora. Si esto lanzara, un hook roto tumbaría el turno\n * saltándose la política de `failClosed`.\n */\nexport async function ejecutarHook(\n\thook: HookDefinido,\n\tcontexto: ContextoHook,\n\topciones: { env?: NodeJS.ProcessEnv } = {},\n): Promise<RespuestaHook> {\n\tconst entrada = JSON.stringify(contexto);\n\tconst timeoutMs = hook.timeoutMs && hook.timeoutMs > 0 ? hook.timeoutMs : TIMEOUT_POR_DEFECTO_MS;\n\n\treturn new Promise<RespuestaHook>((resolve) => {\n\t\tlet hijo: ReturnType<typeof spawn>;\n\t\ttry {\n\t\t\thijo = spawn(hook.command, {\n\t\t\t\tshell: true,\n\t\t\t\tcwd: contexto.cwd,\n\t\t\t\t// El evento va también por entorno: un hook de una línea puede\n\t\t\t\t// ramificar con `$ADA_HOOK_EVENT` sin parsear el JSON.\n\t\t\t\tenv: { ...process.env, ...opciones.env, ADA_HOOK_EVENT: contexto.evento },\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tresolve({ exitCode: 127, stderr: error instanceof Error ? error.message : String(error) });\n\t\t\treturn;\n\t\t}\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet resuelto = false;\n\t\tconst terminar = (respuesta: RespuestaHook) => {\n\t\t\tif (resuelto) return;\n\t\t\tresuelto = true;\n\t\t\tclearTimeout(reloj);\n\t\t\tresolve(respuesta);\n\t\t};\n\n\t\tconst reloj = setTimeout(() => {\n\t\t\thijo.kill(\"SIGKILL\");\n\t\t\tterminar({ exitCode: 124, stdout, stderr: `${stderr}\\nhook agotó su tiempo (${timeoutMs} ms)` });\n\t\t}, timeoutMs);\n\n\t\thijo.stdout?.on(\"data\", (trozo: Buffer) => {\n\t\t\tif (stdout.length < MAX_SALIDA) stdout += trozo.toString(\"utf8\");\n\t\t});\n\t\thijo.stderr?.on(\"data\", (trozo: Buffer) => {\n\t\t\tif (stderr.length < MAX_SALIDA) stderr += trozo.toString(\"utf8\");\n\t\t});\n\t\thijo.on(\"error\", (error) => terminar({ exitCode: 127, stdout, stderr: error.message }));\n\t\thijo.on(\"close\", (codigo) => terminar({ exitCode: codigo ?? 0, stdout, stderr }));\n\n\t\t// Cerrar stdin siempre: sin esto, un hook que lea hasta EOF se cuelga\n\t\t// hasta agotar el temporizador y todo el turno espera con él.\n\t\thijo.stdin?.on(\"error\", () => {});\n\t\thijo.stdin?.end(entrada);\n\t});\n}\n\n/**\n * Ejecuta varios hooks en serie.\n *\n * En serie y no en paralelo a propósito: los hooks de `pre_tool_use` existen\n * para vetar, y dos vetos concurrentes sobre el mismo fichero se pisan. El\n * coste es aceptable porque cada uno tiene su propio tope de tiempo.\n */\nexport async function ejecutarHooks(\n\thooks: HookDefinido[],\n\tcontexto: ContextoHook,\n\topciones: { env?: NodeJS.ProcessEnv } = {},\n): Promise<RespuestaHook[]> {\n\tconst respuestas: RespuestaHook[] = [];\n\tfor (const hook of hooks) {\n\t\trespuestas.push(await ejecutarHook(hook, contexto, opciones));\n\t}\n\treturn respuestas;\n}\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pegamento entre la sesión y los hooks.
|
|
3
|
+
*
|
|
4
|
+
* Vive aparte de `agent-session.ts` a propósito: ese fichero es de upstream y
|
|
5
|
+
* cada línea que le añadimos se paga en cada sincronización. Aquí cabe toda la
|
|
6
|
+
* lógica y allí queda una llamada.
|
|
7
|
+
*
|
|
8
|
+
* Regla de oro del enganche: **si no hay hooks configurados para este evento,
|
|
9
|
+
* esto no debe cambiar absolutamente nada**. `resolverDecision` devuelve el
|
|
10
|
+
* techo del modo cuando no hay respuestas, y aplicar ese techo aquí bloquearía
|
|
11
|
+
* cada herramienta en modo manual aunque el usuario no haya configurado un solo
|
|
12
|
+
* hook. Por eso se sale antes de consultar nada.
|
|
13
|
+
*/
|
|
14
|
+
import type { EventoHook, NivelPermiso } from "./contract.ts";
|
|
15
|
+
import { type ContextoHook } from "./runner.ts";
|
|
16
|
+
interface ConfigDelMotor {
|
|
17
|
+
hooks?: {
|
|
18
|
+
enabled?: boolean;
|
|
19
|
+
failClosedHeadless?: boolean;
|
|
20
|
+
events?: Record<string, Array<{
|
|
21
|
+
matcher?: string;
|
|
22
|
+
command: string;
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
}>>;
|
|
25
|
+
};
|
|
26
|
+
permissions?: {
|
|
27
|
+
level?: string;
|
|
28
|
+
};
|
|
29
|
+
goalEngine?: {
|
|
30
|
+
planOnly?: boolean;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* El nivel de permisos efectivo.
|
|
35
|
+
*
|
|
36
|
+
* UN VALOR DESCONOCIDO NO SE LEE COMO EL POR DEFECTO. Antes, cualquier cosa que
|
|
37
|
+
* no fuera `manual` ni `yolo` caía a `auto` en silencio: una errata como
|
|
38
|
+
* `"manaul"` dejaba al usuario con más permisos de los que pidió y sin ningún
|
|
39
|
+
* aviso. En una configuración de permisos, «no te he entendido» y «has elegido
|
|
40
|
+
* el valor por defecto» son cosas distintas, y confundirlas es la familia de
|
|
41
|
+
* fallos que más cara nos ha salido.
|
|
42
|
+
*
|
|
43
|
+
* Se avisa por `stderr` y se cae al MÁS RESTRICTIVO de los dos —`manual`, no
|
|
44
|
+
* `auto`—: ante la duda, preguntar antes de escribir.
|
|
45
|
+
*/
|
|
46
|
+
export declare function nivelDesdeConfig(config: ConfigDelMotor): NivelPermiso;
|
|
47
|
+
export interface ResultadoHooks {
|
|
48
|
+
/** `true` si hay que impedir la acción. */
|
|
49
|
+
bloquea: boolean;
|
|
50
|
+
motivo: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Dispara los hooks de un evento y dice si hay que parar.
|
|
54
|
+
*
|
|
55
|
+
* `ask` se trata como bloqueo: aquí no hay a quién preguntar —el enganche corre
|
|
56
|
+
* dentro de la llamada a la herramienta, no en el bucle de la interfaz—, y ante
|
|
57
|
+
* la duda se cierra. El motivo lo explica al usuario, que puede reintentar tras
|
|
58
|
+
* ajustar el hook o el modo.
|
|
59
|
+
*/
|
|
60
|
+
export declare function dispararHooks(config: ConfigDelMotor, evento: EventoHook, objetivo: string, contexto: Omit<ContextoHook, "evento">): Promise<ResultadoHooks>;
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=session-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-hooks.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/session-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,aAAa,CAAC;AAE/D,UAAU,cAAc;IACvB,KAAK,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC,CAAC;KAC1F,CAAC;IACF,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACpC;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,YAAY,CAarE;AAED,MAAM,WAAW,cAAc;IAC9B,4CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CACf;AAID;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAClC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GACpC,OAAO,CAAC,cAAc,CAAC,CAqBzB","sourcesContent":["/**\n * Pegamento entre la sesión y los hooks.\n *\n * Vive aparte de `agent-session.ts` a propósito: ese fichero es de upstream y\n * cada línea que le añadimos se paga en cada sincronización. Aquí cabe toda la\n * lógica y allí queda una llamada.\n *\n * Regla de oro del enganche: **si no hay hooks configurados para este evento,\n * esto no debe cambiar absolutamente nada**. `resolverDecision` devuelve el\n * techo del modo cuando no hay respuestas, y aplicar ese techo aquí bloquearía\n * cada herramienta en modo manual aunque el usuario no haya configurado un solo\n * hook. Por eso se sale antes de consultar nada.\n */\n\nimport type { EventoHook, NivelPermiso } from \"./contract.ts\";\nimport { planificarHooks, resolverDecision } from \"./contract.ts\";\nimport { type ContextoHook, ejecutarHooks } from \"./runner.ts\";\n\ninterface ConfigDelMotor {\n\thooks?: {\n\t\tenabled?: boolean;\n\t\tfailClosedHeadless?: boolean;\n\t\tevents?: Record<string, Array<{ matcher?: string; command: string; timeoutMs?: number }>>;\n\t};\n\tpermissions?: { level?: string };\n\tgoalEngine?: { planOnly?: boolean };\n}\n\n/** Los cuatro que existen de verdad. Si esta lista crece, crece el tipo. */\nconst NIVELES: readonly NivelPermiso[] = [\"plan\", \"manual\", \"auto\", \"yolo\"];\n\n/**\n * Nombres que la gente escribe esperando otra cosa, con su equivalente real.\n *\n * `ask` y `full` estaban en nuestro README y NO existen en el código. Un\n * comprador que ponía `level: \"full\"` esperando plena autonomía se quedaba en\n * `auto` —que aún pregunta en `bash`— y uno que ponía `\"ask\"` esperando\n * confirmación por acción también. Se traducen en vez de rechazarlos porque el\n * README los prometió: romperle la configuración a quien nos creyó sería\n * cobrarle nuestro error.\n */\nconst SINONIMOS: Readonly<Record<string, NivelPermiso>> = { ask: \"manual\", full: \"yolo\" };\n\n/**\n * El nivel de permisos efectivo.\n *\n * UN VALOR DESCONOCIDO NO SE LEE COMO EL POR DEFECTO. Antes, cualquier cosa que\n * no fuera `manual` ni `yolo` caía a `auto` en silencio: una errata como\n * `\"manaul\"` dejaba al usuario con más permisos de los que pidió y sin ningún\n * aviso. En una configuración de permisos, «no te he entendido» y «has elegido\n * el valor por defecto» son cosas distintas, y confundirlas es la familia de\n * fallos que más cara nos ha salido.\n *\n * Se avisa por `stderr` y se cae al MÁS RESTRICTIVO de los dos —`manual`, no\n * `auto`—: ante la duda, preguntar antes de escribir.\n */\nexport function nivelDesdeConfig(config: ConfigDelMotor): NivelPermiso {\n\tif (config.goalEngine?.planOnly === true) return \"plan\";\n\tconst nivel = config.permissions?.level;\n\tif (nivel === undefined || nivel === \"\") return \"auto\";\n\tif ((NIVELES as readonly string[]).includes(nivel)) return nivel as NivelPermiso;\n\tconst sinonimo = SINONIMOS[nivel];\n\tif (sinonimo) return sinonimo;\n\tconsole.error(\n\t\t`Ada: \"permissions.level\" vale \"${nivel}\", que no es ninguno de ${NIVELES.join(\", \")}. ` +\n\t\t\t'Se usa \"manual\" (pregunta antes de cada escritura) por ser el más restrictivo: un valor que no ' +\n\t\t\t\"se entiende no puede dar más permisos de los que pediste.\",\n\t);\n\treturn \"manual\";\n}\n\nexport interface ResultadoHooks {\n\t/** `true` si hay que impedir la acción. */\n\tbloquea: boolean;\n\tmotivo: string;\n}\n\nconst SIN_HOOKS: ResultadoHooks = { bloquea: false, motivo: \"\" };\n\n/**\n * Dispara los hooks de un evento y dice si hay que parar.\n *\n * `ask` se trata como bloqueo: aquí no hay a quién preguntar —el enganche corre\n * dentro de la llamada a la herramienta, no en el bucle de la interfaz—, y ante\n * la duda se cierra. El motivo lo explica al usuario, que puede reintentar tras\n * ajustar el hook o el modo.\n */\nexport async function dispararHooks(\n\tconfig: ConfigDelMotor,\n\tevento: EventoHook,\n\tobjetivo: string,\n\tcontexto: Omit<ContextoHook, \"evento\">,\n): Promise<ResultadoHooks> {\n\tconst hooks = planificarHooks(config.hooks, evento, objetivo);\n\t// Salida temprana: sin hooks configurados, ni se mira el modo. Ver cabecera.\n\tif (hooks.length === 0) return SIN_HOOKS;\n\n\tconst respuestas = await ejecutarHooks(hooks, { ...contexto, evento });\n\tconst { decision, motivos } = resolverDecision(\n\t\trespuestas,\n\t\tnivelDesdeConfig(config),\n\t\tconfig.hooks?.failClosedHeadless ?? true,\n\t);\n\tif (decision === \"allow\") return SIN_HOOKS;\n\n\tconst explicacion = motivos.filter(Boolean).join(\"; \");\n\treturn {\n\t\tbloquea: true,\n\t\tmotivo:\n\t\t\tdecision === \"deny\"\n\t\t\t\t? `Bloqueado por un hook${explicacion ? `: ${explicacion}` : \"\"}`\n\t\t\t\t: `Un hook pide aprobación explícita${explicacion ? `: ${explicacion}` : \"\"}`,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pegamento entre la sesión y los hooks.
|
|
3
|
+
*
|
|
4
|
+
* Vive aparte de `agent-session.ts` a propósito: ese fichero es de upstream y
|
|
5
|
+
* cada línea que le añadimos se paga en cada sincronización. Aquí cabe toda la
|
|
6
|
+
* lógica y allí queda una llamada.
|
|
7
|
+
*
|
|
8
|
+
* Regla de oro del enganche: **si no hay hooks configurados para este evento,
|
|
9
|
+
* esto no debe cambiar absolutamente nada**. `resolverDecision` devuelve el
|
|
10
|
+
* techo del modo cuando no hay respuestas, y aplicar ese techo aquí bloquearía
|
|
11
|
+
* cada herramienta en modo manual aunque el usuario no haya configurado un solo
|
|
12
|
+
* hook. Por eso se sale antes de consultar nada.
|
|
13
|
+
*/
|
|
14
|
+
import { planificarHooks, resolverDecision } from "./contract.js";
|
|
15
|
+
import { ejecutarHooks } from "./runner.js";
|
|
16
|
+
/** Los cuatro que existen de verdad. Si esta lista crece, crece el tipo. */
|
|
17
|
+
const NIVELES = ["plan", "manual", "auto", "yolo"];
|
|
18
|
+
/**
|
|
19
|
+
* Nombres que la gente escribe esperando otra cosa, con su equivalente real.
|
|
20
|
+
*
|
|
21
|
+
* `ask` y `full` estaban en nuestro README y NO existen en el código. Un
|
|
22
|
+
* comprador que ponía `level: "full"` esperando plena autonomía se quedaba en
|
|
23
|
+
* `auto` —que aún pregunta en `bash`— y uno que ponía `"ask"` esperando
|
|
24
|
+
* confirmación por acción también. Se traducen en vez de rechazarlos porque el
|
|
25
|
+
* README los prometió: romperle la configuración a quien nos creyó sería
|
|
26
|
+
* cobrarle nuestro error.
|
|
27
|
+
*/
|
|
28
|
+
const SINONIMOS = { ask: "manual", full: "yolo" };
|
|
29
|
+
/**
|
|
30
|
+
* El nivel de permisos efectivo.
|
|
31
|
+
*
|
|
32
|
+
* UN VALOR DESCONOCIDO NO SE LEE COMO EL POR DEFECTO. Antes, cualquier cosa que
|
|
33
|
+
* no fuera `manual` ni `yolo` caía a `auto` en silencio: una errata como
|
|
34
|
+
* `"manaul"` dejaba al usuario con más permisos de los que pidió y sin ningún
|
|
35
|
+
* aviso. En una configuración de permisos, «no te he entendido» y «has elegido
|
|
36
|
+
* el valor por defecto» son cosas distintas, y confundirlas es la familia de
|
|
37
|
+
* fallos que más cara nos ha salido.
|
|
38
|
+
*
|
|
39
|
+
* Se avisa por `stderr` y se cae al MÁS RESTRICTIVO de los dos —`manual`, no
|
|
40
|
+
* `auto`—: ante la duda, preguntar antes de escribir.
|
|
41
|
+
*/
|
|
42
|
+
export function nivelDesdeConfig(config) {
|
|
43
|
+
if (config.goalEngine?.planOnly === true)
|
|
44
|
+
return "plan";
|
|
45
|
+
const nivel = config.permissions?.level;
|
|
46
|
+
if (nivel === undefined || nivel === "")
|
|
47
|
+
return "auto";
|
|
48
|
+
if (NIVELES.includes(nivel))
|
|
49
|
+
return nivel;
|
|
50
|
+
const sinonimo = SINONIMOS[nivel];
|
|
51
|
+
if (sinonimo)
|
|
52
|
+
return sinonimo;
|
|
53
|
+
console.error(`Ada: "permissions.level" vale "${nivel}", que no es ninguno de ${NIVELES.join(", ")}. ` +
|
|
54
|
+
'Se usa "manual" (pregunta antes de cada escritura) por ser el más restrictivo: un valor que no ' +
|
|
55
|
+
"se entiende no puede dar más permisos de los que pediste.");
|
|
56
|
+
return "manual";
|
|
57
|
+
}
|
|
58
|
+
const SIN_HOOKS = { bloquea: false, motivo: "" };
|
|
59
|
+
/**
|
|
60
|
+
* Dispara los hooks de un evento y dice si hay que parar.
|
|
61
|
+
*
|
|
62
|
+
* `ask` se trata como bloqueo: aquí no hay a quién preguntar —el enganche corre
|
|
63
|
+
* dentro de la llamada a la herramienta, no en el bucle de la interfaz—, y ante
|
|
64
|
+
* la duda se cierra. El motivo lo explica al usuario, que puede reintentar tras
|
|
65
|
+
* ajustar el hook o el modo.
|
|
66
|
+
*/
|
|
67
|
+
export async function dispararHooks(config, evento, objetivo, contexto) {
|
|
68
|
+
const hooks = planificarHooks(config.hooks, evento, objetivo);
|
|
69
|
+
// Salida temprana: sin hooks configurados, ni se mira el modo. Ver cabecera.
|
|
70
|
+
if (hooks.length === 0)
|
|
71
|
+
return SIN_HOOKS;
|
|
72
|
+
const respuestas = await ejecutarHooks(hooks, { ...contexto, evento });
|
|
73
|
+
const { decision, motivos } = resolverDecision(respuestas, nivelDesdeConfig(config), config.hooks?.failClosedHeadless ?? true);
|
|
74
|
+
if (decision === "allow")
|
|
75
|
+
return SIN_HOOKS;
|
|
76
|
+
const explicacion = motivos.filter(Boolean).join("; ");
|
|
77
|
+
return {
|
|
78
|
+
bloquea: true,
|
|
79
|
+
motivo: decision === "deny"
|
|
80
|
+
? `Bloqueado por un hook${explicacion ? `: ${explicacion}` : ""}`
|
|
81
|
+
: `Un hook pide aprobación explícita${explicacion ? `: ${explicacion}` : ""}`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=session-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-hooks.js","sourceRoot":"","sources":["../../../src/core/hooks/session-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAqB,aAAa,EAAE,MAAM,aAAa,CAAC;AAY/D,4EAA4E;AAC5E,MAAM,OAAO,GAA4B,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5E;;;;;;;;;GASG;AACH,MAAM,SAAS,GAA2C,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAE1F;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAsB,EAAgB;IACtE,IAAI,MAAM,CAAC,UAAU,EAAE,QAAQ,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC;IACxC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC;IACvD,IAAK,OAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAqB,CAAC;IACjF,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,CAAC,KAAK,CACZ,kCAAkC,KAAK,2BAA2B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QACvF,kGAAiG;QACjG,4DAA2D,CAC5D,CAAC;IACF,OAAO,QAAQ,CAAC;AAAA,CAChB;AAQD,MAAM,SAAS,GAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAEjE;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,MAAsB,EACtB,MAAkB,EAClB,QAAgB,EAChB,QAAsC,EACZ;IAC1B,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9D,6EAA6E;IAC7E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAC7C,UAAU,EACV,gBAAgB,CAAC,MAAM,CAAC,EACxB,MAAM,CAAC,KAAK,EAAE,kBAAkB,IAAI,IAAI,CACxC,CAAC;IACF,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAE3C,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO;QACN,OAAO,EAAE,IAAI;QACb,MAAM,EACL,QAAQ,KAAK,MAAM;YAClB,CAAC,CAAC,wBAAwB,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YACjE,CAAC,CAAC,sCAAoC,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;KAC/E,CAAC;AAAA,CACF","sourcesContent":["/**\n * Pegamento entre la sesión y los hooks.\n *\n * Vive aparte de `agent-session.ts` a propósito: ese fichero es de upstream y\n * cada línea que le añadimos se paga en cada sincronización. Aquí cabe toda la\n * lógica y allí queda una llamada.\n *\n * Regla de oro del enganche: **si no hay hooks configurados para este evento,\n * esto no debe cambiar absolutamente nada**. `resolverDecision` devuelve el\n * techo del modo cuando no hay respuestas, y aplicar ese techo aquí bloquearía\n * cada herramienta en modo manual aunque el usuario no haya configurado un solo\n * hook. Por eso se sale antes de consultar nada.\n */\n\nimport type { EventoHook, NivelPermiso } from \"./contract.ts\";\nimport { planificarHooks, resolverDecision } from \"./contract.ts\";\nimport { type ContextoHook, ejecutarHooks } from \"./runner.ts\";\n\ninterface ConfigDelMotor {\n\thooks?: {\n\t\tenabled?: boolean;\n\t\tfailClosedHeadless?: boolean;\n\t\tevents?: Record<string, Array<{ matcher?: string; command: string; timeoutMs?: number }>>;\n\t};\n\tpermissions?: { level?: string };\n\tgoalEngine?: { planOnly?: boolean };\n}\n\n/** Los cuatro que existen de verdad. Si esta lista crece, crece el tipo. */\nconst NIVELES: readonly NivelPermiso[] = [\"plan\", \"manual\", \"auto\", \"yolo\"];\n\n/**\n * Nombres que la gente escribe esperando otra cosa, con su equivalente real.\n *\n * `ask` y `full` estaban en nuestro README y NO existen en el código. Un\n * comprador que ponía `level: \"full\"` esperando plena autonomía se quedaba en\n * `auto` —que aún pregunta en `bash`— y uno que ponía `\"ask\"` esperando\n * confirmación por acción también. Se traducen en vez de rechazarlos porque el\n * README los prometió: romperle la configuración a quien nos creyó sería\n * cobrarle nuestro error.\n */\nconst SINONIMOS: Readonly<Record<string, NivelPermiso>> = { ask: \"manual\", full: \"yolo\" };\n\n/**\n * El nivel de permisos efectivo.\n *\n * UN VALOR DESCONOCIDO NO SE LEE COMO EL POR DEFECTO. Antes, cualquier cosa que\n * no fuera `manual` ni `yolo` caía a `auto` en silencio: una errata como\n * `\"manaul\"` dejaba al usuario con más permisos de los que pidió y sin ningún\n * aviso. En una configuración de permisos, «no te he entendido» y «has elegido\n * el valor por defecto» son cosas distintas, y confundirlas es la familia de\n * fallos que más cara nos ha salido.\n *\n * Se avisa por `stderr` y se cae al MÁS RESTRICTIVO de los dos —`manual`, no\n * `auto`—: ante la duda, preguntar antes de escribir.\n */\nexport function nivelDesdeConfig(config: ConfigDelMotor): NivelPermiso {\n\tif (config.goalEngine?.planOnly === true) return \"plan\";\n\tconst nivel = config.permissions?.level;\n\tif (nivel === undefined || nivel === \"\") return \"auto\";\n\tif ((NIVELES as readonly string[]).includes(nivel)) return nivel as NivelPermiso;\n\tconst sinonimo = SINONIMOS[nivel];\n\tif (sinonimo) return sinonimo;\n\tconsole.error(\n\t\t`Ada: \"permissions.level\" vale \"${nivel}\", que no es ninguno de ${NIVELES.join(\", \")}. ` +\n\t\t\t'Se usa \"manual\" (pregunta antes de cada escritura) por ser el más restrictivo: un valor que no ' +\n\t\t\t\"se entiende no puede dar más permisos de los que pediste.\",\n\t);\n\treturn \"manual\";\n}\n\nexport interface ResultadoHooks {\n\t/** `true` si hay que impedir la acción. */\n\tbloquea: boolean;\n\tmotivo: string;\n}\n\nconst SIN_HOOKS: ResultadoHooks = { bloquea: false, motivo: \"\" };\n\n/**\n * Dispara los hooks de un evento y dice si hay que parar.\n *\n * `ask` se trata como bloqueo: aquí no hay a quién preguntar —el enganche corre\n * dentro de la llamada a la herramienta, no en el bucle de la interfaz—, y ante\n * la duda se cierra. El motivo lo explica al usuario, que puede reintentar tras\n * ajustar el hook o el modo.\n */\nexport async function dispararHooks(\n\tconfig: ConfigDelMotor,\n\tevento: EventoHook,\n\tobjetivo: string,\n\tcontexto: Omit<ContextoHook, \"evento\">,\n): Promise<ResultadoHooks> {\n\tconst hooks = planificarHooks(config.hooks, evento, objetivo);\n\t// Salida temprana: sin hooks configurados, ni se mira el modo. Ver cabecera.\n\tif (hooks.length === 0) return SIN_HOOKS;\n\n\tconst respuestas = await ejecutarHooks(hooks, { ...contexto, evento });\n\tconst { decision, motivos } = resolverDecision(\n\t\trespuestas,\n\t\tnivelDesdeConfig(config),\n\t\tconfig.hooks?.failClosedHeadless ?? true,\n\t);\n\tif (decision === \"allow\") return SIN_HOOKS;\n\n\tconst explicacion = motivos.filter(Boolean).join(\"; \");\n\treturn {\n\t\tbloquea: true,\n\t\tmotivo:\n\t\t\tdecision === \"deny\"\n\t\t\t\t? `Bloqueado por un hook${explicacion ? `: ${explicacion}` : \"\"}`\n\t\t\t\t: `Un hook pide aprobación explícita${explicacion ? `: ${explicacion}` : \"\"}`,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Importar sesiones de Claude Code y de Codex.
|
|
3
|
+
*
|
|
4
|
+
* Es coste de cambio. Quien lleva meses trabajando con otra herramienta tiene
|
|
5
|
+
* ahí su historial: lo que decidió, por qué, y las conversaciones que busca
|
|
6
|
+
* cuando vuelve a un proyecto. Pedirle que lo deje atrás es pedirle que empiece
|
|
7
|
+
* de cero, y eso pesa más que cualquier comparativa de capacidades.
|
|
8
|
+
*
|
|
9
|
+
* QUÉ SE IMPORTA Y QUÉ NO, dicho antes de que alguien lo descubra por su
|
|
10
|
+
* cuenta: se importa la CONVERSACIÓN —lo que se dijo, en orden y con su
|
|
11
|
+
* estructura de padres— y no el ESTADO. Las llamadas a herramientas y sus
|
|
12
|
+
* resultados se aplanan a texto legible, porque no se pueden reproducir: los
|
|
13
|
+
* ficheros han cambiado, los procesos murieron y los identificadores de
|
|
14
|
+
* herramienta no significan nada aquí. Una sesión importada sirve para leerla,
|
|
15
|
+
* buscarla y continuarla con contexto; no para rebobinarla.
|
|
16
|
+
*
|
|
17
|
+
* Fingir lo contrario sería peor que no importar: el usuario haría `undo` sobre
|
|
18
|
+
* una sesión importada y no pasaría nada.
|
|
19
|
+
*/
|
|
20
|
+
/** Una entrada del fichero de sesión de Ada. */
|
|
21
|
+
export interface EntradaAda {
|
|
22
|
+
type: "session" | "message";
|
|
23
|
+
id: string;
|
|
24
|
+
parentId?: string;
|
|
25
|
+
timestamp: number;
|
|
26
|
+
cwd?: string;
|
|
27
|
+
version?: number;
|
|
28
|
+
message?: {
|
|
29
|
+
role: string;
|
|
30
|
+
content: Array<{
|
|
31
|
+
type: string;
|
|
32
|
+
text: string;
|
|
33
|
+
}>;
|
|
34
|
+
timestamp: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export type Formato = "claude-code" | "codex";
|
|
38
|
+
/** Resumen de una sesión importable, para poder elegir sin abrirla. */
|
|
39
|
+
export interface ResumenSesion {
|
|
40
|
+
formato: Formato;
|
|
41
|
+
ruta: string;
|
|
42
|
+
cwd: string;
|
|
43
|
+
mensajes: number;
|
|
44
|
+
primerPrompt: string;
|
|
45
|
+
cuando: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Claude Code: un JSONL con entradas `user` y `assistant` encadenadas por
|
|
49
|
+
* `parentUuid`. El resto de tipos (`attachment`, `queue-operation`, `mode`…) es
|
|
50
|
+
* estado interno suyo y no tiene sentido aquí.
|
|
51
|
+
*/
|
|
52
|
+
export declare function convertirClaudeCode(lineas: string[], idSesion: string): EntradaAda[];
|
|
53
|
+
/**
|
|
54
|
+
* Codex: un «rollout» con `session_meta` y `response_item`.
|
|
55
|
+
*
|
|
56
|
+
* No trae cadena de padres, así que se encadena por orden de aparición, que es
|
|
57
|
+
* como se leyó la conversación. Los mensajes de rol `developer` son la
|
|
58
|
+
* inyección de sistema de su harness y no forman parte de lo que dijo nadie.
|
|
59
|
+
*/
|
|
60
|
+
export declare function convertirCodex(lineas: string[], idSesion: string): EntradaAda[];
|
|
61
|
+
/** Reconoce el formato por la forma de sus líneas, no por la extensión. */
|
|
62
|
+
export declare function detectarFormato(lineas: string[]): Formato | null;
|
|
63
|
+
export declare function convertir(lineas: string[], idSesion: string): {
|
|
64
|
+
formato: Formato;
|
|
65
|
+
entradas: EntradaAda[];
|
|
66
|
+
} | null;
|
|
67
|
+
/** Lo que hace falta para elegir una sesión de una lista. */
|
|
68
|
+
export declare function resumir(entradas: EntradaAda[], formato: Formato, ruta: string): ResumenSesion;
|
|
69
|
+
//# sourceMappingURL=formatos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatos.d.ts","sourceRoot":"","sources":["../../../src/core/importar/formatos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,iDAAgD;AAChD,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9F;AAED,MAAM,MAAM,OAAO,GAAG,aAAa,GAAG,OAAO,CAAC;AAE9C,wEAAuE;AACvE,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CACf;AAkED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CA8BpF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAmC/E;AAED,6EAA2E;AAC3E,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAWhE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GAAG,IAAI,CAKjH;AAwBD,8DAA6D;AAC7D,wBAAgB,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAa7F","sourcesContent":["/**\n * Importar sesiones de Claude Code y de Codex.\n *\n * Es coste de cambio. Quien lleva meses trabajando con otra herramienta tiene\n * ahí su historial: lo que decidió, por qué, y las conversaciones que busca\n * cuando vuelve a un proyecto. Pedirle que lo deje atrás es pedirle que empiece\n * de cero, y eso pesa más que cualquier comparativa de capacidades.\n *\n * QUÉ SE IMPORTA Y QUÉ NO, dicho antes de que alguien lo descubra por su\n * cuenta: se importa la CONVERSACIÓN —lo que se dijo, en orden y con su\n * estructura de padres— y no el ESTADO. Las llamadas a herramientas y sus\n * resultados se aplanan a texto legible, porque no se pueden reproducir: los\n * ficheros han cambiado, los procesos murieron y los identificadores de\n * herramienta no significan nada aquí. Una sesión importada sirve para leerla,\n * buscarla y continuarla con contexto; no para rebobinarla.\n *\n * Fingir lo contrario sería peor que no importar: el usuario haría `undo` sobre\n * una sesión importada y no pasaría nada.\n */\n\n/** Una entrada del fichero de sesión de Ada. */\nexport interface EntradaAda {\n\ttype: \"session\" | \"message\";\n\tid: string;\n\tparentId?: string;\n\ttimestamp: number;\n\tcwd?: string;\n\tversion?: number;\n\tmessage?: { role: string; content: Array<{ type: string; text: string }>; timestamp: number };\n}\n\nexport type Formato = \"claude-code\" | \"codex\";\n\n/** Resumen de una sesión importable, para poder elegir sin abrirla. */\nexport interface ResumenSesion {\n\tformato: Formato;\n\truta: string;\n\tcwd: string;\n\tmensajes: number;\n\tprimerPrompt: string;\n\tcuando: number;\n}\n\nfunction aMilisegundos(valor: unknown): number {\n\tif (typeof valor === \"number\") return valor;\n\tif (typeof valor === \"string\") {\n\t\tconst t = Date.parse(valor);\n\t\tif (!Number.isNaN(t)) return t;\n\t}\n\treturn 0;\n}\n\n/**\n * Aplana el contenido de un mensaje a bloques de texto.\n *\n * Las llamadas a herramienta se convierten en una línea legible en vez de\n * desaparecer: leer «⚙ bash: npm test» explica el hilo de la conversación,\n * mientras que quitarlo deja saltos que no se entienden.\n */\nfunction aTexto(contenido: unknown): Array<{ type: string; text: string }> {\n\tif (typeof contenido === \"string\") return contenido.trim() ? [{ type: \"text\", text: contenido }] : [];\n\tif (!Array.isArray(contenido)) return [];\n\tconst bloques: Array<{ type: string; text: string }> = [];\n\tfor (const bruto of contenido) {\n\t\tif (typeof bruto === \"string\") {\n\t\t\tif (bruto.trim()) bloques.push({ type: \"text\", text: bruto });\n\t\t\tcontinue;\n\t\t}\n\t\tif (!bruto || typeof bruto !== \"object\") continue;\n\t\tconst b = bruto as Record<string, unknown>;\n\t\tswitch (b.type) {\n\t\t\tcase \"text\":\n\t\t\tcase \"input_text\":\n\t\t\tcase \"output_text\":\n\t\t\t\tif (typeof b.text === \"string\" && b.text.trim()) bloques.push({ type: \"text\", text: b.text });\n\t\t\t\tbreak;\n\t\t\tcase \"thinking\":\n\t\t\tcase \"reasoning\":\n\t\t\t\tif (typeof b.thinking === \"string\" && b.thinking.trim()) bloques.push({ type: \"text\", text: b.thinking });\n\t\t\t\tbreak;\n\t\t\tcase \"tool_use\":\n\t\t\tcase \"function_call\":\n\t\t\t\tbloques.push({\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: `⚙ ${String(b.name ?? \"herramienta\")}: ${JSON.stringify(b.input ?? b.arguments ?? {}).slice(0, 400)}`,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"tool_result\":\n\t\t\tcase \"function_call_output\": {\n\t\t\t\tconst salida = aTexto(b.content ?? b.output)\n\t\t\t\t\t.map((x) => x.text)\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tif (salida.trim()) bloques.push({ type: \"text\", text: `↩ ${salida.slice(0, 800)}` });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn bloques;\n}\n\n/** La cabecera que abre un fichero de sesión de Ada. */\nfunction cabecera(id: string, cwd: string, cuando: number): EntradaAda {\n\treturn { type: \"session\", id, cwd, timestamp: cuando, version: 1 };\n}\n\n/**\n * Claude Code: un JSONL con entradas `user` y `assistant` encadenadas por\n * `parentUuid`. El resto de tipos (`attachment`, `queue-operation`, `mode`…) es\n * estado interno suyo y no tiene sentido aquí.\n */\nexport function convertirClaudeCode(lineas: string[], idSesion: string): EntradaAda[] {\n\tconst salida: EntradaAda[] = [];\n\tlet cwd = \"\";\n\tlet primero = 0;\n\tfor (const linea of lineas) {\n\t\tlet d: Record<string, unknown>;\n\t\ttry {\n\t\t\td = JSON.parse(linea) as Record<string, unknown>;\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (d.type !== \"user\" && d.type !== \"assistant\") continue;\n\t\tconst mensaje = d.message as { role?: string; content?: unknown } | undefined;\n\t\tif (!mensaje) continue;\n\t\tconst bloques = aTexto(mensaje.content);\n\t\tif (bloques.length === 0) continue;\n\t\tconst cuando = aMilisegundos(d.timestamp);\n\t\tif (!cwd && typeof d.cwd === \"string\") cwd = d.cwd;\n\t\tif (!primero) primero = cuando;\n\t\tsalida.push({\n\t\t\ttype: \"message\",\n\t\t\tid: String(d.uuid ?? `${salida.length}`),\n\t\t\t// Se conserva la cadena de padres del origen: es lo que permite que\n\t\t\t// las ramas de la conversación sigan siendo ramas al importarlas.\n\t\t\t...(typeof d.parentUuid === \"string\" ? { parentId: d.parentUuid } : {}),\n\t\t\ttimestamp: cuando,\n\t\t\tmessage: { role: String(mensaje.role ?? d.type), content: bloques, timestamp: cuando },\n\t\t});\n\t}\n\treturn salida.length === 0 ? [] : [cabecera(idSesion, cwd, primero), ...salida];\n}\n\n/**\n * Codex: un «rollout» con `session_meta` y `response_item`.\n *\n * No trae cadena de padres, así que se encadena por orden de aparición, que es\n * como se leyó la conversación. Los mensajes de rol `developer` son la\n * inyección de sistema de su harness y no forman parte de lo que dijo nadie.\n */\nexport function convertirCodex(lineas: string[], idSesion: string): EntradaAda[] {\n\tconst salida: EntradaAda[] = [];\n\tlet cwd = \"\";\n\tlet primero = 0;\n\tlet anterior: string | undefined;\n\tfor (const linea of lineas) {\n\t\tlet d: Record<string, unknown>;\n\t\ttry {\n\t\t\td = JSON.parse(linea) as Record<string, unknown>;\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tconst carga = d.payload as Record<string, unknown> | undefined;\n\t\tif (d.type === \"session_meta\" && carga && typeof carga.cwd === \"string\") {\n\t\t\tcwd = carga.cwd;\n\t\t\tcontinue;\n\t\t}\n\t\tif (d.type !== \"response_item\" || !carga || carga.type !== \"message\") continue;\n\t\tconst rol = String(carga.role ?? \"\");\n\t\tif (rol === \"developer\" || rol === \"system\") continue;\n\t\tconst bloques = aTexto(carga.content);\n\t\tif (bloques.length === 0) continue;\n\t\tconst cuando = aMilisegundos(d.timestamp);\n\t\tif (!primero) primero = cuando;\n\t\tconst id = String(carga.id ?? `${salida.length}`);\n\t\tsalida.push({\n\t\t\ttype: \"message\",\n\t\t\tid,\n\t\t\t...(anterior ? { parentId: anterior } : {}),\n\t\t\ttimestamp: cuando,\n\t\t\tmessage: { role: rol, content: bloques, timestamp: cuando },\n\t\t});\n\t\tanterior = id;\n\t}\n\treturn salida.length === 0 ? [] : [cabecera(idSesion, cwd, primero), ...salida];\n}\n\n/** Reconoce el formato por la forma de sus líneas, no por la extensión. */\nexport function detectarFormato(lineas: string[]): Formato | null {\n\tfor (const linea of lineas.slice(0, 40)) {\n\t\ttry {\n\t\t\tconst d = JSON.parse(linea) as Record<string, unknown>;\n\t\t\tif (d.type === \"session_meta\" || (d.type === \"response_item\" && d.payload)) return \"codex\";\n\t\t\tif ((d.type === \"user\" || d.type === \"assistant\") && d.message && d.sessionId) return \"claude-code\";\n\t\t} catch {\n\t\t\t// Una línea ilegible no dice nada del formato del fichero.\n\t\t}\n\t}\n\treturn null;\n}\n\nexport function convertir(lineas: string[], idSesion: string): { formato: Formato; entradas: EntradaAda[] } | null {\n\tconst formato = detectarFormato(lineas);\n\tif (!formato) return null;\n\tconst entradas = formato === \"codex\" ? convertirCodex(lineas, idSesion) : convertirClaudeCode(lineas, idSesion);\n\treturn entradas.length === 0 ? null : { formato, entradas };\n}\n\n/**\n * ¿Este mensaje de usuario lo escribió una persona, o lo inyectó el harness?\n *\n * Codex mete su `<environment_context>` y el AGENTS.md del proyecto como\n * mensajes de rol `user`, así que el \"primer prompt\" de media sesión importada\n * salía siendo un volcado de configuración. Se importan igual —formaban parte\n * del contexto— pero no sirven para que alguien reconozca su sesión en una\n * lista, que es para lo que existe el resumen.\n *\n * Se descubrió convirtiendo ficheros reales, no las muestras.\n */\nfunction pareceInyeccion(texto: string): boolean {\n\tconst inicio = texto.trimStart().slice(0, 120);\n\treturn (\n\t\tinicio.startsWith(\"<environment_context>\") ||\n\t\tinicio.startsWith(\"<INSTRUCTIONS>\") ||\n\t\tinicio.startsWith(\"# AGENTS.md\") ||\n\t\tinicio.startsWith(\"<skills_instructions>\") ||\n\t\tinicio.startsWith(\"<system-reminder>\")\n\t);\n}\n\n/** Lo que hace falta para elegir una sesión de una lista. */\nexport function resumir(entradas: EntradaAda[], formato: Formato, ruta: string): ResumenSesion {\n\tconst mensajes = entradas.filter((e) => e.type === \"message\");\n\tconst primerUsuario = mensajes.find(\n\t\t(e) => e.message?.role === \"user\" && !pareceInyeccion(e.message.content[0]?.text ?? \"\"),\n\t);\n\treturn {\n\t\tformato,\n\t\truta,\n\t\tcwd: entradas[0]?.cwd ?? \"\",\n\t\tmensajes: mensajes.length,\n\t\tprimerPrompt: (primerUsuario?.message?.content[0]?.text ?? \"\").replace(/\\s+/g, \" \").slice(0, 80),\n\t\tcuando: entradas[0]?.timestamp ?? 0,\n\t};\n}\n"]}
|