@hoilab/ada-cli 0.84.22 → 0.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -2
- package/README.es.md +17 -6
- package/README.md +109 -11
- package/dist/ada-publico.d.ts +35 -0
- package/dist/ada-publico.d.ts.map +1 -0
- package/dist/ada-publico.js +40 -0
- package/dist/ada-publico.js.map +1 -0
- package/dist/cli/audit-command.d.ts +15 -0
- package/dist/cli/audit-command.d.ts.map +1 -0
- package/dist/cli/audit-command.js +280 -0
- package/dist/cli/audit-command.js.map +1 -0
- package/dist/cli/banco-command.d.ts +15 -0
- package/dist/cli/banco-command.d.ts.map +1 -0
- package/dist/cli/banco-command.js +213 -0
- package/dist/cli/banco-command.js.map +1 -0
- package/dist/cli/cleanse-command.d.ts +11 -0
- package/dist/cli/cleanse-command.d.ts.map +1 -0
- package/dist/cli/cleanse-command.js +101 -0
- package/dist/cli/cleanse-command.js.map +1 -0
- package/dist/cli/commit-command.d.ts +31 -0
- package/dist/cli/commit-command.d.ts.map +1 -0
- package/dist/cli/commit-command.js +158 -0
- package/dist/cli/commit-command.js.map +1 -0
- package/dist/cli/computer-command.d.ts +12 -0
- package/dist/cli/computer-command.d.ts.map +1 -0
- package/dist/cli/computer-command.js +141 -0
- package/dist/cli/computer-command.js.map +1 -0
- package/dist/cli/discover-command.d.ts +18 -0
- package/dist/cli/discover-command.d.ts.map +1 -0
- package/dist/cli/discover-command.js +108 -0
- package/dist/cli/discover-command.js.map +1 -0
- package/dist/cli/hashline-command.d.ts +11 -0
- package/dist/cli/hashline-command.d.ts.map +1 -0
- package/dist/cli/hashline-command.js +106 -0
- package/dist/cli/hashline-command.js.map +1 -0
- package/dist/cli/import-command.d.ts +35 -0
- package/dist/cli/import-command.d.ts.map +1 -0
- package/dist/cli/import-command.js +164 -0
- package/dist/cli/import-command.js.map +1 -0
- package/dist/cli/politica-command.d.ts +20 -0
- package/dist/cli/politica-command.d.ts.map +1 -0
- package/dist/cli/politica-command.js +93 -0
- package/dist/cli/politica-command.js.map +1 -0
- package/dist/cli/refine-command.d.ts +18 -0
- package/dist/cli/refine-command.d.ts.map +1 -0
- package/dist/cli/refine-command.js +101 -0
- package/dist/cli/refine-command.js.map +1 -0
- package/dist/cli/review-command.d.ts +24 -0
- package/dist/cli/review-command.d.ts.map +1 -0
- package/dist/cli/review-command.js +168 -0
- package/dist/cli/review-command.js.map +1 -0
- package/dist/cli/schedule-command.d.ts +17 -0
- package/dist/cli/schedule-command.d.ts.map +1 -0
- package/dist/cli/schedule-command.js +117 -0
- package/dist/cli/schedule-command.js.map +1 -0
- package/dist/cli/serve-command.d.ts +72 -0
- package/dist/cli/serve-command.d.ts.map +1 -0
- package/dist/cli/serve-command.js +568 -0
- package/dist/cli/serve-command.js.map +1 -0
- package/dist/cli/telegram-command.d.ts +18 -0
- package/dist/cli/telegram-command.d.ts.map +1 -0
- package/dist/cli/telegram-command.js +137 -0
- package/dist/cli/telegram-command.js.map +1 -0
- package/dist/cli/telemetria-command.d.ts +22 -0
- package/dist/cli/telemetria-command.d.ts.map +1 -0
- package/dist/cli/telemetria-command.js +127 -0
- package/dist/cli/telemetria-command.js.map +1 -0
- package/dist/cli/undo-command.d.ts +9 -0
- package/dist/cli/undo-command.d.ts.map +1 -0
- package/dist/cli/undo-command.js +56 -0
- package/dist/cli/undo-command.js.map +1 -0
- package/dist/cli/usage-command.d.ts +10 -0
- package/dist/cli/usage-command.d.ts.map +1 -0
- package/dist/cli/usage-command.js +209 -0
- package/dist/cli/usage-command.js.map +1 -0
- package/dist/cli/wiki-command.d.ts +9 -0
- package/dist/cli/wiki-command.d.ts.map +1 -0
- package/dist/cli/wiki-command.js +76 -0
- package/dist/cli/wiki-command.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -11
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/ada.d.ts +58 -0
- package/dist/core/ada.d.ts.map +1 -0
- package/dist/core/ada.js +61 -0
- package/dist/core/ada.js.map +1 -0
- package/dist/core/advisor/guarda.d.ts +66 -0
- package/dist/core/advisor/guarda.d.ts.map +1 -0
- package/dist/core/advisor/guarda.js +191 -0
- package/dist/core/advisor/guarda.js.map +1 -0
- package/dist/core/advisor/runtime.d.ts +66 -0
- package/dist/core/advisor/runtime.d.ts.map +1 -0
- package/dist/core/advisor/runtime.js +121 -0
- package/dist/core/advisor/runtime.js.map +1 -0
- package/dist/core/advisor/sesion.d.ts +109 -0
- package/dist/core/advisor/sesion.d.ts.map +1 -0
- package/dist/core/advisor/sesion.js +139 -0
- package/dist/core/advisor/sesion.js.map +1 -0
- package/dist/core/agent-session.d.ts +30 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +430 -22
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents/loader.d.ts +77 -0
- package/dist/core/agents/loader.d.ts.map +1 -0
- package/dist/core/agents/loader.js +154 -0
- package/dist/core/agents/loader.js.map +1 -0
- package/dist/core/aprobacion/generados.d.ts +37 -0
- package/dist/core/aprobacion/generados.d.ts.map +1 -0
- package/dist/core/aprobacion/generados.js +85 -0
- package/dist/core/aprobacion/generados.js.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.js +212 -0
- package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
- package/dist/core/aprobacion/politica.d.ts +90 -0
- package/dist/core/aprobacion/politica.d.ts.map +1 -0
- package/dist/core/aprobacion/politica.js +375 -0
- package/dist/core/aprobacion/politica.js.map +1 -0
- package/dist/core/arranque/atajos.d.ts +46 -0
- package/dist/core/arranque/atajos.d.ts.map +1 -0
- package/dist/core/arranque/atajos.js +113 -0
- package/dist/core/arranque/atajos.js.map +1 -0
- package/dist/core/audit/exportacion.d.ts +54 -0
- package/dist/core/audit/exportacion.d.ts.map +1 -0
- package/dist/core/audit/exportacion.js +265 -0
- package/dist/core/audit/exportacion.js.map +1 -0
- package/dist/core/audit/libro.d.ts +318 -0
- package/dist/core/audit/libro.d.ts.map +1 -0
- package/dist/core/audit/libro.js +508 -0
- package/dist/core/audit/libro.js.map +1 -0
- package/dist/core/audit/registro-sesion.d.ts +78 -0
- package/dist/core/audit/registro-sesion.d.ts.map +1 -0
- package/dist/core/audit/registro-sesion.js +202 -0
- package/dist/core/audit/registro-sesion.js.map +1 -0
- package/dist/core/audit/retencion.d.ts +82 -0
- package/dist/core/audit/retencion.d.ts.map +1 -0
- package/dist/core/audit/retencion.js +152 -0
- package/dist/core/audit/retencion.js.map +1 -0
- package/dist/core/audit/rutas.d.ts +23 -0
- package/dist/core/audit/rutas.d.ts.map +1 -0
- package/dist/core/audit/rutas.js +23 -0
- package/dist/core/audit/rutas.js.map +1 -0
- package/dist/core/auth-storage.d.ts +0 -3
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +17 -5
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/banco/almacenamiento.d.ts +18 -0
- package/dist/core/banco/almacenamiento.d.ts.map +1 -0
- package/dist/core/banco/almacenamiento.js +50 -0
- package/dist/core/banco/almacenamiento.js.map +1 -0
- package/dist/core/banco/analisis.d.ts +37 -0
- package/dist/core/banco/analisis.d.ts.map +1 -0
- package/dist/core/banco/analisis.js +164 -0
- package/dist/core/banco/analisis.js.map +1 -0
- package/dist/core/banco/bloques.d.ts +39 -0
- package/dist/core/banco/bloques.d.ts.map +1 -0
- package/dist/core/banco/bloques.js +84 -0
- package/dist/core/banco/bloques.js.map +1 -0
- package/dist/core/banco/cargas.d.ts +84 -0
- package/dist/core/banco/cargas.d.ts.map +1 -0
- package/dist/core/banco/cargas.js +520 -0
- package/dist/core/banco/cargas.js.map +1 -0
- package/dist/core/banco/comparar.d.ts +29 -0
- package/dist/core/banco/comparar.d.ts.map +1 -0
- package/dist/core/banco/comparar.js +28 -0
- package/dist/core/banco/comparar.js.map +1 -0
- package/dist/core/banco/ejecutar.d.ts +44 -0
- package/dist/core/banco/ejecutar.d.ts.map +1 -0
- package/dist/core/banco/ejecutar.js +183 -0
- package/dist/core/banco/ejecutar.js.map +1 -0
- package/dist/core/banco/generar.d.ts +24 -0
- package/dist/core/banco/generar.d.ts.map +1 -0
- package/dist/core/banco/generar.js +159 -0
- package/dist/core/banco/generar.js.map +1 -0
- package/dist/core/banco/mutaciones.d.ts +25 -0
- package/dist/core/banco/mutaciones.d.ts.map +1 -0
- package/dist/core/banco/mutaciones.js +215 -0
- package/dist/core/banco/mutaciones.js.map +1 -0
- package/dist/core/banco/tipos.d.ts +121 -0
- package/dist/core/banco/tipos.d.ts.map +1 -0
- package/dist/core/banco/tipos.js +16 -0
- package/dist/core/banco/tipos.js.map +1 -0
- package/dist/core/blobs/almacen.d.ts +81 -0
- package/dist/core/blobs/almacen.d.ts.map +1 -0
- package/dist/core/blobs/almacen.js +198 -0
- package/dist/core/blobs/almacen.js.map +1 -0
- package/dist/core/blobs/broker.d.ts +103 -0
- package/dist/core/blobs/broker.d.ts.map +1 -0
- package/dist/core/blobs/broker.js +204 -0
- package/dist/core/blobs/broker.js.map +1 -0
- package/dist/core/blobs/index.d.ts +70 -0
- package/dist/core/blobs/index.d.ts.map +1 -0
- package/dist/core/blobs/index.js +232 -0
- package/dist/core/blobs/index.js.map +1 -0
- package/dist/core/blobs/payload.d.ts +55 -0
- package/dist/core/blobs/payload.d.ts.map +1 -0
- package/dist/core/blobs/payload.js +255 -0
- package/dist/core/blobs/payload.js.map +1 -0
- package/dist/core/blobs/proveedor.d.ts +85 -0
- package/dist/core/blobs/proveedor.d.ts.map +1 -0
- package/dist/core/blobs/proveedor.js +196 -0
- package/dist/core/blobs/proveedor.js.map +1 -0
- package/dist/core/browser/cdp.d.ts +41 -0
- package/dist/core/browser/cdp.d.ts.map +1 -0
- package/dist/core/browser/cdp.js +119 -0
- package/dist/core/browser/cdp.js.map +1 -0
- package/dist/core/browser/politica.d.ts +51 -0
- package/dist/core/browser/politica.d.ts.map +1 -0
- package/dist/core/browser/politica.js +123 -0
- package/dist/core/browser/politica.js.map +1 -0
- package/dist/core/browser/sesion.d.ts +52 -0
- package/dist/core/browser/sesion.d.ts.map +1 -0
- package/dist/core/browser/sesion.js +176 -0
- package/dist/core/browser/sesion.js.map +1 -0
- package/dist/core/browser/tools.d.ts +16 -0
- package/dist/core/browser/tools.d.ts.map +1 -0
- package/dist/core/browser/tools.js +279 -0
- package/dist/core/browser/tools.js.map +1 -0
- package/dist/core/commit/diff.d.ts +56 -0
- package/dist/core/commit/diff.d.ts.map +1 -0
- package/dist/core/commit/diff.js +145 -0
- package/dist/core/commit/diff.js.map +1 -0
- package/dist/core/commit/mensaje.d.ts +80 -0
- package/dist/core/commit/mensaje.d.ts.map +1 -0
- package/dist/core/commit/mensaje.js +207 -0
- package/dist/core/commit/mensaje.js.map +1 -0
- package/dist/core/compactar/index.d.ts +52 -0
- package/dist/core/compactar/index.d.ts.map +1 -0
- package/dist/core/compactar/index.js +91 -0
- package/dist/core/compactar/index.js.map +1 -0
- package/dist/core/compactar/registro-denso.d.ts +160 -0
- package/dist/core/compactar/registro-denso.d.ts.map +1 -0
- package/dist/core/compactar/registro-denso.js +620 -0
- package/dist/core/compactar/registro-denso.js.map +1 -0
- package/dist/core/computer/captura.d.ts +35 -0
- package/dist/core/computer/captura.d.ts.map +1 -0
- package/dist/core/computer/captura.js +140 -0
- package/dist/core/computer/captura.js.map +1 -0
- package/dist/core/computer/driver.d.ts +130 -0
- package/dist/core/computer/driver.d.ts.map +1 -0
- package/dist/core/computer/driver.js +206 -0
- package/dist/core/computer/driver.js.map +1 -0
- package/dist/core/computer/motor/actions.d.ts +109 -0
- package/dist/core/computer/motor/actions.d.ts.map +1 -0
- package/dist/core/computer/motor/actions.js +157 -0
- package/dist/core/computer/motor/actions.js.map +1 -0
- package/dist/core/computer/motor/bridge.d.ts +232 -0
- package/dist/core/computer/motor/bridge.d.ts.map +1 -0
- package/dist/core/computer/motor/bridge.js +2335 -0
- package/dist/core/computer/motor/bridge.js.map +1 -0
- package/dist/core/computer/motor/cdp.d.ts +107 -0
- package/dist/core/computer/motor/cdp.d.ts.map +1 -0
- package/dist/core/computer/motor/cdp.js +659 -0
- package/dist/core/computer/motor/cdp.js.map +1 -0
- package/dist/core/computer/motor/config.d.ts +23 -0
- package/dist/core/computer/motor/config.d.ts.map +1 -0
- package/dist/core/computer/motor/config.js +100 -0
- package/dist/core/computer/motor/config.js.map +1 -0
- package/dist/core/computer/motor/contract.d.ts +81 -0
- package/dist/core/computer/motor/contract.d.ts.map +1 -0
- package/dist/core/computer/motor/contract.js +14 -0
- package/dist/core/computer/motor/contract.js.map +1 -0
- package/dist/core/computer/motor/note.d.ts +37 -0
- package/dist/core/computer/motor/note.d.ts.map +1 -0
- package/dist/core/computer/motor/note.js +162 -0
- package/dist/core/computer/motor/note.js.map +1 -0
- package/dist/core/computer/motor/outline.d.ts +155 -0
- package/dist/core/computer/motor/outline.d.ts.map +1 -0
- package/dist/core/computer/motor/outline.js +590 -0
- package/dist/core/computer/motor/outline.js.map +1 -0
- package/dist/core/computer/motor/output.d.ts +18 -0
- package/dist/core/computer/motor/output.d.ts.map +1 -0
- package/dist/core/computer/motor/output.js +148 -0
- package/dist/core/computer/motor/output.js.map +1 -0
- package/dist/core/computer/motor/permissions.d.ts +41 -0
- package/dist/core/computer/motor/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/permissions.js +51 -0
- package/dist/core/computer/motor/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
- package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/architecture.js +21 -0
- package/dist/core/computer/motor/platform/architecture.js.map +1 -0
- package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
- package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/coerce.js +17 -0
- package/dist/core/computer/motor/platform/coerce.js.map +1 -0
- package/dist/core/computer/motor/platform/index.d.ts +4 -0
- package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/index.js +79 -0
- package/dist/core/computer/motor/platform/index.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.js +173 -0
- package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.js +261 -0
- package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.js +124 -0
- package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.js +101 -0
- package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper.js +277 -0
- package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
- package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/types.d.ts +263 -0
- package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/types.js +2 -0
- package/dist/core/computer/motor/platform/types.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.js +163 -0
- package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.js +174 -0
- package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
- package/dist/core/computer/motor/root-selection.d.ts +6 -0
- package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
- package/dist/core/computer/motor/root-selection.js +28 -0
- package/dist/core/computer/motor/root-selection.js.map +1 -0
- package/dist/core/computer/motor/runtime.d.ts +50 -0
- package/dist/core/computer/motor/runtime.d.ts.map +1 -0
- package/dist/core/computer/motor/runtime.js +119 -0
- package/dist/core/computer/motor/runtime.js.map +1 -0
- package/dist/core/computer/motor/state.d.ts +68 -0
- package/dist/core/computer/motor/state.d.ts.map +1 -0
- package/dist/core/computer/motor/state.js +100 -0
- package/dist/core/computer/motor/state.js.map +1 -0
- package/dist/core/computer/motor/view.d.ts +6 -0
- package/dist/core/computer/motor/view.d.ts.map +1 -0
- package/dist/core/computer/motor/view.js +185 -0
- package/dist/core/computer/motor/view.js.map +1 -0
- package/dist/core/computer/motor-ada.d.ts +159 -0
- package/dist/core/computer/motor-ada.d.ts.map +1 -0
- package/dist/core/computer/motor-ada.js +412 -0
- package/dist/core/computer/motor-ada.js.map +1 -0
- package/dist/core/computer/politica.d.ts +56 -0
- package/dist/core/computer/politica.d.ts.map +1 -0
- package/dist/core/computer/politica.js +163 -0
- package/dist/core/computer/politica.js.map +1 -0
- package/dist/core/computer/tools.d.ts +26 -0
- package/dist/core/computer/tools.d.ts.map +1 -0
- package/dist/core/computer/tools.js +399 -0
- package/dist/core/computer/tools.js.map +1 -0
- package/dist/core/context-breakdown.d.ts +80 -0
- package/dist/core/context-breakdown.d.ts.map +1 -0
- package/dist/core/context-breakdown.js +87 -0
- package/dist/core/context-breakdown.js.map +1 -0
- package/dist/core/credenciales/cliente.d.ts +60 -0
- package/dist/core/credenciales/cliente.d.ts.map +1 -0
- package/dist/core/credenciales/cliente.js +81 -0
- package/dist/core/credenciales/cliente.js.map +1 -0
- package/dist/core/credenciales/pool.d.ts +96 -0
- package/dist/core/credenciales/pool.d.ts.map +1 -0
- package/dist/core/credenciales/pool.js +128 -0
- package/dist/core/credenciales/pool.js.map +1 -0
- package/dist/core/credenciales/reposo.d.ts +93 -0
- package/dist/core/credenciales/reposo.d.ts.map +1 -0
- package/dist/core/credenciales/reposo.js +489 -0
- package/dist/core/credenciales/reposo.js.map +1 -0
- package/dist/core/credenciales/servidor.d.ts +55 -0
- package/dist/core/credenciales/servidor.d.ts.map +1 -0
- package/dist/core/credenciales/servidor.js +205 -0
- package/dist/core/credenciales/servidor.js.map +1 -0
- package/dist/core/descubrimiento/comandos.d.ts +30 -0
- package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
- package/dist/core/descubrimiento/comandos.js +76 -0
- package/dist/core/descubrimiento/comandos.js.map +1 -0
- package/dist/core/descubrimiento/mcp.d.ts +42 -0
- package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
- package/dist/core/descubrimiento/mcp.js +130 -0
- package/dist/core/descubrimiento/mcp.js.map +1 -0
- package/dist/core/descubrimiento/reglas.d.ts +61 -0
- package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
- package/dist/core/descubrimiento/reglas.js +134 -0
- package/dist/core/descubrimiento/reglas.js.map +1 -0
- package/dist/core/descubrimiento/skills.d.ts +57 -0
- package/dist/core/descubrimiento/skills.d.ts.map +1 -0
- package/dist/core/descubrimiento/skills.js +113 -0
- package/dist/core/descubrimiento/skills.js.map +1 -0
- package/dist/core/dificultad/clasificador.d.ts +133 -0
- package/dist/core/dificultad/clasificador.d.ts.map +1 -0
- package/dist/core/dificultad/clasificador.js +288 -0
- package/dist/core/dificultad/clasificador.js.map +1 -0
- package/dist/core/edicion/diario.d.ts +37 -0
- package/dist/core/edicion/diario.d.ts.map +1 -0
- package/dist/core/edicion/diario.js +51 -0
- package/dist/core/edicion/diario.js.map +1 -0
- package/dist/core/edicion/hashline.d.ts +71 -0
- package/dist/core/edicion/hashline.d.ts.map +1 -0
- package/dist/core/edicion/hashline.js +111 -0
- package/dist/core/edicion/hashline.js.map +1 -0
- package/dist/core/edicion/hueco.d.ts +64 -0
- package/dist/core/edicion/hueco.d.ts.map +1 -0
- package/dist/core/edicion/hueco.js +162 -0
- package/dist/core/edicion/hueco.js.map +1 -0
- package/dist/core/edicion/limpiar-carga.d.ts +39 -0
- package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
- package/dist/core/edicion/limpiar-carga.js +121 -0
- package/dist/core/edicion/limpiar-carga.js.map +1 -0
- package/dist/core/edicion/observador.d.ts +80 -0
- package/dist/core/edicion/observador.d.ts.map +1 -0
- package/dist/core/edicion/observador.js +183 -0
- package/dist/core/edicion/observador.js.map +1 -0
- package/dist/core/edicion/parecido.d.ts +53 -0
- package/dist/core/edicion/parecido.d.ts.map +1 -0
- package/dist/core/edicion/parecido.js +145 -0
- package/dist/core/edicion/parecido.js.map +1 -0
- package/dist/core/edicion/parseo.d.ts +58 -0
- package/dist/core/edicion/parseo.d.ts.map +1 -0
- package/dist/core/edicion/parseo.js +124 -0
- package/dist/core/edicion/parseo.js.map +1 -0
- package/dist/core/edicion/reparacion.d.ts +67 -0
- package/dist/core/edicion/reparacion.d.ts.map +1 -0
- package/dist/core/edicion/reparacion.js +202 -0
- package/dist/core/edicion/reparacion.js.map +1 -0
- package/dist/core/edicion/sangria.d.ts +121 -0
- package/dist/core/edicion/sangria.d.ts.map +1 -0
- package/dist/core/edicion/sangria.js +341 -0
- package/dist/core/edicion/sangria.js.map +1 -0
- package/dist/core/edicion/tipos.d.ts +58 -0
- package/dist/core/edicion/tipos.d.ts.map +1 -0
- package/dist/core/edicion/tipos.js +160 -0
- package/dist/core/edicion/tipos.js.map +1 -0
- package/dist/core/errores/proveedor.d.ts +53 -0
- package/dist/core/errores/proveedor.d.ts.map +1 -0
- package/dist/core/errores/proveedor.js +191 -0
- package/dist/core/errores/proveedor.js.map +1 -0
- package/dist/core/estructural/buscar.d.ts +61 -0
- package/dist/core/estructural/buscar.d.ts.map +1 -0
- package/dist/core/estructural/buscar.js +261 -0
- package/dist/core/estructural/buscar.js.map +1 -0
- package/dist/core/estructural/editar.d.ts +36 -0
- package/dist/core/estructural/editar.d.ts.map +1 -0
- package/dist/core/estructural/editar.js +123 -0
- package/dist/core/estructural/editar.js.map +1 -0
- package/dist/core/estructural/tools.d.ts +11 -0
- package/dist/core/estructural/tools.d.ts.map +1 -0
- package/dist/core/estructural/tools.js +100 -0
- package/dist/core/estructural/tools.js.map +1 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +10 -1
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensiones/suplantacion.d.ts +49 -0
- package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
- package/dist/core/extensiones/suplantacion.js +61 -0
- package/dist/core/extensiones/suplantacion.js.map +1 -0
- package/dist/core/extensiones/vigilancia.d.ts +54 -0
- package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
- package/dist/core/extensiones/vigilancia.js +217 -0
- package/dist/core/extensiones/vigilancia.js.map +1 -0
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +11 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
- package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
- package/dist/core/harness/fuentes-de-contexto.js +44 -0
- package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
- package/dist/core/harness/refine.d.ts +40 -0
- package/dist/core/harness/refine.d.ts.map +1 -0
- package/dist/core/harness/refine.js +109 -0
- package/dist/core/harness/refine.js.map +1 -0
- package/dist/core/harness/store.d.ts +75 -0
- package/dist/core/harness/store.d.ts.map +1 -0
- package/dist/core/harness/store.js +149 -0
- package/dist/core/harness/store.js.map +1 -0
- package/dist/core/hooks/contract.d.ts +85 -0
- package/dist/core/hooks/contract.d.ts.map +1 -0
- package/dist/core/hooks/contract.js +140 -0
- package/dist/core/hooks/contract.js.map +1 -0
- package/dist/core/hooks/runner.d.ts +42 -0
- package/dist/core/hooks/runner.d.ts.map +1 -0
- package/dist/core/hooks/runner.js +85 -0
- package/dist/core/hooks/runner.js.map +1 -0
- package/dist/core/hooks/session-hooks.d.ts +62 -0
- package/dist/core/hooks/session-hooks.d.ts.map +1 -0
- package/dist/core/hooks/session-hooks.js +84 -0
- package/dist/core/hooks/session-hooks.js.map +1 -0
- package/dist/core/importar/formatos.d.ts +69 -0
- package/dist/core/importar/formatos.d.ts.map +1 -0
- package/dist/core/importar/formatos.js +235 -0
- package/dist/core/importar/formatos.js.map +1 -0
- package/dist/core/interactivo/deteccion.d.ts +44 -0
- package/dist/core/interactivo/deteccion.d.ts.map +1 -0
- package/dist/core/interactivo/deteccion.js +82 -0
- package/dist/core/interactivo/deteccion.js.map +1 -0
- package/dist/core/interactivo/sesion.d.ts +50 -0
- package/dist/core/interactivo/sesion.d.ts.map +1 -0
- package/dist/core/interactivo/sesion.js +156 -0
- package/dist/core/interactivo/sesion.js.map +1 -0
- package/dist/core/interactivo/tools.d.ts +21 -0
- package/dist/core/interactivo/tools.d.ts.map +1 -0
- package/dist/core/interactivo/tools.js +122 -0
- package/dist/core/interactivo/tools.js.map +1 -0
- package/dist/core/lectura/mapa.d.ts +70 -0
- package/dist/core/lectura/mapa.d.ts.map +1 -0
- package/dist/core/lectura/mapa.js +177 -0
- package/dist/core/lectura/mapa.js.map +1 -0
- package/dist/core/lectura/pdf.d.ts +49 -0
- package/dist/core/lectura/pdf.d.ts.map +1 -0
- package/dist/core/lectura/pdf.js +337 -0
- package/dist/core/lectura/pdf.js.map +1 -0
- package/dist/core/limpieza/comprobadores.d.ts +28 -0
- package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
- package/dist/core/limpieza/comprobadores.js +311 -0
- package/dist/core/limpieza/comprobadores.js.map +1 -0
- package/dist/core/limpieza/parseo.d.ts +19 -0
- package/dist/core/limpieza/parseo.d.ts.map +1 -0
- package/dist/core/limpieza/parseo.js +124 -0
- package/dist/core/limpieza/parseo.js.map +1 -0
- package/dist/core/limpieza/reparacion.d.ts +77 -0
- package/dist/core/limpieza/reparacion.d.ts.map +1 -0
- package/dist/core/limpieza/reparacion.js +254 -0
- package/dist/core/limpieza/reparacion.js.map +1 -0
- package/dist/core/limpieza/tipos.d.ts +56 -0
- package/dist/core/limpieza/tipos.d.ts.map +1 -0
- package/dist/core/limpieza/tipos.js +9 -0
- package/dist/core/limpieza/tipos.js.map +1 -0
- package/dist/core/lsp/cliente.d.ts +52 -0
- package/dist/core/lsp/cliente.d.ts.map +1 -0
- package/dist/core/lsp/cliente.js +232 -0
- package/dist/core/lsp/cliente.js.map +1 -0
- package/dist/core/lsp/descubrimiento.d.ts +62 -0
- package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
- package/dist/core/lsp/descubrimiento.js +152 -0
- package/dist/core/lsp/descubrimiento.js.map +1 -0
- package/dist/core/lsp/ediciones.d.ts +59 -0
- package/dist/core/lsp/ediciones.d.ts.map +1 -0
- package/dist/core/lsp/ediciones.js +89 -0
- package/dist/core/lsp/ediciones.js.map +1 -0
- package/dist/core/lsp/extension.d.ts +28 -0
- package/dist/core/lsp/extension.d.ts.map +1 -0
- package/dist/core/lsp/extension.js +34 -0
- package/dist/core/lsp/extension.js.map +1 -0
- package/dist/core/lsp/tools.d.ts +45 -0
- package/dist/core/lsp/tools.d.ts.map +1 -0
- package/dist/core/lsp/tools.js +265 -0
- package/dist/core/lsp/tools.js.map +1 -0
- package/dist/core/mcp/client.d.ts +60 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +139 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/manager.d.ts +86 -0
- package/dist/core/mcp/manager.d.ts.map +1 -0
- package/dist/core/mcp/manager.js +124 -0
- package/dist/core/mcp/manager.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +15 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +84 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/memory-engine/audit-export.d.ts +12 -10
- package/dist/core/memory-engine/audit-export.d.ts.map +1 -1
- package/dist/core/memory-engine/audit-export.js +15 -0
- package/dist/core/memory-engine/audit-export.js.map +1 -1
- package/dist/core/memory-engine/audit-indice.d.ts +153 -0
- package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
- package/dist/core/memory-engine/audit-indice.js +271 -0
- package/dist/core/memory-engine/audit-indice.js.map +1 -0
- package/dist/core/memory-engine/audit.d.ts +18 -6
- package/dist/core/memory-engine/audit.d.ts.map +1 -1
- package/dist/core/memory-engine/audit.js +25 -42
- package/dist/core/memory-engine/audit.js.map +1 -1
- package/dist/core/memory-engine/engine.d.ts +19 -1
- package/dist/core/memory-engine/engine.d.ts.map +1 -1
- package/dist/core/memory-engine/engine.js +71 -5
- package/dist/core/memory-engine/engine.js.map +1 -1
- package/dist/core/memory-engine/observation-store.d.ts +0 -2
- package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
- package/dist/core/memory-engine/observation-store.js +4 -5
- package/dist/core/memory-engine/observation-store.js.map +1 -1
- package/dist/core/memory-engine/refinements.d.ts +51 -0
- package/dist/core/memory-engine/refinements.d.ts.map +1 -0
- package/dist/core/memory-engine/refinements.js +99 -0
- package/dist/core/memory-engine/refinements.js.map +1 -0
- package/dist/core/memory-engine/tools.d.ts.map +1 -1
- package/dist/core/memory-engine/tools.js +27 -1
- package/dist/core/memory-engine/tools.js.map +1 -1
- package/dist/core/memory-engine/types.d.ts +2 -0
- package/dist/core/memory-engine/types.d.ts.map +1 -1
- package/dist/core/memory-engine/types.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +7 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/muestreo-restringido.d.ts +49 -0
- package/dist/core/muestreo-restringido.d.ts.map +1 -0
- package/dist/core/muestreo-restringido.js +65 -0
- package/dist/core/muestreo-restringido.js.map +1 -0
- package/dist/core/orphan-process-journal.d.ts +48 -0
- package/dist/core/orphan-process-journal.d.ts.map +1 -0
- package/dist/core/orphan-process-journal.js +116 -0
- package/dist/core/orphan-process-journal.js.map +1 -0
- package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
- package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
- package/dist/core/privacidad/categorias-especiales.js +745 -0
- package/dist/core/privacidad/categorias-especiales.js.map +1 -0
- package/dist/core/privacidad/tapar.d.ts +48 -0
- package/dist/core/privacidad/tapar.d.ts.map +1 -0
- package/dist/core/privacidad/tapar.js +66 -0
- package/dist/core/privacidad/tapar.js.map +1 -0
- package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
- package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
- package/dist/core/prompt-cache/diagnostics.js +100 -0
- package/dist/core/prompt-cache/diagnostics.js.map +1 -0
- package/dist/core/prompt-cache/index.d.ts +33 -0
- package/dist/core/prompt-cache/index.d.ts.map +1 -0
- package/dist/core/prompt-cache/index.js +189 -0
- package/dist/core/prompt-cache/index.js.map +1 -0
- package/dist/core/prompt-cache/payload.d.ts +58 -0
- package/dist/core/prompt-cache/payload.d.ts.map +1 -0
- package/dist/core/prompt-cache/payload.js +122 -0
- package/dist/core/prompt-cache/payload.js.map +1 -0
- package/dist/core/prompt-cache/stabilize.d.ts +65 -0
- package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
- package/dist/core/prompt-cache/stabilize.js +137 -0
- package/dist/core/prompt-cache/stabilize.js.map +1 -0
- package/dist/core/prompt-cache/stats.d.ts +55 -0
- package/dist/core/prompt-cache/stats.d.ts.map +1 -0
- package/dist/core/prompt-cache/stats.js +158 -0
- package/dist/core/prompt-cache/stats.js.map +1 -0
- package/dist/core/prompt-eleccion.d.ts +38 -0
- package/dist/core/prompt-eleccion.d.ts.map +1 -0
- package/dist/core/prompt-eleccion.js +46 -0
- package/dist/core/prompt-eleccion.js.map +1 -0
- package/dist/core/prompts/montar.d.ts +75 -0
- package/dist/core/prompts/montar.d.ts.map +1 -0
- package/dist/core/prompts/montar.js +146 -0
- package/dist/core/prompts/montar.js.map +1 -0
- package/dist/core/prompts/plantilla.d.ts +54 -0
- package/dist/core/prompts/plantilla.d.ts.map +1 -0
- package/dist/core/prompts/plantilla.js +153 -0
- package/dist/core/prompts/plantilla.js.map +1 -0
- package/dist/core/prompts/sistema.md +134 -0
- package/dist/core/provider-attribution.d.ts +24 -2
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js +24 -42
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/remoto/destino.d.ts +38 -0
- package/dist/core/remoto/destino.d.ts.map +1 -0
- package/dist/core/remoto/destino.js +105 -0
- package/dist/core/remoto/destino.js.map +1 -0
- package/dist/core/remoto/ejecutor.d.ts +59 -0
- package/dist/core/remoto/ejecutor.d.ts.map +1 -0
- package/dist/core/remoto/ejecutor.js +225 -0
- package/dist/core/remoto/ejecutor.js.map +1 -0
- package/dist/core/remoto/ficheros.d.ts +29 -0
- package/dist/core/remoto/ficheros.d.ts.map +1 -0
- package/dist/core/remoto/ficheros.js +90 -0
- package/dist/core/remoto/ficheros.js.map +1 -0
- package/dist/core/remoto/registro-extension.d.ts +15 -0
- package/dist/core/remoto/registro-extension.d.ts.map +1 -0
- package/dist/core/remoto/registro-extension.js +17 -0
- package/dist/core/remoto/registro-extension.js.map +1 -0
- package/dist/core/remoto/tools.d.ts +28 -0
- package/dist/core/remoto/tools.d.ts.map +1 -0
- package/dist/core/remoto/tools.js +31 -0
- package/dist/core/remoto/tools.js.map +1 -0
- package/dist/core/resource-loader.d.ts +8 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +93 -1
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/revision/hallazgo.d.ts +51 -0
- package/dist/core/revision/hallazgo.d.ts.map +1 -0
- package/dist/core/revision/hallazgo.js +73 -0
- package/dist/core/revision/hallazgo.js.map +1 -0
- package/dist/core/revision/revisor.d.ts +81 -0
- package/dist/core/revision/revisor.d.ts.map +1 -0
- package/dist/core/revision/revisor.js +132 -0
- package/dist/core/revision/revisor.js.map +1 -0
- package/dist/core/revision/sarif.d.ts +30 -0
- package/dist/core/revision/sarif.d.ts.map +1 -0
- package/dist/core/revision/sarif.js +83 -0
- package/dist/core/revision/sarif.js.map +1 -0
- package/dist/core/scheduler/scheduler.d.ts +87 -0
- package/dist/core/scheduler/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler/scheduler.js +178 -0
- package/dist/core/scheduler/scheduler.js.map +1 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
- package/dist/core/settings-manager.d.ts +110 -6
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +53 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +3 -3
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts +17 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +13 -5
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetria/otlp.d.ts +122 -0
- package/dist/core/telemetria/otlp.d.ts.map +1 -0
- package/dist/core/telemetria/otlp.js +373 -0
- package/dist/core/telemetria/otlp.js.map +1 -0
- package/dist/core/tools/coercion-argumentos.d.ts +48 -0
- package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
- package/dist/core/tools/coercion-argumentos.js +99 -0
- package/dist/core/tools/coercion-argumentos.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +0 -7
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +232 -7
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +8 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +5 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/json-tolerante.d.ts +30 -0
- package/dist/core/tools/json-tolerante.d.ts.map +1 -0
- package/dist/core/tools/json-tolerante.js +70 -0
- package/dist/core/tools/json-tolerante.js.map +1 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +17 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +17 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/turno-vacio/detectar.d.ts +38 -0
- package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
- package/dist/core/turno-vacio/detectar.js +66 -0
- package/dist/core/turno-vacio/detectar.js.map +1 -0
- package/dist/core/undo/journal.d.ts +57 -0
- package/dist/core/undo/journal.d.ts.map +1 -0
- package/dist/core/undo/journal.js +178 -0
- package/dist/core/undo/journal.js.map +1 -0
- package/dist/core/urls-internas/auditoria.d.ts +10 -0
- package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
- package/dist/core/urls-internas/auditoria.js +42 -0
- package/dist/core/urls-internas/auditoria.js.map +1 -0
- package/dist/core/urls-internas/boveda.d.ts +13 -0
- package/dist/core/urls-internas/boveda.d.ts.map +1 -0
- package/dist/core/urls-internas/boveda.js +40 -0
- package/dist/core/urls-internas/boveda.js.map +1 -0
- package/dist/core/urls-internas/lector.d.ts +30 -0
- package/dist/core/urls-internas/lector.d.ts.map +1 -0
- package/dist/core/urls-internas/lector.js +56 -0
- package/dist/core/urls-internas/lector.js.map +1 -0
- package/dist/core/urls-internas/memoria.d.ts +11 -0
- package/dist/core/urls-internas/memoria.d.ts.map +1 -0
- package/dist/core/urls-internas/memoria.js +25 -0
- package/dist/core/urls-internas/memoria.js.map +1 -0
- package/dist/core/urls-internas/parse.d.ts +28 -0
- package/dist/core/urls-internas/parse.d.ts.map +1 -0
- package/dist/core/urls-internas/parse.js +32 -0
- package/dist/core/urls-internas/parse.js.map +1 -0
- package/dist/core/urls-internas/reglas.d.ts +10 -0
- package/dist/core/urls-internas/reglas.d.ts.map +1 -0
- package/dist/core/urls-internas/reglas.js +31 -0
- package/dist/core/urls-internas/reglas.js.map +1 -0
- package/dist/core/usage/aggregate.d.ts +68 -0
- package/dist/core/usage/aggregate.d.ts.map +1 -0
- package/dist/core/usage/aggregate.js +93 -0
- package/dist/core/usage/aggregate.js.map +1 -0
- package/dist/core/usage/cuota/anthropic.d.ts +10 -0
- package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
- package/dist/core/usage/cuota/anthropic.js +63 -0
- package/dist/core/usage/cuota/anthropic.js.map +1 -0
- package/dist/core/usage/cuota/cache.d.ts +20 -0
- package/dist/core/usage/cuota/cache.d.ts.map +1 -0
- package/dist/core/usage/cuota/cache.js +36 -0
- package/dist/core/usage/cuota/cache.js.map +1 -0
- package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
- package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
- package/dist/core/usage/cuota/github-copilot.js +67 -0
- package/dist/core/usage/cuota/github-copilot.js.map +1 -0
- package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
- package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
- package/dist/core/usage/cuota/google-gemini.js +72 -0
- package/dist/core/usage/cuota/google-gemini.js.map +1 -0
- package/dist/core/usage/cuota/index.d.ts +25 -0
- package/dist/core/usage/cuota/index.d.ts.map +1 -0
- package/dist/core/usage/cuota/index.js +50 -0
- package/dist/core/usage/cuota/index.js.map +1 -0
- package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
- package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
- package/dist/core/usage/cuota/openai-codex.js +59 -0
- package/dist/core/usage/cuota/openai-codex.js.map +1 -0
- package/dist/core/usage/cuota/openrouter.d.ts +10 -0
- package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
- package/dist/core/usage/cuota/openrouter.js +47 -0
- package/dist/core/usage/cuota/openrouter.js.map +1 -0
- package/dist/core/usage/cuota/tipos.d.ts +50 -0
- package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
- package/dist/core/usage/cuota/tipos.js +25 -0
- package/dist/core/usage/cuota/tipos.js.map +1 -0
- package/dist/core/web/busqueda-nativa.d.ts +82 -0
- package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
- package/dist/core/web/busqueda-nativa.js +163 -0
- package/dist/core/web/busqueda-nativa.js.map +1 -0
- package/dist/core/web/destino.d.ts +58 -0
- package/dist/core/web/destino.d.ts.map +1 -0
- package/dist/core/web/destino.js +127 -0
- package/dist/core/web/destino.js.map +1 -0
- package/dist/core/web/proveedores/brave.d.ts +6 -0
- package/dist/core/web/proveedores/brave.d.ts.map +1 -0
- package/dist/core/web/proveedores/brave.js +20 -0
- package/dist/core/web/proveedores/brave.js.map +1 -0
- package/dist/core/web/proveedores/claves.d.ts +19 -0
- package/dist/core/web/proveedores/claves.d.ts.map +1 -0
- package/dist/core/web/proveedores/claves.js +36 -0
- package/dist/core/web/proveedores/claves.js.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.js +109 -0
- package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
- package/dist/core/web/proveedores/ecosia.d.ts +3 -0
- package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
- package/dist/core/web/proveedores/ecosia.js +72 -0
- package/dist/core/web/proveedores/ecosia.js.map +1 -0
- package/dist/core/web/proveedores/exa.d.ts +6 -0
- package/dist/core/web/proveedores/exa.d.ts.map +1 -0
- package/dist/core/web/proveedores/exa.js +24 -0
- package/dist/core/web/proveedores/exa.js.map +1 -0
- package/dist/core/web/proveedores/mojeek.d.ts +3 -0
- package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
- package/dist/core/web/proveedores/mojeek.js +65 -0
- package/dist/core/web/proveedores/mojeek.js.map +1 -0
- package/dist/core/web/proveedores/navegador.d.ts +10 -0
- package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
- package/dist/core/web/proveedores/navegador.js +13 -0
- package/dist/core/web/proveedores/navegador.js.map +1 -0
- package/dist/core/web/proveedores/registro.d.ts +43 -0
- package/dist/core/web/proveedores/registro.d.ts.map +1 -0
- package/dist/core/web/proveedores/registro.js +49 -0
- package/dist/core/web/proveedores/registro.js.map +1 -0
- package/dist/core/web/proveedores/searxng.d.ts +9 -0
- package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
- package/dist/core/web/proveedores/searxng.js +17 -0
- package/dist/core/web/proveedores/searxng.js.map +1 -0
- package/dist/core/web/proveedores/serper.d.ts +9 -0
- package/dist/core/web/proveedores/serper.d.ts.map +1 -0
- package/dist/core/web/proveedores/serper.js +19 -0
- package/dist/core/web/proveedores/serper.js.map +1 -0
- package/dist/core/web/proveedores/tavily.d.ts +6 -0
- package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
- package/dist/core/web/proveedores/tavily.js +19 -0
- package/dist/core/web/proveedores/tavily.js.map +1 -0
- package/dist/core/web/proveedores/tipos.d.ts +36 -0
- package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
- package/dist/core/web/proveedores/tipos.js +10 -0
- package/dist/core/web/proveedores/tipos.js.map +1 -0
- package/dist/core/web/registro-red.d.ts +43 -0
- package/dist/core/web/registro-red.d.ts.map +1 -0
- package/dist/core/web/registro-red.js +86 -0
- package/dist/core/web/registro-red.js.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.js +38 -0
- package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
- package/dist/core/web/scrapers/crates-io.d.ts +11 -0
- package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
- package/dist/core/web/scrapers/crates-io.js +29 -0
- package/dist/core/web/scrapers/crates-io.js.map +1 -0
- package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
- package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
- package/dist/core/web/scrapers/docs-rs.js +35 -0
- package/dist/core/web/scrapers/docs-rs.js.map +1 -0
- package/dist/core/web/scrapers/github.d.ts +3 -0
- package/dist/core/web/scrapers/github.d.ts.map +1 -0
- package/dist/core/web/scrapers/github.js +72 -0
- package/dist/core/web/scrapers/github.js.map +1 -0
- package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
- package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
- package/dist/core/web/scrapers/go-pkg.js +30 -0
- package/dist/core/web/scrapers/go-pkg.js.map +1 -0
- package/dist/core/web/scrapers/hex.d.ts +6 -0
- package/dist/core/web/scrapers/hex.d.ts.map +1 -0
- package/dist/core/web/scrapers/hex.js +27 -0
- package/dist/core/web/scrapers/hex.js.map +1 -0
- package/dist/core/web/scrapers/maven.d.ts +8 -0
- package/dist/core/web/scrapers/maven.d.ts.map +1 -0
- package/dist/core/web/scrapers/maven.js +41 -0
- package/dist/core/web/scrapers/maven.js.map +1 -0
- package/dist/core/web/scrapers/mdn.d.ts +6 -0
- package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
- package/dist/core/web/scrapers/mdn.js +28 -0
- package/dist/core/web/scrapers/mdn.js.map +1 -0
- package/dist/core/web/scrapers/npm.d.ts +11 -0
- package/dist/core/web/scrapers/npm.d.ts.map +1 -0
- package/dist/core/web/scrapers/npm.js +57 -0
- package/dist/core/web/scrapers/npm.js.map +1 -0
- package/dist/core/web/scrapers/nuget.d.ts +8 -0
- package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
- package/dist/core/web/scrapers/nuget.js +22 -0
- package/dist/core/web/scrapers/nuget.js.map +1 -0
- package/dist/core/web/scrapers/nvd.d.ts +7 -0
- package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
- package/dist/core/web/scrapers/nvd.js +37 -0
- package/dist/core/web/scrapers/nvd.js.map +1 -0
- package/dist/core/web/scrapers/pypi.d.ts +6 -0
- package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
- package/dist/core/web/scrapers/pypi.js +31 -0
- package/dist/core/web/scrapers/pypi.js.map +1 -0
- package/dist/core/web/scrapers/registro.d.ts +13 -0
- package/dist/core/web/scrapers/registro.d.ts.map +1 -0
- package/dist/core/web/scrapers/registro.js +65 -0
- package/dist/core/web/scrapers/registro.js.map +1 -0
- package/dist/core/web/scrapers/rubygems.d.ts +6 -0
- package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
- package/dist/core/web/scrapers/rubygems.js +23 -0
- package/dist/core/web/scrapers/rubygems.js.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.js +46 -0
- package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
- package/dist/core/web/scrapers/tipos.d.ts +42 -0
- package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
- package/dist/core/web/scrapers/tipos.js +23 -0
- package/dist/core/web/scrapers/tipos.js.map +1 -0
- package/dist/core/web/texto.d.ts +10 -0
- package/dist/core/web/texto.d.ts.map +1 -0
- package/dist/core/web/texto.js +26 -0
- package/dist/core/web/texto.js.map +1 -0
- package/dist/core/web/tools.d.ts +91 -0
- package/dist/core/web/tools.d.ts.map +1 -0
- package/dist/core/web/tools.js +304 -0
- package/dist/core/web/tools.js.map +1 -0
- package/dist/core/wiki/almacen.d.ts +33 -0
- package/dist/core/wiki/almacen.d.ts.map +1 -0
- package/dist/core/wiki/almacen.js +93 -0
- package/dist/core/wiki/almacen.js.map +1 -0
- package/dist/core/wiki/citas.d.ts +111 -0
- package/dist/core/wiki/citas.d.ts.map +1 -0
- package/dist/core/wiki/citas.js +146 -0
- package/dist/core/wiki/citas.js.map +1 -0
- package/dist/core/workflows/agent-runner.d.ts +2 -0
- package/dist/core/workflows/agent-runner.d.ts.map +1 -1
- package/dist/core/workflows/agent-runner.js +131 -44
- package/dist/core/workflows/agent-runner.js.map +1 -1
- package/dist/core/workflows/builtins.d.ts.map +1 -1
- package/dist/core/workflows/builtins.js +1 -0
- package/dist/core/workflows/builtins.js.map +1 -1
- package/dist/core/workflows/contrato/esquema.d.ts +32 -0
- package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
- package/dist/core/workflows/contrato/esquema.js +25 -0
- package/dist/core/workflows/contrato/esquema.js.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
- package/dist/core/workflows/contrato/validador.d.ts +30 -0
- package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
- package/dist/core/workflows/contrato/validador.js +56 -0
- package/dist/core/workflows/contrato/validador.js.map +1 -0
- package/dist/core/workflows/contrato/yield.d.ts +65 -0
- package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
- package/dist/core/workflows/contrato/yield.js +80 -0
- package/dist/core/workflows/contrato/yield.js.map +1 -0
- package/dist/core/workflows/goal-engine/engine.d.ts +17 -0
- package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -1
- package/dist/core/workflows/goal-engine/engine.js +41 -0
- package/dist/core/workflows/goal-engine/engine.js.map +1 -1
- package/dist/core/workflows/index.d.ts +8 -0
- package/dist/core/workflows/index.d.ts.map +1 -1
- package/dist/core/workflows/index.js +4 -0
- package/dist/core/workflows/index.js.map +1 -1
- package/dist/core/workflows/manager.d.ts +10 -0
- package/dist/core/workflows/manager.d.ts.map +1 -1
- package/dist/core/workflows/manager.js +35 -11
- package/dist/core/workflows/manager.js.map +1 -1
- package/dist/core/workflows/runtime.d.ts +13 -0
- package/dist/core/workflows/runtime.d.ts.map +1 -1
- package/dist/core/workflows/runtime.js +80 -1
- package/dist/core/workflows/runtime.js.map +1 -1
- package/dist/core/workflows/save-as-skill.d.ts +27 -0
- package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
- package/dist/core/workflows/save-as-skill.js +54 -0
- package/dist/core/workflows/save-as-skill.js.map +1 -0
- package/dist/core/workflows/types.d.ts +49 -0
- package/dist/core/workflows/types.d.ts.map +1 -1
- package/dist/core/workflows/types.js.map +1 -1
- package/dist/extensions/remoto/index.d.ts +22 -0
- package/dist/extensions/remoto/index.d.ts.map +1 -0
- package/dist/extensions/remoto/index.js +54 -0
- package/dist/extensions/remoto/index.js.map +1 -0
- package/dist/index.d.ts +1 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -16
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +6 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts +42 -0
- package/dist/modes/acp/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp/acp-mode.js +190 -0
- package/dist/modes/acp/acp-mode.js.map +1 -0
- package/dist/modes/acp/events.d.ts +74 -0
- package/dist/modes/acp/events.d.ts.map +1 -0
- package/dist/modes/acp/events.js +116 -0
- package/dist/modes/acp/events.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +8 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +41 -7
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +1 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +9 -86
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +8 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +48 -17
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -7
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +137 -146
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +11 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +27 -5
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/server/attach.d.ts +56 -0
- package/dist/server/attach.d.ts.map +1 -0
- package/dist/server/attach.js +130 -0
- package/dist/server/attach.js.map +1 -0
- package/dist/server/extension-ops.d.ts +40 -0
- package/dist/server/extension-ops.d.ts.map +1 -0
- package/dist/server/extension-ops.js +146 -0
- package/dist/server/extension-ops.js.map +1 -0
- package/dist/server/pi-server-service.d.ts +85 -0
- package/dist/server/pi-server-service.d.ts.map +1 -0
- package/dist/server/pi-server-service.js +213 -0
- package/dist/server/pi-server-service.js.map +1 -0
- package/dist/server/scheduler-tick.d.ts +32 -0
- package/dist/server/scheduler-tick.d.ts.map +1 -0
- package/dist/server/scheduler-tick.js +47 -0
- package/dist/server/scheduler-tick.js.map +1 -0
- package/dist/server/serve.d.ts +25 -0
- package/dist/server/serve.d.ts.map +1 -0
- package/dist/server/serve.js +83 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/server/transcript.d.ts +38 -0
- package/dist/server/transcript.d.ts.map +1 -0
- package/dist/server/transcript.js +176 -0
- package/dist/server/transcript.js.map +1 -0
- package/dist/skills/skill-creator/SKILL.md +90 -0
- package/dist/telegram/api.d.ts +75 -0
- package/dist/telegram/api.d.ts.map +1 -0
- package/dist/telegram/api.js +104 -0
- package/dist/telegram/api.js.map +1 -0
- package/dist/telegram/bridge.d.ts +85 -0
- package/dist/telegram/bridge.d.ts.map +1 -0
- package/dist/telegram/bridge.js +182 -0
- package/dist/telegram/bridge.js.map +1 -0
- package/dist/telegram/journal.d.ts +67 -0
- package/dist/telegram/journal.d.ts.map +1 -0
- package/dist/telegram/journal.js +119 -0
- package/dist/telegram/journal.js.map +1 -0
- package/dist/telegram/servidor.d.ts +15 -0
- package/dist/telegram/servidor.d.ts.map +1 -0
- package/dist/telegram/servidor.js +74 -0
- package/dist/telegram/servidor.js.map +1 -0
- package/dist/utils/shell.d.ts +11 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +11 -0
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +29 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +10 -10
- package/docs/compliance.md +241 -0
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +10 -10
- package/docs/development.md +47 -10
- package/docs/docs.json +14 -2
- package/docs/environment-variables.md +20 -17
- package/docs/extensions.md +51 -49
- package/docs/index.md +15 -21
- package/docs/json.md +3 -3
- package/docs/keybindings.md +5 -5
- package/docs/llama-cpp.md +7 -7
- package/docs/models.md +12 -12
- package/docs/packages.md +45 -45
- package/docs/prompt-templates.md +5 -5
- package/docs/providers.md +12 -12
- package/docs/quickstart.md +39 -39
- package/docs/rpc.md +12 -12
- package/docs/sdk.md +38 -38
- package/docs/security.md +26 -21
- package/docs/session-format.md +7 -7
- package/docs/sessions.md +14 -14
- package/docs/settings.md +45 -20
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +11 -11
- package/docs/terminal-setup.md +14 -14
- package/docs/termux.md +7 -7
- package/docs/themes.md +11 -11
- package/docs/tmux.md +4 -4
- package/docs/tui.md +3 -3
- package/docs/usage.md +54 -54
- package/docs/windows.md +2 -2
- package/examples/sdk/12-full-control.ts +9 -0
- package/npm-shrinkwrap.json +35 -251
- package/package.json +10 -4
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Un proceso interactivo vivo, entre llamadas a tool.
|
|
3
|
+
*
|
|
4
|
+
* `bash` normal lanza y espera a que termine: una sola llamada, un solo
|
|
5
|
+
* resultado. Aquí el proceso sobrevive a la llamada que lo lanzó, para que
|
|
6
|
+
* una segunda llamada (`bash_enviar`) pueda escribirle más entrada — el
|
|
7
|
+
* "sí" a la confirmación, la contraseña, el siguiente comando del REPL.
|
|
8
|
+
*
|
|
9
|
+
* Reutiliza el MISMO seguimiento de huérfanos que ya usa `bash` normal
|
|
10
|
+
* (`trackDetachedChildPid` / `killTrackedDetachedChildren` en
|
|
11
|
+
* `utils/shell.ts`), que los tres modos del CLI —print, interactive, rpc—
|
|
12
|
+
* ya llaman al apagarse. No hace falta cablear un gancho de cierre nuevo:
|
|
13
|
+
* una sesión viva entra en el mismo Set que un `bash` colgado, y muere con
|
|
14
|
+
* él. Verificado en `sesion.test.ts` y con `ps` en el informe de la tarea.
|
|
15
|
+
*/
|
|
16
|
+
import { spawn } from "node:child_process";
|
|
17
|
+
import { randomUUID } from "node:crypto";
|
|
18
|
+
import { getShellConfig, getShellEnv, killProcessTree, trackDetachedChildPid, untrackDetachedChildPid, } from "../../utils/shell.js";
|
|
19
|
+
import { detectarEsperaEntrada } from "./deteccion.js";
|
|
20
|
+
/** Cuánta salida sin consumir se retiene por sesión. Un REPL ruidoso no debe reventar memoria. */
|
|
21
|
+
const MAX_PENDIENTE_BYTES = 200_000;
|
|
22
|
+
const AVISO_RECORTE = "[…salida antigua descartada, sesión demasiado ruidosa…]\n";
|
|
23
|
+
const sesiones = new Map();
|
|
24
|
+
function normalizarChunk(buf) {
|
|
25
|
+
return buf.toString("utf8").replace(/\r\n/gu, "\n");
|
|
26
|
+
}
|
|
27
|
+
function acumular(s, texto) {
|
|
28
|
+
s.pendiente += texto;
|
|
29
|
+
s.ultimaActividad = Date.now();
|
|
30
|
+
if (s.pendiente.length > MAX_PENDIENTE_BYTES) {
|
|
31
|
+
s.pendiente = AVISO_RECORTE + s.pendiente.slice(-MAX_PENDIENTE_BYTES);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function limpiar(s) {
|
|
35
|
+
if (s.pid !== undefined)
|
|
36
|
+
untrackDetachedChildPid(s.pid);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Espera a que la sesión dé una señal (prompt detectado o proceso muerto) o
|
|
40
|
+
* agote el tiempo. Sondea cada 80ms: es rápido de sobra frente a lo que
|
|
41
|
+
* tarda un humano en leer un prompt, y no quema CPU con un intervalo menor.
|
|
42
|
+
*/
|
|
43
|
+
async function esperarSenal(s, timeoutMs, umbralInactividadMs) {
|
|
44
|
+
const limite = Date.now() + timeoutMs;
|
|
45
|
+
for (;;) {
|
|
46
|
+
const estado = detectarEsperaEntrada({
|
|
47
|
+
salidaReciente: s.pendiente,
|
|
48
|
+
msDesdeUltimaSalida: Date.now() - s.ultimaActividad,
|
|
49
|
+
vivo: s.vivo,
|
|
50
|
+
umbralInactividadMs,
|
|
51
|
+
});
|
|
52
|
+
if (estado.esperando || !s.vivo || Date.now() >= limite)
|
|
53
|
+
return estado;
|
|
54
|
+
await new Promise((resolve) => setTimeout(resolve, 80));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function consumir(s) {
|
|
58
|
+
const salida = s.pendiente;
|
|
59
|
+
s.pendiente = "";
|
|
60
|
+
return salida;
|
|
61
|
+
}
|
|
62
|
+
function aResultado(s, estado) {
|
|
63
|
+
return {
|
|
64
|
+
id: s.id,
|
|
65
|
+
comando: s.comando,
|
|
66
|
+
salida: consumir(s),
|
|
67
|
+
esperando: estado.esperando,
|
|
68
|
+
motivo: estado.motivo,
|
|
69
|
+
vivo: s.vivo,
|
|
70
|
+
codigoSalida: s.codigoSalida,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** Lanza un proceso interactivo y espera hasta el primer prompt (o a que termine, o al timeout). */
|
|
74
|
+
export async function lanzarSesionInteractiva(comando, opciones) {
|
|
75
|
+
const shellConfig = getShellConfig(opciones.shellPath);
|
|
76
|
+
const comandoDesdeStdin = shellConfig.commandTransport === "stdin";
|
|
77
|
+
const proceso = spawn(shellConfig.shell, comandoDesdeStdin ? shellConfig.args : [...shellConfig.args, comando], {
|
|
78
|
+
cwd: opciones.cwd,
|
|
79
|
+
detached: process.platform !== "win32",
|
|
80
|
+
env: getShellEnv(),
|
|
81
|
+
stdio: "pipe",
|
|
82
|
+
windowsHide: true,
|
|
83
|
+
});
|
|
84
|
+
const s = {
|
|
85
|
+
id: randomUUID(),
|
|
86
|
+
comando,
|
|
87
|
+
pid: proceso.pid,
|
|
88
|
+
proceso,
|
|
89
|
+
pendiente: "",
|
|
90
|
+
ultimaActividad: Date.now(),
|
|
91
|
+
vivo: true,
|
|
92
|
+
codigoSalida: null,
|
|
93
|
+
};
|
|
94
|
+
sesiones.set(s.id, s);
|
|
95
|
+
if (proceso.pid)
|
|
96
|
+
trackDetachedChildPid(proceso.pid);
|
|
97
|
+
proceso.stdout.on("data", (chunk) => acumular(s, normalizarChunk(chunk)));
|
|
98
|
+
proceso.stderr.on("data", (chunk) => acumular(s, normalizarChunk(chunk)));
|
|
99
|
+
proceso.stdin.on("error", () => {
|
|
100
|
+
// Escribir tras la muerte del proceso no debe tirar la sesión abajo:
|
|
101
|
+
// `bash_enviar` ya distingue "sesión muerta" por `vivo`.
|
|
102
|
+
});
|
|
103
|
+
proceso.on("exit", (code) => {
|
|
104
|
+
s.vivo = false;
|
|
105
|
+
s.codigoSalida = code;
|
|
106
|
+
limpiar(s);
|
|
107
|
+
});
|
|
108
|
+
// El comando en sí es la primera "entrada": en modo `-s` (bash de WSL legacy)
|
|
109
|
+
// se escribe por stdin en vez de pasar por argv, y el fd es el mismo tanto
|
|
110
|
+
// para el resto del script como para lo que el propio comando pida leer
|
|
111
|
+
// luego — es idéntico a teclearlo a mano.
|
|
112
|
+
if (comandoDesdeStdin) {
|
|
113
|
+
proceso.stdin.write(`${comando}\n`);
|
|
114
|
+
}
|
|
115
|
+
const estado = await esperarSenal(s, opciones.timeoutMs ?? 10_000, opciones.umbralInactividadMs ?? 1200);
|
|
116
|
+
return aResultado(s, estado);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Manda una línea a una sesión viva y espera la siguiente señal.
|
|
120
|
+
*
|
|
121
|
+
* `null` cuando la sesión no existe: NO es lo mismo que una sesión que
|
|
122
|
+
* existe pero no tiene nada nuevo que decir (eso es `salida: ""`).
|
|
123
|
+
*/
|
|
124
|
+
export async function enviarASesion(id, texto, opciones = {}) {
|
|
125
|
+
const s = sesiones.get(id);
|
|
126
|
+
if (!s)
|
|
127
|
+
return null;
|
|
128
|
+
if (!s.vivo)
|
|
129
|
+
return aResultado(s, { esperando: false, motivo: null });
|
|
130
|
+
s.proceso.stdin.write(`${texto}\n`);
|
|
131
|
+
const estado = await esperarSenal(s, opciones.timeoutMs ?? 10_000, opciones.umbralInactividadMs ?? 1200);
|
|
132
|
+
return aResultado(s, estado);
|
|
133
|
+
}
|
|
134
|
+
/** `null` si la sesión no existe; `true`/`false` según si había algo vivo que matar. */
|
|
135
|
+
export function cerrarSesion(id) {
|
|
136
|
+
const s = sesiones.get(id);
|
|
137
|
+
if (!s)
|
|
138
|
+
return null;
|
|
139
|
+
const estabaViva = s.vivo;
|
|
140
|
+
if (s.pid !== undefined)
|
|
141
|
+
killProcessTree(s.pid);
|
|
142
|
+
s.vivo = false;
|
|
143
|
+
limpiar(s);
|
|
144
|
+
sesiones.delete(id);
|
|
145
|
+
return estabaViva;
|
|
146
|
+
}
|
|
147
|
+
/** Para pruebas y para el apagado del CLI: no debe sobrevivir ninguna. */
|
|
148
|
+
export function cerrarTodasLasSesiones() {
|
|
149
|
+
for (const id of [...sesiones.keys()])
|
|
150
|
+
cerrarSesion(id);
|
|
151
|
+
}
|
|
152
|
+
/** Solo para pruebas: cuántas sesiones quedan registradas. */
|
|
153
|
+
export function contarSesiones() {
|
|
154
|
+
return sesiones.size;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=sesion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sesion.js","sourceRoot":"","sources":["../../../src/core/interactivo/sesion.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Un proceso interactivo vivo, entre llamadas a tool.\n *\n * `bash` normal lanza y espera a que termine: una sola llamada, un solo\n * resultado. Aquí el proceso sobrevive a la llamada que lo lanzó, para que\n * una segunda llamada (`bash_enviar`) pueda escribirle más entrada — el\n * \"sí\" a la confirmación, la contraseña, el siguiente comando del REPL.\n *\n * Reutiliza el MISMO seguimiento de huérfanos que ya usa `bash` normal\n * (`trackDetachedChildPid` / `killTrackedDetachedChildren` en\n * `utils/shell.ts`), que los tres modos del CLI —print, interactive, rpc—\n * ya llaman al apagarse. No hace falta cablear un gancho de cierre nuevo:\n * una sesión viva entra en el mismo Set que un `bash` colgado, y muere con\n * él. Verificado en `sesion.test.ts` y con `ps` en el informe de la tarea.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n\tgetShellConfig,\n\tgetShellEnv,\n\tkillProcessTree,\n\ttrackDetachedChildPid,\n\tuntrackDetachedChildPid,\n} from \"../../utils/shell.ts\";\nimport { detectarEsperaEntrada } from \"./deteccion.ts\";\n\n/** Cuánta salida sin consumir se retiene por sesión. Un REPL ruidoso no debe reventar memoria. */\nconst MAX_PENDIENTE_BYTES = 200_000;\nconst AVISO_RECORTE = \"[…salida antigua descartada, sesión demasiado ruidosa…]\\n\";\n\ninterface SesionInteractiva {\n\tid: string;\n\tcomando: string;\n\tpid: number | undefined;\n\tproceso: import(\"node:child_process\").ChildProcessWithoutNullStreams;\n\t/** Lo que no se le ha devuelto todavía al agente. */\n\tpendiente: string;\n\tultimaActividad: number;\n\tvivo: boolean;\n\tcodigoSalida: number | null;\n}\n\nexport interface ResultadoSesion {\n\tid: string;\n\tcomando: string;\n\tsalida: string;\n\tesperando: boolean;\n\tmotivo: string | null;\n\tvivo: boolean;\n\tcodigoSalida: number | null;\n}\n\nconst sesiones = new Map<string, SesionInteractiva>();\n\nfunction normalizarChunk(buf: Buffer): string {\n\treturn buf.toString(\"utf8\").replace(/\\r\\n/gu, \"\\n\");\n}\n\nfunction acumular(s: SesionInteractiva, texto: string): void {\n\ts.pendiente += texto;\n\ts.ultimaActividad = Date.now();\n\tif (s.pendiente.length > MAX_PENDIENTE_BYTES) {\n\t\ts.pendiente = AVISO_RECORTE + s.pendiente.slice(-MAX_PENDIENTE_BYTES);\n\t}\n}\n\nfunction limpiar(s: SesionInteractiva): void {\n\tif (s.pid !== undefined) untrackDetachedChildPid(s.pid);\n}\n\n/**\n * Espera a que la sesión dé una señal (prompt detectado o proceso muerto) o\n * agote el tiempo. Sondea cada 80ms: es rápido de sobra frente a lo que\n * tarda un humano en leer un prompt, y no quema CPU con un intervalo menor.\n */\nasync function esperarSenal(\n\ts: SesionInteractiva,\n\ttimeoutMs: number,\n\tumbralInactividadMs: number,\n): Promise<ReturnType<typeof detectarEsperaEntrada>> {\n\tconst limite = Date.now() + timeoutMs;\n\tfor (;;) {\n\t\tconst estado = detectarEsperaEntrada({\n\t\t\tsalidaReciente: s.pendiente,\n\t\t\tmsDesdeUltimaSalida: Date.now() - s.ultimaActividad,\n\t\t\tvivo: s.vivo,\n\t\t\tumbralInactividadMs,\n\t\t});\n\t\tif (estado.esperando || !s.vivo || Date.now() >= limite) return estado;\n\t\tawait new Promise((resolve) => setTimeout(resolve, 80));\n\t}\n}\n\nfunction consumir(s: SesionInteractiva): string {\n\tconst salida = s.pendiente;\n\ts.pendiente = \"\";\n\treturn salida;\n}\n\nfunction aResultado(s: SesionInteractiva, estado: ReturnType<typeof detectarEsperaEntrada>): ResultadoSesion {\n\treturn {\n\t\tid: s.id,\n\t\tcomando: s.comando,\n\t\tsalida: consumir(s),\n\t\tesperando: estado.esperando,\n\t\tmotivo: estado.motivo,\n\t\tvivo: s.vivo,\n\t\tcodigoSalida: s.codigoSalida,\n\t};\n}\n\nexport interface OpcionesLanzar {\n\tcwd: string;\n\ttimeoutMs?: number;\n\tumbralInactividadMs?: number;\n\tshellPath?: string;\n}\n\n/** Lanza un proceso interactivo y espera hasta el primer prompt (o a que termine, o al timeout). */\nexport async function lanzarSesionInteractiva(comando: string, opciones: OpcionesLanzar): Promise<ResultadoSesion> {\n\tconst shellConfig = getShellConfig(opciones.shellPath);\n\tconst comandoDesdeStdin = shellConfig.commandTransport === \"stdin\";\n\tconst proceso = spawn(shellConfig.shell, comandoDesdeStdin ? shellConfig.args : [...shellConfig.args, comando], {\n\t\tcwd: opciones.cwd,\n\t\tdetached: process.platform !== \"win32\",\n\t\tenv: getShellEnv(),\n\t\tstdio: \"pipe\",\n\t\twindowsHide: true,\n\t});\n\n\tconst s: SesionInteractiva = {\n\t\tid: randomUUID(),\n\t\tcomando,\n\t\tpid: proceso.pid,\n\t\tproceso,\n\t\tpendiente: \"\",\n\t\tultimaActividad: Date.now(),\n\t\tvivo: true,\n\t\tcodigoSalida: null,\n\t};\n\tsesiones.set(s.id, s);\n\tif (proceso.pid) trackDetachedChildPid(proceso.pid);\n\n\tproceso.stdout.on(\"data\", (chunk: Buffer) => acumular(s, normalizarChunk(chunk)));\n\tproceso.stderr.on(\"data\", (chunk: Buffer) => acumular(s, normalizarChunk(chunk)));\n\tproceso.stdin.on(\"error\", () => {\n\t\t// Escribir tras la muerte del proceso no debe tirar la sesión abajo:\n\t\t// `bash_enviar` ya distingue \"sesión muerta\" por `vivo`.\n\t});\n\tproceso.on(\"exit\", (code) => {\n\t\ts.vivo = false;\n\t\ts.codigoSalida = code;\n\t\tlimpiar(s);\n\t});\n\n\t// El comando en sí es la primera \"entrada\": en modo `-s` (bash de WSL legacy)\n\t// se escribe por stdin en vez de pasar por argv, y el fd es el mismo tanto\n\t// para el resto del script como para lo que el propio comando pida leer\n\t// luego — es idéntico a teclearlo a mano.\n\tif (comandoDesdeStdin) {\n\t\tproceso.stdin.write(`${comando}\\n`);\n\t}\n\n\tconst estado = await esperarSenal(s, opciones.timeoutMs ?? 10_000, opciones.umbralInactividadMs ?? 1200);\n\treturn aResultado(s, estado);\n}\n\nexport interface OpcionesEnviar {\n\ttimeoutMs?: number;\n\tumbralInactividadMs?: number;\n}\n\n/**\n * Manda una línea a una sesión viva y espera la siguiente señal.\n *\n * `null` cuando la sesión no existe: NO es lo mismo que una sesión que\n * existe pero no tiene nada nuevo que decir (eso es `salida: \"\"`).\n */\nexport async function enviarASesion(\n\tid: string,\n\ttexto: string,\n\topciones: OpcionesEnviar = {},\n): Promise<ResultadoSesion | null> {\n\tconst s = sesiones.get(id);\n\tif (!s) return null;\n\tif (!s.vivo) return aResultado(s, { esperando: false, motivo: null });\n\n\ts.proceso.stdin.write(`${texto}\\n`);\n\tconst estado = await esperarSenal(s, opciones.timeoutMs ?? 10_000, opciones.umbralInactividadMs ?? 1200);\n\treturn aResultado(s, estado);\n}\n\n/** `null` si la sesión no existe; `true`/`false` según si había algo vivo que matar. */\nexport function cerrarSesion(id: string): boolean | null {\n\tconst s = sesiones.get(id);\n\tif (!s) return null;\n\tconst estabaViva = s.vivo;\n\tif (s.pid !== undefined) killProcessTree(s.pid);\n\ts.vivo = false;\n\tlimpiar(s);\n\tsesiones.delete(id);\n\treturn estabaViva;\n}\n\n/** Para pruebas y para el apagado del CLI: no debe sobrevivir ninguna. */\nexport function cerrarTodasLasSesiones(): void {\n\tfor (const id of [...sesiones.keys()]) cerrarSesion(id);\n}\n\n/** Solo para pruebas: cuántas sesiones quedan registradas. */\nexport function contarSesiones(): number {\n\treturn sesiones.size;\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools de bash interactivo: `bash_interactivo`, `bash_enviar`, `bash_cerrar`.
|
|
3
|
+
*
|
|
4
|
+
* `bash` normal se queda colgado ante un comando que pregunta algo — una
|
|
5
|
+
* confirmación, una contraseña, un REPL— hasta que salta el timeout, y el
|
|
6
|
+
* agente lo lee como "el comando no responde". Estas tres tools abren un
|
|
7
|
+
* proceso que sobrevive entre llamadas: `bash_interactivo` lo lanza y
|
|
8
|
+
* devuelve lo que haya hasta el primer prompt (o hasta que termine, o hasta
|
|
9
|
+
* el timeout); `bash_enviar` le manda una línea más; `bash_cerrar` lo mata.
|
|
10
|
+
*
|
|
11
|
+
* Ninguna de las tres está en `LECTURA` ni `ESCRITURA` en
|
|
12
|
+
* `aprobacion/politica.ts`, así que `nivelDe()` las clasifica como
|
|
13
|
+
* `ejecucion` por su regla de "lo desconocido cuenta como ejecución" — la
|
|
14
|
+
* misma puerta que ya pasa `bash`, sin tocar ese fichero.
|
|
15
|
+
*/
|
|
16
|
+
import type { ToolDefinition } from "../extensions/types.ts";
|
|
17
|
+
export declare const NOMBRES_INTERACTIVO_TOOLS: readonly ["bash_interactivo", "bash_enviar", "bash_cerrar"];
|
|
18
|
+
export declare function crearInteractivoTools(opciones: {
|
|
19
|
+
cwd: string;
|
|
20
|
+
}): Record<string, ToolDefinition>;
|
|
21
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/core/interactivo/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAkC9E,eAAO,MAAM,yBAAyB,6DAA8D,CAAC;AAErG,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CA8E/F","sourcesContent":["/**\n * Tools de bash interactivo: `bash_interactivo`, `bash_enviar`, `bash_cerrar`.\n *\n * `bash` normal se queda colgado ante un comando que pregunta algo — una\n * confirmación, una contraseña, un REPL— hasta que salta el timeout, y el\n * agente lo lee como \"el comando no responde\". Estas tres tools abren un\n * proceso que sobrevive entre llamadas: `bash_interactivo` lo lanza y\n * devuelve lo que haya hasta el primer prompt (o hasta que termine, o hasta\n * el timeout); `bash_enviar` le manda una línea más; `bash_cerrar` lo mata.\n *\n * Ninguna de las tres está en `LECTURA` ni `ESCRITURA` en\n * `aprobacion/politica.ts`, así que `nivelDe()` las clasifica como\n * `ejecucion` por su regla de \"lo desconocido cuenta como ejecución\" — la\n * misma puerta que ya pasa `bash`, sin tocar ese fichero.\n */\n\nimport { Type } from \"typebox\";\nimport type { AgentToolResult, ToolDefinition } from \"../extensions/types.ts\";\nimport { cerrarSesion, enviarASesion, lanzarSesionInteractiva, type ResultadoSesion } from \"./sesion.ts\";\n\nconst GUIA = [\n\t\"Para un comando normal que termina solo, usa bash. Usa bash_interactivo solo cuando esperes que el comando pregunte algo: una confirmación, una contraseña, un REPL.\",\n\t\"bash_interactivo devuelve un id de sesión. Si sigue vivo, respóndele con bash_enviar pasando ese id y una línea de texto (puede ser vacía, para solo esperar más).\",\n\t\"Cierra la sesión con bash_cerrar en cuanto termines con ella: una sesión olvidada sigue consumiendo un proceso real.\",\n];\n\nfunction texto(t: string): AgentToolResult<unknown> {\n\treturn { content: [{ type: \"text\" as const, text: t }], details: undefined };\n}\n\nfunction fallo(error: unknown): AgentToolResult<unknown> {\n\treturn texto(`Error: ${error instanceof Error ? error.message : String(error)}`);\n}\n\n/** Frase de estado + qué hacer a continuación, para que el modelo no tenga que adivinar. */\nfunction narrarEstado(r: ResultadoSesion): string {\n\tif (!r.vivo) return `[sesión ${r.id}] terminó con código ${r.codigoSalida ?? \"desconocido\"}.`;\n\tif (r.esperando) {\n\t\treturn `[sesión ${r.id}] esperando entrada (${r.motivo}). Responde con bash_enviar (session=\"${r.id}\") o mátala con bash_cerrar.`;\n\t}\n\treturn `[sesión ${r.id}] sigue en marcha, sin señal reconocible de que esté esperando algo todavía. Puedes esperar más con bash_enviar (session=\"${r.id}\", texto=\"\") o cerrarla con bash_cerrar.`;\n}\n\nfunction conSalida(r: ResultadoSesion): string {\n\treturn `${narrarEstado(r)}\\n\\n${r.salida || \"(sin salida nueva)\"}`;\n}\n\nfunction segundosAMs(segundos: number | undefined): number | undefined {\n\treturn segundos === undefined ? undefined : segundos * 1000;\n}\n\nexport const NOMBRES_INTERACTIVO_TOOLS = [\"bash_interactivo\", \"bash_enviar\", \"bash_cerrar\"] as const;\n\nexport function crearInteractivoTools(opciones: { cwd: string }): Record<string, ToolDefinition> {\n\tconst lanzar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"bash_interactivo\",\n\t\tlabel: \"Bash interactivo\",\n\t\tdescription:\n\t\t\t\"Lanza un comando de shell que puede pedir entrada (confirmación, contraseña, REPL) y devuelve \" +\n\t\t\t\"lo que haya escrito hasta el primer prompt reconocido, hasta que termine, o hasta el timeout. \" +\n\t\t\t\"El proceso queda vivo entre llamadas: sigue con bash_enviar.\",\n\t\tpromptSnippet: \"ejecutar un comando que puede preguntar algo y seguir hablando con él\",\n\t\tpromptGuidelines: GUIA,\n\t\tparameters: Type.Object({\n\t\t\tcommand: Type.String({ description: \"Comando de shell a ejecutar\" }),\n\t\t\ttimeout: Type.Optional(\n\t\t\t\tType.Number({\n\t\t\t\t\tdescription: \"Segundos a esperar por un prompt antes de devolver el control (por defecto 10)\",\n\t\t\t\t}),\n\t\t\t),\n\t\t}),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\tconst comando = String(input.command ?? \"\").trim();\n\t\t\tif (!comando) return texto(\"Falta el comando.\");\n\t\t\ttry {\n\t\t\t\tconst r = await lanzarSesionInteractiva(comando, {\n\t\t\t\t\tcwd: opciones.cwd,\n\t\t\t\t\ttimeoutMs: segundosAMs(input.timeout as number | undefined),\n\t\t\t\t});\n\t\t\t\treturn texto(conSalida(r));\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst enviar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"bash_enviar\",\n\t\tlabel: \"Enviar a sesión interactiva\",\n\t\tdescription:\n\t\t\t\"Manda una línea de texto a una sesión abierta con bash_interactivo (por ejemplo la respuesta a una \" +\n\t\t\t\"confirmación o una contraseña) y espera la siguiente señal: otro prompt, más salida, o que termine.\",\n\t\tpromptSnippet: \"responder a una sesión de bash interactivo abierta\",\n\t\tpromptGuidelines: GUIA,\n\t\tparameters: Type.Object({\n\t\t\tsession: Type.String({ description: \"El id de sesión que devolvió bash_interactivo\" }),\n\t\t\ttexto: Type.String({ description: \"Línea a enviar (se añade un salto de línea). Puede ser vacía.\" }),\n\t\t\ttimeout: Type.Optional(Type.Number({ description: \"Segundos a esperar la siguiente señal (por defecto 10)\" })),\n\t\t}),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\tconst id = String(input.session ?? \"\");\n\t\t\ttry {\n\t\t\t\tconst r = await enviarASesion(id, String(input.texto ?? \"\"), {\n\t\t\t\t\ttimeoutMs: segundosAMs(input.timeout as number | undefined),\n\t\t\t\t});\n\t\t\t\tif (r === null) return texto(`No hay ninguna sesión interactiva abierta con id \"${id}\".`);\n\t\t\t\treturn texto(conSalida(r));\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst cerrar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"bash_cerrar\",\n\t\tlabel: \"Cerrar sesión interactiva\",\n\t\tdescription: \"Mata una sesión abierta con bash_interactivo y libera el proceso.\",\n\t\tpromptSnippet: \"cerrar una sesión de bash interactivo abierta\",\n\t\tpromptGuidelines: GUIA,\n\t\tparameters: Type.Object({\n\t\t\tsession: Type.String({ description: \"El id de sesión a cerrar\" }),\n\t\t}),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\tconst id = String(input.session ?? \"\");\n\t\t\tconst habiaAlgoVivo = cerrarSesion(id);\n\t\t\tif (habiaAlgoVivo === null) return texto(`No hay ninguna sesión interactiva abierta con id \"${id}\".`);\n\t\t\treturn texto(habiaAlgoVivo ? `Sesión ${id} cerrada.` : `La sesión ${id} ya había terminado; limpiada.`);\n\t\t},\n\t};\n\n\treturn { bash_interactivo: lanzar, bash_enviar: enviar, bash_cerrar: cerrar };\n}\n"]}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools de bash interactivo: `bash_interactivo`, `bash_enviar`, `bash_cerrar`.
|
|
3
|
+
*
|
|
4
|
+
* `bash` normal se queda colgado ante un comando que pregunta algo — una
|
|
5
|
+
* confirmación, una contraseña, un REPL— hasta que salta el timeout, y el
|
|
6
|
+
* agente lo lee como "el comando no responde". Estas tres tools abren un
|
|
7
|
+
* proceso que sobrevive entre llamadas: `bash_interactivo` lo lanza y
|
|
8
|
+
* devuelve lo que haya hasta el primer prompt (o hasta que termine, o hasta
|
|
9
|
+
* el timeout); `bash_enviar` le manda una línea más; `bash_cerrar` lo mata.
|
|
10
|
+
*
|
|
11
|
+
* Ninguna de las tres está en `LECTURA` ni `ESCRITURA` en
|
|
12
|
+
* `aprobacion/politica.ts`, así que `nivelDe()` las clasifica como
|
|
13
|
+
* `ejecucion` por su regla de "lo desconocido cuenta como ejecución" — la
|
|
14
|
+
* misma puerta que ya pasa `bash`, sin tocar ese fichero.
|
|
15
|
+
*/
|
|
16
|
+
import { Type } from "typebox";
|
|
17
|
+
import { cerrarSesion, enviarASesion, lanzarSesionInteractiva } from "./sesion.js";
|
|
18
|
+
const GUIA = [
|
|
19
|
+
"Para un comando normal que termina solo, usa bash. Usa bash_interactivo solo cuando esperes que el comando pregunte algo: una confirmación, una contraseña, un REPL.",
|
|
20
|
+
"bash_interactivo devuelve un id de sesión. Si sigue vivo, respóndele con bash_enviar pasando ese id y una línea de texto (puede ser vacía, para solo esperar más).",
|
|
21
|
+
"Cierra la sesión con bash_cerrar en cuanto termines con ella: una sesión olvidada sigue consumiendo un proceso real.",
|
|
22
|
+
];
|
|
23
|
+
function texto(t) {
|
|
24
|
+
return { content: [{ type: "text", text: t }], details: undefined };
|
|
25
|
+
}
|
|
26
|
+
function fallo(error) {
|
|
27
|
+
return texto(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
28
|
+
}
|
|
29
|
+
/** Frase de estado + qué hacer a continuación, para que el modelo no tenga que adivinar. */
|
|
30
|
+
function narrarEstado(r) {
|
|
31
|
+
if (!r.vivo)
|
|
32
|
+
return `[sesión ${r.id}] terminó con código ${r.codigoSalida ?? "desconocido"}.`;
|
|
33
|
+
if (r.esperando) {
|
|
34
|
+
return `[sesión ${r.id}] esperando entrada (${r.motivo}). Responde con bash_enviar (session="${r.id}") o mátala con bash_cerrar.`;
|
|
35
|
+
}
|
|
36
|
+
return `[sesión ${r.id}] sigue en marcha, sin señal reconocible de que esté esperando algo todavía. Puedes esperar más con bash_enviar (session="${r.id}", texto="") o cerrarla con bash_cerrar.`;
|
|
37
|
+
}
|
|
38
|
+
function conSalida(r) {
|
|
39
|
+
return `${narrarEstado(r)}\n\n${r.salida || "(sin salida nueva)"}`;
|
|
40
|
+
}
|
|
41
|
+
function segundosAMs(segundos) {
|
|
42
|
+
return segundos === undefined ? undefined : segundos * 1000;
|
|
43
|
+
}
|
|
44
|
+
export const NOMBRES_INTERACTIVO_TOOLS = ["bash_interactivo", "bash_enviar", "bash_cerrar"];
|
|
45
|
+
export function crearInteractivoTools(opciones) {
|
|
46
|
+
const lanzar = {
|
|
47
|
+
name: "bash_interactivo",
|
|
48
|
+
label: "Bash interactivo",
|
|
49
|
+
description: "Lanza un comando de shell que puede pedir entrada (confirmación, contraseña, REPL) y devuelve " +
|
|
50
|
+
"lo que haya escrito hasta el primer prompt reconocido, hasta que termine, o hasta el timeout. " +
|
|
51
|
+
"El proceso queda vivo entre llamadas: sigue con bash_enviar.",
|
|
52
|
+
promptSnippet: "ejecutar un comando que puede preguntar algo y seguir hablando con él",
|
|
53
|
+
promptGuidelines: GUIA,
|
|
54
|
+
parameters: Type.Object({
|
|
55
|
+
command: Type.String({ description: "Comando de shell a ejecutar" }),
|
|
56
|
+
timeout: Type.Optional(Type.Number({
|
|
57
|
+
description: "Segundos a esperar por un prompt antes de devolver el control (por defecto 10)",
|
|
58
|
+
})),
|
|
59
|
+
}),
|
|
60
|
+
async execute(_id, input) {
|
|
61
|
+
const comando = String(input.command ?? "").trim();
|
|
62
|
+
if (!comando)
|
|
63
|
+
return texto("Falta el comando.");
|
|
64
|
+
try {
|
|
65
|
+
const r = await lanzarSesionInteractiva(comando, {
|
|
66
|
+
cwd: opciones.cwd,
|
|
67
|
+
timeoutMs: segundosAMs(input.timeout),
|
|
68
|
+
});
|
|
69
|
+
return texto(conSalida(r));
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
return fallo(error);
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
const enviar = {
|
|
77
|
+
name: "bash_enviar",
|
|
78
|
+
label: "Enviar a sesión interactiva",
|
|
79
|
+
description: "Manda una línea de texto a una sesión abierta con bash_interactivo (por ejemplo la respuesta a una " +
|
|
80
|
+
"confirmación o una contraseña) y espera la siguiente señal: otro prompt, más salida, o que termine.",
|
|
81
|
+
promptSnippet: "responder a una sesión de bash interactivo abierta",
|
|
82
|
+
promptGuidelines: GUIA,
|
|
83
|
+
parameters: Type.Object({
|
|
84
|
+
session: Type.String({ description: "El id de sesión que devolvió bash_interactivo" }),
|
|
85
|
+
texto: Type.String({ description: "Línea a enviar (se añade un salto de línea). Puede ser vacía." }),
|
|
86
|
+
timeout: Type.Optional(Type.Number({ description: "Segundos a esperar la siguiente señal (por defecto 10)" })),
|
|
87
|
+
}),
|
|
88
|
+
async execute(_id, input) {
|
|
89
|
+
const id = String(input.session ?? "");
|
|
90
|
+
try {
|
|
91
|
+
const r = await enviarASesion(id, String(input.texto ?? ""), {
|
|
92
|
+
timeoutMs: segundosAMs(input.timeout),
|
|
93
|
+
});
|
|
94
|
+
if (r === null)
|
|
95
|
+
return texto(`No hay ninguna sesión interactiva abierta con id "${id}".`);
|
|
96
|
+
return texto(conSalida(r));
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
return fallo(error);
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
const cerrar = {
|
|
104
|
+
name: "bash_cerrar",
|
|
105
|
+
label: "Cerrar sesión interactiva",
|
|
106
|
+
description: "Mata una sesión abierta con bash_interactivo y libera el proceso.",
|
|
107
|
+
promptSnippet: "cerrar una sesión de bash interactivo abierta",
|
|
108
|
+
promptGuidelines: GUIA,
|
|
109
|
+
parameters: Type.Object({
|
|
110
|
+
session: Type.String({ description: "El id de sesión a cerrar" }),
|
|
111
|
+
}),
|
|
112
|
+
async execute(_id, input) {
|
|
113
|
+
const id = String(input.session ?? "");
|
|
114
|
+
const habiaAlgoVivo = cerrarSesion(id);
|
|
115
|
+
if (habiaAlgoVivo === null)
|
|
116
|
+
return texto(`No hay ninguna sesión interactiva abierta con id "${id}".`);
|
|
117
|
+
return texto(habiaAlgoVivo ? `Sesión ${id} cerrada.` : `La sesión ${id} ya había terminado; limpiada.`);
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
return { bash_interactivo: lanzar, bash_enviar: enviar, bash_cerrar: cerrar };
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/core/interactivo/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,uBAAuB,EAAwB,MAAM,aAAa,CAAC;AAEzG,MAAM,IAAI,GAAG;IACZ,wKAAsK;IACtK,yKAAoK;IACpK,wHAAsH;CACtH,CAAC;AAEF,SAAS,KAAK,CAAC,CAAS,EAA4B;IACnD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,CAC7E;AAED,SAAS,KAAK,CAAC,KAAc,EAA4B;IACxD,OAAO,KAAK,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAAA,CACjF;AAED,8FAA4F;AAC5F,SAAS,YAAY,CAAC,CAAkB,EAAU;IACjD,IAAI,CAAC,CAAC,CAAC,IAAI;QAAE,OAAO,YAAW,CAAC,CAAC,EAAE,0BAAwB,CAAC,CAAC,YAAY,IAAI,aAAa,GAAG,CAAC;IAC9F,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO,YAAW,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC,MAAM,yCAAyC,CAAC,CAAC,EAAE,+BAA8B,CAAC;IACnI,CAAC;IACD,OAAO,YAAW,CAAC,CAAC,EAAE,iIAA6H,CAAC,CAAC,EAAE,0CAA0C,CAAC;AAAA,CAClM;AAED,SAAS,SAAS,CAAC,CAAkB,EAAU;IAC9C,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC;AAAA,CACnE;AAED,SAAS,WAAW,CAAC,QAA4B,EAAsB;IACtE,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;AAAA,CAC5D;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,kBAAkB,EAAE,aAAa,EAAE,aAAa,CAAU,CAAC;AAErG,MAAM,UAAU,qBAAqB,CAAC,QAAyB,EAAkC;IAChG,MAAM,MAAM,GAAmD;QAC9D,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACV,kGAAgG;YAChG,gGAAgG;YAChG,8DAA8D;QAC/D,aAAa,EAAE,wEAAuE;QACtF,gBAAgB,EAAE,IAAI;QACtB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACvB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC;YACpE,OAAO,EAAE,IAAI,CAAC,QAAQ,CACrB,IAAI,CAAC,MAAM,CAAC;gBACX,WAAW,EAAE,gFAAgF;aAC7F,CAAC,CACF;SACD,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAqC;YAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAChD,IAAI,CAAC;gBACJ,MAAM,CAAC,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE;oBAChD,GAAG,EAAE,QAAQ,CAAC,GAAG;oBACjB,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,OAA6B,CAAC;iBAC3D,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QAAA,CACD;KACD,CAAC;IAEF,MAAM,MAAM,GAAmD;QAC9D,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,8BAA6B;QACpC,WAAW,EACV,uGAAqG;YACrG,yGAAqG;QACtG,aAAa,EAAE,qDAAoD;QACnE,gBAAgB,EAAE,IAAI;QACtB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACvB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iDAA+C,EAAE,CAAC;YACtF,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mEAA+D,EAAE,CAAC;YACpG,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yDAAwD,EAAE,CAAC,CAAC;SAC9G,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAqC;YAC5D,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC;gBACJ,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;oBAC5D,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,OAA6B,CAAC;iBAC3D,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,IAAI;oBAAE,OAAO,KAAK,CAAC,sDAAqD,EAAE,IAAI,CAAC,CAAC;gBAC1F,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QAAA,CACD;KACD,CAAC;IAEF,MAAM,MAAM,GAAmD;QAC9D,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,4BAA2B;QAClC,WAAW,EAAE,oEAAmE;QAChF,aAAa,EAAE,gDAA+C;QAC9D,gBAAgB,EAAE,IAAI;QACtB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACvB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2BAA0B,EAAE,CAAC;SACjE,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAqC;YAC5D,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACvC,MAAM,aAAa,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,aAAa,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC,sDAAqD,EAAE,IAAI,CAAC,CAAC;YACtG,OAAO,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,WAAU,EAAE,WAAW,CAAC,CAAC,CAAC,cAAa,EAAE,iCAAgC,CAAC,CAAC;QAAA,CACxG;KACD,CAAC;IAEF,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAAA,CAC9E","sourcesContent":["/**\n * Tools de bash interactivo: `bash_interactivo`, `bash_enviar`, `bash_cerrar`.\n *\n * `bash` normal se queda colgado ante un comando que pregunta algo — una\n * confirmación, una contraseña, un REPL— hasta que salta el timeout, y el\n * agente lo lee como \"el comando no responde\". Estas tres tools abren un\n * proceso que sobrevive entre llamadas: `bash_interactivo` lo lanza y\n * devuelve lo que haya hasta el primer prompt (o hasta que termine, o hasta\n * el timeout); `bash_enviar` le manda una línea más; `bash_cerrar` lo mata.\n *\n * Ninguna de las tres está en `LECTURA` ni `ESCRITURA` en\n * `aprobacion/politica.ts`, así que `nivelDe()` las clasifica como\n * `ejecucion` por su regla de \"lo desconocido cuenta como ejecución\" — la\n * misma puerta que ya pasa `bash`, sin tocar ese fichero.\n */\n\nimport { Type } from \"typebox\";\nimport type { AgentToolResult, ToolDefinition } from \"../extensions/types.ts\";\nimport { cerrarSesion, enviarASesion, lanzarSesionInteractiva, type ResultadoSesion } from \"./sesion.ts\";\n\nconst GUIA = [\n\t\"Para un comando normal que termina solo, usa bash. Usa bash_interactivo solo cuando esperes que el comando pregunte algo: una confirmación, una contraseña, un REPL.\",\n\t\"bash_interactivo devuelve un id de sesión. Si sigue vivo, respóndele con bash_enviar pasando ese id y una línea de texto (puede ser vacía, para solo esperar más).\",\n\t\"Cierra la sesión con bash_cerrar en cuanto termines con ella: una sesión olvidada sigue consumiendo un proceso real.\",\n];\n\nfunction texto(t: string): AgentToolResult<unknown> {\n\treturn { content: [{ type: \"text\" as const, text: t }], details: undefined };\n}\n\nfunction fallo(error: unknown): AgentToolResult<unknown> {\n\treturn texto(`Error: ${error instanceof Error ? error.message : String(error)}`);\n}\n\n/** Frase de estado + qué hacer a continuación, para que el modelo no tenga que adivinar. */\nfunction narrarEstado(r: ResultadoSesion): string {\n\tif (!r.vivo) return `[sesión ${r.id}] terminó con código ${r.codigoSalida ?? \"desconocido\"}.`;\n\tif (r.esperando) {\n\t\treturn `[sesión ${r.id}] esperando entrada (${r.motivo}). Responde con bash_enviar (session=\"${r.id}\") o mátala con bash_cerrar.`;\n\t}\n\treturn `[sesión ${r.id}] sigue en marcha, sin señal reconocible de que esté esperando algo todavía. Puedes esperar más con bash_enviar (session=\"${r.id}\", texto=\"\") o cerrarla con bash_cerrar.`;\n}\n\nfunction conSalida(r: ResultadoSesion): string {\n\treturn `${narrarEstado(r)}\\n\\n${r.salida || \"(sin salida nueva)\"}`;\n}\n\nfunction segundosAMs(segundos: number | undefined): number | undefined {\n\treturn segundos === undefined ? undefined : segundos * 1000;\n}\n\nexport const NOMBRES_INTERACTIVO_TOOLS = [\"bash_interactivo\", \"bash_enviar\", \"bash_cerrar\"] as const;\n\nexport function crearInteractivoTools(opciones: { cwd: string }): Record<string, ToolDefinition> {\n\tconst lanzar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"bash_interactivo\",\n\t\tlabel: \"Bash interactivo\",\n\t\tdescription:\n\t\t\t\"Lanza un comando de shell que puede pedir entrada (confirmación, contraseña, REPL) y devuelve \" +\n\t\t\t\"lo que haya escrito hasta el primer prompt reconocido, hasta que termine, o hasta el timeout. \" +\n\t\t\t\"El proceso queda vivo entre llamadas: sigue con bash_enviar.\",\n\t\tpromptSnippet: \"ejecutar un comando que puede preguntar algo y seguir hablando con él\",\n\t\tpromptGuidelines: GUIA,\n\t\tparameters: Type.Object({\n\t\t\tcommand: Type.String({ description: \"Comando de shell a ejecutar\" }),\n\t\t\ttimeout: Type.Optional(\n\t\t\t\tType.Number({\n\t\t\t\t\tdescription: \"Segundos a esperar por un prompt antes de devolver el control (por defecto 10)\",\n\t\t\t\t}),\n\t\t\t),\n\t\t}),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\tconst comando = String(input.command ?? \"\").trim();\n\t\t\tif (!comando) return texto(\"Falta el comando.\");\n\t\t\ttry {\n\t\t\t\tconst r = await lanzarSesionInteractiva(comando, {\n\t\t\t\t\tcwd: opciones.cwd,\n\t\t\t\t\ttimeoutMs: segundosAMs(input.timeout as number | undefined),\n\t\t\t\t});\n\t\t\t\treturn texto(conSalida(r));\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst enviar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"bash_enviar\",\n\t\tlabel: \"Enviar a sesión interactiva\",\n\t\tdescription:\n\t\t\t\"Manda una línea de texto a una sesión abierta con bash_interactivo (por ejemplo la respuesta a una \" +\n\t\t\t\"confirmación o una contraseña) y espera la siguiente señal: otro prompt, más salida, o que termine.\",\n\t\tpromptSnippet: \"responder a una sesión de bash interactivo abierta\",\n\t\tpromptGuidelines: GUIA,\n\t\tparameters: Type.Object({\n\t\t\tsession: Type.String({ description: \"El id de sesión que devolvió bash_interactivo\" }),\n\t\t\ttexto: Type.String({ description: \"Línea a enviar (se añade un salto de línea). Puede ser vacía.\" }),\n\t\t\ttimeout: Type.Optional(Type.Number({ description: \"Segundos a esperar la siguiente señal (por defecto 10)\" })),\n\t\t}),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\tconst id = String(input.session ?? \"\");\n\t\t\ttry {\n\t\t\t\tconst r = await enviarASesion(id, String(input.texto ?? \"\"), {\n\t\t\t\t\ttimeoutMs: segundosAMs(input.timeout as number | undefined),\n\t\t\t\t});\n\t\t\t\tif (r === null) return texto(`No hay ninguna sesión interactiva abierta con id \"${id}\".`);\n\t\t\t\treturn texto(conSalida(r));\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst cerrar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"bash_cerrar\",\n\t\tlabel: \"Cerrar sesión interactiva\",\n\t\tdescription: \"Mata una sesión abierta con bash_interactivo y libera el proceso.\",\n\t\tpromptSnippet: \"cerrar una sesión de bash interactivo abierta\",\n\t\tpromptGuidelines: GUIA,\n\t\tparameters: Type.Object({\n\t\t\tsession: Type.String({ description: \"El id de sesión a cerrar\" }),\n\t\t}),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\tconst id = String(input.session ?? \"\");\n\t\t\tconst habiaAlgoVivo = cerrarSesion(id);\n\t\t\tif (habiaAlgoVivo === null) return texto(`No hay ninguna sesión interactiva abierta con id \"${id}\".`);\n\t\t\treturn texto(habiaAlgoVivo ? `Sesión ${id} cerrada.` : `La sesión ${id} ya había terminado; limpiada.`);\n\t\t},\n\t};\n\n\treturn { bash_interactivo: lanzar, bash_enviar: enviar, bash_cerrar: cerrar };\n}\n"]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El mapa de lo que un `read` truncado NO enseñó.
|
|
3
|
+
*
|
|
4
|
+
* EL CASO, medido sobre este repositorio. `core/agent-session.ts` tiene 4.546
|
|
5
|
+
* líneas y 162 KB. El límite de 50 KB salta antes que el de 2.000 líneas, así
|
|
6
|
+
* que el agente ve las primeras **1.415 líneas (31%)** y nada más. Un bug en la
|
|
7
|
+
* línea 3.000 es invisible.
|
|
8
|
+
*
|
|
9
|
+
* Lo que hay hoy para eso son `offset` y `limit`, y sirven — si sabes a qué
|
|
10
|
+
* línea ir. El agente no lo sabe: le hemos cortado el fichero sin decirle qué
|
|
11
|
+
* había detrás. Su única salida es paginar a ciegas, que gasta turnos, o
|
|
12
|
+
* rendirse y editar lo que sí vio, que es peor.
|
|
13
|
+
*
|
|
14
|
+
* Es la misma familia de siempre. Un corte silencioso se lee como «esto es el
|
|
15
|
+
* fichero», igual que un `[]` se lee como «no hay». La diferencia entre «no
|
|
16
|
+
* está» y «no te lo he enseñado» tiene que ser visible, y aquí no lo era: el
|
|
17
|
+
* aviso decía cuántas líneas faltaban, nunca QUÉ faltaba.
|
|
18
|
+
*
|
|
19
|
+
* QUÉ HACE. Sobre la parte que NO cupo, lista las declaraciones de primer nivel
|
|
20
|
+
* con su línea: funciones, clases, interfaces, tipos y constantes exportadas.
|
|
21
|
+
* El agente pasa de «me faltan 3.131 líneas» a «`_rebuildSystemPrompt` está en
|
|
22
|
+
* la 1537», que es un `read offset=1530` en vez de seis intentos.
|
|
23
|
+
*
|
|
24
|
+
* NO es un resumen del contenido y a propósito. Un resumen lo escribe un modelo
|
|
25
|
+
* y puede inventarse lo que no leyó; esto son nombres y números sacados del
|
|
26
|
+
* árbol de sintaxis. En un registro que se vende como auditable, un mapa que
|
|
27
|
+
* miente es peor que no tener mapa.
|
|
28
|
+
*
|
|
29
|
+
* LÍMITES, dichos antes de que los descubra nadie:
|
|
30
|
+
* · Solo TypeScript y JavaScript. Para el resto se dice que no se pudo mapear,
|
|
31
|
+
* que no es lo mismo que decir que no hay nada — tres estados, no dos.
|
|
32
|
+
* · Se baja UN nivel dentro de clases, y esa decisión está medida. La primera
|
|
33
|
+
* versión solo miraba el primer nivel y sobre `agent-session.ts` —el fichero
|
|
34
|
+
* que motivó todo esto— devolvió CERO declaraciones: sus 4.546 líneas son
|
|
35
|
+
* una sola clase con 106 métodos. Un mapa que se queda en «hay una clase
|
|
36
|
+
* AgentSession en la línea 368» no le dice nada a quien busca dónde está
|
|
37
|
+
* `_rebuildSystemPrompt`. Más adentro no se baja: una función dentro de un
|
|
38
|
+
* método es detalle, no ancla.
|
|
39
|
+
*/
|
|
40
|
+
/** Una declaración que el agente no llegó a ver. */
|
|
41
|
+
export interface Declaracion {
|
|
42
|
+
/** `funcion`, `clase`, `interfaz`, `tipo`, `constante`. */
|
|
43
|
+
que: string;
|
|
44
|
+
nombre: string;
|
|
45
|
+
/** Línea 1-indexada, para poder pasarla a `read offset=`. */
|
|
46
|
+
linea: number;
|
|
47
|
+
exportada: boolean;
|
|
48
|
+
}
|
|
49
|
+
/** Por qué no hay mapa, cuando no lo hay. */
|
|
50
|
+
export type SinMapa = "extension-no-soportada" | "no-parsea" | "nada-que-mapear";
|
|
51
|
+
export interface Mapa {
|
|
52
|
+
declaraciones: Declaracion[];
|
|
53
|
+
/** `null` si sí hay mapa. Un motivo, nunca una lista vacía silenciosa. */
|
|
54
|
+
sinMapa: SinMapa | null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Mapea las declaraciones que caen DESPUÉS de `desdeLinea`.
|
|
58
|
+
*
|
|
59
|
+
* `desdeLinea` es 1-indexada y exclusiva: se pasa el número de la última línea
|
|
60
|
+
* que el agente sí vio, y se devuelve lo que hay a partir de la siguiente.
|
|
61
|
+
*/
|
|
62
|
+
export declare function mapearNoVisto(ruta: string, contenido: string, desdeLinea: number): Mapa;
|
|
63
|
+
/**
|
|
64
|
+
* El mapa, escrito para que el modelo pueda usarlo directamente.
|
|
65
|
+
*
|
|
66
|
+
* Devuelve `null` cuando no hay nada que decir, para que quien llame no tenga
|
|
67
|
+
* que decidir si una cadena vacía significa «sin mapa» o «error».
|
|
68
|
+
*/
|
|
69
|
+
export declare function textoDelMapa(mapa: Mapa, ruta: string): string | null;
|
|
70
|
+
//# sourceMappingURL=mapa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapa.d.ts","sourceRoot":"","sources":["../../../src/core/lectura/mapa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAIH,sDAAoD;AACpD,MAAM,WAAW,WAAW;IAC3B,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,8DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,8CAA6C;AAC7C,MAAM,MAAM,OAAO,GAAG,wBAAwB,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAEjF,MAAM,WAAW,IAAI;IACpB,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,4EAA0E;IAC1E,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACxB;AA8BD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAyDvF;AAKD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA+BpE","sourcesContent":["/**\n * El mapa de lo que un `read` truncado NO enseñó.\n *\n * EL CASO, medido sobre este repositorio. `core/agent-session.ts` tiene 4.546\n * líneas y 162 KB. El límite de 50 KB salta antes que el de 2.000 líneas, así\n * que el agente ve las primeras **1.415 líneas (31%)** y nada más. Un bug en la\n * línea 3.000 es invisible.\n *\n * Lo que hay hoy para eso son `offset` y `limit`, y sirven — si sabes a qué\n * línea ir. El agente no lo sabe: le hemos cortado el fichero sin decirle qué\n * había detrás. Su única salida es paginar a ciegas, que gasta turnos, o\n * rendirse y editar lo que sí vio, que es peor.\n *\n * Es la misma familia de siempre. Un corte silencioso se lee como «esto es el\n * fichero», igual que un `[]` se lee como «no hay». La diferencia entre «no\n * está» y «no te lo he enseñado» tiene que ser visible, y aquí no lo era: el\n * aviso decía cuántas líneas faltaban, nunca QUÉ faltaba.\n *\n * QUÉ HACE. Sobre la parte que NO cupo, lista las declaraciones de primer nivel\n * con su línea: funciones, clases, interfaces, tipos y constantes exportadas.\n * El agente pasa de «me faltan 3.131 líneas» a «`_rebuildSystemPrompt` está en\n * la 1537», que es un `read offset=1530` en vez de seis intentos.\n *\n * NO es un resumen del contenido y a propósito. Un resumen lo escribe un modelo\n * y puede inventarse lo que no leyó; esto son nombres y números sacados del\n * árbol de sintaxis. En un registro que se vende como auditable, un mapa que\n * miente es peor que no tener mapa.\n *\n * LÍMITES, dichos antes de que los descubra nadie:\n * · Solo TypeScript y JavaScript. Para el resto se dice que no se pudo mapear,\n * que no es lo mismo que decir que no hay nada — tres estados, no dos.\n * · Se baja UN nivel dentro de clases, y esa decisión está medida. La primera\n * versión solo miraba el primer nivel y sobre `agent-session.ts` —el fichero\n * que motivó todo esto— devolvió CERO declaraciones: sus 4.546 líneas son\n * una sola clase con 106 métodos. Un mapa que se queda en «hay una clase\n * AgentSession en la línea 368» no le dice nada a quien busca dónde está\n * `_rebuildSystemPrompt`. Más adentro no se baja: una función dentro de un\n * método es detalle, no ancla.\n */\n\nimport ts from \"typescript\";\n\n/** Una declaración que el agente no llegó a ver. */\nexport interface Declaracion {\n\t/** `funcion`, `clase`, `interfaz`, `tipo`, `constante`. */\n\tque: string;\n\tnombre: string;\n\t/** Línea 1-indexada, para poder pasarla a `read offset=`. */\n\tlinea: number;\n\texportada: boolean;\n}\n\n/** Por qué no hay mapa, cuando no lo hay. */\nexport type SinMapa = \"extension-no-soportada\" | \"no-parsea\" | \"nada-que-mapear\";\n\nexport interface Mapa {\n\tdeclaraciones: Declaracion[];\n\t/** `null` si sí hay mapa. Un motivo, nunca una lista vacía silenciosa. */\n\tsinMapa: SinMapa | null;\n}\n\nconst EXTENSIONES = new Set([\".ts\", \".tsx\", \".mts\", \".cts\", \".js\", \".jsx\", \".mjs\", \".cjs\"]);\n\nfunction tipoDe(nodo: ts.Node): string | null {\n\tif (ts.isFunctionDeclaration(nodo)) return \"funcion\";\n\tif (ts.isClassDeclaration(nodo)) return \"clase\";\n\tif (ts.isInterfaceDeclaration(nodo)) return \"interfaz\";\n\tif (ts.isTypeAliasDeclaration(nodo)) return \"tipo\";\n\tif (ts.isEnumDeclaration(nodo)) return \"enum\";\n\tif (ts.isVariableStatement(nodo)) return \"constante\";\n\treturn null;\n}\n\nfunction esExportada(nodo: ts.Node): boolean {\n\tconst mods = ts.canHaveModifiers(nodo) ? ts.getModifiers(nodo) : undefined;\n\treturn mods?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false;\n}\n\nfunction nombreDe(nodo: ts.Node): string | null {\n\tif (ts.isVariableStatement(nodo)) {\n\t\tconst d = nodo.declarationList.declarations[0];\n\t\treturn d && ts.isIdentifier(d.name) ? d.name.text : null;\n\t}\n\tconst conNombre = nodo as ts.Node & { name?: ts.Node };\n\treturn conNombre.name && ts.isIdentifier(conNombre.name as ts.Identifier)\n\t\t? (conNombre.name as ts.Identifier).text\n\t\t: null;\n}\n\n/**\n * Mapea las declaraciones que caen DESPUÉS de `desdeLinea`.\n *\n * `desdeLinea` es 1-indexada y exclusiva: se pasa el número de la última línea\n * que el agente sí vio, y se devuelve lo que hay a partir de la siguiente.\n */\nexport function mapearNoVisto(ruta: string, contenido: string, desdeLinea: number): Mapa {\n\tconst punto = ruta.lastIndexOf(\".\");\n\tif (punto < 0 || !EXTENSIONES.has(ruta.slice(punto))) {\n\t\treturn { declaraciones: [], sinMapa: \"extension-no-soportada\" };\n\t}\n\n\tlet fuente: ts.SourceFile;\n\ttry {\n\t\tfuente = ts.createSourceFile(ruta, contenido, ts.ScriptTarget.Latest, true);\n\t} catch {\n\t\treturn { declaraciones: [], sinMapa: \"no-parsea\" };\n\t}\n\t// «No parsea» hay que preguntárselo a `parseDiagnostics`, no deducirlo.\n\t//\n\t// `createSourceFile` no lanza y es MUY permisivo: sobre\n\t// `esto ( no { es ] typescript` devuelve sentencias igualmente, así que mirar\n\t// si el árbol está vacío daba «nada-que-mapear» sobre un fichero roto — otra\n\t// vez «no puedo» leído como «no hay». Es el mismo mecanismo que ya se midió\n\t// en `core/edicion/parseo.ts` (10 de 10 frente a 7 de 10 con otras vías).\n\t//\n\t// `parseDiagnostics` no está en el tipo público, y aun así es lo correcto:\n\t// contiene SOLO errores de sintaxis, no los del comprobador de tipos, que\n\t// aquí serían ruido.\n\tconst diagnosticos = (fuente as ts.SourceFile & { parseDiagnostics?: unknown }).parseDiagnostics;\n\tif (Array.isArray(diagnosticos) && diagnosticos.length > 0) {\n\t\treturn { declaraciones: [], sinMapa: \"no-parsea\" };\n\t}\n\n\tconst declaraciones: Declaracion[] = [];\n\tfor (const nodo of fuente.statements) {\n\t\tconst que = tipoDe(nodo);\n\t\tif (!que) continue;\n\t\tconst nombre = nombreDe(nodo);\n\t\tif (!nombre) continue;\n\t\tconst linea = fuente.getLineAndCharacterOfPosition(nodo.getStart(fuente)).line + 1;\n\t\tif (linea > desdeLinea) declaraciones.push({ que, nombre, linea, exportada: esExportada(nodo) });\n\n\t\t// Un nivel más, dentro de clases. Sin esto el mapa era inútil justo donde\n\t\t// hacía falta: un fichero de 4.500 líneas que es una sola clase.\n\t\tif (!ts.isClassDeclaration(nodo)) continue;\n\t\tfor (const miembro of nodo.members) {\n\t\t\tif (!ts.isMethodDeclaration(miembro) && !ts.isGetAccessorDeclaration(miembro)) continue;\n\t\t\tif (!ts.isIdentifier(miembro.name) && !ts.isPrivateIdentifier(miembro.name)) continue;\n\t\t\tconst lineaM = fuente.getLineAndCharacterOfPosition(miembro.getStart(fuente)).line + 1;\n\t\t\tif (lineaM <= desdeLinea) continue;\n\t\t\tdeclaraciones.push({\n\t\t\t\tque: ts.isGetAccessorDeclaration(miembro) ? \"getter\" : \"metodo\",\n\t\t\t\t// Con la clase delante: `AgentSession.prompt` se busca mejor que `prompt`.\n\t\t\t\tnombre: `${nombre}.${miembro.name.text}`,\n\t\t\t\tlinea: lineaM,\n\t\t\t\texportada: false,\n\t\t\t});\n\t\t}\n\t}\n\n\tif (declaraciones.length === 0) return { declaraciones: [], sinMapa: \"nada-que-mapear\" };\n\treturn { declaraciones, sinMapa: null };\n}\n\n/** Cuántas declaraciones se enseñan como mucho, para no cambiar un muro por otro. */\nconst TOPE = 40;\n\n/**\n * El mapa, escrito para que el modelo pueda usarlo directamente.\n *\n * Devuelve `null` cuando no hay nada que decir, para que quien llame no tenga\n * que decidir si una cadena vacía significa «sin mapa» o «error».\n */\nexport function textoDelMapa(mapa: Mapa, ruta: string): string | null {\n\tif (mapa.sinMapa === \"nada-que-mapear\") return null;\n\tif (mapa.sinMapa === \"extension-no-soportada\") return null;\n\tif (mapa.sinMapa === \"no-parsea\") {\n\t\t// Se dice, en vez de callar: «no se pudo mapear» y «no hay nada» son\n\t\t// distintos, y confundirlos le haría creer al agente que el resto del\n\t\t// fichero está vacío.\n\t\treturn \"No se ha podido mapear el resto del fichero (no parsea). Usa offset/limit para recorrerlo.\";\n\t}\n\n\tconst orden = [\"clase\", \"interfaz\", \"funcion\", \"metodo\", \"getter\", \"tipo\", \"enum\", \"constante\"];\n\tconst lista = [...mapa.declaraciones].sort((a, b) => a.linea - b.linea);\n\tconst mostradas = lista.slice(0, TOPE);\n\tconst lineas = mostradas.map(\n\t\t(d) => ` ${String(d.linea).padStart(5)} ${d.que.padEnd(10)} ${d.exportada ? \"export \" : \"\"}${d.nombre}`,\n\t);\n\n\tlet texto =\n\t\t`Lo que NO se ha mostrado de ${ruta} contiene estas declaraciones. ` +\n\t\t`Usa \\`read\\` con \\`offset\\` para ir directo a la que necesites:\\n${lineas.join(\"\\n\")}`;\n\tif (lista.length > mostradas.length) {\n\t\t// Se dice cuántas quedan: un mapa truncado en silencio repetiría el mismo\n\t\t// fallo que este módulo existe para arreglar.\n\t\tconst porTipo = orden\n\t\t\t.map((t) => [t, lista.slice(TOPE).filter((d) => d.que === t).length] as const)\n\t\t\t.filter(([, n]) => n > 0)\n\t\t\t.map(([t, n]) => `${n} ${t}${n > 1 ? \"s\" : \"\"}`)\n\t\t\t.join(\", \");\n\t\ttexto += `\\n …y ${lista.length - mostradas.length} más (${porTipo}).`;\n\t}\n\treturn texto;\n}\n"]}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El mapa de lo que un `read` truncado NO enseñó.
|
|
3
|
+
*
|
|
4
|
+
* EL CASO, medido sobre este repositorio. `core/agent-session.ts` tiene 4.546
|
|
5
|
+
* líneas y 162 KB. El límite de 50 KB salta antes que el de 2.000 líneas, así
|
|
6
|
+
* que el agente ve las primeras **1.415 líneas (31%)** y nada más. Un bug en la
|
|
7
|
+
* línea 3.000 es invisible.
|
|
8
|
+
*
|
|
9
|
+
* Lo que hay hoy para eso son `offset` y `limit`, y sirven — si sabes a qué
|
|
10
|
+
* línea ir. El agente no lo sabe: le hemos cortado el fichero sin decirle qué
|
|
11
|
+
* había detrás. Su única salida es paginar a ciegas, que gasta turnos, o
|
|
12
|
+
* rendirse y editar lo que sí vio, que es peor.
|
|
13
|
+
*
|
|
14
|
+
* Es la misma familia de siempre. Un corte silencioso se lee como «esto es el
|
|
15
|
+
* fichero», igual que un `[]` se lee como «no hay». La diferencia entre «no
|
|
16
|
+
* está» y «no te lo he enseñado» tiene que ser visible, y aquí no lo era: el
|
|
17
|
+
* aviso decía cuántas líneas faltaban, nunca QUÉ faltaba.
|
|
18
|
+
*
|
|
19
|
+
* QUÉ HACE. Sobre la parte que NO cupo, lista las declaraciones de primer nivel
|
|
20
|
+
* con su línea: funciones, clases, interfaces, tipos y constantes exportadas.
|
|
21
|
+
* El agente pasa de «me faltan 3.131 líneas» a «`_rebuildSystemPrompt` está en
|
|
22
|
+
* la 1537», que es un `read offset=1530` en vez de seis intentos.
|
|
23
|
+
*
|
|
24
|
+
* NO es un resumen del contenido y a propósito. Un resumen lo escribe un modelo
|
|
25
|
+
* y puede inventarse lo que no leyó; esto son nombres y números sacados del
|
|
26
|
+
* árbol de sintaxis. En un registro que se vende como auditable, un mapa que
|
|
27
|
+
* miente es peor que no tener mapa.
|
|
28
|
+
*
|
|
29
|
+
* LÍMITES, dichos antes de que los descubra nadie:
|
|
30
|
+
* · Solo TypeScript y JavaScript. Para el resto se dice que no se pudo mapear,
|
|
31
|
+
* que no es lo mismo que decir que no hay nada — tres estados, no dos.
|
|
32
|
+
* · Se baja UN nivel dentro de clases, y esa decisión está medida. La primera
|
|
33
|
+
* versión solo miraba el primer nivel y sobre `agent-session.ts` —el fichero
|
|
34
|
+
* que motivó todo esto— devolvió CERO declaraciones: sus 4.546 líneas son
|
|
35
|
+
* una sola clase con 106 métodos. Un mapa que se queda en «hay una clase
|
|
36
|
+
* AgentSession en la línea 368» no le dice nada a quien busca dónde está
|
|
37
|
+
* `_rebuildSystemPrompt`. Más adentro no se baja: una función dentro de un
|
|
38
|
+
* método es detalle, no ancla.
|
|
39
|
+
*/
|
|
40
|
+
import ts from "typescript";
|
|
41
|
+
const EXTENSIONES = new Set([".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"]);
|
|
42
|
+
function tipoDe(nodo) {
|
|
43
|
+
if (ts.isFunctionDeclaration(nodo))
|
|
44
|
+
return "funcion";
|
|
45
|
+
if (ts.isClassDeclaration(nodo))
|
|
46
|
+
return "clase";
|
|
47
|
+
if (ts.isInterfaceDeclaration(nodo))
|
|
48
|
+
return "interfaz";
|
|
49
|
+
if (ts.isTypeAliasDeclaration(nodo))
|
|
50
|
+
return "tipo";
|
|
51
|
+
if (ts.isEnumDeclaration(nodo))
|
|
52
|
+
return "enum";
|
|
53
|
+
if (ts.isVariableStatement(nodo))
|
|
54
|
+
return "constante";
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
function esExportada(nodo) {
|
|
58
|
+
const mods = ts.canHaveModifiers(nodo) ? ts.getModifiers(nodo) : undefined;
|
|
59
|
+
return mods?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false;
|
|
60
|
+
}
|
|
61
|
+
function nombreDe(nodo) {
|
|
62
|
+
if (ts.isVariableStatement(nodo)) {
|
|
63
|
+
const d = nodo.declarationList.declarations[0];
|
|
64
|
+
return d && ts.isIdentifier(d.name) ? d.name.text : null;
|
|
65
|
+
}
|
|
66
|
+
const conNombre = nodo;
|
|
67
|
+
return conNombre.name && ts.isIdentifier(conNombre.name)
|
|
68
|
+
? conNombre.name.text
|
|
69
|
+
: null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Mapea las declaraciones que caen DESPUÉS de `desdeLinea`.
|
|
73
|
+
*
|
|
74
|
+
* `desdeLinea` es 1-indexada y exclusiva: se pasa el número de la última línea
|
|
75
|
+
* que el agente sí vio, y se devuelve lo que hay a partir de la siguiente.
|
|
76
|
+
*/
|
|
77
|
+
export function mapearNoVisto(ruta, contenido, desdeLinea) {
|
|
78
|
+
const punto = ruta.lastIndexOf(".");
|
|
79
|
+
if (punto < 0 || !EXTENSIONES.has(ruta.slice(punto))) {
|
|
80
|
+
return { declaraciones: [], sinMapa: "extension-no-soportada" };
|
|
81
|
+
}
|
|
82
|
+
let fuente;
|
|
83
|
+
try {
|
|
84
|
+
fuente = ts.createSourceFile(ruta, contenido, ts.ScriptTarget.Latest, true);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return { declaraciones: [], sinMapa: "no-parsea" };
|
|
88
|
+
}
|
|
89
|
+
// «No parsea» hay que preguntárselo a `parseDiagnostics`, no deducirlo.
|
|
90
|
+
//
|
|
91
|
+
// `createSourceFile` no lanza y es MUY permisivo: sobre
|
|
92
|
+
// `esto ( no { es ] typescript` devuelve sentencias igualmente, así que mirar
|
|
93
|
+
// si el árbol está vacío daba «nada-que-mapear» sobre un fichero roto — otra
|
|
94
|
+
// vez «no puedo» leído como «no hay». Es el mismo mecanismo que ya se midió
|
|
95
|
+
// en `core/edicion/parseo.ts` (10 de 10 frente a 7 de 10 con otras vías).
|
|
96
|
+
//
|
|
97
|
+
// `parseDiagnostics` no está en el tipo público, y aun así es lo correcto:
|
|
98
|
+
// contiene SOLO errores de sintaxis, no los del comprobador de tipos, que
|
|
99
|
+
// aquí serían ruido.
|
|
100
|
+
const diagnosticos = fuente.parseDiagnostics;
|
|
101
|
+
if (Array.isArray(diagnosticos) && diagnosticos.length > 0) {
|
|
102
|
+
return { declaraciones: [], sinMapa: "no-parsea" };
|
|
103
|
+
}
|
|
104
|
+
const declaraciones = [];
|
|
105
|
+
for (const nodo of fuente.statements) {
|
|
106
|
+
const que = tipoDe(nodo);
|
|
107
|
+
if (!que)
|
|
108
|
+
continue;
|
|
109
|
+
const nombre = nombreDe(nodo);
|
|
110
|
+
if (!nombre)
|
|
111
|
+
continue;
|
|
112
|
+
const linea = fuente.getLineAndCharacterOfPosition(nodo.getStart(fuente)).line + 1;
|
|
113
|
+
if (linea > desdeLinea)
|
|
114
|
+
declaraciones.push({ que, nombre, linea, exportada: esExportada(nodo) });
|
|
115
|
+
// Un nivel más, dentro de clases. Sin esto el mapa era inútil justo donde
|
|
116
|
+
// hacía falta: un fichero de 4.500 líneas que es una sola clase.
|
|
117
|
+
if (!ts.isClassDeclaration(nodo))
|
|
118
|
+
continue;
|
|
119
|
+
for (const miembro of nodo.members) {
|
|
120
|
+
if (!ts.isMethodDeclaration(miembro) && !ts.isGetAccessorDeclaration(miembro))
|
|
121
|
+
continue;
|
|
122
|
+
if (!ts.isIdentifier(miembro.name) && !ts.isPrivateIdentifier(miembro.name))
|
|
123
|
+
continue;
|
|
124
|
+
const lineaM = fuente.getLineAndCharacterOfPosition(miembro.getStart(fuente)).line + 1;
|
|
125
|
+
if (lineaM <= desdeLinea)
|
|
126
|
+
continue;
|
|
127
|
+
declaraciones.push({
|
|
128
|
+
que: ts.isGetAccessorDeclaration(miembro) ? "getter" : "metodo",
|
|
129
|
+
// Con la clase delante: `AgentSession.prompt` se busca mejor que `prompt`.
|
|
130
|
+
nombre: `${nombre}.${miembro.name.text}`,
|
|
131
|
+
linea: lineaM,
|
|
132
|
+
exportada: false,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (declaraciones.length === 0)
|
|
137
|
+
return { declaraciones: [], sinMapa: "nada-que-mapear" };
|
|
138
|
+
return { declaraciones, sinMapa: null };
|
|
139
|
+
}
|
|
140
|
+
/** Cuántas declaraciones se enseñan como mucho, para no cambiar un muro por otro. */
|
|
141
|
+
const TOPE = 40;
|
|
142
|
+
/**
|
|
143
|
+
* El mapa, escrito para que el modelo pueda usarlo directamente.
|
|
144
|
+
*
|
|
145
|
+
* Devuelve `null` cuando no hay nada que decir, para que quien llame no tenga
|
|
146
|
+
* que decidir si una cadena vacía significa «sin mapa» o «error».
|
|
147
|
+
*/
|
|
148
|
+
export function textoDelMapa(mapa, ruta) {
|
|
149
|
+
if (mapa.sinMapa === "nada-que-mapear")
|
|
150
|
+
return null;
|
|
151
|
+
if (mapa.sinMapa === "extension-no-soportada")
|
|
152
|
+
return null;
|
|
153
|
+
if (mapa.sinMapa === "no-parsea") {
|
|
154
|
+
// Se dice, en vez de callar: «no se pudo mapear» y «no hay nada» son
|
|
155
|
+
// distintos, y confundirlos le haría creer al agente que el resto del
|
|
156
|
+
// fichero está vacío.
|
|
157
|
+
return "No se ha podido mapear el resto del fichero (no parsea). Usa offset/limit para recorrerlo.";
|
|
158
|
+
}
|
|
159
|
+
const orden = ["clase", "interfaz", "funcion", "metodo", "getter", "tipo", "enum", "constante"];
|
|
160
|
+
const lista = [...mapa.declaraciones].sort((a, b) => a.linea - b.linea);
|
|
161
|
+
const mostradas = lista.slice(0, TOPE);
|
|
162
|
+
const lineas = mostradas.map((d) => ` ${String(d.linea).padStart(5)} ${d.que.padEnd(10)} ${d.exportada ? "export " : ""}${d.nombre}`);
|
|
163
|
+
let texto = `Lo que NO se ha mostrado de ${ruta} contiene estas declaraciones. ` +
|
|
164
|
+
`Usa \`read\` con \`offset\` para ir directo a la que necesites:\n${lineas.join("\n")}`;
|
|
165
|
+
if (lista.length > mostradas.length) {
|
|
166
|
+
// Se dice cuántas quedan: un mapa truncado en silencio repetiría el mismo
|
|
167
|
+
// fallo que este módulo existe para arreglar.
|
|
168
|
+
const porTipo = orden
|
|
169
|
+
.map((t) => [t, lista.slice(TOPE).filter((d) => d.que === t).length])
|
|
170
|
+
.filter(([, n]) => n > 0)
|
|
171
|
+
.map(([t, n]) => `${n} ${t}${n > 1 ? "s" : ""}`)
|
|
172
|
+
.join(", ");
|
|
173
|
+
texto += `\n …y ${lista.length - mostradas.length} más (${porTipo}).`;
|
|
174
|
+
}
|
|
175
|
+
return texto;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=mapa.js.map
|