@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,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Todo lo que Ada añade alrededor de una llamada a herramienta, en una pieza.
|
|
3
|
+
*
|
|
4
|
+
* Reúne tres cosas que empezaron sueltas dentro de `agent-session.ts` —el libro
|
|
5
|
+
* de sesión, la política de aprobación y el observador de ediciones— porque las
|
|
6
|
+
* tres cuelgan de los mismos dos ganchos y comparten el ciclo de vida de la
|
|
7
|
+
* llamada.
|
|
8
|
+
*
|
|
9
|
+
* El motivo de agruparlas no es estético. `agent-session.ts` es de upstream y
|
|
10
|
+
* cada región nuestra que vive ahí es un hunk que se reaplica en cada
|
|
11
|
+
* sincronización y se rompe cuando upstream refactoriza. Tres campos y un
|
|
12
|
+
* método sueltos partían el hunk de declaraciones en dos y se pasaban del
|
|
13
|
+
* presupuesto; un campo y dos llamadas, no. La regla está escrita en
|
|
14
|
+
* `core/ada.ts`: si vas a tocar `agent-session.ts`, mira antes si lo tuyo cabe
|
|
15
|
+
* en un módulo propio.
|
|
16
|
+
*/
|
|
17
|
+
import type { AssistantMessage } from "@earendil-works/pi-ai";
|
|
18
|
+
import { type Decision } from "../aprobacion/politica.ts";
|
|
19
|
+
import { LibroDeSesion } from "./libro.ts";
|
|
20
|
+
/** El trozo de configuración del motor que le hace falta a esto. */
|
|
21
|
+
interface ConfigConPermisos {
|
|
22
|
+
permissions?: Record<string, unknown>;
|
|
23
|
+
goalEngine?: {
|
|
24
|
+
planOnly?: boolean;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare class RegistroDeSesion {
|
|
28
|
+
private readonly agentDir;
|
|
29
|
+
private readonly sesionId;
|
|
30
|
+
private readonly observador;
|
|
31
|
+
/** Decisión de cada llamada, de `beforeToolCall` a `afterToolCall`. */
|
|
32
|
+
private readonly decisiones;
|
|
33
|
+
/**
|
|
34
|
+
* Llamadas que el modelo ANUNCIÓ y de las que el libro aún no sabe nada.
|
|
35
|
+
*
|
|
36
|
+
* Existe porque había un hueco medido: `validateToolArguments` corre ANTES
|
|
37
|
+
* que `beforeToolCall`, así que una llamada rechazada por sus argumentos
|
|
38
|
+
* —el error más común de los modelos pequeños— no llegaba a ninguno de
|
|
39
|
+
* nuestros dos enganches y desaparecía del libro. Ocurrió de verdad en una
|
|
40
|
+
* comparación contra un modelo gratuito: el transcript tenía dos `edit` y el
|
|
41
|
+
* libro solo una. Un registro que se vende como «qué hizo el agente» no puede
|
|
42
|
+
* callarse lo que el agente intentó hacer.
|
|
43
|
+
*/
|
|
44
|
+
private readonly anunciadas;
|
|
45
|
+
private _libro?;
|
|
46
|
+
constructor(agentDir: () => string, sesionId: () => string, cwd: () => string, completar?: (prompt: string) => Promise<string | null>);
|
|
47
|
+
/**
|
|
48
|
+
* El libro, creado en la primera anotación.
|
|
49
|
+
*
|
|
50
|
+
* Perezoso a propósito: abrirlo al construir la sesión crearía el directorio
|
|
51
|
+
* incluso para sesiones que no llegan a hacer nada, y entonces "no hay
|
|
52
|
+
* registro" y "no hizo nada" dejarían de distinguirse.
|
|
53
|
+
*/
|
|
54
|
+
libro(): LibroDeSesion;
|
|
55
|
+
/**
|
|
56
|
+
* Antes de ejecutar: decide si se permite y guarda la preimagen del fichero.
|
|
57
|
+
*
|
|
58
|
+
* Devuelve la decisión. Quien llama corta si es `denegada`; la denegación ya
|
|
59
|
+
* queda anotada aquí.
|
|
60
|
+
*/
|
|
61
|
+
antesDeLlamada(idLlamada: string, tool: string, args: Record<string, unknown>, config: ConfigConPermisos): Promise<Decision>;
|
|
62
|
+
/**
|
|
63
|
+
* Después de ejecutar: anota lo ocurrido y devuelve el aviso de edición rota,
|
|
64
|
+
* o `null` si no hay nada que decir — que es el caso de casi todas.
|
|
65
|
+
*/
|
|
66
|
+
trasLlamada(idLlamada: string, tool: string, args: Record<string, unknown>, huboError: boolean): Promise<string | null>;
|
|
67
|
+
/**
|
|
68
|
+
* Una llamada al modelo.
|
|
69
|
+
*
|
|
70
|
+
* Se anota por llamada y no por turno porque un turno puede gastar varias, y
|
|
71
|
+
* "qué modelo se usó y cuánto costó" hay que poder responderlo con ese grano.
|
|
72
|
+
* Las que fallan también: `motivoParada: "error"` es justo lo que hay que
|
|
73
|
+
* poder enseñar.
|
|
74
|
+
*/
|
|
75
|
+
anotarModelo(asistente: AssistantMessage): void;
|
|
76
|
+
}
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=registro-sesion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registro-sesion.d.ts","sourceRoot":"","sources":["../../../src/core/audit/registro-sesion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,KAAK,QAAQ,EAA0B,MAAM,2BAA2B,CAAC;AAIlF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,qEAAoE;AACpE,UAAU,iBAAiB;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACpC;AAED,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IACnD,wEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAC1D;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,MAAM,CAAC,CAAgB;IAW/B,YACC,QAAQ,EAAE,MAAM,MAAM,EACtB,QAAQ,EAAE,MAAM,MAAM,EACtB,GAAG,EAAE,MAAM,MAAM,EACjB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAatD;IAED;;;;;;OAMG;IACH,KAAK,IAAI,aAAa,CAGrB;IAED;;;;;OAKG;IACG,cAAc,CACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,iBAAiB,GACvB,OAAO,CAAC,QAAQ,CAAC,CA6BnB;IAED;;;OAGG;IACG,WAAW,CAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,OAAO,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+CxB;IAED;;;;;;;OAOG;IACH,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAqC9C;CACD","sourcesContent":["/**\n * Todo lo que Ada añade alrededor de una llamada a herramienta, en una pieza.\n *\n * Reúne tres cosas que empezaron sueltas dentro de `agent-session.ts` —el libro\n * de sesión, la política de aprobación y el observador de ediciones— porque las\n * tres cuelgan de los mismos dos ganchos y comparten el ciclo de vida de la\n * llamada.\n *\n * El motivo de agruparlas no es estético. `agent-session.ts` es de upstream y\n * cada región nuestra que vive ahí es un hunk que se reaplica en cada\n * sincronización y se rompe cuando upstream refactoriza. Tres campos y un\n * método sueltos partían el hunk de declaraciones en dos y se pasaban del\n * presupuesto; un campo y dos llamadas, no. La regla está escrita en\n * `core/ada.ts`: si vas a tocar `agent-session.ts`, mira antes si lo tuyo cabe\n * en un módulo propio.\n */\n\nimport type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport { type Decision, decidir, leerDenegadas } from \"../aprobacion/politica.ts\";\nimport { ObservadorDeEdiciones } from \"../edicion/observador.ts\";\nimport { publicarLibroDeSesion } from \"../extensiones/vigilancia.ts\";\nimport { nivelDesdeConfig } from \"../hooks/session-hooks.ts\";\nimport { LibroDeSesion } from \"./libro.ts\";\n\n/** El trozo de configuración del motor que le hace falta a esto. */\ninterface ConfigConPermisos {\n\tpermissions?: Record<string, unknown>;\n\tgoalEngine?: { planOnly?: boolean };\n}\n\nexport class RegistroDeSesion {\n\tprivate readonly agentDir: () => string;\n\tprivate readonly sesionId: () => string;\n\tprivate readonly observador: ObservadorDeEdiciones;\n\t/** Decisión de cada llamada, de `beforeToolCall` a `afterToolCall`. */\n\tprivate readonly decisiones = new Map<string, Decision>();\n\t/**\n\t * Llamadas que el modelo ANUNCIÓ y de las que el libro aún no sabe nada.\n\t *\n\t * Existe porque había un hueco medido: `validateToolArguments` corre ANTES\n\t * que `beforeToolCall`, así que una llamada rechazada por sus argumentos\n\t * —el error más común de los modelos pequeños— no llegaba a ninguno de\n\t * nuestros dos enganches y desaparecía del libro. Ocurrió de verdad en una\n\t * comparación contra un modelo gratuito: el transcript tenía dos `edit` y el\n\t * libro solo una. Un registro que se vende como «qué hizo el agente» no puede\n\t * callarse lo que el agente intentó hacer.\n\t */\n\tprivate readonly anunciadas = new Map<string, string>();\n\tprivate _libro?: LibroDeSesion;\n\n\t// Los tres primeros son funciones y no valores: este objeto se construye en\n\t// un inicializador de campo de `AgentSession`, que corre ANTES del cuerpo\n\t// del constructor. `this.sessionId` es un getter sobre estado que todavía\n\t// no existe ahí, y leerlo en ese momento reventaba la sesión entera —76\n\t// ficheros de prueba en rojo— sin que los tipos dijeran nada.\n\t//\n\t// `completar` es opcional: sin modelo (sesiones de prueba, subagentes sin\n\t// auth) la auto-reparación de ediciones rotas queda \"no-aplicable\" en vez\n\t// de intentarlo con `undefined` y reventar.\n\tconstructor(\n\t\tagentDir: () => string,\n\t\tsesionId: () => string,\n\t\tcwd: () => string,\n\t\tcompletar?: (prompt: string) => Promise<string | null>,\n\t) {\n\t\tthis.agentDir = agentDir;\n\t\tthis.sesionId = sesionId;\n\t\tthis.observador = new ObservadorDeEdiciones(cwd, agentDir, completar);\n\t\t// `pi.exec` de una extensión escribe en el MISMO libro que las llamadas\n\t\t// del agente. Sin esto, la extensión abriría su propio fichero de sesión\n\t\t// y quien auditara el de la conversación no vería nada — que es el mismo\n\t\t// agujero de antes con un rastro más difícil de encontrar.\n\t\t//\n\t\t// Se publica un getter para no forzar la creación del libro aquí: sigue\n\t\t// siendo perezoso, y una sesión que no hace nada no deja directorio.\n\t\tpublicarLibroDeSesion(() => this.libro());\n\t}\n\n\t/**\n\t * El libro, creado en la primera anotación.\n\t *\n\t * Perezoso a propósito: abrirlo al construir la sesión crearía el directorio\n\t * incluso para sesiones que no llegan a hacer nada, y entonces \"no hay\n\t * registro\" y \"no hizo nada\" dejarían de distinguirse.\n\t */\n\tlibro(): LibroDeSesion {\n\t\tthis._libro ??= new LibroDeSesion(this.agentDir(), this.sesionId());\n\t\treturn this._libro;\n\t}\n\n\t/**\n\t * Antes de ejecutar: decide si se permite y guarda la preimagen del fichero.\n\t *\n\t * Devuelve la decisión. Quien llama corta si es `denegada`; la denegación ya\n\t * queda anotada aquí.\n\t */\n\tasync antesDeLlamada(\n\t\tidLlamada: string,\n\t\ttool: string,\n\t\targs: Record<string, unknown>,\n\t\tconfig: ConfigConPermisos,\n\t): Promise<Decision> {\n\t\tconst decision = decidir({\n\t\t\ttool,\n\t\t\targs,\n\t\t\tmodo: nivelDesdeConfig(config),\n\t\t\tagentDir: this.agentDir(),\n\t\t\tdenegadas: leerDenegadas(config),\n\t\t});\n\n\t\tif (decision.veredicto === \"denegada\") {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"tool\",\n\t\t\t\tnombre: tool,\n\t\t\t\tok: false,\n\t\t\t\tdecision: \"denegada\",\n\t\t\t\tmotivo: decision.politica,\n\t\t\t});\n\t\t\t// Una llamada bloqueada no llega a `trasLlamada`, así que no se guarda\n\t\t\t// nada que luego nadie recogería. Y ya está anotada arriba: se saca de\n\t\t\t// las pendientes para que la reconciliación no la cuente dos veces.\n\t\t\tthis.anunciadas.delete(idLlamada);\n\t\t\treturn decision;\n\t\t}\n\n\t\t// Tope por si alguna llamada muere antes de consumirse.\n\t\tif (this.decisiones.size > 256) this.decisiones.clear();\n\t\tthis.decisiones.set(idLlamada, decision);\n\t\tawait this.observador.antesDe(idLlamada, tool, args);\n\t\treturn decision;\n\t}\n\n\t/**\n\t * Después de ejecutar: anota lo ocurrido y devuelve el aviso de edición rota,\n\t * o `null` si no hay nada que decir — que es el caso de casi todas.\n\t */\n\tasync trasLlamada(\n\t\tidLlamada: string,\n\t\ttool: string,\n\t\targs: Record<string, unknown>,\n\t\thuboError: boolean,\n\t): Promise<string | null> {\n\t\tconst aprobacion = this.decisiones.get(idLlamada);\n\t\tthis.decisiones.delete(idLlamada);\n\t\tthis.anunciadas.delete(idLlamada);\n\n\t\tconst comando = (args as { command?: unknown } | undefined)?.command;\n\t\tvoid this.libro().anotar(\n\t\t\ttool === \"bash\" && typeof comando === \"string\"\n\t\t\t\t? { tipo: \"comando\", argv: [comando], codigo: huboError ? 1 : 0, origen: \"agente\" }\n\t\t\t\t: {\n\t\t\t\t\t\ttipo: \"tool\",\n\t\t\t\t\t\tnombre: tool,\n\t\t\t\t\t\tok: !huboError,\n\t\t\t\t\t\t// Qué regla la dejó pasar. Sin esto el libro dice que algo\n\t\t\t\t\t\t// ocurrió pero no por qué se permitió, que es justo la mitad\n\t\t\t\t\t\t// que pregunta una auditoría.\n\t\t\t\t\t\tdecision: aprobacion?.veredicto,\n\t\t\t\t\t\tmotivo: aprobacion?.politica,\n\t\t\t\t\t},\n\t\t);\n\n\t\tconst aviso = await this.observador.despuesDe(idLlamada, huboError);\n\n\t\t// El suceso `fichero` del libro: art. 30 RGPD, qué ficheros se trataron.\n\t\t//\n\t\t// El tipo existía en `libro.ts` desde el primer día y NADIE lo anotaba: el\n\t\t// comentario de `agent-session.ts` decía \"los hashes de fichero llegan con\n\t\t// el observador de ediciones\", en futuro, y nunca llegaron. La auditoría\n\t\t// enterprise lo encontró preguntando lo que pregunta un DPO. Es el defecto\n\t\t// número uno de esta casa: capacidad construida y desenchufada, con el tipo\n\t\t// compilando y las pruebas en verde porque las pruebas anotaban a mano.\n\t\t//\n\t\t// Se toma del observador, que ya leyó las dos versiones, en vez de releer el\n\t\t// fichero aquí. El libro hashea `antes` y `despues` al escribir, así que el\n\t\t// contenido pasa por aquí pero no llega a disco.\n\t\tconst cambio = this.observador.ultimoCambio(idLlamada);\n\t\tif (cambio) {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"fichero\",\n\t\t\t\truta: cambio.ruta,\n\t\t\t\tantes: cambio.antes,\n\t\t\t\tdespues: cambio.despues,\n\t\t\t\ttool,\n\t\t\t});\n\t\t}\n\n\t\treturn aviso;\n\t}\n\n\t/**\n\t * Una llamada al modelo.\n\t *\n\t * Se anota por llamada y no por turno porque un turno puede gastar varias, y\n\t * \"qué modelo se usó y cuánto costó\" hay que poder responderlo con ese grano.\n\t * Las que fallan también: `motivoParada: \"error\"` es justo lo que hay que\n\t * poder enseñar.\n\t */\n\tanotarModelo(asistente: AssistantMessage): void {\n\t\t// RECONCILIAR PRIMERO. Para cuando llega este mensaje, las herramientas del\n\t\t// anterior ya se ejecutaron —el bucle las espera—, así que todo lo que siga\n\t\t// pendiente es una llamada que el modelo pidió y que nunca llegó a\n\t\t// ejecutarse: argumentos que no validaron, o una herramienta inexistente.\n\t\tfor (const [id, nombre] of this.anunciadas) {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"tool\",\n\t\t\t\tnombre,\n\t\t\t\tok: false,\n\t\t\t\tdecision: \"no-ejecutada\",\n\t\t\t\t// El motivo no se inventa: desde aquí no se ve la causa exacta, y\n\t\t\t\t// escribir una supuesta sería peor que nombrar lo que sí se sabe.\n\t\t\t\tmotivo: \"el modelo la pidió y no llegó a ejecutarse (argumentos inválidos o herramienta inexistente)\",\n\t\t\t});\n\t\t\tthis.anunciadas.delete(id);\n\t\t}\n\n\t\tif (!asistente.usage) return;\n\n\t\t// Y se apuntan las de ESTE mensaje, para poder reconciliarlas en el\n\t\t// siguiente.\n\t\tfor (const bloque of asistente.content) {\n\t\t\tif (bloque.type === \"toolCall\") this.anunciadas.set(bloque.id, bloque.name);\n\t\t}\n\t\tvoid this.libro().anotar({\n\t\t\ttipo: \"modelo\",\n\t\t\tproveedor: asistente.provider,\n\t\t\t// `responseModel` es el modelo CONCRETO cuando lo pedido era un alias\n\t\t\t// (el `auto` de OpenRouter, por ejemplo). Para un registro de\n\t\t\t// cumplimiento importa el que respondió, no el que se pidió.\n\t\t\tmodelo: asistente.responseModel ?? asistente.model,\n\t\t\tentrada: asistente.usage.input,\n\t\t\tsalida: asistente.usage.output,\n\t\t\tcoste: asistente.usage.cost?.total,\n\t\t\tmotivoParada: asistente.stopReason,\n\t\t});\n\t}\n}\n"]}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Todo lo que Ada añade alrededor de una llamada a herramienta, en una pieza.
|
|
3
|
+
*
|
|
4
|
+
* Reúne tres cosas que empezaron sueltas dentro de `agent-session.ts` —el libro
|
|
5
|
+
* de sesión, la política de aprobación y el observador de ediciones— porque las
|
|
6
|
+
* tres cuelgan de los mismos dos ganchos y comparten el ciclo de vida de la
|
|
7
|
+
* llamada.
|
|
8
|
+
*
|
|
9
|
+
* El motivo de agruparlas no es estético. `agent-session.ts` es de upstream y
|
|
10
|
+
* cada región nuestra que vive ahí es un hunk que se reaplica en cada
|
|
11
|
+
* sincronización y se rompe cuando upstream refactoriza. Tres campos y un
|
|
12
|
+
* método sueltos partían el hunk de declaraciones en dos y se pasaban del
|
|
13
|
+
* presupuesto; un campo y dos llamadas, no. La regla está escrita en
|
|
14
|
+
* `core/ada.ts`: si vas a tocar `agent-session.ts`, mira antes si lo tuyo cabe
|
|
15
|
+
* en un módulo propio.
|
|
16
|
+
*/
|
|
17
|
+
import { decidir, leerDenegadas } from "../aprobacion/politica.js";
|
|
18
|
+
import { ObservadorDeEdiciones } from "../edicion/observador.js";
|
|
19
|
+
import { publicarLibroDeSesion } from "../extensiones/vigilancia.js";
|
|
20
|
+
import { nivelDesdeConfig } from "../hooks/session-hooks.js";
|
|
21
|
+
import { LibroDeSesion } from "./libro.js";
|
|
22
|
+
export class RegistroDeSesion {
|
|
23
|
+
agentDir;
|
|
24
|
+
sesionId;
|
|
25
|
+
observador;
|
|
26
|
+
/** Decisión de cada llamada, de `beforeToolCall` a `afterToolCall`. */
|
|
27
|
+
decisiones = new Map();
|
|
28
|
+
/**
|
|
29
|
+
* Llamadas que el modelo ANUNCIÓ y de las que el libro aún no sabe nada.
|
|
30
|
+
*
|
|
31
|
+
* Existe porque había un hueco medido: `validateToolArguments` corre ANTES
|
|
32
|
+
* que `beforeToolCall`, así que una llamada rechazada por sus argumentos
|
|
33
|
+
* —el error más común de los modelos pequeños— no llegaba a ninguno de
|
|
34
|
+
* nuestros dos enganches y desaparecía del libro. Ocurrió de verdad en una
|
|
35
|
+
* comparación contra un modelo gratuito: el transcript tenía dos `edit` y el
|
|
36
|
+
* libro solo una. Un registro que se vende como «qué hizo el agente» no puede
|
|
37
|
+
* callarse lo que el agente intentó hacer.
|
|
38
|
+
*/
|
|
39
|
+
anunciadas = new Map();
|
|
40
|
+
_libro;
|
|
41
|
+
// Los tres primeros son funciones y no valores: este objeto se construye en
|
|
42
|
+
// un inicializador de campo de `AgentSession`, que corre ANTES del cuerpo
|
|
43
|
+
// del constructor. `this.sessionId` es un getter sobre estado que todavía
|
|
44
|
+
// no existe ahí, y leerlo en ese momento reventaba la sesión entera —76
|
|
45
|
+
// ficheros de prueba en rojo— sin que los tipos dijeran nada.
|
|
46
|
+
//
|
|
47
|
+
// `completar` es opcional: sin modelo (sesiones de prueba, subagentes sin
|
|
48
|
+
// auth) la auto-reparación de ediciones rotas queda "no-aplicable" en vez
|
|
49
|
+
// de intentarlo con `undefined` y reventar.
|
|
50
|
+
constructor(agentDir, sesionId, cwd, completar) {
|
|
51
|
+
this.agentDir = agentDir;
|
|
52
|
+
this.sesionId = sesionId;
|
|
53
|
+
this.observador = new ObservadorDeEdiciones(cwd, agentDir, completar);
|
|
54
|
+
// `pi.exec` de una extensión escribe en el MISMO libro que las llamadas
|
|
55
|
+
// del agente. Sin esto, la extensión abriría su propio fichero de sesión
|
|
56
|
+
// y quien auditara el de la conversación no vería nada — que es el mismo
|
|
57
|
+
// agujero de antes con un rastro más difícil de encontrar.
|
|
58
|
+
//
|
|
59
|
+
// Se publica un getter para no forzar la creación del libro aquí: sigue
|
|
60
|
+
// siendo perezoso, y una sesión que no hace nada no deja directorio.
|
|
61
|
+
publicarLibroDeSesion(() => this.libro());
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* El libro, creado en la primera anotación.
|
|
65
|
+
*
|
|
66
|
+
* Perezoso a propósito: abrirlo al construir la sesión crearía el directorio
|
|
67
|
+
* incluso para sesiones que no llegan a hacer nada, y entonces "no hay
|
|
68
|
+
* registro" y "no hizo nada" dejarían de distinguirse.
|
|
69
|
+
*/
|
|
70
|
+
libro() {
|
|
71
|
+
this._libro ??= new LibroDeSesion(this.agentDir(), this.sesionId());
|
|
72
|
+
return this._libro;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Antes de ejecutar: decide si se permite y guarda la preimagen del fichero.
|
|
76
|
+
*
|
|
77
|
+
* Devuelve la decisión. Quien llama corta si es `denegada`; la denegación ya
|
|
78
|
+
* queda anotada aquí.
|
|
79
|
+
*/
|
|
80
|
+
async antesDeLlamada(idLlamada, tool, args, config) {
|
|
81
|
+
const decision = decidir({
|
|
82
|
+
tool,
|
|
83
|
+
args,
|
|
84
|
+
modo: nivelDesdeConfig(config),
|
|
85
|
+
agentDir: this.agentDir(),
|
|
86
|
+
denegadas: leerDenegadas(config),
|
|
87
|
+
});
|
|
88
|
+
if (decision.veredicto === "denegada") {
|
|
89
|
+
void this.libro().anotar({
|
|
90
|
+
tipo: "tool",
|
|
91
|
+
nombre: tool,
|
|
92
|
+
ok: false,
|
|
93
|
+
decision: "denegada",
|
|
94
|
+
motivo: decision.politica,
|
|
95
|
+
});
|
|
96
|
+
// Una llamada bloqueada no llega a `trasLlamada`, así que no se guarda
|
|
97
|
+
// nada que luego nadie recogería. Y ya está anotada arriba: se saca de
|
|
98
|
+
// las pendientes para que la reconciliación no la cuente dos veces.
|
|
99
|
+
this.anunciadas.delete(idLlamada);
|
|
100
|
+
return decision;
|
|
101
|
+
}
|
|
102
|
+
// Tope por si alguna llamada muere antes de consumirse.
|
|
103
|
+
if (this.decisiones.size > 256)
|
|
104
|
+
this.decisiones.clear();
|
|
105
|
+
this.decisiones.set(idLlamada, decision);
|
|
106
|
+
await this.observador.antesDe(idLlamada, tool, args);
|
|
107
|
+
return decision;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Después de ejecutar: anota lo ocurrido y devuelve el aviso de edición rota,
|
|
111
|
+
* o `null` si no hay nada que decir — que es el caso de casi todas.
|
|
112
|
+
*/
|
|
113
|
+
async trasLlamada(idLlamada, tool, args, huboError) {
|
|
114
|
+
const aprobacion = this.decisiones.get(idLlamada);
|
|
115
|
+
this.decisiones.delete(idLlamada);
|
|
116
|
+
this.anunciadas.delete(idLlamada);
|
|
117
|
+
const comando = args?.command;
|
|
118
|
+
void this.libro().anotar(tool === "bash" && typeof comando === "string"
|
|
119
|
+
? { tipo: "comando", argv: [comando], codigo: huboError ? 1 : 0, origen: "agente" }
|
|
120
|
+
: {
|
|
121
|
+
tipo: "tool",
|
|
122
|
+
nombre: tool,
|
|
123
|
+
ok: !huboError,
|
|
124
|
+
// Qué regla la dejó pasar. Sin esto el libro dice que algo
|
|
125
|
+
// ocurrió pero no por qué se permitió, que es justo la mitad
|
|
126
|
+
// que pregunta una auditoría.
|
|
127
|
+
decision: aprobacion?.veredicto,
|
|
128
|
+
motivo: aprobacion?.politica,
|
|
129
|
+
});
|
|
130
|
+
const aviso = await this.observador.despuesDe(idLlamada, huboError);
|
|
131
|
+
// El suceso `fichero` del libro: art. 30 RGPD, qué ficheros se trataron.
|
|
132
|
+
//
|
|
133
|
+
// El tipo existía en `libro.ts` desde el primer día y NADIE lo anotaba: el
|
|
134
|
+
// comentario de `agent-session.ts` decía "los hashes de fichero llegan con
|
|
135
|
+
// el observador de ediciones", en futuro, y nunca llegaron. La auditoría
|
|
136
|
+
// enterprise lo encontró preguntando lo que pregunta un DPO. Es el defecto
|
|
137
|
+
// número uno de esta casa: capacidad construida y desenchufada, con el tipo
|
|
138
|
+
// compilando y las pruebas en verde porque las pruebas anotaban a mano.
|
|
139
|
+
//
|
|
140
|
+
// Se toma del observador, que ya leyó las dos versiones, en vez de releer el
|
|
141
|
+
// fichero aquí. El libro hashea `antes` y `despues` al escribir, así que el
|
|
142
|
+
// contenido pasa por aquí pero no llega a disco.
|
|
143
|
+
const cambio = this.observador.ultimoCambio(idLlamada);
|
|
144
|
+
if (cambio) {
|
|
145
|
+
void this.libro().anotar({
|
|
146
|
+
tipo: "fichero",
|
|
147
|
+
ruta: cambio.ruta,
|
|
148
|
+
antes: cambio.antes,
|
|
149
|
+
despues: cambio.despues,
|
|
150
|
+
tool,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return aviso;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Una llamada al modelo.
|
|
157
|
+
*
|
|
158
|
+
* Se anota por llamada y no por turno porque un turno puede gastar varias, y
|
|
159
|
+
* "qué modelo se usó y cuánto costó" hay que poder responderlo con ese grano.
|
|
160
|
+
* Las que fallan también: `motivoParada: "error"` es justo lo que hay que
|
|
161
|
+
* poder enseñar.
|
|
162
|
+
*/
|
|
163
|
+
anotarModelo(asistente) {
|
|
164
|
+
// RECONCILIAR PRIMERO. Para cuando llega este mensaje, las herramientas del
|
|
165
|
+
// anterior ya se ejecutaron —el bucle las espera—, así que todo lo que siga
|
|
166
|
+
// pendiente es una llamada que el modelo pidió y que nunca llegó a
|
|
167
|
+
// ejecutarse: argumentos que no validaron, o una herramienta inexistente.
|
|
168
|
+
for (const [id, nombre] of this.anunciadas) {
|
|
169
|
+
void this.libro().anotar({
|
|
170
|
+
tipo: "tool",
|
|
171
|
+
nombre,
|
|
172
|
+
ok: false,
|
|
173
|
+
decision: "no-ejecutada",
|
|
174
|
+
// El motivo no se inventa: desde aquí no se ve la causa exacta, y
|
|
175
|
+
// escribir una supuesta sería peor que nombrar lo que sí se sabe.
|
|
176
|
+
motivo: "el modelo la pidió y no llegó a ejecutarse (argumentos inválidos o herramienta inexistente)",
|
|
177
|
+
});
|
|
178
|
+
this.anunciadas.delete(id);
|
|
179
|
+
}
|
|
180
|
+
if (!asistente.usage)
|
|
181
|
+
return;
|
|
182
|
+
// Y se apuntan las de ESTE mensaje, para poder reconciliarlas en el
|
|
183
|
+
// siguiente.
|
|
184
|
+
for (const bloque of asistente.content) {
|
|
185
|
+
if (bloque.type === "toolCall")
|
|
186
|
+
this.anunciadas.set(bloque.id, bloque.name);
|
|
187
|
+
}
|
|
188
|
+
void this.libro().anotar({
|
|
189
|
+
tipo: "modelo",
|
|
190
|
+
proveedor: asistente.provider,
|
|
191
|
+
// `responseModel` es el modelo CONCRETO cuando lo pedido era un alias
|
|
192
|
+
// (el `auto` de OpenRouter, por ejemplo). Para un registro de
|
|
193
|
+
// cumplimiento importa el que respondió, no el que se pidió.
|
|
194
|
+
modelo: asistente.responseModel ?? asistente.model,
|
|
195
|
+
entrada: asistente.usage.input,
|
|
196
|
+
salida: asistente.usage.output,
|
|
197
|
+
coste: asistente.usage.cost?.total,
|
|
198
|
+
motivoParada: asistente.stopReason,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=registro-sesion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registro-sesion.js","sourceRoot":"","sources":["../../../src/core/audit/registro-sesion.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Todo lo que Ada añade alrededor de una llamada a herramienta, en una pieza.\n *\n * Reúne tres cosas que empezaron sueltas dentro de `agent-session.ts` —el libro\n * de sesión, la política de aprobación y el observador de ediciones— porque las\n * tres cuelgan de los mismos dos ganchos y comparten el ciclo de vida de la\n * llamada.\n *\n * El motivo de agruparlas no es estético. `agent-session.ts` es de upstream y\n * cada región nuestra que vive ahí es un hunk que se reaplica en cada\n * sincronización y se rompe cuando upstream refactoriza. Tres campos y un\n * método sueltos partían el hunk de declaraciones en dos y se pasaban del\n * presupuesto; un campo y dos llamadas, no. La regla está escrita en\n * `core/ada.ts`: si vas a tocar `agent-session.ts`, mira antes si lo tuyo cabe\n * en un módulo propio.\n */\n\nimport type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport { type Decision, decidir, leerDenegadas } from \"../aprobacion/politica.ts\";\nimport { ObservadorDeEdiciones } from \"../edicion/observador.ts\";\nimport { publicarLibroDeSesion } from \"../extensiones/vigilancia.ts\";\nimport { nivelDesdeConfig } from \"../hooks/session-hooks.ts\";\nimport { LibroDeSesion } from \"./libro.ts\";\n\n/** El trozo de configuración del motor que le hace falta a esto. */\ninterface ConfigConPermisos {\n\tpermissions?: Record<string, unknown>;\n\tgoalEngine?: { planOnly?: boolean };\n}\n\nexport class RegistroDeSesion {\n\tprivate readonly agentDir: () => string;\n\tprivate readonly sesionId: () => string;\n\tprivate readonly observador: ObservadorDeEdiciones;\n\t/** Decisión de cada llamada, de `beforeToolCall` a `afterToolCall`. */\n\tprivate readonly decisiones = new Map<string, Decision>();\n\t/**\n\t * Llamadas que el modelo ANUNCIÓ y de las que el libro aún no sabe nada.\n\t *\n\t * Existe porque había un hueco medido: `validateToolArguments` corre ANTES\n\t * que `beforeToolCall`, así que una llamada rechazada por sus argumentos\n\t * —el error más común de los modelos pequeños— no llegaba a ninguno de\n\t * nuestros dos enganches y desaparecía del libro. Ocurrió de verdad en una\n\t * comparación contra un modelo gratuito: el transcript tenía dos `edit` y el\n\t * libro solo una. Un registro que se vende como «qué hizo el agente» no puede\n\t * callarse lo que el agente intentó hacer.\n\t */\n\tprivate readonly anunciadas = new Map<string, string>();\n\tprivate _libro?: LibroDeSesion;\n\n\t// Los tres primeros son funciones y no valores: este objeto se construye en\n\t// un inicializador de campo de `AgentSession`, que corre ANTES del cuerpo\n\t// del constructor. `this.sessionId` es un getter sobre estado que todavía\n\t// no existe ahí, y leerlo en ese momento reventaba la sesión entera —76\n\t// ficheros de prueba en rojo— sin que los tipos dijeran nada.\n\t//\n\t// `completar` es opcional: sin modelo (sesiones de prueba, subagentes sin\n\t// auth) la auto-reparación de ediciones rotas queda \"no-aplicable\" en vez\n\t// de intentarlo con `undefined` y reventar.\n\tconstructor(\n\t\tagentDir: () => string,\n\t\tsesionId: () => string,\n\t\tcwd: () => string,\n\t\tcompletar?: (prompt: string) => Promise<string | null>,\n\t) {\n\t\tthis.agentDir = agentDir;\n\t\tthis.sesionId = sesionId;\n\t\tthis.observador = new ObservadorDeEdiciones(cwd, agentDir, completar);\n\t\t// `pi.exec` de una extensión escribe en el MISMO libro que las llamadas\n\t\t// del agente. Sin esto, la extensión abriría su propio fichero de sesión\n\t\t// y quien auditara el de la conversación no vería nada — que es el mismo\n\t\t// agujero de antes con un rastro más difícil de encontrar.\n\t\t//\n\t\t// Se publica un getter para no forzar la creación del libro aquí: sigue\n\t\t// siendo perezoso, y una sesión que no hace nada no deja directorio.\n\t\tpublicarLibroDeSesion(() => this.libro());\n\t}\n\n\t/**\n\t * El libro, creado en la primera anotación.\n\t *\n\t * Perezoso a propósito: abrirlo al construir la sesión crearía el directorio\n\t * incluso para sesiones que no llegan a hacer nada, y entonces \"no hay\n\t * registro\" y \"no hizo nada\" dejarían de distinguirse.\n\t */\n\tlibro(): LibroDeSesion {\n\t\tthis._libro ??= new LibroDeSesion(this.agentDir(), this.sesionId());\n\t\treturn this._libro;\n\t}\n\n\t/**\n\t * Antes de ejecutar: decide si se permite y guarda la preimagen del fichero.\n\t *\n\t * Devuelve la decisión. Quien llama corta si es `denegada`; la denegación ya\n\t * queda anotada aquí.\n\t */\n\tasync antesDeLlamada(\n\t\tidLlamada: string,\n\t\ttool: string,\n\t\targs: Record<string, unknown>,\n\t\tconfig: ConfigConPermisos,\n\t): Promise<Decision> {\n\t\tconst decision = decidir({\n\t\t\ttool,\n\t\t\targs,\n\t\t\tmodo: nivelDesdeConfig(config),\n\t\t\tagentDir: this.agentDir(),\n\t\t\tdenegadas: leerDenegadas(config),\n\t\t});\n\n\t\tif (decision.veredicto === \"denegada\") {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"tool\",\n\t\t\t\tnombre: tool,\n\t\t\t\tok: false,\n\t\t\t\tdecision: \"denegada\",\n\t\t\t\tmotivo: decision.politica,\n\t\t\t});\n\t\t\t// Una llamada bloqueada no llega a `trasLlamada`, así que no se guarda\n\t\t\t// nada que luego nadie recogería. Y ya está anotada arriba: se saca de\n\t\t\t// las pendientes para que la reconciliación no la cuente dos veces.\n\t\t\tthis.anunciadas.delete(idLlamada);\n\t\t\treturn decision;\n\t\t}\n\n\t\t// Tope por si alguna llamada muere antes de consumirse.\n\t\tif (this.decisiones.size > 256) this.decisiones.clear();\n\t\tthis.decisiones.set(idLlamada, decision);\n\t\tawait this.observador.antesDe(idLlamada, tool, args);\n\t\treturn decision;\n\t}\n\n\t/**\n\t * Después de ejecutar: anota lo ocurrido y devuelve el aviso de edición rota,\n\t * o `null` si no hay nada que decir — que es el caso de casi todas.\n\t */\n\tasync trasLlamada(\n\t\tidLlamada: string,\n\t\ttool: string,\n\t\targs: Record<string, unknown>,\n\t\thuboError: boolean,\n\t): Promise<string | null> {\n\t\tconst aprobacion = this.decisiones.get(idLlamada);\n\t\tthis.decisiones.delete(idLlamada);\n\t\tthis.anunciadas.delete(idLlamada);\n\n\t\tconst comando = (args as { command?: unknown } | undefined)?.command;\n\t\tvoid this.libro().anotar(\n\t\t\ttool === \"bash\" && typeof comando === \"string\"\n\t\t\t\t? { tipo: \"comando\", argv: [comando], codigo: huboError ? 1 : 0, origen: \"agente\" }\n\t\t\t\t: {\n\t\t\t\t\t\ttipo: \"tool\",\n\t\t\t\t\t\tnombre: tool,\n\t\t\t\t\t\tok: !huboError,\n\t\t\t\t\t\t// Qué regla la dejó pasar. Sin esto el libro dice que algo\n\t\t\t\t\t\t// ocurrió pero no por qué se permitió, que es justo la mitad\n\t\t\t\t\t\t// que pregunta una auditoría.\n\t\t\t\t\t\tdecision: aprobacion?.veredicto,\n\t\t\t\t\t\tmotivo: aprobacion?.politica,\n\t\t\t\t\t},\n\t\t);\n\n\t\tconst aviso = await this.observador.despuesDe(idLlamada, huboError);\n\n\t\t// El suceso `fichero` del libro: art. 30 RGPD, qué ficheros se trataron.\n\t\t//\n\t\t// El tipo existía en `libro.ts` desde el primer día y NADIE lo anotaba: el\n\t\t// comentario de `agent-session.ts` decía \"los hashes de fichero llegan con\n\t\t// el observador de ediciones\", en futuro, y nunca llegaron. La auditoría\n\t\t// enterprise lo encontró preguntando lo que pregunta un DPO. Es el defecto\n\t\t// número uno de esta casa: capacidad construida y desenchufada, con el tipo\n\t\t// compilando y las pruebas en verde porque las pruebas anotaban a mano.\n\t\t//\n\t\t// Se toma del observador, que ya leyó las dos versiones, en vez de releer el\n\t\t// fichero aquí. El libro hashea `antes` y `despues` al escribir, así que el\n\t\t// contenido pasa por aquí pero no llega a disco.\n\t\tconst cambio = this.observador.ultimoCambio(idLlamada);\n\t\tif (cambio) {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"fichero\",\n\t\t\t\truta: cambio.ruta,\n\t\t\t\tantes: cambio.antes,\n\t\t\t\tdespues: cambio.despues,\n\t\t\t\ttool,\n\t\t\t});\n\t\t}\n\n\t\treturn aviso;\n\t}\n\n\t/**\n\t * Una llamada al modelo.\n\t *\n\t * Se anota por llamada y no por turno porque un turno puede gastar varias, y\n\t * \"qué modelo se usó y cuánto costó\" hay que poder responderlo con ese grano.\n\t * Las que fallan también: `motivoParada: \"error\"` es justo lo que hay que\n\t * poder enseñar.\n\t */\n\tanotarModelo(asistente: AssistantMessage): void {\n\t\t// RECONCILIAR PRIMERO. Para cuando llega este mensaje, las herramientas del\n\t\t// anterior ya se ejecutaron —el bucle las espera—, así que todo lo que siga\n\t\t// pendiente es una llamada que el modelo pidió y que nunca llegó a\n\t\t// ejecutarse: argumentos que no validaron, o una herramienta inexistente.\n\t\tfor (const [id, nombre] of this.anunciadas) {\n\t\t\tvoid this.libro().anotar({\n\t\t\t\ttipo: \"tool\",\n\t\t\t\tnombre,\n\t\t\t\tok: false,\n\t\t\t\tdecision: \"no-ejecutada\",\n\t\t\t\t// El motivo no se inventa: desde aquí no se ve la causa exacta, y\n\t\t\t\t// escribir una supuesta sería peor que nombrar lo que sí se sabe.\n\t\t\t\tmotivo: \"el modelo la pidió y no llegó a ejecutarse (argumentos inválidos o herramienta inexistente)\",\n\t\t\t});\n\t\t\tthis.anunciadas.delete(id);\n\t\t}\n\n\t\tif (!asistente.usage) return;\n\n\t\t// Y se apuntan las de ESTE mensaje, para poder reconciliarlas en el\n\t\t// siguiente.\n\t\tfor (const bloque of asistente.content) {\n\t\t\tif (bloque.type === \"toolCall\") this.anunciadas.set(bloque.id, bloque.name);\n\t\t}\n\t\tvoid this.libro().anotar({\n\t\t\ttipo: \"modelo\",\n\t\t\tproveedor: asistente.provider,\n\t\t\t// `responseModel` es el modelo CONCRETO cuando lo pedido era un alias\n\t\t\t// (el `auto` de OpenRouter, por ejemplo). Para un registro de\n\t\t\t// cumplimiento importa el que respondió, no el que se pidió.\n\t\t\tmodelo: asistente.responseModel ?? asistente.model,\n\t\t\tentrada: asistente.usage.input,\n\t\t\tsalida: asistente.usage.output,\n\t\t\tcoste: asistente.usage.cost?.total,\n\t\t\tmotivoParada: asistente.stopReason,\n\t\t});\n\t}\n}\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Purgar el libro sin que la purga parezca una manipulación.
|
|
3
|
+
*
|
|
4
|
+
* EL CALLEJÓN SIN SALIDA, medido antes de escribir nada. El artículo 5.1.e del
|
|
5
|
+
* RGPD obliga a no conservar los datos más de lo necesario, así que un DPO
|
|
6
|
+
* TIENE que poder borrar lo viejo. Pero hoy:
|
|
7
|
+
*
|
|
8
|
+
* · Si borra los ficheros de `sesion/`, el ancla del índice los sigue
|
|
9
|
+
* esperando y `verificar` contesta
|
|
10
|
+
* «FALTAN 1 fichero(s) con 3 entrada(s): alguien los ha borrado». Cumplir
|
|
11
|
+
* la ley nos acusa de manipular.
|
|
12
|
+
* · Si borra también el índice, el libro queda «íntegro» con menos entradas y
|
|
13
|
+
* la purga desaparece sin rastro. Es indistinguible de un borrado hostil.
|
|
14
|
+
*
|
|
15
|
+
* Las dos salidas son malas, y el subcomando ni siquiera existe: `audit purge`,
|
|
16
|
+
* `audit purgar`, `audit retencion` → «Subcomando desconocido». El único camino
|
|
17
|
+
* era `rm`.
|
|
18
|
+
*
|
|
19
|
+
* LA IDEA: una purga no es una ausencia, es un HECHO. Y un hecho se anota.
|
|
20
|
+
*
|
|
21
|
+
* En vez de borrar y callar, se escribe una LÁPIDA en el libro —encadenada como
|
|
22
|
+
* cualquier otra entrada— que dice qué periodo se purgó, cuántas entradas
|
|
23
|
+
* había, bajo qué política, y el hash de cierre del tramo que se va. Con eso:
|
|
24
|
+
*
|
|
25
|
+
* · `verificar` distingue «esto se purgó el día D bajo la política P» de
|
|
26
|
+
* «esto ha desaparecido», que es la diferencia entre cumplir y encubrir.
|
|
27
|
+
* · El artículo 5.2 —responsabilidad proactiva: hay que poder DEMOSTRAR que
|
|
28
|
+
* se cumple— queda cubierto por el propio mecanismo.
|
|
29
|
+
* · Y quien reciba el libro años después puede reconstruir qué pasó con lo
|
|
30
|
+
* que ya no está.
|
|
31
|
+
*
|
|
32
|
+
* LO QUE LA LÁPIDA NO ES. No es una prueba de que lo purgado fuera lo que dice
|
|
33
|
+
* la lápida: quien controla el disco puede escribir la lápida que quiera. Es
|
|
34
|
+
* una prueba de INTENCIÓN DECLARADA, y sirve para lo que sirve — que un borrado
|
|
35
|
+
* legítimo no se confunda con uno hostil, y que uno hostil tenga que mentir por
|
|
36
|
+
* escrito en vez de limitarse a borrar. Contra un adversario con acceso al
|
|
37
|
+
* disco no hay defensa local; para eso hace falta un ancla externa.
|
|
38
|
+
*/
|
|
39
|
+
import type { EntradaDelLibro, LibroDeSesion } from "./libro.ts";
|
|
40
|
+
/** Lo que la lápida deja escrito. Todo es dato de forma, nunca contenido. */
|
|
41
|
+
export interface Lapida {
|
|
42
|
+
/** Qué fichero de sesión se fue. */
|
|
43
|
+
fichero: string;
|
|
44
|
+
/** Cuántas entradas tenía, para que el hueco sea contable. */
|
|
45
|
+
entradas: number;
|
|
46
|
+
/** El sello de tiempo de la primera y la última, que delimitan el periodo. */
|
|
47
|
+
desde: string;
|
|
48
|
+
hasta: string;
|
|
49
|
+
/** Hash del último eslabón del tramo purgado: ancla de lo que se fue. */
|
|
50
|
+
hashDeCierre: string;
|
|
51
|
+
/** Bajo qué regla. Un texto libre que el DPO reconozca en su documentación. */
|
|
52
|
+
politica: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ResultadoDePurga {
|
|
55
|
+
purgados: Lapida[];
|
|
56
|
+
/** Los que se miraron y NO se purgaron, con su motivo. */
|
|
57
|
+
conservados: Array<{
|
|
58
|
+
fichero: string;
|
|
59
|
+
porque: string;
|
|
60
|
+
}>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Purga los ficheros de sesión anteriores a `antesDe`, dejando una lápida.
|
|
64
|
+
*
|
|
65
|
+
* `antesDe` se compara contra el sello de la ÚLTIMA entrada del fichero: una
|
|
66
|
+
* sesión que empezó en enero y terminó en marzo se conserva si el corte está en
|
|
67
|
+
* febrero. Purgar por la fecha de inicio borraría actividad posterior al corte,
|
|
68
|
+
* que es justo lo que no se puede hacer.
|
|
69
|
+
*
|
|
70
|
+
* No purga el fichero de la sesión EN CURSO aunque cumpla la fecha: quitarle el
|
|
71
|
+
* suelo a un libro que se está escribiendo rompería su cadena en memoria.
|
|
72
|
+
*/
|
|
73
|
+
export declare function purgarAntesDe(libro: LibroDeSesion, agentDir: string, antesDe: Date, politica: string,
|
|
74
|
+
/** Con `true` se decide igual pero no se escribe ni se borra nada. */
|
|
75
|
+
simular?: boolean): Promise<ResultadoDePurga>;
|
|
76
|
+
/**
|
|
77
|
+
* Los ficheros que una lápida declara purgados, leídos del propio libro.
|
|
78
|
+
*
|
|
79
|
+
* `verificar` lo usa para distinguir un hueco explicado de uno que no lo está.
|
|
80
|
+
*/
|
|
81
|
+
export declare function ficherosPurgados(entradas: readonly EntradaDelLibro[]): Map<string, Lapida>;
|
|
82
|
+
//# sourceMappingURL=retencion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retencion.d.ts","sourceRoot":"","sources":["../../../src/core/audit/retencion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGjE,8EAA6E;AAC7E,MAAM,WAAW,MAAM;IACtB,sCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,gEAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,2EAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,iFAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0DAA0D;IAC1D,WAAW,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAcD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,MAAM;AAChB,sEAAsE;AACtE,OAAO,UAAQ,GACb,OAAO,CAAC,gBAAgB,CAAC,CAiE3B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAe1F","sourcesContent":["/**\n * Purgar el libro sin que la purga parezca una manipulación.\n *\n * EL CALLEJÓN SIN SALIDA, medido antes de escribir nada. El artículo 5.1.e del\n * RGPD obliga a no conservar los datos más de lo necesario, así que un DPO\n * TIENE que poder borrar lo viejo. Pero hoy:\n *\n * · Si borra los ficheros de `sesion/`, el ancla del índice los sigue\n * esperando y `verificar` contesta\n * «FALTAN 1 fichero(s) con 3 entrada(s): alguien los ha borrado». Cumplir\n * la ley nos acusa de manipular.\n * · Si borra también el índice, el libro queda «íntegro» con menos entradas y\n * la purga desaparece sin rastro. Es indistinguible de un borrado hostil.\n *\n * Las dos salidas son malas, y el subcomando ni siquiera existe: `audit purge`,\n * `audit purgar`, `audit retencion` → «Subcomando desconocido». El único camino\n * era `rm`.\n *\n * LA IDEA: una purga no es una ausencia, es un HECHO. Y un hecho se anota.\n *\n * En vez de borrar y callar, se escribe una LÁPIDA en el libro —encadenada como\n * cualquier otra entrada— que dice qué periodo se purgó, cuántas entradas\n * había, bajo qué política, y el hash de cierre del tramo que se va. Con eso:\n *\n * · `verificar` distingue «esto se purgó el día D bajo la política P» de\n * «esto ha desaparecido», que es la diferencia entre cumplir y encubrir.\n * · El artículo 5.2 —responsabilidad proactiva: hay que poder DEMOSTRAR que\n * se cumple— queda cubierto por el propio mecanismo.\n * · Y quien reciba el libro años después puede reconstruir qué pasó con lo\n * que ya no está.\n *\n * LO QUE LA LÁPIDA NO ES. No es una prueba de que lo purgado fuera lo que dice\n * la lápida: quien controla el disco puede escribir la lápida que quiera. Es\n * una prueba de INTENCIÓN DECLARADA, y sirve para lo que sirve — que un borrado\n * legítimo no se confunda con uno hostil, y que uno hostil tenga que mentir por\n * escrito en vez de limitarse a borrar. Contra un adversario con acceso al\n * disco no hay defensa local; para eso hace falta un ancla externa.\n */\n\nimport { readFileSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { EntradaDelLibro, LibroDeSesion } from \"./libro.ts\";\nimport { DIR_INDICE, DIR_SESION } from \"./rutas.ts\";\n\n/** Lo que la lápida deja escrito. Todo es dato de forma, nunca contenido. */\nexport interface Lapida {\n\t/** Qué fichero de sesión se fue. */\n\tfichero: string;\n\t/** Cuántas entradas tenía, para que el hueco sea contable. */\n\tentradas: number;\n\t/** El sello de tiempo de la primera y la última, que delimitan el periodo. */\n\tdesde: string;\n\thasta: string;\n\t/** Hash del último eslabón del tramo purgado: ancla de lo que se fue. */\n\thashDeCierre: string;\n\t/** Bajo qué regla. Un texto libre que el DPO reconozca en su documentación. */\n\tpolitica: string;\n}\n\nexport interface ResultadoDePurga {\n\tpurgados: Lapida[];\n\t/** Los que se miraron y NO se purgaron, con su motivo. */\n\tconservados: Array<{ fichero: string; porque: string }>;\n}\n\n/** Un fichero del libro leído, o `null` si no se pudo. */\nfunction leerEntradas(ruta: string): EntradaDelLibro[] | null {\n\ttry {\n\t\treturn readFileSync(ruta, \"utf-8\")\n\t\t\t.split(\"\\n\")\n\t\t\t.filter(Boolean)\n\t\t\t.map((l) => JSON.parse(l) as EntradaDelLibro);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Purga los ficheros de sesión anteriores a `antesDe`, dejando una lápida.\n *\n * `antesDe` se compara contra el sello de la ÚLTIMA entrada del fichero: una\n * sesión que empezó en enero y terminó en marzo se conserva si el corte está en\n * febrero. Purgar por la fecha de inicio borraría actividad posterior al corte,\n * que es justo lo que no se puede hacer.\n *\n * No purga el fichero de la sesión EN CURSO aunque cumpla la fecha: quitarle el\n * suelo a un libro que se está escribiendo rompería su cadena en memoria.\n */\nexport async function purgarAntesDe(\n\tlibro: LibroDeSesion,\n\tagentDir: string,\n\tantesDe: Date,\n\tpolitica: string,\n\t/** Con `true` se decide igual pero no se escribe ni se borra nada. */\n\tsimular = false,\n): Promise<ResultadoDePurga> {\n\tconst purgados: Lapida[] = [];\n\tconst conservados: Array<{ fichero: string; porque: string }> = [];\n\n\tconst { readdirSync } = await import(\"node:fs\");\n\tlet nombres: string[];\n\ttry {\n\t\tnombres = readdirSync(join(agentDir, DIR_SESION)).filter((f) => f.endsWith(\".jsonl\"));\n\t} catch {\n\t\treturn { purgados, conservados };\n\t}\n\n\tfor (const nombre of nombres) {\n\t\t// Se pregunta DENTRO del bucle: la primera lápida es la que da nombre al\n\t\t// fichero de esta sesión, así que antes de escribirla el libro todavía no\n\t\t// tiene ninguno —y si no tiene, tampoco está en `nombres`—.\n\t\tif (nombre === libro.ficheroEnCurso) {\n\t\t\tconservados.push({ fichero: nombre, porque: \"es la sesión en curso\" });\n\t\t\tcontinue;\n\t\t}\n\t\tconst ruta = join(agentDir, DIR_SESION, nombre);\n\t\tconst entradas = leerEntradas(ruta);\n\t\t// No se borra lo que no se ha podido leer: sin saber qué había, la lápida\n\t\t// sería una declaración inventada, que es peor que no purgar.\n\t\tif (!entradas || entradas.length === 0) {\n\t\t\tconservados.push({\n\t\t\t\tfichero: nombre,\n\t\t\t\tporque: \"no se ha podido leer, y no se purga lo que no se puede describir\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst ultima = entradas[entradas.length - 1];\n\t\tif (new Date(ultima.ts) >= antesDe) {\n\t\t\tconservados.push({\n\t\t\t\tfichero: nombre,\n\t\t\t\tporque: `su última entrada (${ultima.ts.slice(0, 10)}) es posterior al corte`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst lapida: Lapida = {\n\t\t\tfichero: nombre,\n\t\t\tentradas: entradas.length,\n\t\t\tdesde: entradas[0].ts,\n\t\t\thasta: ultima.ts,\n\t\t\thashDeCierre: ultima.hash,\n\t\t\tpolitica,\n\t\t};\n\t\t// La lápida PRIMERO, el borrado después. Si el proceso muere en medio, el\n\t\t// libro tiene una lápida de más y el fichero todavía ahí — un estado\n\t\t// incómodo pero legible. Al revés quedaría un hueco sin explicación, que\n\t\t// es exactamente lo que este módulo existe para no producir.\n\t\t//\n\t\t// Con `simular` se decide EXACTAMENTE igual y no se toca nada: lo que se\n\t\t// enseña antes de un borrado irreversible tiene que salir del mismo camino\n\t\t// que lo ejecuta, o es una promesa sobre otro código.\n\t\tif (!simular) {\n\t\t\tawait libro.anotar({ tipo: \"purga\", ...lapida } as never);\n\t\t\trmSync(ruta, { force: true });\n\t\t\trmSync(join(agentDir, DIR_INDICE, nombre), { force: true });\n\t\t}\n\t\tpurgados.push(lapida);\n\t}\n\n\treturn { purgados, conservados };\n}\n\n/**\n * Los ficheros que una lápida declara purgados, leídos del propio libro.\n *\n * `verificar` lo usa para distinguir un hueco explicado de uno que no lo está.\n */\nexport function ficherosPurgados(entradas: readonly EntradaDelLibro[]): Map<string, Lapida> {\n\tconst mapa = new Map<string, Lapida>();\n\tfor (const e of entradas) {\n\t\tconst s = e.suceso as Record<string, unknown>;\n\t\tif (s.tipo !== \"purga\" || typeof s.fichero !== \"string\") continue;\n\t\tmapa.set(s.fichero, {\n\t\t\tfichero: s.fichero,\n\t\t\tentradas: Number(s.entradas ?? 0),\n\t\t\tdesde: String(s.desde ?? \"\"),\n\t\t\thasta: String(s.hasta ?? \"\"),\n\t\t\thashDeCierre: String(s.hashDeCierre ?? \"\"),\n\t\t\tpolitica: String(s.politica ?? \"\"),\n\t\t});\n\t}\n\treturn mapa;\n}\n"]}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Purgar el libro sin que la purga parezca una manipulación.
|
|
3
|
+
*
|
|
4
|
+
* EL CALLEJÓN SIN SALIDA, medido antes de escribir nada. El artículo 5.1.e del
|
|
5
|
+
* RGPD obliga a no conservar los datos más de lo necesario, así que un DPO
|
|
6
|
+
* TIENE que poder borrar lo viejo. Pero hoy:
|
|
7
|
+
*
|
|
8
|
+
* · Si borra los ficheros de `sesion/`, el ancla del índice los sigue
|
|
9
|
+
* esperando y `verificar` contesta
|
|
10
|
+
* «FALTAN 1 fichero(s) con 3 entrada(s): alguien los ha borrado». Cumplir
|
|
11
|
+
* la ley nos acusa de manipular.
|
|
12
|
+
* · Si borra también el índice, el libro queda «íntegro» con menos entradas y
|
|
13
|
+
* la purga desaparece sin rastro. Es indistinguible de un borrado hostil.
|
|
14
|
+
*
|
|
15
|
+
* Las dos salidas son malas, y el subcomando ni siquiera existe: `audit purge`,
|
|
16
|
+
* `audit purgar`, `audit retencion` → «Subcomando desconocido». El único camino
|
|
17
|
+
* era `rm`.
|
|
18
|
+
*
|
|
19
|
+
* LA IDEA: una purga no es una ausencia, es un HECHO. Y un hecho se anota.
|
|
20
|
+
*
|
|
21
|
+
* En vez de borrar y callar, se escribe una LÁPIDA en el libro —encadenada como
|
|
22
|
+
* cualquier otra entrada— que dice qué periodo se purgó, cuántas entradas
|
|
23
|
+
* había, bajo qué política, y el hash de cierre del tramo que se va. Con eso:
|
|
24
|
+
*
|
|
25
|
+
* · `verificar` distingue «esto se purgó el día D bajo la política P» de
|
|
26
|
+
* «esto ha desaparecido», que es la diferencia entre cumplir y encubrir.
|
|
27
|
+
* · El artículo 5.2 —responsabilidad proactiva: hay que poder DEMOSTRAR que
|
|
28
|
+
* se cumple— queda cubierto por el propio mecanismo.
|
|
29
|
+
* · Y quien reciba el libro años después puede reconstruir qué pasó con lo
|
|
30
|
+
* que ya no está.
|
|
31
|
+
*
|
|
32
|
+
* LO QUE LA LÁPIDA NO ES. No es una prueba de que lo purgado fuera lo que dice
|
|
33
|
+
* la lápida: quien controla el disco puede escribir la lápida que quiera. Es
|
|
34
|
+
* una prueba de INTENCIÓN DECLARADA, y sirve para lo que sirve — que un borrado
|
|
35
|
+
* legítimo no se confunda con uno hostil, y que uno hostil tenga que mentir por
|
|
36
|
+
* escrito en vez de limitarse a borrar. Contra un adversario con acceso al
|
|
37
|
+
* disco no hay defensa local; para eso hace falta un ancla externa.
|
|
38
|
+
*/
|
|
39
|
+
import { readFileSync, rmSync } from "node:fs";
|
|
40
|
+
import { join } from "node:path";
|
|
41
|
+
import { DIR_INDICE, DIR_SESION } from "./rutas.js";
|
|
42
|
+
/** Un fichero del libro leído, o `null` si no se pudo. */
|
|
43
|
+
function leerEntradas(ruta) {
|
|
44
|
+
try {
|
|
45
|
+
return readFileSync(ruta, "utf-8")
|
|
46
|
+
.split("\n")
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.map((l) => JSON.parse(l));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Purga los ficheros de sesión anteriores a `antesDe`, dejando una lápida.
|
|
56
|
+
*
|
|
57
|
+
* `antesDe` se compara contra el sello de la ÚLTIMA entrada del fichero: una
|
|
58
|
+
* sesión que empezó en enero y terminó en marzo se conserva si el corte está en
|
|
59
|
+
* febrero. Purgar por la fecha de inicio borraría actividad posterior al corte,
|
|
60
|
+
* que es justo lo que no se puede hacer.
|
|
61
|
+
*
|
|
62
|
+
* No purga el fichero de la sesión EN CURSO aunque cumpla la fecha: quitarle el
|
|
63
|
+
* suelo a un libro que se está escribiendo rompería su cadena en memoria.
|
|
64
|
+
*/
|
|
65
|
+
export async function purgarAntesDe(libro, agentDir, antesDe, politica,
|
|
66
|
+
/** Con `true` se decide igual pero no se escribe ni se borra nada. */
|
|
67
|
+
simular = false) {
|
|
68
|
+
const purgados = [];
|
|
69
|
+
const conservados = [];
|
|
70
|
+
const { readdirSync } = await import("node:fs");
|
|
71
|
+
let nombres;
|
|
72
|
+
try {
|
|
73
|
+
nombres = readdirSync(join(agentDir, DIR_SESION)).filter((f) => f.endsWith(".jsonl"));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return { purgados, conservados };
|
|
77
|
+
}
|
|
78
|
+
for (const nombre of nombres) {
|
|
79
|
+
// Se pregunta DENTRO del bucle: la primera lápida es la que da nombre al
|
|
80
|
+
// fichero de esta sesión, así que antes de escribirla el libro todavía no
|
|
81
|
+
// tiene ninguno —y si no tiene, tampoco está en `nombres`—.
|
|
82
|
+
if (nombre === libro.ficheroEnCurso) {
|
|
83
|
+
conservados.push({ fichero: nombre, porque: "es la sesión en curso" });
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const ruta = join(agentDir, DIR_SESION, nombre);
|
|
87
|
+
const entradas = leerEntradas(ruta);
|
|
88
|
+
// No se borra lo que no se ha podido leer: sin saber qué había, la lápida
|
|
89
|
+
// sería una declaración inventada, que es peor que no purgar.
|
|
90
|
+
if (!entradas || entradas.length === 0) {
|
|
91
|
+
conservados.push({
|
|
92
|
+
fichero: nombre,
|
|
93
|
+
porque: "no se ha podido leer, y no se purga lo que no se puede describir",
|
|
94
|
+
});
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const ultima = entradas[entradas.length - 1];
|
|
98
|
+
if (new Date(ultima.ts) >= antesDe) {
|
|
99
|
+
conservados.push({
|
|
100
|
+
fichero: nombre,
|
|
101
|
+
porque: `su última entrada (${ultima.ts.slice(0, 10)}) es posterior al corte`,
|
|
102
|
+
});
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const lapida = {
|
|
106
|
+
fichero: nombre,
|
|
107
|
+
entradas: entradas.length,
|
|
108
|
+
desde: entradas[0].ts,
|
|
109
|
+
hasta: ultima.ts,
|
|
110
|
+
hashDeCierre: ultima.hash,
|
|
111
|
+
politica,
|
|
112
|
+
};
|
|
113
|
+
// La lápida PRIMERO, el borrado después. Si el proceso muere en medio, el
|
|
114
|
+
// libro tiene una lápida de más y el fichero todavía ahí — un estado
|
|
115
|
+
// incómodo pero legible. Al revés quedaría un hueco sin explicación, que
|
|
116
|
+
// es exactamente lo que este módulo existe para no producir.
|
|
117
|
+
//
|
|
118
|
+
// Con `simular` se decide EXACTAMENTE igual y no se toca nada: lo que se
|
|
119
|
+
// enseña antes de un borrado irreversible tiene que salir del mismo camino
|
|
120
|
+
// que lo ejecuta, o es una promesa sobre otro código.
|
|
121
|
+
if (!simular) {
|
|
122
|
+
await libro.anotar({ tipo: "purga", ...lapida });
|
|
123
|
+
rmSync(ruta, { force: true });
|
|
124
|
+
rmSync(join(agentDir, DIR_INDICE, nombre), { force: true });
|
|
125
|
+
}
|
|
126
|
+
purgados.push(lapida);
|
|
127
|
+
}
|
|
128
|
+
return { purgados, conservados };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Los ficheros que una lápida declara purgados, leídos del propio libro.
|
|
132
|
+
*
|
|
133
|
+
* `verificar` lo usa para distinguir un hueco explicado de uno que no lo está.
|
|
134
|
+
*/
|
|
135
|
+
export function ficherosPurgados(entradas) {
|
|
136
|
+
const mapa = new Map();
|
|
137
|
+
for (const e of entradas) {
|
|
138
|
+
const s = e.suceso;
|
|
139
|
+
if (s.tipo !== "purga" || typeof s.fichero !== "string")
|
|
140
|
+
continue;
|
|
141
|
+
mapa.set(s.fichero, {
|
|
142
|
+
fichero: s.fichero,
|
|
143
|
+
entradas: Number(s.entradas ?? 0),
|
|
144
|
+
desde: String(s.desde ?? ""),
|
|
145
|
+
hasta: String(s.hasta ?? ""),
|
|
146
|
+
hashDeCierre: String(s.hashDeCierre ?? ""),
|
|
147
|
+
politica: String(s.politica ?? ""),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return mapa;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=retencion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retencion.js","sourceRoot":"","sources":["../../../src/core/audit/retencion.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Purgar el libro sin que la purga parezca una manipulación.\n *\n * EL CALLEJÓN SIN SALIDA, medido antes de escribir nada. El artículo 5.1.e del\n * RGPD obliga a no conservar los datos más de lo necesario, así que un DPO\n * TIENE que poder borrar lo viejo. Pero hoy:\n *\n * · Si borra los ficheros de `sesion/`, el ancla del índice los sigue\n * esperando y `verificar` contesta\n * «FALTAN 1 fichero(s) con 3 entrada(s): alguien los ha borrado». Cumplir\n * la ley nos acusa de manipular.\n * · Si borra también el índice, el libro queda «íntegro» con menos entradas y\n * la purga desaparece sin rastro. Es indistinguible de un borrado hostil.\n *\n * Las dos salidas son malas, y el subcomando ni siquiera existe: `audit purge`,\n * `audit purgar`, `audit retencion` → «Subcomando desconocido». El único camino\n * era `rm`.\n *\n * LA IDEA: una purga no es una ausencia, es un HECHO. Y un hecho se anota.\n *\n * En vez de borrar y callar, se escribe una LÁPIDA en el libro —encadenada como\n * cualquier otra entrada— que dice qué periodo se purgó, cuántas entradas\n * había, bajo qué política, y el hash de cierre del tramo que se va. Con eso:\n *\n * · `verificar` distingue «esto se purgó el día D bajo la política P» de\n * «esto ha desaparecido», que es la diferencia entre cumplir y encubrir.\n * · El artículo 5.2 —responsabilidad proactiva: hay que poder DEMOSTRAR que\n * se cumple— queda cubierto por el propio mecanismo.\n * · Y quien reciba el libro años después puede reconstruir qué pasó con lo\n * que ya no está.\n *\n * LO QUE LA LÁPIDA NO ES. No es una prueba de que lo purgado fuera lo que dice\n * la lápida: quien controla el disco puede escribir la lápida que quiera. Es\n * una prueba de INTENCIÓN DECLARADA, y sirve para lo que sirve — que un borrado\n * legítimo no se confunda con uno hostil, y que uno hostil tenga que mentir por\n * escrito en vez de limitarse a borrar. Contra un adversario con acceso al\n * disco no hay defensa local; para eso hace falta un ancla externa.\n */\n\nimport { readFileSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { EntradaDelLibro, LibroDeSesion } from \"./libro.ts\";\nimport { DIR_INDICE, DIR_SESION } from \"./rutas.ts\";\n\n/** Lo que la lápida deja escrito. Todo es dato de forma, nunca contenido. */\nexport interface Lapida {\n\t/** Qué fichero de sesión se fue. */\n\tfichero: string;\n\t/** Cuántas entradas tenía, para que el hueco sea contable. */\n\tentradas: number;\n\t/** El sello de tiempo de la primera y la última, que delimitan el periodo. */\n\tdesde: string;\n\thasta: string;\n\t/** Hash del último eslabón del tramo purgado: ancla de lo que se fue. */\n\thashDeCierre: string;\n\t/** Bajo qué regla. Un texto libre que el DPO reconozca en su documentación. */\n\tpolitica: string;\n}\n\nexport interface ResultadoDePurga {\n\tpurgados: Lapida[];\n\t/** Los que se miraron y NO se purgaron, con su motivo. */\n\tconservados: Array<{ fichero: string; porque: string }>;\n}\n\n/** Un fichero del libro leído, o `null` si no se pudo. */\nfunction leerEntradas(ruta: string): EntradaDelLibro[] | null {\n\ttry {\n\t\treturn readFileSync(ruta, \"utf-8\")\n\t\t\t.split(\"\\n\")\n\t\t\t.filter(Boolean)\n\t\t\t.map((l) => JSON.parse(l) as EntradaDelLibro);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Purga los ficheros de sesión anteriores a `antesDe`, dejando una lápida.\n *\n * `antesDe` se compara contra el sello de la ÚLTIMA entrada del fichero: una\n * sesión que empezó en enero y terminó en marzo se conserva si el corte está en\n * febrero. Purgar por la fecha de inicio borraría actividad posterior al corte,\n * que es justo lo que no se puede hacer.\n *\n * No purga el fichero de la sesión EN CURSO aunque cumpla la fecha: quitarle el\n * suelo a un libro que se está escribiendo rompería su cadena en memoria.\n */\nexport async function purgarAntesDe(\n\tlibro: LibroDeSesion,\n\tagentDir: string,\n\tantesDe: Date,\n\tpolitica: string,\n\t/** Con `true` se decide igual pero no se escribe ni se borra nada. */\n\tsimular = false,\n): Promise<ResultadoDePurga> {\n\tconst purgados: Lapida[] = [];\n\tconst conservados: Array<{ fichero: string; porque: string }> = [];\n\n\tconst { readdirSync } = await import(\"node:fs\");\n\tlet nombres: string[];\n\ttry {\n\t\tnombres = readdirSync(join(agentDir, DIR_SESION)).filter((f) => f.endsWith(\".jsonl\"));\n\t} catch {\n\t\treturn { purgados, conservados };\n\t}\n\n\tfor (const nombre of nombres) {\n\t\t// Se pregunta DENTRO del bucle: la primera lápida es la que da nombre al\n\t\t// fichero de esta sesión, así que antes de escribirla el libro todavía no\n\t\t// tiene ninguno —y si no tiene, tampoco está en `nombres`—.\n\t\tif (nombre === libro.ficheroEnCurso) {\n\t\t\tconservados.push({ fichero: nombre, porque: \"es la sesión en curso\" });\n\t\t\tcontinue;\n\t\t}\n\t\tconst ruta = join(agentDir, DIR_SESION, nombre);\n\t\tconst entradas = leerEntradas(ruta);\n\t\t// No se borra lo que no se ha podido leer: sin saber qué había, la lápida\n\t\t// sería una declaración inventada, que es peor que no purgar.\n\t\tif (!entradas || entradas.length === 0) {\n\t\t\tconservados.push({\n\t\t\t\tfichero: nombre,\n\t\t\t\tporque: \"no se ha podido leer, y no se purga lo que no se puede describir\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst ultima = entradas[entradas.length - 1];\n\t\tif (new Date(ultima.ts) >= antesDe) {\n\t\t\tconservados.push({\n\t\t\t\tfichero: nombre,\n\t\t\t\tporque: `su última entrada (${ultima.ts.slice(0, 10)}) es posterior al corte`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst lapida: Lapida = {\n\t\t\tfichero: nombre,\n\t\t\tentradas: entradas.length,\n\t\t\tdesde: entradas[0].ts,\n\t\t\thasta: ultima.ts,\n\t\t\thashDeCierre: ultima.hash,\n\t\t\tpolitica,\n\t\t};\n\t\t// La lápida PRIMERO, el borrado después. Si el proceso muere en medio, el\n\t\t// libro tiene una lápida de más y el fichero todavía ahí — un estado\n\t\t// incómodo pero legible. Al revés quedaría un hueco sin explicación, que\n\t\t// es exactamente lo que este módulo existe para no producir.\n\t\t//\n\t\t// Con `simular` se decide EXACTAMENTE igual y no se toca nada: lo que se\n\t\t// enseña antes de un borrado irreversible tiene que salir del mismo camino\n\t\t// que lo ejecuta, o es una promesa sobre otro código.\n\t\tif (!simular) {\n\t\t\tawait libro.anotar({ tipo: \"purga\", ...lapida } as never);\n\t\t\trmSync(ruta, { force: true });\n\t\t\trmSync(join(agentDir, DIR_INDICE, nombre), { force: true });\n\t\t}\n\t\tpurgados.push(lapida);\n\t}\n\n\treturn { purgados, conservados };\n}\n\n/**\n * Los ficheros que una lápida declara purgados, leídos del propio libro.\n *\n * `verificar` lo usa para distinguir un hueco explicado de uno que no lo está.\n */\nexport function ficherosPurgados(entradas: readonly EntradaDelLibro[]): Map<string, Lapida> {\n\tconst mapa = new Map<string, Lapida>();\n\tfor (const e of entradas) {\n\t\tconst s = e.suceso as Record<string, unknown>;\n\t\tif (s.tipo !== \"purga\" || typeof s.fichero !== \"string\") continue;\n\t\tmapa.set(s.fichero, {\n\t\t\tfichero: s.fichero,\n\t\t\tentradas: Number(s.entradas ?? 0),\n\t\t\tdesde: String(s.desde ?? \"\"),\n\t\t\thasta: String(s.hasta ?? \"\"),\n\t\t\thashDeCierre: String(s.hashDeCierre ?? \"\"),\n\t\t\tpolitica: String(s.politica ?? \"\"),\n\t\t});\n\t}\n\treturn mapa;\n}\n"]}
|