@hoilab/ada-cli 0.84.21 → 0.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -2
- package/README.es.md +174 -0
- package/README.md +203 -658
- package/dist/ada-publico.d.ts +35 -0
- package/dist/ada-publico.d.ts.map +1 -0
- package/dist/ada-publico.js +40 -0
- package/dist/ada-publico.js.map +1 -0
- package/dist/cli/args.d.ts +3 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +11 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/audit-command.d.ts +15 -0
- package/dist/cli/audit-command.d.ts.map +1 -0
- package/dist/cli/audit-command.js +280 -0
- package/dist/cli/audit-command.js.map +1 -0
- package/dist/cli/banco-command.d.ts +15 -0
- package/dist/cli/banco-command.d.ts.map +1 -0
- package/dist/cli/banco-command.js +213 -0
- package/dist/cli/banco-command.js.map +1 -0
- package/dist/cli/cleanse-command.d.ts +11 -0
- package/dist/cli/cleanse-command.d.ts.map +1 -0
- package/dist/cli/cleanse-command.js +101 -0
- package/dist/cli/cleanse-command.js.map +1 -0
- package/dist/cli/commit-command.d.ts +31 -0
- package/dist/cli/commit-command.d.ts.map +1 -0
- package/dist/cli/commit-command.js +158 -0
- package/dist/cli/commit-command.js.map +1 -0
- package/dist/cli/computer-command.d.ts +12 -0
- package/dist/cli/computer-command.d.ts.map +1 -0
- package/dist/cli/computer-command.js +141 -0
- package/dist/cli/computer-command.js.map +1 -0
- package/dist/cli/discover-command.d.ts +18 -0
- package/dist/cli/discover-command.d.ts.map +1 -0
- package/dist/cli/discover-command.js +108 -0
- package/dist/cli/discover-command.js.map +1 -0
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +2 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/hashline-command.d.ts +11 -0
- package/dist/cli/hashline-command.d.ts.map +1 -0
- package/dist/cli/hashline-command.js +106 -0
- package/dist/cli/hashline-command.js.map +1 -0
- package/dist/cli/home-screen.d.ts.map +1 -1
- package/dist/cli/home-screen.js +2 -2
- package/dist/cli/home-screen.js.map +1 -1
- package/dist/cli/import-command.d.ts +35 -0
- package/dist/cli/import-command.d.ts.map +1 -0
- package/dist/cli/import-command.js +164 -0
- package/dist/cli/import-command.js.map +1 -0
- package/dist/cli/politica-command.d.ts +20 -0
- package/dist/cli/politica-command.d.ts.map +1 -0
- package/dist/cli/politica-command.js +93 -0
- package/dist/cli/politica-command.js.map +1 -0
- package/dist/cli/refine-command.d.ts +18 -0
- package/dist/cli/refine-command.d.ts.map +1 -0
- package/dist/cli/refine-command.js +101 -0
- package/dist/cli/refine-command.js.map +1 -0
- package/dist/cli/review-command.d.ts +24 -0
- package/dist/cli/review-command.d.ts.map +1 -0
- package/dist/cli/review-command.js +168 -0
- package/dist/cli/review-command.js.map +1 -0
- package/dist/cli/schedule-command.d.ts +17 -0
- package/dist/cli/schedule-command.d.ts.map +1 -0
- package/dist/cli/schedule-command.js +117 -0
- package/dist/cli/schedule-command.js.map +1 -0
- package/dist/cli/serve-command.d.ts +72 -0
- package/dist/cli/serve-command.d.ts.map +1 -0
- package/dist/cli/serve-command.js +568 -0
- package/dist/cli/serve-command.js.map +1 -0
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +9 -3
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/cli/telegram-command.d.ts +18 -0
- package/dist/cli/telegram-command.d.ts.map +1 -0
- package/dist/cli/telegram-command.js +137 -0
- package/dist/cli/telegram-command.js.map +1 -0
- package/dist/cli/telemetria-command.d.ts +22 -0
- package/dist/cli/telemetria-command.d.ts.map +1 -0
- package/dist/cli/telemetria-command.js +127 -0
- package/dist/cli/telemetria-command.js.map +1 -0
- package/dist/cli/undo-command.d.ts +9 -0
- package/dist/cli/undo-command.d.ts.map +1 -0
- package/dist/cli/undo-command.js +56 -0
- package/dist/cli/undo-command.js.map +1 -0
- package/dist/cli/usage-command.d.ts +10 -0
- package/dist/cli/usage-command.d.ts.map +1 -0
- package/dist/cli/usage-command.js +209 -0
- package/dist/cli/usage-command.js.map +1 -0
- package/dist/cli/wiki-command.d.ts +9 -0
- package/dist/cli/wiki-command.d.ts.map +1 -0
- package/dist/cli/wiki-command.js +76 -0
- package/dist/cli/wiki-command.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -11
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -2
- package/dist/config.js.map +1 -1
- package/dist/core/ada.d.ts +58 -0
- package/dist/core/ada.d.ts.map +1 -0
- package/dist/core/ada.js +61 -0
- package/dist/core/ada.js.map +1 -0
- package/dist/core/advisor/guarda.d.ts +66 -0
- package/dist/core/advisor/guarda.d.ts.map +1 -0
- package/dist/core/advisor/guarda.js +191 -0
- package/dist/core/advisor/guarda.js.map +1 -0
- package/dist/core/advisor/runtime.d.ts +66 -0
- package/dist/core/advisor/runtime.d.ts.map +1 -0
- package/dist/core/advisor/runtime.js +121 -0
- package/dist/core/advisor/runtime.js.map +1 -0
- package/dist/core/advisor/sesion.d.ts +109 -0
- package/dist/core/advisor/sesion.d.ts.map +1 -0
- package/dist/core/advisor/sesion.js +139 -0
- package/dist/core/advisor/sesion.js.map +1 -0
- package/dist/core/agent-session.d.ts +85 -7
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +862 -78
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents/loader.d.ts +77 -0
- package/dist/core/agents/loader.d.ts.map +1 -0
- package/dist/core/agents/loader.js +154 -0
- package/dist/core/agents/loader.js.map +1 -0
- package/dist/core/aprobacion/generados.d.ts +37 -0
- package/dist/core/aprobacion/generados.d.ts.map +1 -0
- package/dist/core/aprobacion/generados.js +85 -0
- package/dist/core/aprobacion/generados.js.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.js +212 -0
- package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
- package/dist/core/aprobacion/politica.d.ts +90 -0
- package/dist/core/aprobacion/politica.d.ts.map +1 -0
- package/dist/core/aprobacion/politica.js +375 -0
- package/dist/core/aprobacion/politica.js.map +1 -0
- package/dist/core/arranque/atajos.d.ts +46 -0
- package/dist/core/arranque/atajos.d.ts.map +1 -0
- package/dist/core/arranque/atajos.js +113 -0
- package/dist/core/arranque/atajos.js.map +1 -0
- package/dist/core/audit/exportacion.d.ts +54 -0
- package/dist/core/audit/exportacion.d.ts.map +1 -0
- package/dist/core/audit/exportacion.js +265 -0
- package/dist/core/audit/exportacion.js.map +1 -0
- package/dist/core/audit/libro.d.ts +318 -0
- package/dist/core/audit/libro.d.ts.map +1 -0
- package/dist/core/audit/libro.js +508 -0
- package/dist/core/audit/libro.js.map +1 -0
- package/dist/core/audit/registro-sesion.d.ts +78 -0
- package/dist/core/audit/registro-sesion.d.ts.map +1 -0
- package/dist/core/audit/registro-sesion.js +202 -0
- package/dist/core/audit/registro-sesion.js.map +1 -0
- package/dist/core/audit/retencion.d.ts +82 -0
- package/dist/core/audit/retencion.d.ts.map +1 -0
- package/dist/core/audit/retencion.js +152 -0
- package/dist/core/audit/retencion.js.map +1 -0
- package/dist/core/audit/rutas.d.ts +23 -0
- package/dist/core/audit/rutas.d.ts.map +1 -0
- package/dist/core/audit/rutas.js +23 -0
- package/dist/core/audit/rutas.js.map +1 -0
- package/dist/core/auth-storage.d.ts +0 -3
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +21 -8
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/banco/almacenamiento.d.ts +18 -0
- package/dist/core/banco/almacenamiento.d.ts.map +1 -0
- package/dist/core/banco/almacenamiento.js +50 -0
- package/dist/core/banco/almacenamiento.js.map +1 -0
- package/dist/core/banco/analisis.d.ts +37 -0
- package/dist/core/banco/analisis.d.ts.map +1 -0
- package/dist/core/banco/analisis.js +164 -0
- package/dist/core/banco/analisis.js.map +1 -0
- package/dist/core/banco/bloques.d.ts +39 -0
- package/dist/core/banco/bloques.d.ts.map +1 -0
- package/dist/core/banco/bloques.js +84 -0
- package/dist/core/banco/bloques.js.map +1 -0
- package/dist/core/banco/cargas.d.ts +84 -0
- package/dist/core/banco/cargas.d.ts.map +1 -0
- package/dist/core/banco/cargas.js +520 -0
- package/dist/core/banco/cargas.js.map +1 -0
- package/dist/core/banco/comparar.d.ts +29 -0
- package/dist/core/banco/comparar.d.ts.map +1 -0
- package/dist/core/banco/comparar.js +28 -0
- package/dist/core/banco/comparar.js.map +1 -0
- package/dist/core/banco/ejecutar.d.ts +44 -0
- package/dist/core/banco/ejecutar.d.ts.map +1 -0
- package/dist/core/banco/ejecutar.js +183 -0
- package/dist/core/banco/ejecutar.js.map +1 -0
- package/dist/core/banco/generar.d.ts +24 -0
- package/dist/core/banco/generar.d.ts.map +1 -0
- package/dist/core/banco/generar.js +159 -0
- package/dist/core/banco/generar.js.map +1 -0
- package/dist/core/banco/mutaciones.d.ts +25 -0
- package/dist/core/banco/mutaciones.d.ts.map +1 -0
- package/dist/core/banco/mutaciones.js +215 -0
- package/dist/core/banco/mutaciones.js.map +1 -0
- package/dist/core/banco/tipos.d.ts +121 -0
- package/dist/core/banco/tipos.d.ts.map +1 -0
- package/dist/core/banco/tipos.js +16 -0
- package/dist/core/banco/tipos.js.map +1 -0
- package/dist/core/blobs/almacen.d.ts +81 -0
- package/dist/core/blobs/almacen.d.ts.map +1 -0
- package/dist/core/blobs/almacen.js +198 -0
- package/dist/core/blobs/almacen.js.map +1 -0
- package/dist/core/blobs/broker.d.ts +103 -0
- package/dist/core/blobs/broker.d.ts.map +1 -0
- package/dist/core/blobs/broker.js +204 -0
- package/dist/core/blobs/broker.js.map +1 -0
- package/dist/core/blobs/index.d.ts +70 -0
- package/dist/core/blobs/index.d.ts.map +1 -0
- package/dist/core/blobs/index.js +232 -0
- package/dist/core/blobs/index.js.map +1 -0
- package/dist/core/blobs/payload.d.ts +55 -0
- package/dist/core/blobs/payload.d.ts.map +1 -0
- package/dist/core/blobs/payload.js +255 -0
- package/dist/core/blobs/payload.js.map +1 -0
- package/dist/core/blobs/proveedor.d.ts +85 -0
- package/dist/core/blobs/proveedor.d.ts.map +1 -0
- package/dist/core/blobs/proveedor.js +196 -0
- package/dist/core/blobs/proveedor.js.map +1 -0
- package/dist/core/browser/cdp.d.ts +41 -0
- package/dist/core/browser/cdp.d.ts.map +1 -0
- package/dist/core/browser/cdp.js +119 -0
- package/dist/core/browser/cdp.js.map +1 -0
- package/dist/core/browser/politica.d.ts +51 -0
- package/dist/core/browser/politica.d.ts.map +1 -0
- package/dist/core/browser/politica.js +123 -0
- package/dist/core/browser/politica.js.map +1 -0
- package/dist/core/browser/sesion.d.ts +52 -0
- package/dist/core/browser/sesion.d.ts.map +1 -0
- package/dist/core/browser/sesion.js +176 -0
- package/dist/core/browser/sesion.js.map +1 -0
- package/dist/core/browser/tools.d.ts +16 -0
- package/dist/core/browser/tools.d.ts.map +1 -0
- package/dist/core/browser/tools.js +279 -0
- package/dist/core/browser/tools.js.map +1 -0
- package/dist/core/commit/diff.d.ts +56 -0
- package/dist/core/commit/diff.d.ts.map +1 -0
- package/dist/core/commit/diff.js +145 -0
- package/dist/core/commit/diff.js.map +1 -0
- package/dist/core/commit/mensaje.d.ts +80 -0
- package/dist/core/commit/mensaje.d.ts.map +1 -0
- package/dist/core/commit/mensaje.js +207 -0
- package/dist/core/commit/mensaje.js.map +1 -0
- package/dist/core/compactar/index.d.ts +52 -0
- package/dist/core/compactar/index.d.ts.map +1 -0
- package/dist/core/compactar/index.js +91 -0
- package/dist/core/compactar/index.js.map +1 -0
- package/dist/core/compactar/registro-denso.d.ts +160 -0
- package/dist/core/compactar/registro-denso.d.ts.map +1 -0
- package/dist/core/compactar/registro-denso.js +620 -0
- package/dist/core/compactar/registro-denso.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +3 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +4 -3
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +41 -32
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/computer/captura.d.ts +35 -0
- package/dist/core/computer/captura.d.ts.map +1 -0
- package/dist/core/computer/captura.js +140 -0
- package/dist/core/computer/captura.js.map +1 -0
- package/dist/core/computer/driver.d.ts +130 -0
- package/dist/core/computer/driver.d.ts.map +1 -0
- package/dist/core/computer/driver.js +206 -0
- package/dist/core/computer/driver.js.map +1 -0
- package/dist/core/computer/motor/actions.d.ts +109 -0
- package/dist/core/computer/motor/actions.d.ts.map +1 -0
- package/dist/core/computer/motor/actions.js +157 -0
- package/dist/core/computer/motor/actions.js.map +1 -0
- package/dist/core/computer/motor/bridge.d.ts +232 -0
- package/dist/core/computer/motor/bridge.d.ts.map +1 -0
- package/dist/core/computer/motor/bridge.js +2335 -0
- package/dist/core/computer/motor/bridge.js.map +1 -0
- package/dist/core/computer/motor/cdp.d.ts +107 -0
- package/dist/core/computer/motor/cdp.d.ts.map +1 -0
- package/dist/core/computer/motor/cdp.js +659 -0
- package/dist/core/computer/motor/cdp.js.map +1 -0
- package/dist/core/computer/motor/config.d.ts +23 -0
- package/dist/core/computer/motor/config.d.ts.map +1 -0
- package/dist/core/computer/motor/config.js +100 -0
- package/dist/core/computer/motor/config.js.map +1 -0
- package/dist/core/computer/motor/contract.d.ts +81 -0
- package/dist/core/computer/motor/contract.d.ts.map +1 -0
- package/dist/core/computer/motor/contract.js +14 -0
- package/dist/core/computer/motor/contract.js.map +1 -0
- package/dist/core/computer/motor/note.d.ts +37 -0
- package/dist/core/computer/motor/note.d.ts.map +1 -0
- package/dist/core/computer/motor/note.js +162 -0
- package/dist/core/computer/motor/note.js.map +1 -0
- package/dist/core/computer/motor/outline.d.ts +155 -0
- package/dist/core/computer/motor/outline.d.ts.map +1 -0
- package/dist/core/computer/motor/outline.js +590 -0
- package/dist/core/computer/motor/outline.js.map +1 -0
- package/dist/core/computer/motor/output.d.ts +18 -0
- package/dist/core/computer/motor/output.d.ts.map +1 -0
- package/dist/core/computer/motor/output.js +148 -0
- package/dist/core/computer/motor/output.js.map +1 -0
- package/dist/core/computer/motor/permissions.d.ts +41 -0
- package/dist/core/computer/motor/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/permissions.js +51 -0
- package/dist/core/computer/motor/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
- package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/architecture.js +21 -0
- package/dist/core/computer/motor/platform/architecture.js.map +1 -0
- package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
- package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/coerce.js +17 -0
- package/dist/core/computer/motor/platform/coerce.js.map +1 -0
- package/dist/core/computer/motor/platform/index.d.ts +4 -0
- package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/index.js +79 -0
- package/dist/core/computer/motor/platform/index.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.js +173 -0
- package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.js +261 -0
- package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.js +124 -0
- package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.js +101 -0
- package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper.js +277 -0
- package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
- package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/types.d.ts +263 -0
- package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/types.js +2 -0
- package/dist/core/computer/motor/platform/types.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.js +163 -0
- package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.js +174 -0
- package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
- package/dist/core/computer/motor/root-selection.d.ts +6 -0
- package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
- package/dist/core/computer/motor/root-selection.js +28 -0
- package/dist/core/computer/motor/root-selection.js.map +1 -0
- package/dist/core/computer/motor/runtime.d.ts +50 -0
- package/dist/core/computer/motor/runtime.d.ts.map +1 -0
- package/dist/core/computer/motor/runtime.js +119 -0
- package/dist/core/computer/motor/runtime.js.map +1 -0
- package/dist/core/computer/motor/state.d.ts +68 -0
- package/dist/core/computer/motor/state.d.ts.map +1 -0
- package/dist/core/computer/motor/state.js +100 -0
- package/dist/core/computer/motor/state.js.map +1 -0
- package/dist/core/computer/motor/view.d.ts +6 -0
- package/dist/core/computer/motor/view.d.ts.map +1 -0
- package/dist/core/computer/motor/view.js +185 -0
- package/dist/core/computer/motor/view.js.map +1 -0
- package/dist/core/computer/motor-ada.d.ts +159 -0
- package/dist/core/computer/motor-ada.d.ts.map +1 -0
- package/dist/core/computer/motor-ada.js +412 -0
- package/dist/core/computer/motor-ada.js.map +1 -0
- package/dist/core/computer/politica.d.ts +56 -0
- package/dist/core/computer/politica.d.ts.map +1 -0
- package/dist/core/computer/politica.js +163 -0
- package/dist/core/computer/politica.js.map +1 -0
- package/dist/core/computer/tools.d.ts +26 -0
- package/dist/core/computer/tools.d.ts.map +1 -0
- package/dist/core/computer/tools.js +399 -0
- package/dist/core/computer/tools.js.map +1 -0
- package/dist/core/context-breakdown.d.ts +80 -0
- package/dist/core/context-breakdown.d.ts.map +1 -0
- package/dist/core/context-breakdown.js +87 -0
- package/dist/core/context-breakdown.js.map +1 -0
- package/dist/core/credenciales/cliente.d.ts +60 -0
- package/dist/core/credenciales/cliente.d.ts.map +1 -0
- package/dist/core/credenciales/cliente.js +81 -0
- package/dist/core/credenciales/cliente.js.map +1 -0
- package/dist/core/credenciales/pool.d.ts +96 -0
- package/dist/core/credenciales/pool.d.ts.map +1 -0
- package/dist/core/credenciales/pool.js +128 -0
- package/dist/core/credenciales/pool.js.map +1 -0
- package/dist/core/credenciales/reposo.d.ts +93 -0
- package/dist/core/credenciales/reposo.d.ts.map +1 -0
- package/dist/core/credenciales/reposo.js +489 -0
- package/dist/core/credenciales/reposo.js.map +1 -0
- package/dist/core/credenciales/servidor.d.ts +55 -0
- package/dist/core/credenciales/servidor.d.ts.map +1 -0
- package/dist/core/credenciales/servidor.js +205 -0
- package/dist/core/credenciales/servidor.js.map +1 -0
- package/dist/core/defaults.d.ts +1 -0
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/defaults.js +9 -0
- package/dist/core/defaults.js.map +1 -1
- package/dist/core/descubrimiento/comandos.d.ts +30 -0
- package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
- package/dist/core/descubrimiento/comandos.js +76 -0
- package/dist/core/descubrimiento/comandos.js.map +1 -0
- package/dist/core/descubrimiento/mcp.d.ts +42 -0
- package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
- package/dist/core/descubrimiento/mcp.js +130 -0
- package/dist/core/descubrimiento/mcp.js.map +1 -0
- package/dist/core/descubrimiento/reglas.d.ts +61 -0
- package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
- package/dist/core/descubrimiento/reglas.js +134 -0
- package/dist/core/descubrimiento/reglas.js.map +1 -0
- package/dist/core/descubrimiento/skills.d.ts +57 -0
- package/dist/core/descubrimiento/skills.d.ts.map +1 -0
- package/dist/core/descubrimiento/skills.js +113 -0
- package/dist/core/descubrimiento/skills.js.map +1 -0
- package/dist/core/dificultad/clasificador.d.ts +133 -0
- package/dist/core/dificultad/clasificador.d.ts.map +1 -0
- package/dist/core/dificultad/clasificador.js +288 -0
- package/dist/core/dificultad/clasificador.js.map +1 -0
- package/dist/core/edicion/diario.d.ts +37 -0
- package/dist/core/edicion/diario.d.ts.map +1 -0
- package/dist/core/edicion/diario.js +51 -0
- package/dist/core/edicion/diario.js.map +1 -0
- package/dist/core/edicion/hashline.d.ts +71 -0
- package/dist/core/edicion/hashline.d.ts.map +1 -0
- package/dist/core/edicion/hashline.js +111 -0
- package/dist/core/edicion/hashline.js.map +1 -0
- package/dist/core/edicion/hueco.d.ts +64 -0
- package/dist/core/edicion/hueco.d.ts.map +1 -0
- package/dist/core/edicion/hueco.js +162 -0
- package/dist/core/edicion/hueco.js.map +1 -0
- package/dist/core/edicion/limpiar-carga.d.ts +39 -0
- package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
- package/dist/core/edicion/limpiar-carga.js +121 -0
- package/dist/core/edicion/limpiar-carga.js.map +1 -0
- package/dist/core/edicion/observador.d.ts +80 -0
- package/dist/core/edicion/observador.d.ts.map +1 -0
- package/dist/core/edicion/observador.js +183 -0
- package/dist/core/edicion/observador.js.map +1 -0
- package/dist/core/edicion/parecido.d.ts +53 -0
- package/dist/core/edicion/parecido.d.ts.map +1 -0
- package/dist/core/edicion/parecido.js +145 -0
- package/dist/core/edicion/parecido.js.map +1 -0
- package/dist/core/edicion/parseo.d.ts +58 -0
- package/dist/core/edicion/parseo.d.ts.map +1 -0
- package/dist/core/edicion/parseo.js +124 -0
- package/dist/core/edicion/parseo.js.map +1 -0
- package/dist/core/edicion/reparacion.d.ts +67 -0
- package/dist/core/edicion/reparacion.d.ts.map +1 -0
- package/dist/core/edicion/reparacion.js +202 -0
- package/dist/core/edicion/reparacion.js.map +1 -0
- package/dist/core/edicion/sangria.d.ts +121 -0
- package/dist/core/edicion/sangria.d.ts.map +1 -0
- package/dist/core/edicion/sangria.js +341 -0
- package/dist/core/edicion/sangria.js.map +1 -0
- package/dist/core/edicion/tipos.d.ts +58 -0
- package/dist/core/edicion/tipos.d.ts.map +1 -0
- package/dist/core/edicion/tipos.js +160 -0
- package/dist/core/edicion/tipos.js.map +1 -0
- package/dist/core/engine-personality.d.ts +12 -0
- package/dist/core/engine-personality.d.ts.map +1 -0
- package/dist/core/engine-personality.js +53 -0
- package/dist/core/engine-personality.js.map +1 -0
- package/dist/core/errores/proveedor.d.ts +53 -0
- package/dist/core/errores/proveedor.d.ts.map +1 -0
- package/dist/core/errores/proveedor.js +191 -0
- package/dist/core/errores/proveedor.js.map +1 -0
- package/dist/core/estructural/buscar.d.ts +61 -0
- package/dist/core/estructural/buscar.d.ts.map +1 -0
- package/dist/core/estructural/buscar.js +261 -0
- package/dist/core/estructural/buscar.js.map +1 -0
- package/dist/core/estructural/editar.d.ts +36 -0
- package/dist/core/estructural/editar.d.ts.map +1 -0
- package/dist/core/estructural/editar.js +123 -0
- package/dist/core/estructural/editar.js.map +1 -0
- package/dist/core/estructural/tools.d.ts +11 -0
- package/dist/core/estructural/tools.d.ts.map +1 -0
- package/dist/core/estructural/tools.js +100 -0
- package/dist/core/estructural/tools.js.map +1 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +10 -1
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensiones/suplantacion.d.ts +49 -0
- package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
- package/dist/core/extensiones/suplantacion.js +61 -0
- package/dist/core/extensiones/suplantacion.js.map +1 -0
- package/dist/core/extensiones/vigilancia.d.ts +54 -0
- package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
- package/dist/core/extensiones/vigilancia.js +217 -0
- package/dist/core/extensiones/vigilancia.js.map +1 -0
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +21 -6
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +23 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
- package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
- package/dist/core/harness/fuentes-de-contexto.js +44 -0
- package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
- package/dist/core/harness/refine.d.ts +40 -0
- package/dist/core/harness/refine.d.ts.map +1 -0
- package/dist/core/harness/refine.js +109 -0
- package/dist/core/harness/refine.js.map +1 -0
- package/dist/core/harness/store.d.ts +75 -0
- package/dist/core/harness/store.d.ts.map +1 -0
- package/dist/core/harness/store.js +149 -0
- package/dist/core/harness/store.js.map +1 -0
- package/dist/core/hooks/contract.d.ts +85 -0
- package/dist/core/hooks/contract.d.ts.map +1 -0
- package/dist/core/hooks/contract.js +140 -0
- package/dist/core/hooks/contract.js.map +1 -0
- package/dist/core/hooks/runner.d.ts +42 -0
- package/dist/core/hooks/runner.d.ts.map +1 -0
- package/dist/core/hooks/runner.js +85 -0
- package/dist/core/hooks/runner.js.map +1 -0
- package/dist/core/hooks/session-hooks.d.ts +62 -0
- package/dist/core/hooks/session-hooks.d.ts.map +1 -0
- package/dist/core/hooks/session-hooks.js +84 -0
- package/dist/core/hooks/session-hooks.js.map +1 -0
- package/dist/core/importar/formatos.d.ts +69 -0
- package/dist/core/importar/formatos.d.ts.map +1 -0
- package/dist/core/importar/formatos.js +235 -0
- package/dist/core/importar/formatos.js.map +1 -0
- package/dist/core/interactivo/deteccion.d.ts +44 -0
- package/dist/core/interactivo/deteccion.d.ts.map +1 -0
- package/dist/core/interactivo/deteccion.js +82 -0
- package/dist/core/interactivo/deteccion.js.map +1 -0
- package/dist/core/interactivo/sesion.d.ts +50 -0
- package/dist/core/interactivo/sesion.d.ts.map +1 -0
- package/dist/core/interactivo/sesion.js +156 -0
- package/dist/core/interactivo/sesion.js.map +1 -0
- package/dist/core/interactivo/tools.d.ts +21 -0
- package/dist/core/interactivo/tools.d.ts.map +1 -0
- package/dist/core/interactivo/tools.js +122 -0
- package/dist/core/interactivo/tools.js.map +1 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/lectura/mapa.d.ts +70 -0
- package/dist/core/lectura/mapa.d.ts.map +1 -0
- package/dist/core/lectura/mapa.js +177 -0
- package/dist/core/lectura/mapa.js.map +1 -0
- package/dist/core/lectura/pdf.d.ts +49 -0
- package/dist/core/lectura/pdf.d.ts.map +1 -0
- package/dist/core/lectura/pdf.js +337 -0
- package/dist/core/lectura/pdf.js.map +1 -0
- package/dist/core/limpieza/comprobadores.d.ts +28 -0
- package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
- package/dist/core/limpieza/comprobadores.js +311 -0
- package/dist/core/limpieza/comprobadores.js.map +1 -0
- package/dist/core/limpieza/parseo.d.ts +19 -0
- package/dist/core/limpieza/parseo.d.ts.map +1 -0
- package/dist/core/limpieza/parseo.js +124 -0
- package/dist/core/limpieza/parseo.js.map +1 -0
- package/dist/core/limpieza/reparacion.d.ts +77 -0
- package/dist/core/limpieza/reparacion.d.ts.map +1 -0
- package/dist/core/limpieza/reparacion.js +254 -0
- package/dist/core/limpieza/reparacion.js.map +1 -0
- package/dist/core/limpieza/tipos.d.ts +56 -0
- package/dist/core/limpieza/tipos.d.ts.map +1 -0
- package/dist/core/limpieza/tipos.js +9 -0
- package/dist/core/limpieza/tipos.js.map +1 -0
- package/dist/core/lsp/cliente.d.ts +52 -0
- package/dist/core/lsp/cliente.d.ts.map +1 -0
- package/dist/core/lsp/cliente.js +232 -0
- package/dist/core/lsp/cliente.js.map +1 -0
- package/dist/core/lsp/descubrimiento.d.ts +62 -0
- package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
- package/dist/core/lsp/descubrimiento.js +152 -0
- package/dist/core/lsp/descubrimiento.js.map +1 -0
- package/dist/core/lsp/ediciones.d.ts +59 -0
- package/dist/core/lsp/ediciones.d.ts.map +1 -0
- package/dist/core/lsp/ediciones.js +89 -0
- package/dist/core/lsp/ediciones.js.map +1 -0
- package/dist/core/lsp/extension.d.ts +28 -0
- package/dist/core/lsp/extension.d.ts.map +1 -0
- package/dist/core/lsp/extension.js +34 -0
- package/dist/core/lsp/extension.js.map +1 -0
- package/dist/core/lsp/tools.d.ts +45 -0
- package/dist/core/lsp/tools.d.ts.map +1 -0
- package/dist/core/lsp/tools.js +265 -0
- package/dist/core/lsp/tools.js.map +1 -0
- package/dist/core/mcp/client.d.ts +60 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +139 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/manager.d.ts +86 -0
- package/dist/core/mcp/manager.d.ts.map +1 -0
- package/dist/core/mcp/manager.js +124 -0
- package/dist/core/mcp/manager.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +15 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +84 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/memory-engine/audit-export.d.ts +56 -0
- package/dist/core/memory-engine/audit-export.d.ts.map +1 -0
- package/dist/core/memory-engine/audit-export.js +100 -0
- package/dist/core/memory-engine/audit-export.js.map +1 -0
- package/dist/core/memory-engine/audit-indice.d.ts +153 -0
- package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
- package/dist/core/memory-engine/audit-indice.js +271 -0
- package/dist/core/memory-engine/audit-indice.js.map +1 -0
- package/dist/core/memory-engine/audit.d.ts +18 -6
- package/dist/core/memory-engine/audit.d.ts.map +1 -1
- package/dist/core/memory-engine/audit.js +32 -50
- package/dist/core/memory-engine/audit.js.map +1 -1
- package/dist/core/memory-engine/engine.d.ts +21 -4
- package/dist/core/memory-engine/engine.d.ts.map +1 -1
- package/dist/core/memory-engine/engine.js +219 -55
- package/dist/core/memory-engine/engine.js.map +1 -1
- package/dist/core/memory-engine/inverted-index.d.ts.map +1 -1
- package/dist/core/memory-engine/inverted-index.js +67 -10
- package/dist/core/memory-engine/inverted-index.js.map +1 -1
- package/dist/core/memory-engine/keychain.d.ts.map +1 -1
- package/dist/core/memory-engine/keychain.js +1 -6
- package/dist/core/memory-engine/keychain.js.map +1 -1
- package/dist/core/memory-engine/observation-store.d.ts +0 -1
- package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
- package/dist/core/memory-engine/observation-store.js +40 -12
- package/dist/core/memory-engine/observation-store.js.map +1 -1
- package/dist/core/memory-engine/refinements.d.ts +51 -0
- package/dist/core/memory-engine/refinements.d.ts.map +1 -0
- package/dist/core/memory-engine/refinements.js +99 -0
- package/dist/core/memory-engine/refinements.js.map +1 -0
- package/dist/core/memory-engine/scanner.d.ts.map +1 -1
- package/dist/core/memory-engine/scanner.js +25 -5
- package/dist/core/memory-engine/scanner.js.map +1 -1
- package/dist/core/memory-engine/security.d.ts.map +1 -1
- package/dist/core/memory-engine/security.js +131 -23
- package/dist/core/memory-engine/security.js.map +1 -1
- package/dist/core/memory-engine/session-indexer.d.ts.map +1 -1
- package/dist/core/memory-engine/session-indexer.js +8 -2
- package/dist/core/memory-engine/session-indexer.js.map +1 -1
- package/dist/core/memory-engine/tools.d.ts +2 -2
- package/dist/core/memory-engine/tools.d.ts.map +1 -1
- package/dist/core/memory-engine/tools.js +41 -8
- package/dist/core/memory-engine/tools.js.map +1 -1
- package/dist/core/memory-engine/types.d.ts +2 -0
- package/dist/core/memory-engine/types.d.ts.map +1 -1
- package/dist/core/memory-engine/types.js.map +1 -1
- package/dist/core/memory-engine/vault.d.ts.map +1 -1
- package/dist/core/memory-engine/vault.js +2 -2
- package/dist/core/memory-engine/vault.js.map +1 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +2 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +19 -7
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js +2 -1
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/muestreo-restringido.d.ts +49 -0
- package/dist/core/muestreo-restringido.d.ts.map +1 -0
- package/dist/core/muestreo-restringido.js +65 -0
- package/dist/core/muestreo-restringido.js.map +1 -0
- package/dist/core/orphan-process-journal.d.ts +48 -0
- package/dist/core/orphan-process-journal.d.ts.map +1 -0
- package/dist/core/orphan-process-journal.js +116 -0
- package/dist/core/orphan-process-journal.js.map +1 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +11 -6
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-manifest.d.ts.map +1 -1
- package/dist/core/pi-manifest.js +2 -1
- package/dist/core/pi-manifest.js.map +1 -1
- package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
- package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
- package/dist/core/privacidad/categorias-especiales.js +745 -0
- package/dist/core/privacidad/categorias-especiales.js.map +1 -0
- package/dist/core/privacidad/tapar.d.ts +48 -0
- package/dist/core/privacidad/tapar.d.ts.map +1 -0
- package/dist/core/privacidad/tapar.js +66 -0
- package/dist/core/privacidad/tapar.js.map +1 -0
- package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
- package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
- package/dist/core/prompt-cache/diagnostics.js +100 -0
- package/dist/core/prompt-cache/diagnostics.js.map +1 -0
- package/dist/core/prompt-cache/index.d.ts +33 -0
- package/dist/core/prompt-cache/index.d.ts.map +1 -0
- package/dist/core/prompt-cache/index.js +189 -0
- package/dist/core/prompt-cache/index.js.map +1 -0
- package/dist/core/prompt-cache/payload.d.ts +58 -0
- package/dist/core/prompt-cache/payload.d.ts.map +1 -0
- package/dist/core/prompt-cache/payload.js +122 -0
- package/dist/core/prompt-cache/payload.js.map +1 -0
- package/dist/core/prompt-cache/stabilize.d.ts +65 -0
- package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
- package/dist/core/prompt-cache/stabilize.js +137 -0
- package/dist/core/prompt-cache/stabilize.js.map +1 -0
- package/dist/core/prompt-cache/stats.d.ts +55 -0
- package/dist/core/prompt-cache/stats.d.ts.map +1 -0
- package/dist/core/prompt-cache/stats.js +158 -0
- package/dist/core/prompt-cache/stats.js.map +1 -0
- package/dist/core/prompt-eleccion.d.ts +38 -0
- package/dist/core/prompt-eleccion.d.ts.map +1 -0
- package/dist/core/prompt-eleccion.js +46 -0
- package/dist/core/prompt-eleccion.js.map +1 -0
- package/dist/core/prompt-optimizer.d.ts +53 -0
- package/dist/core/prompt-optimizer.d.ts.map +1 -0
- package/dist/core/prompt-optimizer.js +138 -0
- package/dist/core/prompt-optimizer.js.map +1 -0
- package/dist/core/prompts/montar.d.ts +75 -0
- package/dist/core/prompts/montar.d.ts.map +1 -0
- package/dist/core/prompts/montar.js +146 -0
- package/dist/core/prompts/montar.js.map +1 -0
- package/dist/core/prompts/plantilla.d.ts +54 -0
- package/dist/core/prompts/plantilla.d.ts.map +1 -0
- package/dist/core/prompts/plantilla.js +153 -0
- package/dist/core/prompts/plantilla.js.map +1 -0
- package/dist/core/prompts/sistema.md +134 -0
- package/dist/core/provider-attribution.d.ts +24 -2
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js +24 -42
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +2 -1
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/remoto/destino.d.ts +38 -0
- package/dist/core/remoto/destino.d.ts.map +1 -0
- package/dist/core/remoto/destino.js +105 -0
- package/dist/core/remoto/destino.js.map +1 -0
- package/dist/core/remoto/ejecutor.d.ts +59 -0
- package/dist/core/remoto/ejecutor.d.ts.map +1 -0
- package/dist/core/remoto/ejecutor.js +225 -0
- package/dist/core/remoto/ejecutor.js.map +1 -0
- package/dist/core/remoto/ficheros.d.ts +29 -0
- package/dist/core/remoto/ficheros.d.ts.map +1 -0
- package/dist/core/remoto/ficheros.js +90 -0
- package/dist/core/remoto/ficheros.js.map +1 -0
- package/dist/core/remoto/registro-extension.d.ts +15 -0
- package/dist/core/remoto/registro-extension.d.ts.map +1 -0
- package/dist/core/remoto/registro-extension.js +17 -0
- package/dist/core/remoto/registro-extension.js.map +1 -0
- package/dist/core/remoto/tools.d.ts +28 -0
- package/dist/core/remoto/tools.d.ts.map +1 -0
- package/dist/core/remoto/tools.js +31 -0
- package/dist/core/remoto/tools.js.map +1 -0
- package/dist/core/resource-loader.d.ts +58 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +326 -8
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/revision/hallazgo.d.ts +51 -0
- package/dist/core/revision/hallazgo.d.ts.map +1 -0
- package/dist/core/revision/hallazgo.js +73 -0
- package/dist/core/revision/hallazgo.js.map +1 -0
- package/dist/core/revision/revisor.d.ts +81 -0
- package/dist/core/revision/revisor.d.ts.map +1 -0
- package/dist/core/revision/revisor.js +132 -0
- package/dist/core/revision/revisor.js.map +1 -0
- package/dist/core/revision/sarif.d.ts +30 -0
- package/dist/core/revision/sarif.d.ts.map +1 -0
- package/dist/core/revision/sarif.js +83 -0
- package/dist/core/revision/sarif.js.map +1 -0
- package/dist/core/scheduler/scheduler.d.ts +87 -0
- package/dist/core/scheduler/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler/scheduler.js +178 -0
- package/dist/core/scheduler/scheduler.js.map +1 -0
- package/dist/core/sdk.d.ts +8 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +11 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +2 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-diagnostics.d.ts +9 -0
- package/dist/core/settings-diagnostics.d.ts.map +1 -0
- package/dist/core/settings-diagnostics.js +21 -0
- package/dist/core/settings-diagnostics.js.map +1 -0
- package/dist/core/settings-manager.d.ts +156 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +255 -10
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +51 -33
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +2 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts +17 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +13 -5
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetria/otlp.d.ts +122 -0
- package/dist/core/telemetria/otlp.d.ts.map +1 -0
- package/dist/core/telemetria/otlp.js +373 -0
- package/dist/core/telemetria/otlp.js.map +1 -0
- package/dist/core/tools/coercion-argumentos.d.ts +48 -0
- package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
- package/dist/core/tools/coercion-argumentos.js +99 -0
- package/dist/core/tools/coercion-argumentos.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +0 -12
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +234 -12
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +28 -5
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +5 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +2 -2
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/json-tolerante.d.ts +30 -0
- package/dist/core/tools/json-tolerante.d.ts.map +1 -0
- package/dist/core/tools/json-tolerante.js +70 -0
- package/dist/core/tools/json-tolerante.js.map +1 -0
- package/dist/core/tools/project-memory-tool.d.ts.map +1 -1
- package/dist/core/tools/project-memory-tool.js +4 -1
- package/dist/core/tools/project-memory-tool.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +17 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +17 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +2 -1
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/turno-vacio/detectar.d.ts +38 -0
- package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
- package/dist/core/turno-vacio/detectar.js +66 -0
- package/dist/core/turno-vacio/detectar.js.map +1 -0
- package/dist/core/undo/journal.d.ts +57 -0
- package/dist/core/undo/journal.d.ts.map +1 -0
- package/dist/core/undo/journal.js +178 -0
- package/dist/core/undo/journal.js.map +1 -0
- package/dist/core/urls-internas/auditoria.d.ts +10 -0
- package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
- package/dist/core/urls-internas/auditoria.js +42 -0
- package/dist/core/urls-internas/auditoria.js.map +1 -0
- package/dist/core/urls-internas/boveda.d.ts +13 -0
- package/dist/core/urls-internas/boveda.d.ts.map +1 -0
- package/dist/core/urls-internas/boveda.js +40 -0
- package/dist/core/urls-internas/boveda.js.map +1 -0
- package/dist/core/urls-internas/lector.d.ts +30 -0
- package/dist/core/urls-internas/lector.d.ts.map +1 -0
- package/dist/core/urls-internas/lector.js +56 -0
- package/dist/core/urls-internas/lector.js.map +1 -0
- package/dist/core/urls-internas/memoria.d.ts +11 -0
- package/dist/core/urls-internas/memoria.d.ts.map +1 -0
- package/dist/core/urls-internas/memoria.js +25 -0
- package/dist/core/urls-internas/memoria.js.map +1 -0
- package/dist/core/urls-internas/parse.d.ts +28 -0
- package/dist/core/urls-internas/parse.d.ts.map +1 -0
- package/dist/core/urls-internas/parse.js +32 -0
- package/dist/core/urls-internas/parse.js.map +1 -0
- package/dist/core/urls-internas/reglas.d.ts +10 -0
- package/dist/core/urls-internas/reglas.d.ts.map +1 -0
- package/dist/core/urls-internas/reglas.js +31 -0
- package/dist/core/urls-internas/reglas.js.map +1 -0
- package/dist/core/usage/aggregate.d.ts +68 -0
- package/dist/core/usage/aggregate.d.ts.map +1 -0
- package/dist/core/usage/aggregate.js +93 -0
- package/dist/core/usage/aggregate.js.map +1 -0
- package/dist/core/usage/cuota/anthropic.d.ts +10 -0
- package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
- package/dist/core/usage/cuota/anthropic.js +63 -0
- package/dist/core/usage/cuota/anthropic.js.map +1 -0
- package/dist/core/usage/cuota/cache.d.ts +20 -0
- package/dist/core/usage/cuota/cache.d.ts.map +1 -0
- package/dist/core/usage/cuota/cache.js +36 -0
- package/dist/core/usage/cuota/cache.js.map +1 -0
- package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
- package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
- package/dist/core/usage/cuota/github-copilot.js +67 -0
- package/dist/core/usage/cuota/github-copilot.js.map +1 -0
- package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
- package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
- package/dist/core/usage/cuota/google-gemini.js +72 -0
- package/dist/core/usage/cuota/google-gemini.js.map +1 -0
- package/dist/core/usage/cuota/index.d.ts +25 -0
- package/dist/core/usage/cuota/index.d.ts.map +1 -0
- package/dist/core/usage/cuota/index.js +50 -0
- package/dist/core/usage/cuota/index.js.map +1 -0
- package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
- package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
- package/dist/core/usage/cuota/openai-codex.js +59 -0
- package/dist/core/usage/cuota/openai-codex.js.map +1 -0
- package/dist/core/usage/cuota/openrouter.d.ts +10 -0
- package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
- package/dist/core/usage/cuota/openrouter.js +47 -0
- package/dist/core/usage/cuota/openrouter.js.map +1 -0
- package/dist/core/usage/cuota/tipos.d.ts +50 -0
- package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
- package/dist/core/usage/cuota/tipos.js +25 -0
- package/dist/core/usage/cuota/tipos.js.map +1 -0
- package/dist/core/web/busqueda-nativa.d.ts +82 -0
- package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
- package/dist/core/web/busqueda-nativa.js +163 -0
- package/dist/core/web/busqueda-nativa.js.map +1 -0
- package/dist/core/web/destino.d.ts +58 -0
- package/dist/core/web/destino.d.ts.map +1 -0
- package/dist/core/web/destino.js +127 -0
- package/dist/core/web/destino.js.map +1 -0
- package/dist/core/web/proveedores/brave.d.ts +6 -0
- package/dist/core/web/proveedores/brave.d.ts.map +1 -0
- package/dist/core/web/proveedores/brave.js +20 -0
- package/dist/core/web/proveedores/brave.js.map +1 -0
- package/dist/core/web/proveedores/claves.d.ts +19 -0
- package/dist/core/web/proveedores/claves.d.ts.map +1 -0
- package/dist/core/web/proveedores/claves.js +36 -0
- package/dist/core/web/proveedores/claves.js.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.js +109 -0
- package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
- package/dist/core/web/proveedores/ecosia.d.ts +3 -0
- package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
- package/dist/core/web/proveedores/ecosia.js +72 -0
- package/dist/core/web/proveedores/ecosia.js.map +1 -0
- package/dist/core/web/proveedores/exa.d.ts +6 -0
- package/dist/core/web/proveedores/exa.d.ts.map +1 -0
- package/dist/core/web/proveedores/exa.js +24 -0
- package/dist/core/web/proveedores/exa.js.map +1 -0
- package/dist/core/web/proveedores/mojeek.d.ts +3 -0
- package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
- package/dist/core/web/proveedores/mojeek.js +65 -0
- package/dist/core/web/proveedores/mojeek.js.map +1 -0
- package/dist/core/web/proveedores/navegador.d.ts +10 -0
- package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
- package/dist/core/web/proveedores/navegador.js +13 -0
- package/dist/core/web/proveedores/navegador.js.map +1 -0
- package/dist/core/web/proveedores/registro.d.ts +43 -0
- package/dist/core/web/proveedores/registro.d.ts.map +1 -0
- package/dist/core/web/proveedores/registro.js +49 -0
- package/dist/core/web/proveedores/registro.js.map +1 -0
- package/dist/core/web/proveedores/searxng.d.ts +9 -0
- package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
- package/dist/core/web/proveedores/searxng.js +17 -0
- package/dist/core/web/proveedores/searxng.js.map +1 -0
- package/dist/core/web/proveedores/serper.d.ts +9 -0
- package/dist/core/web/proveedores/serper.d.ts.map +1 -0
- package/dist/core/web/proveedores/serper.js +19 -0
- package/dist/core/web/proveedores/serper.js.map +1 -0
- package/dist/core/web/proveedores/tavily.d.ts +6 -0
- package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
- package/dist/core/web/proveedores/tavily.js +19 -0
- package/dist/core/web/proveedores/tavily.js.map +1 -0
- package/dist/core/web/proveedores/tipos.d.ts +36 -0
- package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
- package/dist/core/web/proveedores/tipos.js +10 -0
- package/dist/core/web/proveedores/tipos.js.map +1 -0
- package/dist/core/web/registro-red.d.ts +43 -0
- package/dist/core/web/registro-red.d.ts.map +1 -0
- package/dist/core/web/registro-red.js +86 -0
- package/dist/core/web/registro-red.js.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.js +38 -0
- package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
- package/dist/core/web/scrapers/crates-io.d.ts +11 -0
- package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
- package/dist/core/web/scrapers/crates-io.js +29 -0
- package/dist/core/web/scrapers/crates-io.js.map +1 -0
- package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
- package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
- package/dist/core/web/scrapers/docs-rs.js +35 -0
- package/dist/core/web/scrapers/docs-rs.js.map +1 -0
- package/dist/core/web/scrapers/github.d.ts +3 -0
- package/dist/core/web/scrapers/github.d.ts.map +1 -0
- package/dist/core/web/scrapers/github.js +72 -0
- package/dist/core/web/scrapers/github.js.map +1 -0
- package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
- package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
- package/dist/core/web/scrapers/go-pkg.js +30 -0
- package/dist/core/web/scrapers/go-pkg.js.map +1 -0
- package/dist/core/web/scrapers/hex.d.ts +6 -0
- package/dist/core/web/scrapers/hex.d.ts.map +1 -0
- package/dist/core/web/scrapers/hex.js +27 -0
- package/dist/core/web/scrapers/hex.js.map +1 -0
- package/dist/core/web/scrapers/maven.d.ts +8 -0
- package/dist/core/web/scrapers/maven.d.ts.map +1 -0
- package/dist/core/web/scrapers/maven.js +41 -0
- package/dist/core/web/scrapers/maven.js.map +1 -0
- package/dist/core/web/scrapers/mdn.d.ts +6 -0
- package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
- package/dist/core/web/scrapers/mdn.js +28 -0
- package/dist/core/web/scrapers/mdn.js.map +1 -0
- package/dist/core/web/scrapers/npm.d.ts +11 -0
- package/dist/core/web/scrapers/npm.d.ts.map +1 -0
- package/dist/core/web/scrapers/npm.js +57 -0
- package/dist/core/web/scrapers/npm.js.map +1 -0
- package/dist/core/web/scrapers/nuget.d.ts +8 -0
- package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
- package/dist/core/web/scrapers/nuget.js +22 -0
- package/dist/core/web/scrapers/nuget.js.map +1 -0
- package/dist/core/web/scrapers/nvd.d.ts +7 -0
- package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
- package/dist/core/web/scrapers/nvd.js +37 -0
- package/dist/core/web/scrapers/nvd.js.map +1 -0
- package/dist/core/web/scrapers/pypi.d.ts +6 -0
- package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
- package/dist/core/web/scrapers/pypi.js +31 -0
- package/dist/core/web/scrapers/pypi.js.map +1 -0
- package/dist/core/web/scrapers/registro.d.ts +13 -0
- package/dist/core/web/scrapers/registro.d.ts.map +1 -0
- package/dist/core/web/scrapers/registro.js +65 -0
- package/dist/core/web/scrapers/registro.js.map +1 -0
- package/dist/core/web/scrapers/rubygems.d.ts +6 -0
- package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
- package/dist/core/web/scrapers/rubygems.js +23 -0
- package/dist/core/web/scrapers/rubygems.js.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.js +46 -0
- package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
- package/dist/core/web/scrapers/tipos.d.ts +42 -0
- package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
- package/dist/core/web/scrapers/tipos.js +23 -0
- package/dist/core/web/scrapers/tipos.js.map +1 -0
- package/dist/core/web/texto.d.ts +10 -0
- package/dist/core/web/texto.d.ts.map +1 -0
- package/dist/core/web/texto.js +26 -0
- package/dist/core/web/texto.js.map +1 -0
- package/dist/core/web/tools.d.ts +91 -0
- package/dist/core/web/tools.d.ts.map +1 -0
- package/dist/core/web/tools.js +304 -0
- package/dist/core/web/tools.js.map +1 -0
- package/dist/core/wiki/almacen.d.ts +33 -0
- package/dist/core/wiki/almacen.d.ts.map +1 -0
- package/dist/core/wiki/almacen.js +93 -0
- package/dist/core/wiki/almacen.js.map +1 -0
- package/dist/core/wiki/citas.d.ts +111 -0
- package/dist/core/wiki/citas.d.ts.map +1 -0
- package/dist/core/wiki/citas.js +146 -0
- package/dist/core/wiki/citas.js.map +1 -0
- package/dist/core/workflows/agent-runner.d.ts +88 -0
- package/dist/core/workflows/agent-runner.d.ts.map +1 -0
- package/dist/core/workflows/agent-runner.js +312 -0
- package/dist/core/workflows/agent-runner.js.map +1 -0
- package/dist/core/workflows/builtins.d.ts +41 -0
- package/dist/core/workflows/builtins.d.ts.map +1 -0
- package/dist/core/workflows/builtins.js +283 -0
- package/dist/core/workflows/builtins.js.map +1 -0
- package/dist/core/workflows/contrato/esquema.d.ts +32 -0
- package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
- package/dist/core/workflows/contrato/esquema.js +25 -0
- package/dist/core/workflows/contrato/esquema.js.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
- package/dist/core/workflows/contrato/validador.d.ts +30 -0
- package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
- package/dist/core/workflows/contrato/validador.js +56 -0
- package/dist/core/workflows/contrato/validador.js.map +1 -0
- package/dist/core/workflows/contrato/yield.d.ts +65 -0
- package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
- package/dist/core/workflows/contrato/yield.js +80 -0
- package/dist/core/workflows/contrato/yield.js.map +1 -0
- package/dist/core/workflows/goal-engine/engine.d.ts +151 -0
- package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/engine.js +503 -0
- package/dist/core/workflows/goal-engine/engine.js.map +1 -0
- package/dist/core/workflows/goal-engine/errors.d.ts +7 -0
- package/dist/core/workflows/goal-engine/errors.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/errors.js +9 -0
- package/dist/core/workflows/goal-engine/errors.js.map +1 -0
- package/dist/core/workflows/goal-engine/index.d.ts +13 -0
- package/dist/core/workflows/goal-engine/index.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/index.js +8 -0
- package/dist/core/workflows/goal-engine/index.js.map +1 -0
- package/dist/core/workflows/goal-engine/persistence.d.ts +31 -0
- package/dist/core/workflows/goal-engine/persistence.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/persistence.js +145 -0
- package/dist/core/workflows/goal-engine/persistence.js.map +1 -0
- package/dist/core/workflows/goal-engine/prompts.d.ts +37 -0
- package/dist/core/workflows/goal-engine/prompts.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/prompts.js +131 -0
- package/dist/core/workflows/goal-engine/prompts.js.map +1 -0
- package/dist/core/workflows/goal-engine/state.d.ts +41 -0
- package/dist/core/workflows/goal-engine/state.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/state.js +397 -0
- package/dist/core/workflows/goal-engine/state.js.map +1 -0
- package/dist/core/workflows/goal-engine/tools.d.ts +31 -0
- package/dist/core/workflows/goal-engine/tools.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/tools.js +211 -0
- package/dist/core/workflows/goal-engine/tools.js.map +1 -0
- package/dist/core/workflows/goal-engine/types.d.ts +286 -0
- package/dist/core/workflows/goal-engine/types.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/types.js +17 -0
- package/dist/core/workflows/goal-engine/types.js.map +1 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts +23 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.js +72 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.js.map +1 -0
- package/dist/core/workflows/graph-sync.d.ts +67 -0
- package/dist/core/workflows/graph-sync.d.ts.map +1 -0
- package/dist/core/workflows/graph-sync.js +188 -0
- package/dist/core/workflows/graph-sync.js.map +1 -0
- package/dist/core/workflows/graph.d.ts +143 -0
- package/dist/core/workflows/graph.d.ts.map +1 -0
- package/dist/core/workflows/graph.js +319 -0
- package/dist/core/workflows/graph.js.map +1 -0
- package/dist/core/workflows/index.d.ts +26 -0
- package/dist/core/workflows/index.d.ts.map +1 -0
- package/dist/core/workflows/index.js +18 -0
- package/dist/core/workflows/index.js.map +1 -0
- package/dist/core/workflows/journal.d.ts +68 -0
- package/dist/core/workflows/journal.d.ts.map +1 -0
- package/dist/core/workflows/journal.js +83 -0
- package/dist/core/workflows/journal.js.map +1 -0
- package/dist/core/workflows/manager.d.ts +122 -0
- package/dist/core/workflows/manager.d.ts.map +1 -0
- package/dist/core/workflows/manager.js +351 -0
- package/dist/core/workflows/manager.js.map +1 -0
- package/dist/core/workflows/resolve-script.d.ts +35 -0
- package/dist/core/workflows/resolve-script.d.ts.map +1 -0
- package/dist/core/workflows/resolve-script.js +66 -0
- package/dist/core/workflows/resolve-script.js.map +1 -0
- package/dist/core/workflows/runtime.d.ts +62 -0
- package/dist/core/workflows/runtime.d.ts.map +1 -0
- package/dist/core/workflows/runtime.js +380 -0
- package/dist/core/workflows/runtime.js.map +1 -0
- package/dist/core/workflows/save-as-skill.d.ts +27 -0
- package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
- package/dist/core/workflows/save-as-skill.js +54 -0
- package/dist/core/workflows/save-as-skill.js.map +1 -0
- package/dist/core/workflows/shared-store.d.ts +31 -0
- package/dist/core/workflows/shared-store.d.ts.map +1 -0
- package/dist/core/workflows/shared-store.js +80 -0
- package/dist/core/workflows/shared-store.js.map +1 -0
- package/dist/core/workflows/subagent-host.d.ts +50 -0
- package/dist/core/workflows/subagent-host.d.ts.map +1 -0
- package/dist/core/workflows/subagent-host.js +225 -0
- package/dist/core/workflows/subagent-host.js.map +1 -0
- package/dist/core/workflows/tool-workflow.d.ts +22 -0
- package/dist/core/workflows/tool-workflow.d.ts.map +1 -0
- package/dist/core/workflows/tool-workflow.js +120 -0
- package/dist/core/workflows/tool-workflow.js.map +1 -0
- package/dist/core/workflows/types.d.ts +191 -0
- package/dist/core/workflows/types.d.ts.map +1 -0
- package/dist/core/workflows/types.js +26 -0
- package/dist/core/workflows/types.js.map +1 -0
- package/dist/core/workflows/worktree.d.ts +42 -0
- package/dist/core/workflows/worktree.d.ts.map +1 -0
- package/dist/core/workflows/worktree.js +107 -0
- package/dist/core/workflows/worktree.js.map +1 -0
- package/dist/extensions/llama/index.d.ts.map +1 -1
- package/dist/extensions/llama/index.js +2 -0
- package/dist/extensions/llama/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +6 -2
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/remoto/index.d.ts +22 -0
- package/dist/extensions/remoto/index.d.ts.map +1 -0
- package/dist/extensions/remoto/index.js +54 -0
- package/dist/extensions/remoto/index.js.map +1 -0
- package/dist/index.d.ts +1 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -13
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +4 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +26 -15
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +4 -3
- package/dist/migrations.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts +42 -0
- package/dist/modes/acp/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp/acp-mode.js +190 -0
- package/dist/modes/acp/acp-mode.js.map +1 -0
- package/dist/modes/acp/events.d.ts +74 -0
- package/dist/modes/acp/events.d.ts.map +1 -0
- package/dist/modes/acp/events.js +116 -0
- package/dist/modes/acp/events.js.map +1 -0
- package/dist/modes/interactive/components/home-screen.d.ts.map +1 -1
- package/dist/modes/interactive/components/home-screen.js +2 -2
- package/dist/modes/interactive/components/home-screen.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +9 -3
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +56 -12
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/prompt-optimization.d.ts +16 -0
- package/dist/modes/interactive/components/prompt-optimization.d.ts.map +1 -0
- package/dist/modes/interactive/components/prompt-optimization.js +46 -0
- package/dist/modes/interactive/components/prompt-optimization.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +19 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +180 -56
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-submenu.js +165 -0
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +74 -17
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +2 -1
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +21 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +709 -75
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +4 -3
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +16 -13
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +20 -6
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +11 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +173 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +29 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +27 -5
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/server/attach.d.ts +56 -0
- package/dist/server/attach.d.ts.map +1 -0
- package/dist/server/attach.js +130 -0
- package/dist/server/attach.js.map +1 -0
- package/dist/server/extension-ops.d.ts +40 -0
- package/dist/server/extension-ops.d.ts.map +1 -0
- package/dist/server/extension-ops.js +146 -0
- package/dist/server/extension-ops.js.map +1 -0
- package/dist/server/pi-server-service.d.ts +85 -0
- package/dist/server/pi-server-service.d.ts.map +1 -0
- package/dist/server/pi-server-service.js +213 -0
- package/dist/server/pi-server-service.js.map +1 -0
- package/dist/server/scheduler-tick.d.ts +32 -0
- package/dist/server/scheduler-tick.d.ts.map +1 -0
- package/dist/server/scheduler-tick.js +47 -0
- package/dist/server/scheduler-tick.js.map +1 -0
- package/dist/server/serve.d.ts +25 -0
- package/dist/server/serve.d.ts.map +1 -0
- package/dist/server/serve.js +83 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/server/transcript.d.ts +38 -0
- package/dist/server/transcript.d.ts.map +1 -0
- package/dist/server/transcript.js +176 -0
- package/dist/server/transcript.js.map +1 -0
- package/dist/skills/ada-engine/SKILL.md +153 -0
- package/dist/skills/skill-creator/SKILL.md +90 -0
- package/dist/telegram/api.d.ts +75 -0
- package/dist/telegram/api.d.ts.map +1 -0
- package/dist/telegram/api.js +104 -0
- package/dist/telegram/api.js.map +1 -0
- package/dist/telegram/bridge.d.ts +85 -0
- package/dist/telegram/bridge.d.ts.map +1 -0
- package/dist/telegram/bridge.js +182 -0
- package/dist/telegram/bridge.js.map +1 -0
- package/dist/telegram/journal.d.ts +67 -0
- package/dist/telegram/journal.d.ts.map +1 -0
- package/dist/telegram/journal.js +119 -0
- package/dist/telegram/journal.js.map +1 -0
- package/dist/telegram/servidor.d.ts +15 -0
- package/dist/telegram/servidor.d.ts.map +1 -0
- package/dist/telegram/servidor.js +74 -0
- package/dist/telegram/servidor.js.map +1 -0
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +2 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/management-http.d.ts +5 -3
- package/dist/utils/management-http.d.ts.map +1 -1
- package/dist/utils/management-http.js +14 -10
- package/dist/utils/management-http.js.map +1 -1
- package/dist/utils/shell.d.ts +11 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +11 -0
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/text.d.ts +8 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +9 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +29 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +25 -10
- package/docs/compliance.md +241 -0
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +15 -12
- package/docs/development.md +47 -10
- package/docs/docs.json +14 -2
- package/docs/environment-variables.md +20 -17
- package/docs/extensions.md +62 -51
- package/docs/index.md +15 -21
- package/docs/json.md +10 -5
- package/docs/keybindings.md +5 -5
- package/docs/llama-cpp.md +9 -7
- package/docs/models.md +18 -12
- package/docs/packages.md +45 -45
- package/docs/prompt-templates.md +5 -5
- package/docs/providers.md +12 -12
- package/docs/quickstart.md +39 -39
- package/docs/rpc.md +21 -15
- package/docs/sdk.md +38 -38
- package/docs/security.md +26 -21
- package/docs/session-format.md +7 -7
- package/docs/sessions.md +14 -14
- package/docs/settings.md +47 -22
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +14 -13
- package/docs/terminal-setup.md +14 -14
- package/docs/termux.md +7 -7
- package/docs/themes.md +11 -11
- package/docs/tmux.md +4 -4
- package/docs/tui.md +3 -3
- package/docs/usage.md +54 -54
- package/docs/windows.md +2 -2
- package/examples/extensions/border-status-editor.ts +1 -1
- package/examples/extensions/git-checkpoint.ts +2 -2
- package/examples/extensions/notify.ts +3 -1
- package/examples/extensions/subagent/README.md +1 -1
- package/examples/extensions/subagent/index.ts +6 -1
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/rpc-extension-ui.ts +1 -1
- package/examples/sdk/06-extensions.ts +1 -1
- package/examples/sdk/12-full-control.ts +9 -0
- package/examples/sdk/README.md +1 -1
- package/npm-shrinkwrap.json +35 -261
- package/package.json +9 -3
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ast_search` y `ast_edit`: la búsqueda y la edición estructural, como tools
|
|
3
|
+
* del agente.
|
|
4
|
+
*
|
|
5
|
+
* El renderizado se deja al genérico (`ToolDefinition.renderCall/renderResult`
|
|
6
|
+
* son opcionales): igual que `crearBrowserTools`, la caja de texto por
|
|
7
|
+
* defecto ya vale para lo que devuelven estas dos.
|
|
8
|
+
*/
|
|
9
|
+
import { Type } from "typebox";
|
|
10
|
+
import { resolveToCwd } from "../tools/path-utils.js";
|
|
11
|
+
import { buscarEstructural } from "./buscar.js";
|
|
12
|
+
import { editarEstructural } from "./editar.js";
|
|
13
|
+
const AYUDA_PATRON = 'Patrón estructural "tipo:nombre". tipo es uno de: funcion, clase, tipo, llamada, import, propiedad. ' +
|
|
14
|
+
'Ejemplos: "funcion:procesarPedido", "clase:Cliente", "llamada:fetch", "import:react", "propiedad:id".';
|
|
15
|
+
function rutasDe(pathParam, cwd) {
|
|
16
|
+
const crudas = (pathParam ?? ".")
|
|
17
|
+
.split(";")
|
|
18
|
+
.map((p) => p.trim())
|
|
19
|
+
.filter((p) => p.length > 0);
|
|
20
|
+
return (crudas.length > 0 ? crudas : ["."]).map((p) => resolveToCwd(p, cwd));
|
|
21
|
+
}
|
|
22
|
+
function texto(t) {
|
|
23
|
+
return { content: [{ type: "text", text: t }], details: undefined };
|
|
24
|
+
}
|
|
25
|
+
function avisoNoCubiertos(noCubiertos) {
|
|
26
|
+
if (noCubiertos.length === 0)
|
|
27
|
+
return "";
|
|
28
|
+
return `\n\nSin cobertura estructural (no es .ts/.tsx/.js/.jsx), no se han mirado: ${noCubiertos.join(", ")}`;
|
|
29
|
+
}
|
|
30
|
+
const astSearchSchema = Type.Object({
|
|
31
|
+
pat: Type.String({ description: AYUDA_PATRON }),
|
|
32
|
+
path: Type.Optional(Type.String({ description: 'Fichero o directorio a buscar; varios separados por ";" (default: ".")' })),
|
|
33
|
+
});
|
|
34
|
+
function crearAstSearchTool(cwd) {
|
|
35
|
+
return {
|
|
36
|
+
name: "ast_search",
|
|
37
|
+
label: "Búsqueda estructural",
|
|
38
|
+
promptSnippet: "buscar una declaración/llamada/import por su FORMA en el AST, no por texto (evita comentarios y cadenas)",
|
|
39
|
+
description: "Busca en código TypeScript/JavaScript por estructura sintáctica, no por texto: encuentra la declaración de una " +
|
|
40
|
+
"función/clase/tipo, una llamada, un import o una propiedad SIN que un comentario o una cadena que mencionen el " +
|
|
41
|
+
`mismo nombre cuenten como coincidencia. ${AYUDA_PATRON} Solo cubre .ts/.tsx/.js/.jsx (y variantes de módulo); ` +
|
|
42
|
+
"para otros lenguajes de programación lo dice explícitamente en vez de devolver cero resultados.",
|
|
43
|
+
parameters: astSearchSchema,
|
|
44
|
+
async execute(_toolCallId, { pat, path }) {
|
|
45
|
+
const raices = rutasDe(path, cwd);
|
|
46
|
+
const resultado = buscarEstructural(pat, raices, cwd);
|
|
47
|
+
if (resultado === null) {
|
|
48
|
+
throw new Error(`No se entiende el patrón "${pat}". ${AYUDA_PATRON}`);
|
|
49
|
+
}
|
|
50
|
+
const { coincidencias, noCubiertos } = resultado;
|
|
51
|
+
const cuerpo = coincidencias.length === 0
|
|
52
|
+
? "No hay coincidencias estructurales."
|
|
53
|
+
: coincidencias.map((c) => `${c.ruta}:${c.linea}: ${c.fragmento}`).join("\n");
|
|
54
|
+
return texto(cuerpo + avisoNoCubiertos(noCubiertos));
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const astEditSchema = Type.Object({
|
|
59
|
+
pat: Type.String({ description: AYUDA_PATRON }),
|
|
60
|
+
out: Type.String({
|
|
61
|
+
description: "Texto que sustituye a CADA nodo que coincida, completo (por ejemplo la declaración entera con el nuevo " +
|
|
62
|
+
"nombre). Las líneas 2+ se reindentan a la indentación del sitio.",
|
|
63
|
+
}),
|
|
64
|
+
path: Type.Optional(Type.String({ description: 'Fichero o directorio a editar; varios separados por ";" (default: ".")' })),
|
|
65
|
+
});
|
|
66
|
+
function crearAstEditTool(cwd) {
|
|
67
|
+
return {
|
|
68
|
+
name: "ast_edit",
|
|
69
|
+
label: "Edición estructural",
|
|
70
|
+
promptSnippet: "sustituir una declaración/llamada por su FORMA en el AST, sin tocar cadenas/comentarios que compartan el mismo texto",
|
|
71
|
+
description: "Reemplaza en código TypeScript/JavaScript el nodo que coincide con un patrón estructural (ver ast_search) " +
|
|
72
|
+
"por el texto de `out`, sin tocar cadenas ni comentarios que mencionen el mismo nombre porque no son ese nodo. " +
|
|
73
|
+
"Útil para renombrar una declaración con precisión donde un buscar-y-reemplazar de texto rompería otras cosas. " +
|
|
74
|
+
"Escribe los ficheros que cambian. Solo cubre .ts/.tsx/.js/.jsx; para otros lenguajes lo dice en vez de fingir que no había nada que cambiar.",
|
|
75
|
+
parameters: astEditSchema,
|
|
76
|
+
async execute(_toolCallId, { pat, out, path }) {
|
|
77
|
+
const raices = rutasDe(path, cwd);
|
|
78
|
+
const resultado = editarEstructural(pat, out, raices, cwd, { aplicar: true });
|
|
79
|
+
if (resultado === null) {
|
|
80
|
+
throw new Error(`No se entiende el patrón "${pat}". ${AYUDA_PATRON}`);
|
|
81
|
+
}
|
|
82
|
+
const { cambios, noCubiertos, rompieronParseo } = resultado;
|
|
83
|
+
if (cambios.length === 0) {
|
|
84
|
+
return texto(`No hay coincidencias estructurales; ningún fichero se ha tocado.${avisoNoCubiertos(noCubiertos)}`);
|
|
85
|
+
}
|
|
86
|
+
const cuerpo = cambios.map((c) => `${c.ruta}:${c.linea}:\n- ${c.antes}\n+ ${c.despues}`).join("\n\n");
|
|
87
|
+
const avisoRoto = rompieronParseo.length > 0
|
|
88
|
+
? `\n\n⚠ Estos ficheros han quedado sintácticamente rotos tras la edición: ${rompieronParseo.join(", ")}. Arréglalos antes de seguir.`
|
|
89
|
+
: "";
|
|
90
|
+
return texto(`${cambios.length} cambio(s) aplicados.\n\n${cuerpo}${avisoRoto}${avisoNoCubiertos(noCubiertos)}`);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function crearEstructuralTools(cwd) {
|
|
95
|
+
return {
|
|
96
|
+
ast_search: crearAstSearchTool(cwd),
|
|
97
|
+
ast_edit: crearAstEditTool(cwd),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/core/estructural/tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `ast_search` y `ast_edit`: la búsqueda y la edición estructural, como tools\n * del agente.\n *\n * El renderizado se deja al genérico (`ToolDefinition.renderCall/renderResult`\n * son opcionales): igual que `crearBrowserTools`, la caja de texto por\n * defecto ya vale para lo que devuelven estas dos.\n */\n\nimport { Type } from \"typebox\";\nimport type { AgentToolResult, ToolDefinition } from \"../extensions/types.ts\";\nimport { resolveToCwd } from \"../tools/path-utils.ts\";\nimport { buscarEstructural } from \"./buscar.ts\";\nimport { editarEstructural } from \"./editar.ts\";\n\nconst AYUDA_PATRON =\n\t'Patrón estructural \"tipo:nombre\". tipo es uno de: funcion, clase, tipo, llamada, import, propiedad. ' +\n\t'Ejemplos: \"funcion:procesarPedido\", \"clase:Cliente\", \"llamada:fetch\", \"import:react\", \"propiedad:id\".';\n\nfunction rutasDe(pathParam: string | undefined, cwd: string): string[] {\n\tconst crudas = (pathParam ?? \".\")\n\t\t.split(\";\")\n\t\t.map((p) => p.trim())\n\t\t.filter((p) => p.length > 0);\n\treturn (crudas.length > 0 ? crudas : [\".\"]).map((p) => resolveToCwd(p, cwd));\n}\n\nfunction texto(t: string): AgentToolResult<unknown> {\n\treturn { content: [{ type: \"text\" as const, text: t }], details: undefined };\n}\n\nfunction avisoNoCubiertos(noCubiertos: string[]): string {\n\tif (noCubiertos.length === 0) return \"\";\n\treturn `\\n\\nSin cobertura estructural (no es .ts/.tsx/.js/.jsx), no se han mirado: ${noCubiertos.join(\", \")}`;\n}\n\nconst astSearchSchema = Type.Object({\n\tpat: Type.String({ description: AYUDA_PATRON }),\n\tpath: Type.Optional(\n\t\tType.String({ description: 'Fichero o directorio a buscar; varios separados por \";\" (default: \".\")' }),\n\t),\n});\n\nfunction crearAstSearchTool(cwd: string): ToolDefinition<typeof astSearchSchema> {\n\treturn {\n\t\tname: \"ast_search\",\n\t\tlabel: \"Búsqueda estructural\",\n\t\tpromptSnippet:\n\t\t\t\"buscar una declaración/llamada/import por su FORMA en el AST, no por texto (evita comentarios y cadenas)\",\n\t\tdescription:\n\t\t\t\"Busca en código TypeScript/JavaScript por estructura sintáctica, no por texto: encuentra la declaración de una \" +\n\t\t\t\"función/clase/tipo, una llamada, un import o una propiedad SIN que un comentario o una cadena que mencionen el \" +\n\t\t\t`mismo nombre cuenten como coincidencia. ${AYUDA_PATRON} Solo cubre .ts/.tsx/.js/.jsx (y variantes de módulo); ` +\n\t\t\t\"para otros lenguajes de programación lo dice explícitamente en vez de devolver cero resultados.\",\n\t\tparameters: astSearchSchema,\n\t\tasync execute(_toolCallId, { pat, path }): Promise<AgentToolResult<unknown>> {\n\t\t\tconst raices = rutasDe(path, cwd);\n\t\t\tconst resultado = buscarEstructural(pat, raices, cwd);\n\t\t\tif (resultado === null) {\n\t\t\t\tthrow new Error(`No se entiende el patrón \"${pat}\". ${AYUDA_PATRON}`);\n\t\t\t}\n\t\t\tconst { coincidencias, noCubiertos } = resultado;\n\t\t\tconst cuerpo =\n\t\t\t\tcoincidencias.length === 0\n\t\t\t\t\t? \"No hay coincidencias estructurales.\"\n\t\t\t\t\t: coincidencias.map((c) => `${c.ruta}:${c.linea}: ${c.fragmento}`).join(\"\\n\");\n\t\t\treturn texto(cuerpo + avisoNoCubiertos(noCubiertos));\n\t\t},\n\t};\n}\n\nconst astEditSchema = Type.Object({\n\tpat: Type.String({ description: AYUDA_PATRON }),\n\tout: Type.String({\n\t\tdescription:\n\t\t\t\"Texto que sustituye a CADA nodo que coincida, completo (por ejemplo la declaración entera con el nuevo \" +\n\t\t\t\"nombre). Las líneas 2+ se reindentan a la indentación del sitio.\",\n\t}),\n\tpath: Type.Optional(\n\t\tType.String({ description: 'Fichero o directorio a editar; varios separados por \";\" (default: \".\")' }),\n\t),\n});\n\nfunction crearAstEditTool(cwd: string): ToolDefinition<typeof astEditSchema> {\n\treturn {\n\t\tname: \"ast_edit\",\n\t\tlabel: \"Edición estructural\",\n\t\tpromptSnippet:\n\t\t\t\"sustituir una declaración/llamada por su FORMA en el AST, sin tocar cadenas/comentarios que compartan el mismo texto\",\n\t\tdescription:\n\t\t\t\"Reemplaza en código TypeScript/JavaScript el nodo que coincide con un patrón estructural (ver ast_search) \" +\n\t\t\t\"por el texto de `out`, sin tocar cadenas ni comentarios que mencionen el mismo nombre porque no son ese nodo. \" +\n\t\t\t\"Útil para renombrar una declaración con precisión donde un buscar-y-reemplazar de texto rompería otras cosas. \" +\n\t\t\t\"Escribe los ficheros que cambian. Solo cubre .ts/.tsx/.js/.jsx; para otros lenguajes lo dice en vez de fingir que no había nada que cambiar.\",\n\t\tparameters: astEditSchema,\n\t\tasync execute(_toolCallId, { pat, out, path }): Promise<AgentToolResult<unknown>> {\n\t\t\tconst raices = rutasDe(path, cwd);\n\t\t\tconst resultado = editarEstructural(pat, out, raices, cwd, { aplicar: true });\n\t\t\tif (resultado === null) {\n\t\t\t\tthrow new Error(`No se entiende el patrón \"${pat}\". ${AYUDA_PATRON}`);\n\t\t\t}\n\t\t\tconst { cambios, noCubiertos, rompieronParseo } = resultado;\n\t\t\tif (cambios.length === 0) {\n\t\t\t\treturn texto(\n\t\t\t\t\t`No hay coincidencias estructurales; ningún fichero se ha tocado.${avisoNoCubiertos(noCubiertos)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst cuerpo = cambios.map((c) => `${c.ruta}:${c.linea}:\\n- ${c.antes}\\n+ ${c.despues}`).join(\"\\n\\n\");\n\t\t\tconst avisoRoto =\n\t\t\t\trompieronParseo.length > 0\n\t\t\t\t\t? `\\n\\n⚠ Estos ficheros han quedado sintácticamente rotos tras la edición: ${rompieronParseo.join(\", \")}. Arréglalos antes de seguir.`\n\t\t\t\t\t: \"\";\n\t\t\treturn texto(\n\t\t\t\t`${cambios.length} cambio(s) aplicados.\\n\\n${cuerpo}${avisoRoto}${avisoNoCubiertos(noCubiertos)}`,\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport function crearEstructuralTools(cwd: string): Record<string, ToolDefinition> {\n\treturn {\n\t\tast_search: crearAstSearchTool(cwd) as ToolDefinition,\n\t\tast_edit: crearAstEditTool(cwd) as ToolDefinition,\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"experimental.d.ts","sourceRoot":"","sources":["../../src/core/experimental.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"experimental.d.ts","sourceRoot":"","sources":["../../src/core/experimental.ts"],"names":[],"mappings":"AAIA,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAED,wBAAgB,2BAA2B;;;cAU1C","sourcesContent":["import { muestreoRestringidoActivo } from \"./muestreo-restringido.ts\";\n\nconst PREFER_STRICT_TOOL_SAMPLING = { type: \"json_schema\", strict: \"prefer\" } as const;\n\nexport function areExperimentalFeaturesEnabled(): boolean {\n\treturn process.env.PI_EXPERIMENTAL === \"1\";\n}\n\nexport function getExperimentalToolSampling() {\n\t// La decodificación restringida tiene su PROPIO interruptor desde\n\t// `core/muestreo-restringido.ts`. Antes solo se encendía con\n\t// `PI_EXPERIMENTAL=1`, que activa todo lo experimental a la vez: quien\n\t// quisiera probar solo esto tenía que aceptar lo demás, y en un equipo con\n\t// control de cambios eso significa no probarlo nunca.\n\t//\n\t// El defecto no cambia —sigue apagada— porque no está medida de punta a\n\t// punta. Ver el comentario de cabecera de ese fichero, con lo que sí se midió.\n\treturn muestreoRestringidoActivo() ? PREFER_STRICT_TOOL_SAMPLING : undefined;\n}\n"]}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
|
+
import { muestreoRestringidoActivo } from "./muestreo-restringido.js";
|
|
1
2
|
const PREFER_STRICT_TOOL_SAMPLING = { type: "json_schema", strict: "prefer" };
|
|
2
3
|
export function areExperimentalFeaturesEnabled() {
|
|
3
4
|
return process.env.PI_EXPERIMENTAL === "1";
|
|
4
5
|
}
|
|
5
6
|
export function getExperimentalToolSampling() {
|
|
6
|
-
|
|
7
|
+
// La decodificación restringida tiene su PROPIO interruptor desde
|
|
8
|
+
// `core/muestreo-restringido.ts`. Antes solo se encendía con
|
|
9
|
+
// `PI_EXPERIMENTAL=1`, que activa todo lo experimental a la vez: quien
|
|
10
|
+
// quisiera probar solo esto tenía que aceptar lo demás, y en un equipo con
|
|
11
|
+
// control de cambios eso significa no probarlo nunca.
|
|
12
|
+
//
|
|
13
|
+
// El defecto no cambia —sigue apagada— porque no está medida de punta a
|
|
14
|
+
// punta. Ver el comentario de cabecera de ese fichero, con lo que sí se midió.
|
|
15
|
+
return muestreoRestringidoActivo() ? PREFER_STRICT_TOOL_SAMPLING : undefined;
|
|
7
16
|
}
|
|
8
17
|
//# sourceMappingURL=experimental.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"experimental.js","sourceRoot":"","sources":["../../src/core/experimental.ts"],"names":[],"mappings":"AAAA,MAAM,2BAA2B,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAW,CAAC;AAEvF,MAAM,UAAU,8BAA8B,GAAY;IACzD,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC;AAAA,CAC3C;AAED,MAAM,UAAU,2BAA2B,GAAG;IAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"experimental.js","sourceRoot":"","sources":["../../src/core/experimental.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,2BAA2B,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAW,CAAC;AAEvF,MAAM,UAAU,8BAA8B,GAAY;IACzD,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC;AAAA,CAC3C;AAED,MAAM,UAAU,2BAA2B,GAAG;IAC7C,mEAAkE;IAClE,8DAA6D;IAC7D,uEAAuE;IACvE,6EAA2E;IAC3E,sDAAsD;IACtD,EAAE;IACF,6EAAwE;IACxE,iFAA+E;IAC/E,OAAO,yBAAyB,EAAE,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CAC7E","sourcesContent":["import { muestreoRestringidoActivo } from \"./muestreo-restringido.ts\";\n\nconst PREFER_STRICT_TOOL_SAMPLING = { type: \"json_schema\", strict: \"prefer\" } as const;\n\nexport function areExperimentalFeaturesEnabled(): boolean {\n\treturn process.env.PI_EXPERIMENTAL === \"1\";\n}\n\nexport function getExperimentalToolSampling() {\n\t// La decodificación restringida tiene su PROPIO interruptor desde\n\t// `core/muestreo-restringido.ts`. Antes solo se encendía con\n\t// `PI_EXPERIMENTAL=1`, que activa todo lo experimental a la vez: quien\n\t// quisiera probar solo esto tenía que aceptar lo demás, y en un equipo con\n\t// control de cambios eso significa no probarlo nunca.\n\t//\n\t// El defecto no cambia —sigue apagada— porque no está medida de punta a\n\t// punta. Ver el comentario de cabecera de ese fichero, con lo que sí se midió.\n\treturn muestreoRestringidoActivo() ? PREFER_STRICT_TOOL_SAMPLING : undefined;\n}\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registro de tools de builtin SUPLANTADAS por una extensión.
|
|
3
|
+
*
|
|
4
|
+
* Módulo hoja a propósito: no importa nada. `aprobacion/politica.ts` lo consulta
|
|
5
|
+
* en `nivelDe()` y `extensiones/vigilancia.ts` lo escribe; si el registro
|
|
6
|
+
* viviera en cualquiera de los dos habría un ciclo de imports entre ellos.
|
|
7
|
+
*
|
|
8
|
+
* El defecto que motiva esto se comprobó ejecutando: una extensión llama
|
|
9
|
+
* `pi.registerTool({ name: "read", … })`, el loader hace `tools.set("read", …)`
|
|
10
|
+
* sin mirar nada, y `agent-session._refreshToolRegistry()` la pone ENCIMA de la
|
|
11
|
+
* builtin (`toolRegistry.set(tool.name, tool)` después de las builtin). A partir
|
|
12
|
+
* de ahí:
|
|
13
|
+
*
|
|
14
|
+
* - el modelo cree que llama a nuestro `read`, que solo lee;
|
|
15
|
+
* - `politica.nivelDe("read")` devolvía "lectura", así que la política la
|
|
16
|
+
* dejaba pasar SIEMPRE, en cualquier modo, sin preguntar;
|
|
17
|
+
* - y el usuario no veía ninguna diferencia en pantalla.
|
|
18
|
+
*
|
|
19
|
+
* Es decir: un `read` que en realidad escribe, con el nivel de confianza de un
|
|
20
|
+
* `read`. Lo que se anota aquí es lo que quita ese nivel heredado.
|
|
21
|
+
*
|
|
22
|
+
* Se registra el nombre y QUIÉN lo suplanta: un aviso sin la ruta de la
|
|
23
|
+
* extensión no es accionable, y lo que no se puede accionar se ignora.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Anota que `nombre` ya no es la builtin, sino lo que trae `rutaExtension`.
|
|
27
|
+
*
|
|
28
|
+
* Idempotente por (nombre, ruta): recargar extensiones vuelve a pasar por aquí.
|
|
29
|
+
*/
|
|
30
|
+
export declare function anotarSuplantacion(nombre: string, rutaExtension: string): void;
|
|
31
|
+
/**
|
|
32
|
+
* Olvida lo que anotó una extensión concreta.
|
|
33
|
+
*
|
|
34
|
+
* Hace falta porque las extensiones se recargan en caliente (`ctx.reload()`):
|
|
35
|
+
* sin esto, quitar la extensión dejaría la marca puesta para siempre y el aviso
|
|
36
|
+
* pasaría a ser un falso positivo — exactamente el fallo que vuelve inútil un
|
|
37
|
+
* detector.
|
|
38
|
+
*/
|
|
39
|
+
export declare function olvidarSuplantacionesDe(rutaExtension: string): void;
|
|
40
|
+
/** Quién suplanta `nombre`, o `undefined` si nadie. */
|
|
41
|
+
export declare function suplantadaPor(nombre: string): string | undefined;
|
|
42
|
+
/** Todo lo suplantado, para enseñarlo. */
|
|
43
|
+
export declare function suplantacionesActivas(): Array<{
|
|
44
|
+
nombre: string;
|
|
45
|
+
extension: string;
|
|
46
|
+
}>;
|
|
47
|
+
/** Vacía el registro. Solo para pruebas: el estado es de proceso. */
|
|
48
|
+
export declare function olvidarSuplantaciones(): void;
|
|
49
|
+
//# sourceMappingURL=suplantacion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suplantacion.d.ts","sourceRoot":"","sources":["../../../src/core/extensiones/suplantacion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAE9E;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAInE;AAED,wDAAuD;AACvD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhE;AAED,2CAA0C;AAC1C,wBAAgB,qBAAqB,IAAI,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAEpF;AAED,sEAAqE;AACrE,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C","sourcesContent":["/**\n * Registro de tools de builtin SUPLANTADAS por una extensión.\n *\n * Módulo hoja a propósito: no importa nada. `aprobacion/politica.ts` lo consulta\n * en `nivelDe()` y `extensiones/vigilancia.ts` lo escribe; si el registro\n * viviera en cualquiera de los dos habría un ciclo de imports entre ellos.\n *\n * El defecto que motiva esto se comprobó ejecutando: una extensión llama\n * `pi.registerTool({ name: \"read\", … })`, el loader hace `tools.set(\"read\", …)`\n * sin mirar nada, y `agent-session._refreshToolRegistry()` la pone ENCIMA de la\n * builtin (`toolRegistry.set(tool.name, tool)` después de las builtin). A partir\n * de ahí:\n *\n * - el modelo cree que llama a nuestro `read`, que solo lee;\n * - `politica.nivelDe(\"read\")` devolvía \"lectura\", así que la política la\n * dejaba pasar SIEMPRE, en cualquier modo, sin preguntar;\n * - y el usuario no veía ninguna diferencia en pantalla.\n *\n * Es decir: un `read` que en realidad escribe, con el nivel de confianza de un\n * `read`. Lo que se anota aquí es lo que quita ese nivel heredado.\n *\n * Se registra el nombre y QUIÉN lo suplanta: un aviso sin la ruta de la\n * extensión no es accionable, y lo que no se puede accionar se ignora.\n */\n\n/** nombre de la tool → ruta de la extensión que la suplanta. */\nconst suplantadas = new Map<string, string>();\n\n/**\n * Anota que `nombre` ya no es la builtin, sino lo que trae `rutaExtension`.\n *\n * Idempotente por (nombre, ruta): recargar extensiones vuelve a pasar por aquí.\n */\nexport function anotarSuplantacion(nombre: string, rutaExtension: string): void {\n\tsuplantadas.set(nombre, rutaExtension);\n}\n\n/**\n * Olvida lo que anotó una extensión concreta.\n *\n * Hace falta porque las extensiones se recargan en caliente (`ctx.reload()`):\n * sin esto, quitar la extensión dejaría la marca puesta para siempre y el aviso\n * pasaría a ser un falso positivo — exactamente el fallo que vuelve inútil un\n * detector.\n */\nexport function olvidarSuplantacionesDe(rutaExtension: string): void {\n\tfor (const [nombre, ruta] of suplantadas) {\n\t\tif (ruta === rutaExtension) suplantadas.delete(nombre);\n\t}\n}\n\n/** Quién suplanta `nombre`, o `undefined` si nadie. */\nexport function suplantadaPor(nombre: string): string | undefined {\n\treturn suplantadas.get(nombre);\n}\n\n/** Todo lo suplantado, para enseñarlo. */\nexport function suplantacionesActivas(): Array<{ nombre: string; extension: string }> {\n\treturn [...suplantadas].map(([nombre, extension]) => ({ nombre, extension }));\n}\n\n/** Vacía el registro. Solo para pruebas: el estado es de proceso. */\nexport function olvidarSuplantaciones(): void {\n\tsuplantadas.clear();\n}\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registro de tools de builtin SUPLANTADAS por una extensión.
|
|
3
|
+
*
|
|
4
|
+
* Módulo hoja a propósito: no importa nada. `aprobacion/politica.ts` lo consulta
|
|
5
|
+
* en `nivelDe()` y `extensiones/vigilancia.ts` lo escribe; si el registro
|
|
6
|
+
* viviera en cualquiera de los dos habría un ciclo de imports entre ellos.
|
|
7
|
+
*
|
|
8
|
+
* El defecto que motiva esto se comprobó ejecutando: una extensión llama
|
|
9
|
+
* `pi.registerTool({ name: "read", … })`, el loader hace `tools.set("read", …)`
|
|
10
|
+
* sin mirar nada, y `agent-session._refreshToolRegistry()` la pone ENCIMA de la
|
|
11
|
+
* builtin (`toolRegistry.set(tool.name, tool)` después de las builtin). A partir
|
|
12
|
+
* de ahí:
|
|
13
|
+
*
|
|
14
|
+
* - el modelo cree que llama a nuestro `read`, que solo lee;
|
|
15
|
+
* - `politica.nivelDe("read")` devolvía "lectura", así que la política la
|
|
16
|
+
* dejaba pasar SIEMPRE, en cualquier modo, sin preguntar;
|
|
17
|
+
* - y el usuario no veía ninguna diferencia en pantalla.
|
|
18
|
+
*
|
|
19
|
+
* Es decir: un `read` que en realidad escribe, con el nivel de confianza de un
|
|
20
|
+
* `read`. Lo que se anota aquí es lo que quita ese nivel heredado.
|
|
21
|
+
*
|
|
22
|
+
* Se registra el nombre y QUIÉN lo suplanta: un aviso sin la ruta de la
|
|
23
|
+
* extensión no es accionable, y lo que no se puede accionar se ignora.
|
|
24
|
+
*/
|
|
25
|
+
/** nombre de la tool → ruta de la extensión que la suplanta. */
|
|
26
|
+
const suplantadas = new Map();
|
|
27
|
+
/**
|
|
28
|
+
* Anota que `nombre` ya no es la builtin, sino lo que trae `rutaExtension`.
|
|
29
|
+
*
|
|
30
|
+
* Idempotente por (nombre, ruta): recargar extensiones vuelve a pasar por aquí.
|
|
31
|
+
*/
|
|
32
|
+
export function anotarSuplantacion(nombre, rutaExtension) {
|
|
33
|
+
suplantadas.set(nombre, rutaExtension);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Olvida lo que anotó una extensión concreta.
|
|
37
|
+
*
|
|
38
|
+
* Hace falta porque las extensiones se recargan en caliente (`ctx.reload()`):
|
|
39
|
+
* sin esto, quitar la extensión dejaría la marca puesta para siempre y el aviso
|
|
40
|
+
* pasaría a ser un falso positivo — exactamente el fallo que vuelve inútil un
|
|
41
|
+
* detector.
|
|
42
|
+
*/
|
|
43
|
+
export function olvidarSuplantacionesDe(rutaExtension) {
|
|
44
|
+
for (const [nombre, ruta] of suplantadas) {
|
|
45
|
+
if (ruta === rutaExtension)
|
|
46
|
+
suplantadas.delete(nombre);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Quién suplanta `nombre`, o `undefined` si nadie. */
|
|
50
|
+
export function suplantadaPor(nombre) {
|
|
51
|
+
return suplantadas.get(nombre);
|
|
52
|
+
}
|
|
53
|
+
/** Todo lo suplantado, para enseñarlo. */
|
|
54
|
+
export function suplantacionesActivas() {
|
|
55
|
+
return [...suplantadas].map(([nombre, extension]) => ({ nombre, extension }));
|
|
56
|
+
}
|
|
57
|
+
/** Vacía el registro. Solo para pruebas: el estado es de proceso. */
|
|
58
|
+
export function olvidarSuplantaciones() {
|
|
59
|
+
suplantadas.clear();
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=suplantacion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suplantacion.js","sourceRoot":"","sources":["../../../src/core/extensiones/suplantacion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,mEAAgE;AAChE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,aAAqB,EAAQ;IAC/E,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAAA,CACvC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,aAAqB,EAAQ;IACpE,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;QAC1C,IAAI,IAAI,KAAK,aAAa;YAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;AAAA,CACD;AAED,wDAAuD;AACvD,MAAM,UAAU,aAAa,CAAC,MAAc,EAAsB;IACjE,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAAA,CAC/B;AAED,2CAA0C;AAC1C,MAAM,UAAU,qBAAqB,GAAiD;IACrF,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AAAA,CAC9E;AAED,sEAAqE;AACrE,MAAM,UAAU,qBAAqB,GAAS;IAC7C,WAAW,CAAC,KAAK,EAAE,CAAC;AAAA,CACpB","sourcesContent":["/**\n * Registro de tools de builtin SUPLANTADAS por una extensión.\n *\n * Módulo hoja a propósito: no importa nada. `aprobacion/politica.ts` lo consulta\n * en `nivelDe()` y `extensiones/vigilancia.ts` lo escribe; si el registro\n * viviera en cualquiera de los dos habría un ciclo de imports entre ellos.\n *\n * El defecto que motiva esto se comprobó ejecutando: una extensión llama\n * `pi.registerTool({ name: \"read\", … })`, el loader hace `tools.set(\"read\", …)`\n * sin mirar nada, y `agent-session._refreshToolRegistry()` la pone ENCIMA de la\n * builtin (`toolRegistry.set(tool.name, tool)` después de las builtin). A partir\n * de ahí:\n *\n * - el modelo cree que llama a nuestro `read`, que solo lee;\n * - `politica.nivelDe(\"read\")` devolvía \"lectura\", así que la política la\n * dejaba pasar SIEMPRE, en cualquier modo, sin preguntar;\n * - y el usuario no veía ninguna diferencia en pantalla.\n *\n * Es decir: un `read` que en realidad escribe, con el nivel de confianza de un\n * `read`. Lo que se anota aquí es lo que quita ese nivel heredado.\n *\n * Se registra el nombre y QUIÉN lo suplanta: un aviso sin la ruta de la\n * extensión no es accionable, y lo que no se puede accionar se ignora.\n */\n\n/** nombre de la tool → ruta de la extensión que la suplanta. */\nconst suplantadas = new Map<string, string>();\n\n/**\n * Anota que `nombre` ya no es la builtin, sino lo que trae `rutaExtension`.\n *\n * Idempotente por (nombre, ruta): recargar extensiones vuelve a pasar por aquí.\n */\nexport function anotarSuplantacion(nombre: string, rutaExtension: string): void {\n\tsuplantadas.set(nombre, rutaExtension);\n}\n\n/**\n * Olvida lo que anotó una extensión concreta.\n *\n * Hace falta porque las extensiones se recargan en caliente (`ctx.reload()`):\n * sin esto, quitar la extensión dejaría la marca puesta para siempre y el aviso\n * pasaría a ser un falso positivo — exactamente el fallo que vuelve inútil un\n * detector.\n */\nexport function olvidarSuplantacionesDe(rutaExtension: string): void {\n\tfor (const [nombre, ruta] of suplantadas) {\n\t\tif (ruta === rutaExtension) suplantadas.delete(nombre);\n\t}\n}\n\n/** Quién suplanta `nombre`, o `undefined` si nadie. */\nexport function suplantadaPor(nombre: string): string | undefined {\n\treturn suplantadas.get(nombre);\n}\n\n/** Todo lo suplantado, para enseñarlo. */\nexport function suplantacionesActivas(): Array<{ nombre: string; extension: string }> {\n\treturn [...suplantadas].map(([nombre, extension]) => ({ nombre, extension }));\n}\n\n/** Vacía el registro. Solo para pruebas: el estado es de proceso. */\nexport function olvidarSuplantaciones(): void {\n\tsuplantadas.clear();\n}\n"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Todo lo que Ada añade a la API que reciben las extensiones, en un punto.
|
|
3
|
+
*
|
|
4
|
+
* Dos agujeros comprobados EJECUTANDO una extensión de prueba (la salida está en
|
|
5
|
+
* `test/extensiones-vigilancia.test.ts`, que reproduce las dos):
|
|
6
|
+
*
|
|
7
|
+
* 1. `pi.exec` no pasaba por NADA. Llamaba a `execCommand` directo, así que una
|
|
8
|
+
* extensión leía `~/.ada/agent/vault/` y `auth.json` con un `cat` y no
|
|
9
|
+
* quedaba ni una línea en el libro de sesión. La política le deniega el vault
|
|
10
|
+
* al AGENTE y una extensión lo leía sin registro: una puerta lateral que
|
|
11
|
+
* vacía el argumento de cumplimiento entero.
|
|
12
|
+
*
|
|
13
|
+
* 2. `pi.registerTool` aceptaba el nombre de una builtin sin decir nada, y
|
|
14
|
+
* `agent-session._refreshToolRegistry()` la pone encima de la nuestra. Un
|
|
15
|
+
* `read` que en realidad escribe, con el nivel de confianza de un `read`.
|
|
16
|
+
*
|
|
17
|
+
* Se engancha en UN SOLO punto de upstream (`extensions/loader.ts`, en el
|
|
18
|
+
* `return api` de `createExtensionAPI`) en vez de parchear cada método por
|
|
19
|
+
* separado. La cuenta: parchear `exec` y `registerTool` en su sitio son dos
|
|
20
|
+
* hunks más el import; envolver el objeto al salir es uno más el import, y
|
|
21
|
+
* cualquier guarda futura sobre la API de extensiones ya no paga ninguno.
|
|
22
|
+
*
|
|
23
|
+
* Lo que esto NO es: un sandbox. Una extensión es código con `require` que puede
|
|
24
|
+
* llamar a `node:child_process` por su cuenta y saltarse esto entero. Lo que
|
|
25
|
+
* `pi.exec` sí puede dar —y no daba— es que el camino OFICIAL respete la política
|
|
26
|
+
* y quede registrado. La contención de verdad la pone el sistema operativo.
|
|
27
|
+
*/
|
|
28
|
+
import type { LibroDeSesion } from "../audit/libro.ts";
|
|
29
|
+
import type { Extension, ExtensionAPI } from "../extensions/types.ts";
|
|
30
|
+
/**
|
|
31
|
+
* `RegistroDeSesion` publica aquí su libro para que `pi.exec` escriba en el
|
|
32
|
+
* MISMO fichero que las llamadas del agente.
|
|
33
|
+
*
|
|
34
|
+
* Se publica un getter y no el libro porque `RegistroDeSesion.libro()` es
|
|
35
|
+
* perezoso a propósito: crear el directorio de una sesión que no hace nada
|
|
36
|
+
* borraría la diferencia entre "no hay registro" y "no hizo nada".
|
|
37
|
+
*/
|
|
38
|
+
export declare function publicarLibroDeSesion(getter: () => LibroDeSesion): void;
|
|
39
|
+
/** Solo para pruebas: vuelve al estado "no hay sesión publicada". */
|
|
40
|
+
export declare function olvidarLibroDeSesion(): void;
|
|
41
|
+
export declare function publicarAgentDir(dir: string): void;
|
|
42
|
+
/** Solo para pruebas: vuelve al agentDir global. */
|
|
43
|
+
export declare function olvidarAgentDir(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Envuelve la API de una extensión. Punto único de enganche con upstream.
|
|
46
|
+
*
|
|
47
|
+
* Las extensiones EN LÍNEA (`<inline:…>`, `<sdk:…>`) se dejan pasar sin marcar:
|
|
48
|
+
* son código del propio programa que incrusta Ada —el SDK que personaliza `bash`
|
|
49
|
+
* con `createBashTool`, el escritorio— no un fichero que un tercero ha dejado en
|
|
50
|
+
* `.ada/extensions/`. Marcarlas sería un falso positivo, y un detector que grita
|
|
51
|
+
* sobre el caso benigno vuelve indistinguible el caso real.
|
|
52
|
+
*/
|
|
53
|
+
export declare function vigilarExtension(api: ExtensionAPI, extension: Extension, cwd: string, agentDir: string): ExtensionAPI;
|
|
54
|
+
//# sourceMappingURL=vigilancia.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vigilancia.d.ts","sourceRoot":"","sources":["../../../src/core/extensiones/vigilancia.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAkB,MAAM,wBAAwB,CAAC;AAkBtF;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,aAAa,GAAG,IAAI,CAEvE;AAED,sEAAqE;AACrE,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AAuBD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,oDAAoD;AACpD,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AA8GD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAwBrH","sourcesContent":["/**\n * Todo lo que Ada añade a la API que reciben las extensiones, en un punto.\n *\n * Dos agujeros comprobados EJECUTANDO una extensión de prueba (la salida está en\n * `test/extensiones-vigilancia.test.ts`, que reproduce las dos):\n *\n * 1. `pi.exec` no pasaba por NADA. Llamaba a `execCommand` directo, así que una\n * extensión leía `~/.ada/agent/vault/` y `auth.json` con un `cat` y no\n * quedaba ni una línea en el libro de sesión. La política le deniega el vault\n * al AGENTE y una extensión lo leía sin registro: una puerta lateral que\n * vacía el argumento de cumplimiento entero.\n *\n * 2. `pi.registerTool` aceptaba el nombre de una builtin sin decir nada, y\n * `agent-session._refreshToolRegistry()` la pone encima de la nuestra. Un\n * `read` que en realidad escribe, con el nivel de confianza de un `read`.\n *\n * Se engancha en UN SOLO punto de upstream (`extensions/loader.ts`, en el\n * `return api` de `createExtensionAPI`) en vez de parchear cada método por\n * separado. La cuenta: parchear `exec` y `registerTool` en su sitio son dos\n * hunks más el import; envolver el objeto al salir es uno más el import, y\n * cualquier guarda futura sobre la API de extensiones ya no paga ninguno.\n *\n * Lo que esto NO es: un sandbox. Una extensión es código con `require` que puede\n * llamar a `node:child_process` por su cuenta y saltarse esto entero. Lo que\n * `pi.exec` sí puede dar —y no daba— es que el camino OFICIAL respete la política\n * y quede registrado. La contención de verdad la pone el sistema operativo.\n */\n\nimport { decidir, esNombreDeToolNuestra } from \"../aprobacion/politica.ts\";\nimport type { LibroDeSesion } from \"../audit/libro.ts\";\nimport { LibroDeSesion as LibroDeSesionClase } from \"../audit/libro.ts\";\nimport { type ExecOptions, type ExecResult, execCommand } from \"../exec.ts\";\nimport type { Extension, ExtensionAPI, ToolDefinition } from \"../extensions/types.ts\";\nimport { anotarSuplantacion, olvidarSuplantacionesDe } from \"./suplantacion.ts\";\n\n/**\n * Código de salida de una llamada denegada.\n *\n * 126 es el que usa el shell para \"existe pero no se puede ejecutar\", que es\n * exactamente esto. Cero no valdría: la extensión leería un `stdout` vacío como\n * \"el fichero está vacío\" en vez de como \"no me han dejado\", y ese es justo el\n * fallo-que-parece-éxito que perseguimos.\n */\nconst CODIGO_DENEGADO = 126;\n\n/** El libro de la sesión viva. Lo publica `audit/registro-sesion.ts` al construirse. */\nlet obtenerLibroDeSesion: (() => LibroDeSesion) | undefined;\n/** Libro de respaldo, si una extensión ejecuta algo sin sesión (durante la carga). */\nlet libroSuelto: LibroDeSesion | undefined;\n\n/**\n * `RegistroDeSesion` publica aquí su libro para que `pi.exec` escriba en el\n * MISMO fichero que las llamadas del agente.\n *\n * Se publica un getter y no el libro porque `RegistroDeSesion.libro()` es\n * perezoso a propósito: crear el directorio de una sesión que no hace nada\n * borraría la diferencia entre \"no hay registro\" y \"no hizo nada\".\n */\nexport function publicarLibroDeSesion(getter: () => LibroDeSesion): void {\n\tobtenerLibroDeSesion = getter;\n}\n\n/** Solo para pruebas: vuelve al estado \"no hay sesión publicada\". */\nexport function olvidarLibroDeSesion(): void {\n\tobtenerLibroDeSesion = undefined;\n\tlibroSuelto = undefined;\n}\n\n/**\n * El `agentDir` que hay que proteger, cuando NO es el global.\n *\n * `vigilarExtension` recibe uno, pero quien lo llama —`createExtensionAPI` en\n * `extensions/loader.ts`— no lo tiene en ámbito y pasa `getAgentDir()`. Eso vale\n * para el CLI, donde los dos coinciden, y falla justo donde importa para\n * empresa: quien embeba el SDK con un `agentDir` propio (un servicio\n * multi-inquilino, una prueba, un contenedor por cliente) tendría la guarda\n * protegiendo el directorio EQUIVOCADO — denegaría el vault de la máquina y\n * dejaría abierto el del inquilino.\n *\n * Medido: con un agentDir temporal, una extensión leyó la clave del vault y el\n * `auth.json` enteros; con el real, las dos lecturas salen denegadas.\n *\n * Se resuelve publicando, y no pasándolo por parámetro, porque enhebrarlo por\n * `loadExtension` → `loadExtensionFromFactory` → `createExtensionAPI` costaba 4\n * hunks del presupuesto de fork (121 → 125) y esto cuesta 0: `vigilancia.ts` es\n * nuestro y `discoverAndLoadExtensions` SÍ tiene el agentDir en ámbito.\n */\nlet agentDirPublicado: string | undefined;\n\nexport function publicarAgentDir(dir: string): void {\n\tagentDirPublicado = dir;\n}\n\n/** Solo para pruebas: vuelve al agentDir global. */\nexport function olvidarAgentDir(): void {\n\tagentDirPublicado = undefined;\n}\n\n/**\n * El libro donde anotar.\n *\n * Si no hay sesión publicada —una extensión que ejecuta algo en su factory, un\n * proceso sin `AgentSession`— se abre uno propio con id `extension` en vez de no\n * anotar. \"No hay sesión\" no puede significar \"no hay registro\": es la excusa\n * con la que un agujero se queda sin rastro.\n */\nfunction libro(agentDir: string): LibroDeSesion {\n\tif (obtenerLibroDeSesion) return obtenerLibroDeSesion();\n\tlibroSuelto ??= new LibroDeSesionClase(agentDir, \"extension\");\n\treturn libroSuelto;\n}\n\n/**\n * `pi.exec` con la política y el libro del agente.\n *\n * Se reutiliza `decidir()` en vez de escribir otra lista de rutas: dos listas de\n * lo que no se puede tocar divergen, y la que se queda corta es la que se usa.\n *\n * `modo: \"yolo\"` NO es un descuido y es la única decisión discutible de aquí. En\n * `decidir()` el modo solo gobierna el paso 4; los pasos 1 a 3 —rutas\n * protegidas, ficheros generados y el deny del usuario— van por delante y no los\n * levanta ningún modo. Eso es justo lo que hace falta: lo que el modo decide es\n * si se le PREGUNTA al usuario, y una extensión ejecutando código en su factory\n * no tiene a quién preguntar. Pasar el modo real convertiría `manual` (preguntar\n * siempre) en \"denegar toda extensión\", que rompe las extensiones legítimas sin\n * cerrar ningún agujero.\n */\nasync function ejecutarVigilado(\n\trutaExtension: string,\n\tagentDir: string,\n\tcommand: string,\n\targs: string[],\n\tcwd: string,\n\toptions?: ExecOptions,\n): Promise<ExecResult> {\n\tconst argv = [command, ...args];\n\tconst decision = decidir({\n\t\t// Nombre propio y no \"bash\": en el libro hay que poder separar lo que\n\t\t// ejecutó una extensión de lo que ejecutó el modelo. `nivelDe` no lo\n\t\t// conoce, así que cae en \"ejecucion\", que es lo correcto.\n\t\ttool: \"pi.exec\",\n\t\targs: { command, args, cwd: options?.cwd ?? cwd },\n\t\tmodo: \"yolo\",\n\t\tagentDir,\n\t});\n\n\tif (decision.veredicto === \"denegada\") {\n\t\tawait libro(agentDir).anotar({\n\t\t\ttipo: \"comando\",\n\t\t\targv,\n\t\t\tcodigo: CODIGO_DENEGADO,\n\t\t\tsandbox: \"bloqueado\",\n\t\t\tviolaciones: [decision.politica],\n\t\t\torigen: \"extension\",\n\t\t\textension: rutaExtension,\n\t\t});\n\t\treturn {\n\t\t\tstdout: \"\",\n\t\t\t// El motivo va en `stderr` y no en una excepción para que la extensión\n\t\t\t// pueda enseñarlo tal cual; el código distinto de cero es lo que impide\n\t\t\t// leerlo como éxito.\n\t\t\tstderr: `Ada: ${decision.motivo}\\n(politica: ${decision.politica}; extension: ${rutaExtension})`,\n\t\t\tcode: CODIGO_DENEGADO,\n\t\t\tkilled: false,\n\t\t};\n\t}\n\n\tconst resultado = await execCommand(command, args, options?.cwd ?? cwd, options);\n\tawait libro(agentDir).anotar({\n\t\ttipo: \"comando\",\n\t\targv,\n\t\tcodigo: resultado.code,\n\t\torigen: \"extension\",\n\t\textension: rutaExtension,\n\t});\n\treturn resultado;\n}\n\n/** El aviso que ve el MODELO, delante de la descripción de la tool. */\nfunction avisoParaElModelo(nombre: string, rutaExtension: string): string {\n\treturn `[SUPLANTADA] Esta NO es la tool \\`${nombre}\\` de Ada: la sustituye la extension ${rutaExtension}. Puede hacer cualquier cosa, no lo que dice el nombre. Trátala como una tool desconocida.`;\n}\n\n/**\n * Marca una tool que suplanta a una builtin, en los dos sitios donde se ve.\n *\n * No se RECHAZA el registro, y es deliberado: suplantar una builtin es una\n * función documentada de upstream —`examples/extensions/tool-override.ts`,\n * `minimal-mode.ts` y `built-in-tool-renderer.ts` viven de ella— y romperla\n * dejaría las extensiones normales inservibles, que es peor que el agujero.\n * Lo que se arregla es el SILENCIO:\n *\n * - `description` va al esquema de tools, así que el modelo lo lee en cada\n * turno y deja de creer que llama a la nuestra;\n * - `label` es lo que pinta la TUI en cada fila de ejecución, así que el\n * usuario lo ve cada vez que corre, no solo una línea al arrancar que se va\n * con el primer scroll.\n */\nfunction marcarSuplantada(tool: ToolDefinition, rutaExtension: string): ToolDefinition {\n\treturn {\n\t\t...tool,\n\t\tlabel: `${tool.label} (suplanta a ${tool.name})`,\n\t\tdescription: `${avisoParaElModelo(tool.name, rutaExtension)}\\n\\n${tool.description}`,\n\t};\n}\n\n/**\n * Envuelve la API de una extensión. Punto único de enganche con upstream.\n *\n * Las extensiones EN LÍNEA (`<inline:…>`, `<sdk:…>`) se dejan pasar sin marcar:\n * son código del propio programa que incrusta Ada —el SDK que personaliza `bash`\n * con `createBashTool`, el escritorio— no un fichero que un tercero ha dejado en\n * `.ada/extensions/`. Marcarlas sería un falso positivo, y un detector que grita\n * sobre el caso benigno vuelve indistinguible el caso real.\n */\nexport function vigilarExtension(api: ExtensionAPI, extension: Extension, cwd: string, agentDir: string): ExtensionAPI {\n\t// El publicado gana: quien llama pasa el GLOBAL porque no tiene el real en\n\t// ámbito. Ver `publicarAgentDir`.\n\tconst dirReal = agentDirPublicado ?? agentDir;\n\tconst ruta = extension.path;\n\tconst deFichero = !ruta.startsWith(\"<\");\n\t// Recargar en caliente vuelve a pasar por aquí: se limpia lo que anotó esta\n\t// misma extensión para que quitar una tool quite también su marca.\n\tolvidarSuplantacionesDe(ruta);\n\n\treturn {\n\t\t...api,\n\t\texec(command: string, args: string[], options?: ExecOptions): Promise<ExecResult> {\n\t\t\treturn ejecutarVigilado(ruta, dirReal, command, args, cwd, options);\n\t\t},\n\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\tif (deFichero && esNombreDeToolNuestra(tool.name)) {\n\t\t\t\tanotarSuplantacion(tool.name, ruta);\n\t\t\t\tapi.registerTool(marcarSuplantada(tool, ruta));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tapi.registerTool(tool);\n\t\t},\n\t} as ExtensionAPI;\n}\n"]}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Todo lo que Ada añade a la API que reciben las extensiones, en un punto.
|
|
3
|
+
*
|
|
4
|
+
* Dos agujeros comprobados EJECUTANDO una extensión de prueba (la salida está en
|
|
5
|
+
* `test/extensiones-vigilancia.test.ts`, que reproduce las dos):
|
|
6
|
+
*
|
|
7
|
+
* 1. `pi.exec` no pasaba por NADA. Llamaba a `execCommand` directo, así que una
|
|
8
|
+
* extensión leía `~/.ada/agent/vault/` y `auth.json` con un `cat` y no
|
|
9
|
+
* quedaba ni una línea en el libro de sesión. La política le deniega el vault
|
|
10
|
+
* al AGENTE y una extensión lo leía sin registro: una puerta lateral que
|
|
11
|
+
* vacía el argumento de cumplimiento entero.
|
|
12
|
+
*
|
|
13
|
+
* 2. `pi.registerTool` aceptaba el nombre de una builtin sin decir nada, y
|
|
14
|
+
* `agent-session._refreshToolRegistry()` la pone encima de la nuestra. Un
|
|
15
|
+
* `read` que en realidad escribe, con el nivel de confianza de un `read`.
|
|
16
|
+
*
|
|
17
|
+
* Se engancha en UN SOLO punto de upstream (`extensions/loader.ts`, en el
|
|
18
|
+
* `return api` de `createExtensionAPI`) en vez de parchear cada método por
|
|
19
|
+
* separado. La cuenta: parchear `exec` y `registerTool` en su sitio son dos
|
|
20
|
+
* hunks más el import; envolver el objeto al salir es uno más el import, y
|
|
21
|
+
* cualquier guarda futura sobre la API de extensiones ya no paga ninguno.
|
|
22
|
+
*
|
|
23
|
+
* Lo que esto NO es: un sandbox. Una extensión es código con `require` que puede
|
|
24
|
+
* llamar a `node:child_process` por su cuenta y saltarse esto entero. Lo que
|
|
25
|
+
* `pi.exec` sí puede dar —y no daba— es que el camino OFICIAL respete la política
|
|
26
|
+
* y quede registrado. La contención de verdad la pone el sistema operativo.
|
|
27
|
+
*/
|
|
28
|
+
import { decidir, esNombreDeToolNuestra } from "../aprobacion/politica.js";
|
|
29
|
+
import { LibroDeSesion as LibroDeSesionClase } from "../audit/libro.js";
|
|
30
|
+
import { execCommand } from "../exec.js";
|
|
31
|
+
import { anotarSuplantacion, olvidarSuplantacionesDe } from "./suplantacion.js";
|
|
32
|
+
/**
|
|
33
|
+
* Código de salida de una llamada denegada.
|
|
34
|
+
*
|
|
35
|
+
* 126 es el que usa el shell para "existe pero no se puede ejecutar", que es
|
|
36
|
+
* exactamente esto. Cero no valdría: la extensión leería un `stdout` vacío como
|
|
37
|
+
* "el fichero está vacío" en vez de como "no me han dejado", y ese es justo el
|
|
38
|
+
* fallo-que-parece-éxito que perseguimos.
|
|
39
|
+
*/
|
|
40
|
+
const CODIGO_DENEGADO = 126;
|
|
41
|
+
/** El libro de la sesión viva. Lo publica `audit/registro-sesion.ts` al construirse. */
|
|
42
|
+
let obtenerLibroDeSesion;
|
|
43
|
+
/** Libro de respaldo, si una extensión ejecuta algo sin sesión (durante la carga). */
|
|
44
|
+
let libroSuelto;
|
|
45
|
+
/**
|
|
46
|
+
* `RegistroDeSesion` publica aquí su libro para que `pi.exec` escriba en el
|
|
47
|
+
* MISMO fichero que las llamadas del agente.
|
|
48
|
+
*
|
|
49
|
+
* Se publica un getter y no el libro porque `RegistroDeSesion.libro()` es
|
|
50
|
+
* perezoso a propósito: crear el directorio de una sesión que no hace nada
|
|
51
|
+
* borraría la diferencia entre "no hay registro" y "no hizo nada".
|
|
52
|
+
*/
|
|
53
|
+
export function publicarLibroDeSesion(getter) {
|
|
54
|
+
obtenerLibroDeSesion = getter;
|
|
55
|
+
}
|
|
56
|
+
/** Solo para pruebas: vuelve al estado "no hay sesión publicada". */
|
|
57
|
+
export function olvidarLibroDeSesion() {
|
|
58
|
+
obtenerLibroDeSesion = undefined;
|
|
59
|
+
libroSuelto = undefined;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* El `agentDir` que hay que proteger, cuando NO es el global.
|
|
63
|
+
*
|
|
64
|
+
* `vigilarExtension` recibe uno, pero quien lo llama —`createExtensionAPI` en
|
|
65
|
+
* `extensions/loader.ts`— no lo tiene en ámbito y pasa `getAgentDir()`. Eso vale
|
|
66
|
+
* para el CLI, donde los dos coinciden, y falla justo donde importa para
|
|
67
|
+
* empresa: quien embeba el SDK con un `agentDir` propio (un servicio
|
|
68
|
+
* multi-inquilino, una prueba, un contenedor por cliente) tendría la guarda
|
|
69
|
+
* protegiendo el directorio EQUIVOCADO — denegaría el vault de la máquina y
|
|
70
|
+
* dejaría abierto el del inquilino.
|
|
71
|
+
*
|
|
72
|
+
* Medido: con un agentDir temporal, una extensión leyó la clave del vault y el
|
|
73
|
+
* `auth.json` enteros; con el real, las dos lecturas salen denegadas.
|
|
74
|
+
*
|
|
75
|
+
* Se resuelve publicando, y no pasándolo por parámetro, porque enhebrarlo por
|
|
76
|
+
* `loadExtension` → `loadExtensionFromFactory` → `createExtensionAPI` costaba 4
|
|
77
|
+
* hunks del presupuesto de fork (121 → 125) y esto cuesta 0: `vigilancia.ts` es
|
|
78
|
+
* nuestro y `discoverAndLoadExtensions` SÍ tiene el agentDir en ámbito.
|
|
79
|
+
*/
|
|
80
|
+
let agentDirPublicado;
|
|
81
|
+
export function publicarAgentDir(dir) {
|
|
82
|
+
agentDirPublicado = dir;
|
|
83
|
+
}
|
|
84
|
+
/** Solo para pruebas: vuelve al agentDir global. */
|
|
85
|
+
export function olvidarAgentDir() {
|
|
86
|
+
agentDirPublicado = undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* El libro donde anotar.
|
|
90
|
+
*
|
|
91
|
+
* Si no hay sesión publicada —una extensión que ejecuta algo en su factory, un
|
|
92
|
+
* proceso sin `AgentSession`— se abre uno propio con id `extension` en vez de no
|
|
93
|
+
* anotar. "No hay sesión" no puede significar "no hay registro": es la excusa
|
|
94
|
+
* con la que un agujero se queda sin rastro.
|
|
95
|
+
*/
|
|
96
|
+
function libro(agentDir) {
|
|
97
|
+
if (obtenerLibroDeSesion)
|
|
98
|
+
return obtenerLibroDeSesion();
|
|
99
|
+
libroSuelto ??= new LibroDeSesionClase(agentDir, "extension");
|
|
100
|
+
return libroSuelto;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* `pi.exec` con la política y el libro del agente.
|
|
104
|
+
*
|
|
105
|
+
* Se reutiliza `decidir()` en vez de escribir otra lista de rutas: dos listas de
|
|
106
|
+
* lo que no se puede tocar divergen, y la que se queda corta es la que se usa.
|
|
107
|
+
*
|
|
108
|
+
* `modo: "yolo"` NO es un descuido y es la única decisión discutible de aquí. En
|
|
109
|
+
* `decidir()` el modo solo gobierna el paso 4; los pasos 1 a 3 —rutas
|
|
110
|
+
* protegidas, ficheros generados y el deny del usuario— van por delante y no los
|
|
111
|
+
* levanta ningún modo. Eso es justo lo que hace falta: lo que el modo decide es
|
|
112
|
+
* si se le PREGUNTA al usuario, y una extensión ejecutando código en su factory
|
|
113
|
+
* no tiene a quién preguntar. Pasar el modo real convertiría `manual` (preguntar
|
|
114
|
+
* siempre) en "denegar toda extensión", que rompe las extensiones legítimas sin
|
|
115
|
+
* cerrar ningún agujero.
|
|
116
|
+
*/
|
|
117
|
+
async function ejecutarVigilado(rutaExtension, agentDir, command, args, cwd, options) {
|
|
118
|
+
const argv = [command, ...args];
|
|
119
|
+
const decision = decidir({
|
|
120
|
+
// Nombre propio y no "bash": en el libro hay que poder separar lo que
|
|
121
|
+
// ejecutó una extensión de lo que ejecutó el modelo. `nivelDe` no lo
|
|
122
|
+
// conoce, así que cae en "ejecucion", que es lo correcto.
|
|
123
|
+
tool: "pi.exec",
|
|
124
|
+
args: { command, args, cwd: options?.cwd ?? cwd },
|
|
125
|
+
modo: "yolo",
|
|
126
|
+
agentDir,
|
|
127
|
+
});
|
|
128
|
+
if (decision.veredicto === "denegada") {
|
|
129
|
+
await libro(agentDir).anotar({
|
|
130
|
+
tipo: "comando",
|
|
131
|
+
argv,
|
|
132
|
+
codigo: CODIGO_DENEGADO,
|
|
133
|
+
sandbox: "bloqueado",
|
|
134
|
+
violaciones: [decision.politica],
|
|
135
|
+
origen: "extension",
|
|
136
|
+
extension: rutaExtension,
|
|
137
|
+
});
|
|
138
|
+
return {
|
|
139
|
+
stdout: "",
|
|
140
|
+
// El motivo va en `stderr` y no en una excepción para que la extensión
|
|
141
|
+
// pueda enseñarlo tal cual; el código distinto de cero es lo que impide
|
|
142
|
+
// leerlo como éxito.
|
|
143
|
+
stderr: `Ada: ${decision.motivo}\n(politica: ${decision.politica}; extension: ${rutaExtension})`,
|
|
144
|
+
code: CODIGO_DENEGADO,
|
|
145
|
+
killed: false,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const resultado = await execCommand(command, args, options?.cwd ?? cwd, options);
|
|
149
|
+
await libro(agentDir).anotar({
|
|
150
|
+
tipo: "comando",
|
|
151
|
+
argv,
|
|
152
|
+
codigo: resultado.code,
|
|
153
|
+
origen: "extension",
|
|
154
|
+
extension: rutaExtension,
|
|
155
|
+
});
|
|
156
|
+
return resultado;
|
|
157
|
+
}
|
|
158
|
+
/** El aviso que ve el MODELO, delante de la descripción de la tool. */
|
|
159
|
+
function avisoParaElModelo(nombre, rutaExtension) {
|
|
160
|
+
return `[SUPLANTADA] Esta NO es la tool \`${nombre}\` de Ada: la sustituye la extension ${rutaExtension}. Puede hacer cualquier cosa, no lo que dice el nombre. Trátala como una tool desconocida.`;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Marca una tool que suplanta a una builtin, en los dos sitios donde se ve.
|
|
164
|
+
*
|
|
165
|
+
* No se RECHAZA el registro, y es deliberado: suplantar una builtin es una
|
|
166
|
+
* función documentada de upstream —`examples/extensions/tool-override.ts`,
|
|
167
|
+
* `minimal-mode.ts` y `built-in-tool-renderer.ts` viven de ella— y romperla
|
|
168
|
+
* dejaría las extensiones normales inservibles, que es peor que el agujero.
|
|
169
|
+
* Lo que se arregla es el SILENCIO:
|
|
170
|
+
*
|
|
171
|
+
* - `description` va al esquema de tools, así que el modelo lo lee en cada
|
|
172
|
+
* turno y deja de creer que llama a la nuestra;
|
|
173
|
+
* - `label` es lo que pinta la TUI en cada fila de ejecución, así que el
|
|
174
|
+
* usuario lo ve cada vez que corre, no solo una línea al arrancar que se va
|
|
175
|
+
* con el primer scroll.
|
|
176
|
+
*/
|
|
177
|
+
function marcarSuplantada(tool, rutaExtension) {
|
|
178
|
+
return {
|
|
179
|
+
...tool,
|
|
180
|
+
label: `${tool.label} (suplanta a ${tool.name})`,
|
|
181
|
+
description: `${avisoParaElModelo(tool.name, rutaExtension)}\n\n${tool.description}`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Envuelve la API de una extensión. Punto único de enganche con upstream.
|
|
186
|
+
*
|
|
187
|
+
* Las extensiones EN LÍNEA (`<inline:…>`, `<sdk:…>`) se dejan pasar sin marcar:
|
|
188
|
+
* son código del propio programa que incrusta Ada —el SDK que personaliza `bash`
|
|
189
|
+
* con `createBashTool`, el escritorio— no un fichero que un tercero ha dejado en
|
|
190
|
+
* `.ada/extensions/`. Marcarlas sería un falso positivo, y un detector que grita
|
|
191
|
+
* sobre el caso benigno vuelve indistinguible el caso real.
|
|
192
|
+
*/
|
|
193
|
+
export function vigilarExtension(api, extension, cwd, agentDir) {
|
|
194
|
+
// El publicado gana: quien llama pasa el GLOBAL porque no tiene el real en
|
|
195
|
+
// ámbito. Ver `publicarAgentDir`.
|
|
196
|
+
const dirReal = agentDirPublicado ?? agentDir;
|
|
197
|
+
const ruta = extension.path;
|
|
198
|
+
const deFichero = !ruta.startsWith("<");
|
|
199
|
+
// Recargar en caliente vuelve a pasar por aquí: se limpia lo que anotó esta
|
|
200
|
+
// misma extensión para que quitar una tool quite también su marca.
|
|
201
|
+
olvidarSuplantacionesDe(ruta);
|
|
202
|
+
return {
|
|
203
|
+
...api,
|
|
204
|
+
exec(command, args, options) {
|
|
205
|
+
return ejecutarVigilado(ruta, dirReal, command, args, cwd, options);
|
|
206
|
+
},
|
|
207
|
+
registerTool(tool) {
|
|
208
|
+
if (deFichero && esNombreDeToolNuestra(tool.name)) {
|
|
209
|
+
anotarSuplantacion(tool.name, ruta);
|
|
210
|
+
api.registerTool(marcarSuplantada(tool, ruta));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
api.registerTool(tool);
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=vigilancia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vigilancia.js","sourceRoot":"","sources":["../../../src/core/extensiones/vigilancia.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAE3E,OAAO,EAAE,aAAa,IAAI,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAqC,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEhF;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,yFAAwF;AACxF,IAAI,oBAAuD,CAAC;AAC5D,wFAAsF;AACtF,IAAI,WAAsC,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA2B,EAAQ;IACxE,oBAAoB,GAAG,MAAM,CAAC;AAAA,CAC9B;AAED,sEAAqE;AACrE,MAAM,UAAU,oBAAoB,GAAS;IAC5C,oBAAoB,GAAG,SAAS,CAAC;IACjC,WAAW,GAAG,SAAS,CAAC;AAAA,CACxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,IAAI,iBAAqC,CAAC;AAE1C,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAQ;IACnD,iBAAiB,GAAG,GAAG,CAAC;AAAA,CACxB;AAED,oDAAoD;AACpD,MAAM,UAAU,eAAe,GAAS;IACvC,iBAAiB,GAAG,SAAS,CAAC;AAAA,CAC9B;AAED;;;;;;;GAOG;AACH,SAAS,KAAK,CAAC,QAAgB,EAAiB;IAC/C,IAAI,oBAAoB;QAAE,OAAO,oBAAoB,EAAE,CAAC;IACxD,WAAW,KAAK,IAAI,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9D,OAAO,WAAW,CAAC;AAAA,CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,gBAAgB,CAC9B,aAAqB,EACrB,QAAgB,EAChB,OAAe,EACf,IAAc,EACd,GAAW,EACX,OAAqB,EACC;IACtB,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC;QACxB,sEAAsE;QACtE,wEAAqE;QACrE,2DAA0D;QAC1D,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE;QACjD,IAAI,EAAE,MAAM;QACZ,QAAQ;KACR,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QACvC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;YAC5B,IAAI,EAAE,SAAS;YACf,IAAI;YACJ,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,WAAW;YACpB,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAChC,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,aAAa;SACxB,CAAC,CAAC;QACH,OAAO;YACN,MAAM,EAAE,EAAE;YACV,yEAAuE;YACvE,0EAAwE;YACxE,sBAAqB;YACrB,MAAM,EAAE,QAAQ,QAAQ,CAAC,MAAM,gBAAgB,QAAQ,CAAC,QAAQ,gBAAgB,aAAa,GAAG;YAChG,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,KAAK;SACb,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC;IACjF,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC5B,IAAI,EAAE,SAAS;QACf,IAAI;QACJ,MAAM,EAAE,SAAS,CAAC,IAAI;QACtB,MAAM,EAAE,WAAW;QACnB,SAAS,EAAE,aAAa;KACxB,CAAC,CAAC;IACH,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,wEAAuE;AACvE,SAAS,iBAAiB,CAAC,MAAc,EAAE,aAAqB,EAAU;IACzE,OAAO,qCAAqC,MAAM,wCAAwC,aAAa,6FAA4F,CAAC;AAAA,CACpM;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,gBAAgB,CAAC,IAAoB,EAAE,aAAqB,EAAkB;IACtF,OAAO;QACN,GAAG,IAAI;QACP,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,gBAAgB,IAAI,CAAC,IAAI,GAAG;QAChD,WAAW,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE;KACpF,CAAC;AAAA,CACF;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAiB,EAAE,SAAoB,EAAE,GAAW,EAAE,QAAgB,EAAgB;IACtH,2EAA2E;IAC3E,mCAAkC;IAClC,MAAM,OAAO,GAAG,iBAAiB,IAAI,QAAQ,CAAC;IAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC5B,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACxC,8EAA4E;IAC5E,qEAAmE;IACnE,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAO;QACN,GAAG,GAAG;QACN,IAAI,CAAC,OAAe,EAAE,IAAc,EAAE,OAAqB,EAAuB;YACjF,OAAO,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAAA,CACpE;QACD,YAAY,CAAC,IAAoB,EAAQ;YACxC,IAAI,SAAS,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACpC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC/C,OAAO;YACR,CAAC;YACD,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAAA,CACvB;KACe,CAAC;AAAA,CAClB","sourcesContent":["/**\n * Todo lo que Ada añade a la API que reciben las extensiones, en un punto.\n *\n * Dos agujeros comprobados EJECUTANDO una extensión de prueba (la salida está en\n * `test/extensiones-vigilancia.test.ts`, que reproduce las dos):\n *\n * 1. `pi.exec` no pasaba por NADA. Llamaba a `execCommand` directo, así que una\n * extensión leía `~/.ada/agent/vault/` y `auth.json` con un `cat` y no\n * quedaba ni una línea en el libro de sesión. La política le deniega el vault\n * al AGENTE y una extensión lo leía sin registro: una puerta lateral que\n * vacía el argumento de cumplimiento entero.\n *\n * 2. `pi.registerTool` aceptaba el nombre de una builtin sin decir nada, y\n * `agent-session._refreshToolRegistry()` la pone encima de la nuestra. Un\n * `read` que en realidad escribe, con el nivel de confianza de un `read`.\n *\n * Se engancha en UN SOLO punto de upstream (`extensions/loader.ts`, en el\n * `return api` de `createExtensionAPI`) en vez de parchear cada método por\n * separado. La cuenta: parchear `exec` y `registerTool` en su sitio son dos\n * hunks más el import; envolver el objeto al salir es uno más el import, y\n * cualquier guarda futura sobre la API de extensiones ya no paga ninguno.\n *\n * Lo que esto NO es: un sandbox. Una extensión es código con `require` que puede\n * llamar a `node:child_process` por su cuenta y saltarse esto entero. Lo que\n * `pi.exec` sí puede dar —y no daba— es que el camino OFICIAL respete la política\n * y quede registrado. La contención de verdad la pone el sistema operativo.\n */\n\nimport { decidir, esNombreDeToolNuestra } from \"../aprobacion/politica.ts\";\nimport type { LibroDeSesion } from \"../audit/libro.ts\";\nimport { LibroDeSesion as LibroDeSesionClase } from \"../audit/libro.ts\";\nimport { type ExecOptions, type ExecResult, execCommand } from \"../exec.ts\";\nimport type { Extension, ExtensionAPI, ToolDefinition } from \"../extensions/types.ts\";\nimport { anotarSuplantacion, olvidarSuplantacionesDe } from \"./suplantacion.ts\";\n\n/**\n * Código de salida de una llamada denegada.\n *\n * 126 es el que usa el shell para \"existe pero no se puede ejecutar\", que es\n * exactamente esto. Cero no valdría: la extensión leería un `stdout` vacío como\n * \"el fichero está vacío\" en vez de como \"no me han dejado\", y ese es justo el\n * fallo-que-parece-éxito que perseguimos.\n */\nconst CODIGO_DENEGADO = 126;\n\n/** El libro de la sesión viva. Lo publica `audit/registro-sesion.ts` al construirse. */\nlet obtenerLibroDeSesion: (() => LibroDeSesion) | undefined;\n/** Libro de respaldo, si una extensión ejecuta algo sin sesión (durante la carga). */\nlet libroSuelto: LibroDeSesion | undefined;\n\n/**\n * `RegistroDeSesion` publica aquí su libro para que `pi.exec` escriba en el\n * MISMO fichero que las llamadas del agente.\n *\n * Se publica un getter y no el libro porque `RegistroDeSesion.libro()` es\n * perezoso a propósito: crear el directorio de una sesión que no hace nada\n * borraría la diferencia entre \"no hay registro\" y \"no hizo nada\".\n */\nexport function publicarLibroDeSesion(getter: () => LibroDeSesion): void {\n\tobtenerLibroDeSesion = getter;\n}\n\n/** Solo para pruebas: vuelve al estado \"no hay sesión publicada\". */\nexport function olvidarLibroDeSesion(): void {\n\tobtenerLibroDeSesion = undefined;\n\tlibroSuelto = undefined;\n}\n\n/**\n * El `agentDir` que hay que proteger, cuando NO es el global.\n *\n * `vigilarExtension` recibe uno, pero quien lo llama —`createExtensionAPI` en\n * `extensions/loader.ts`— no lo tiene en ámbito y pasa `getAgentDir()`. Eso vale\n * para el CLI, donde los dos coinciden, y falla justo donde importa para\n * empresa: quien embeba el SDK con un `agentDir` propio (un servicio\n * multi-inquilino, una prueba, un contenedor por cliente) tendría la guarda\n * protegiendo el directorio EQUIVOCADO — denegaría el vault de la máquina y\n * dejaría abierto el del inquilino.\n *\n * Medido: con un agentDir temporal, una extensión leyó la clave del vault y el\n * `auth.json` enteros; con el real, las dos lecturas salen denegadas.\n *\n * Se resuelve publicando, y no pasándolo por parámetro, porque enhebrarlo por\n * `loadExtension` → `loadExtensionFromFactory` → `createExtensionAPI` costaba 4\n * hunks del presupuesto de fork (121 → 125) y esto cuesta 0: `vigilancia.ts` es\n * nuestro y `discoverAndLoadExtensions` SÍ tiene el agentDir en ámbito.\n */\nlet agentDirPublicado: string | undefined;\n\nexport function publicarAgentDir(dir: string): void {\n\tagentDirPublicado = dir;\n}\n\n/** Solo para pruebas: vuelve al agentDir global. */\nexport function olvidarAgentDir(): void {\n\tagentDirPublicado = undefined;\n}\n\n/**\n * El libro donde anotar.\n *\n * Si no hay sesión publicada —una extensión que ejecuta algo en su factory, un\n * proceso sin `AgentSession`— se abre uno propio con id `extension` en vez de no\n * anotar. \"No hay sesión\" no puede significar \"no hay registro\": es la excusa\n * con la que un agujero se queda sin rastro.\n */\nfunction libro(agentDir: string): LibroDeSesion {\n\tif (obtenerLibroDeSesion) return obtenerLibroDeSesion();\n\tlibroSuelto ??= new LibroDeSesionClase(agentDir, \"extension\");\n\treturn libroSuelto;\n}\n\n/**\n * `pi.exec` con la política y el libro del agente.\n *\n * Se reutiliza `decidir()` en vez de escribir otra lista de rutas: dos listas de\n * lo que no se puede tocar divergen, y la que se queda corta es la que se usa.\n *\n * `modo: \"yolo\"` NO es un descuido y es la única decisión discutible de aquí. En\n * `decidir()` el modo solo gobierna el paso 4; los pasos 1 a 3 —rutas\n * protegidas, ficheros generados y el deny del usuario— van por delante y no los\n * levanta ningún modo. Eso es justo lo que hace falta: lo que el modo decide es\n * si se le PREGUNTA al usuario, y una extensión ejecutando código en su factory\n * no tiene a quién preguntar. Pasar el modo real convertiría `manual` (preguntar\n * siempre) en \"denegar toda extensión\", que rompe las extensiones legítimas sin\n * cerrar ningún agujero.\n */\nasync function ejecutarVigilado(\n\trutaExtension: string,\n\tagentDir: string,\n\tcommand: string,\n\targs: string[],\n\tcwd: string,\n\toptions?: ExecOptions,\n): Promise<ExecResult> {\n\tconst argv = [command, ...args];\n\tconst decision = decidir({\n\t\t// Nombre propio y no \"bash\": en el libro hay que poder separar lo que\n\t\t// ejecutó una extensión de lo que ejecutó el modelo. `nivelDe` no lo\n\t\t// conoce, así que cae en \"ejecucion\", que es lo correcto.\n\t\ttool: \"pi.exec\",\n\t\targs: { command, args, cwd: options?.cwd ?? cwd },\n\t\tmodo: \"yolo\",\n\t\tagentDir,\n\t});\n\n\tif (decision.veredicto === \"denegada\") {\n\t\tawait libro(agentDir).anotar({\n\t\t\ttipo: \"comando\",\n\t\t\targv,\n\t\t\tcodigo: CODIGO_DENEGADO,\n\t\t\tsandbox: \"bloqueado\",\n\t\t\tviolaciones: [decision.politica],\n\t\t\torigen: \"extension\",\n\t\t\textension: rutaExtension,\n\t\t});\n\t\treturn {\n\t\t\tstdout: \"\",\n\t\t\t// El motivo va en `stderr` y no en una excepción para que la extensión\n\t\t\t// pueda enseñarlo tal cual; el código distinto de cero es lo que impide\n\t\t\t// leerlo como éxito.\n\t\t\tstderr: `Ada: ${decision.motivo}\\n(politica: ${decision.politica}; extension: ${rutaExtension})`,\n\t\t\tcode: CODIGO_DENEGADO,\n\t\t\tkilled: false,\n\t\t};\n\t}\n\n\tconst resultado = await execCommand(command, args, options?.cwd ?? cwd, options);\n\tawait libro(agentDir).anotar({\n\t\ttipo: \"comando\",\n\t\targv,\n\t\tcodigo: resultado.code,\n\t\torigen: \"extension\",\n\t\textension: rutaExtension,\n\t});\n\treturn resultado;\n}\n\n/** El aviso que ve el MODELO, delante de la descripción de la tool. */\nfunction avisoParaElModelo(nombre: string, rutaExtension: string): string {\n\treturn `[SUPLANTADA] Esta NO es la tool \\`${nombre}\\` de Ada: la sustituye la extension ${rutaExtension}. Puede hacer cualquier cosa, no lo que dice el nombre. Trátala como una tool desconocida.`;\n}\n\n/**\n * Marca una tool que suplanta a una builtin, en los dos sitios donde se ve.\n *\n * No se RECHAZA el registro, y es deliberado: suplantar una builtin es una\n * función documentada de upstream —`examples/extensions/tool-override.ts`,\n * `minimal-mode.ts` y `built-in-tool-renderer.ts` viven de ella— y romperla\n * dejaría las extensiones normales inservibles, que es peor que el agujero.\n * Lo que se arregla es el SILENCIO:\n *\n * - `description` va al esquema de tools, así que el modelo lo lee en cada\n * turno y deja de creer que llama a la nuestra;\n * - `label` es lo que pinta la TUI en cada fila de ejecución, así que el\n * usuario lo ve cada vez que corre, no solo una línea al arrancar que se va\n * con el primer scroll.\n */\nfunction marcarSuplantada(tool: ToolDefinition, rutaExtension: string): ToolDefinition {\n\treturn {\n\t\t...tool,\n\t\tlabel: `${tool.label} (suplanta a ${tool.name})`,\n\t\tdescription: `${avisoParaElModelo(tool.name, rutaExtension)}\\n\\n${tool.description}`,\n\t};\n}\n\n/**\n * Envuelve la API de una extensión. Punto único de enganche con upstream.\n *\n * Las extensiones EN LÍNEA (`<inline:…>`, `<sdk:…>`) se dejan pasar sin marcar:\n * son código del propio programa que incrusta Ada —el SDK que personaliza `bash`\n * con `createBashTool`, el escritorio— no un fichero que un tercero ha dejado en\n * `.ada/extensions/`. Marcarlas sería un falso positivo, y un detector que grita\n * sobre el caso benigno vuelve indistinguible el caso real.\n */\nexport function vigilarExtension(api: ExtensionAPI, extension: Extension, cwd: string, agentDir: string): ExtensionAPI {\n\t// El publicado gana: quien llama pasa el GLOBAL porque no tiene el real en\n\t// ámbito. Ver `publicarAgentDir`.\n\tconst dirReal = agentDirPublicado ?? agentDir;\n\tconst ruta = extension.path;\n\tconst deFichero = !ruta.startsWith(\"<\");\n\t// Recargar en caliente vuelve a pasar por aquí: se limpia lo que anotó esta\n\t// misma extensión para que quitar una tool quite también su marca.\n\tolvidarSuplantacionesDe(ruta);\n\n\treturn {\n\t\t...api,\n\t\texec(command: string, args: string[], options?: ExecOptions): Promise<ExecResult> {\n\t\t\treturn ejecutarVigilado(ruta, dirReal, command, args, cwd, options);\n\t\t},\n\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\tif (deFichero && esNombreDeToolNuestra(tool.name)) {\n\t\t\t\tanotarSuplantacion(tool.name, ruta);\n\t\t\t\tapi.registerTool(marcarSuplantada(tool, ruta));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tapi.registerTool(tool);\n\t\t},\n\t} as ExtensionAPI;\n}\n"]}
|