@hoilab/ada-cli 0.84.21 → 0.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -2
- package/README.es.md +174 -0
- package/README.md +203 -658
- package/dist/ada-publico.d.ts +35 -0
- package/dist/ada-publico.d.ts.map +1 -0
- package/dist/ada-publico.js +40 -0
- package/dist/ada-publico.js.map +1 -0
- package/dist/cli/args.d.ts +3 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +11 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/audit-command.d.ts +15 -0
- package/dist/cli/audit-command.d.ts.map +1 -0
- package/dist/cli/audit-command.js +280 -0
- package/dist/cli/audit-command.js.map +1 -0
- package/dist/cli/banco-command.d.ts +15 -0
- package/dist/cli/banco-command.d.ts.map +1 -0
- package/dist/cli/banco-command.js +213 -0
- package/dist/cli/banco-command.js.map +1 -0
- package/dist/cli/cleanse-command.d.ts +11 -0
- package/dist/cli/cleanse-command.d.ts.map +1 -0
- package/dist/cli/cleanse-command.js +101 -0
- package/dist/cli/cleanse-command.js.map +1 -0
- package/dist/cli/commit-command.d.ts +31 -0
- package/dist/cli/commit-command.d.ts.map +1 -0
- package/dist/cli/commit-command.js +158 -0
- package/dist/cli/commit-command.js.map +1 -0
- package/dist/cli/computer-command.d.ts +12 -0
- package/dist/cli/computer-command.d.ts.map +1 -0
- package/dist/cli/computer-command.js +141 -0
- package/dist/cli/computer-command.js.map +1 -0
- package/dist/cli/discover-command.d.ts +18 -0
- package/dist/cli/discover-command.d.ts.map +1 -0
- package/dist/cli/discover-command.js +108 -0
- package/dist/cli/discover-command.js.map +1 -0
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +2 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/hashline-command.d.ts +11 -0
- package/dist/cli/hashline-command.d.ts.map +1 -0
- package/dist/cli/hashline-command.js +106 -0
- package/dist/cli/hashline-command.js.map +1 -0
- package/dist/cli/home-screen.d.ts.map +1 -1
- package/dist/cli/home-screen.js +2 -2
- package/dist/cli/home-screen.js.map +1 -1
- package/dist/cli/import-command.d.ts +35 -0
- package/dist/cli/import-command.d.ts.map +1 -0
- package/dist/cli/import-command.js +164 -0
- package/dist/cli/import-command.js.map +1 -0
- package/dist/cli/politica-command.d.ts +20 -0
- package/dist/cli/politica-command.d.ts.map +1 -0
- package/dist/cli/politica-command.js +93 -0
- package/dist/cli/politica-command.js.map +1 -0
- package/dist/cli/refine-command.d.ts +18 -0
- package/dist/cli/refine-command.d.ts.map +1 -0
- package/dist/cli/refine-command.js +101 -0
- package/dist/cli/refine-command.js.map +1 -0
- package/dist/cli/review-command.d.ts +24 -0
- package/dist/cli/review-command.d.ts.map +1 -0
- package/dist/cli/review-command.js +168 -0
- package/dist/cli/review-command.js.map +1 -0
- package/dist/cli/schedule-command.d.ts +17 -0
- package/dist/cli/schedule-command.d.ts.map +1 -0
- package/dist/cli/schedule-command.js +117 -0
- package/dist/cli/schedule-command.js.map +1 -0
- package/dist/cli/serve-command.d.ts +72 -0
- package/dist/cli/serve-command.d.ts.map +1 -0
- package/dist/cli/serve-command.js +568 -0
- package/dist/cli/serve-command.js.map +1 -0
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +9 -3
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/cli/telegram-command.d.ts +18 -0
- package/dist/cli/telegram-command.d.ts.map +1 -0
- package/dist/cli/telegram-command.js +137 -0
- package/dist/cli/telegram-command.js.map +1 -0
- package/dist/cli/telemetria-command.d.ts +22 -0
- package/dist/cli/telemetria-command.d.ts.map +1 -0
- package/dist/cli/telemetria-command.js +127 -0
- package/dist/cli/telemetria-command.js.map +1 -0
- package/dist/cli/undo-command.d.ts +9 -0
- package/dist/cli/undo-command.d.ts.map +1 -0
- package/dist/cli/undo-command.js +56 -0
- package/dist/cli/undo-command.js.map +1 -0
- package/dist/cli/usage-command.d.ts +10 -0
- package/dist/cli/usage-command.d.ts.map +1 -0
- package/dist/cli/usage-command.js +209 -0
- package/dist/cli/usage-command.js.map +1 -0
- package/dist/cli/wiki-command.d.ts +9 -0
- package/dist/cli/wiki-command.d.ts.map +1 -0
- package/dist/cli/wiki-command.js +76 -0
- package/dist/cli/wiki-command.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -11
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -2
- package/dist/config.js.map +1 -1
- package/dist/core/ada.d.ts +58 -0
- package/dist/core/ada.d.ts.map +1 -0
- package/dist/core/ada.js +61 -0
- package/dist/core/ada.js.map +1 -0
- package/dist/core/advisor/guarda.d.ts +66 -0
- package/dist/core/advisor/guarda.d.ts.map +1 -0
- package/dist/core/advisor/guarda.js +191 -0
- package/dist/core/advisor/guarda.js.map +1 -0
- package/dist/core/advisor/runtime.d.ts +66 -0
- package/dist/core/advisor/runtime.d.ts.map +1 -0
- package/dist/core/advisor/runtime.js +121 -0
- package/dist/core/advisor/runtime.js.map +1 -0
- package/dist/core/advisor/sesion.d.ts +109 -0
- package/dist/core/advisor/sesion.d.ts.map +1 -0
- package/dist/core/advisor/sesion.js +139 -0
- package/dist/core/advisor/sesion.js.map +1 -0
- package/dist/core/agent-session.d.ts +85 -7
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +862 -78
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents/loader.d.ts +77 -0
- package/dist/core/agents/loader.d.ts.map +1 -0
- package/dist/core/agents/loader.js +154 -0
- package/dist/core/agents/loader.js.map +1 -0
- package/dist/core/aprobacion/generados.d.ts +37 -0
- package/dist/core/aprobacion/generados.d.ts.map +1 -0
- package/dist/core/aprobacion/generados.js +85 -0
- package/dist/core/aprobacion/generados.js.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.js +212 -0
- package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
- package/dist/core/aprobacion/politica.d.ts +90 -0
- package/dist/core/aprobacion/politica.d.ts.map +1 -0
- package/dist/core/aprobacion/politica.js +375 -0
- package/dist/core/aprobacion/politica.js.map +1 -0
- package/dist/core/arranque/atajos.d.ts +46 -0
- package/dist/core/arranque/atajos.d.ts.map +1 -0
- package/dist/core/arranque/atajos.js +113 -0
- package/dist/core/arranque/atajos.js.map +1 -0
- package/dist/core/audit/exportacion.d.ts +54 -0
- package/dist/core/audit/exportacion.d.ts.map +1 -0
- package/dist/core/audit/exportacion.js +265 -0
- package/dist/core/audit/exportacion.js.map +1 -0
- package/dist/core/audit/libro.d.ts +318 -0
- package/dist/core/audit/libro.d.ts.map +1 -0
- package/dist/core/audit/libro.js +508 -0
- package/dist/core/audit/libro.js.map +1 -0
- package/dist/core/audit/registro-sesion.d.ts +78 -0
- package/dist/core/audit/registro-sesion.d.ts.map +1 -0
- package/dist/core/audit/registro-sesion.js +202 -0
- package/dist/core/audit/registro-sesion.js.map +1 -0
- package/dist/core/audit/retencion.d.ts +82 -0
- package/dist/core/audit/retencion.d.ts.map +1 -0
- package/dist/core/audit/retencion.js +152 -0
- package/dist/core/audit/retencion.js.map +1 -0
- package/dist/core/audit/rutas.d.ts +23 -0
- package/dist/core/audit/rutas.d.ts.map +1 -0
- package/dist/core/audit/rutas.js +23 -0
- package/dist/core/audit/rutas.js.map +1 -0
- package/dist/core/auth-storage.d.ts +0 -3
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +21 -8
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/banco/almacenamiento.d.ts +18 -0
- package/dist/core/banco/almacenamiento.d.ts.map +1 -0
- package/dist/core/banco/almacenamiento.js +50 -0
- package/dist/core/banco/almacenamiento.js.map +1 -0
- package/dist/core/banco/analisis.d.ts +37 -0
- package/dist/core/banco/analisis.d.ts.map +1 -0
- package/dist/core/banco/analisis.js +164 -0
- package/dist/core/banco/analisis.js.map +1 -0
- package/dist/core/banco/bloques.d.ts +39 -0
- package/dist/core/banco/bloques.d.ts.map +1 -0
- package/dist/core/banco/bloques.js +84 -0
- package/dist/core/banco/bloques.js.map +1 -0
- package/dist/core/banco/cargas.d.ts +84 -0
- package/dist/core/banco/cargas.d.ts.map +1 -0
- package/dist/core/banco/cargas.js +520 -0
- package/dist/core/banco/cargas.js.map +1 -0
- package/dist/core/banco/comparar.d.ts +29 -0
- package/dist/core/banco/comparar.d.ts.map +1 -0
- package/dist/core/banco/comparar.js +28 -0
- package/dist/core/banco/comparar.js.map +1 -0
- package/dist/core/banco/ejecutar.d.ts +44 -0
- package/dist/core/banco/ejecutar.d.ts.map +1 -0
- package/dist/core/banco/ejecutar.js +183 -0
- package/dist/core/banco/ejecutar.js.map +1 -0
- package/dist/core/banco/generar.d.ts +24 -0
- package/dist/core/banco/generar.d.ts.map +1 -0
- package/dist/core/banco/generar.js +159 -0
- package/dist/core/banco/generar.js.map +1 -0
- package/dist/core/banco/mutaciones.d.ts +25 -0
- package/dist/core/banco/mutaciones.d.ts.map +1 -0
- package/dist/core/banco/mutaciones.js +215 -0
- package/dist/core/banco/mutaciones.js.map +1 -0
- package/dist/core/banco/tipos.d.ts +121 -0
- package/dist/core/banco/tipos.d.ts.map +1 -0
- package/dist/core/banco/tipos.js +16 -0
- package/dist/core/banco/tipos.js.map +1 -0
- package/dist/core/blobs/almacen.d.ts +81 -0
- package/dist/core/blobs/almacen.d.ts.map +1 -0
- package/dist/core/blobs/almacen.js +198 -0
- package/dist/core/blobs/almacen.js.map +1 -0
- package/dist/core/blobs/broker.d.ts +103 -0
- package/dist/core/blobs/broker.d.ts.map +1 -0
- package/dist/core/blobs/broker.js +204 -0
- package/dist/core/blobs/broker.js.map +1 -0
- package/dist/core/blobs/index.d.ts +70 -0
- package/dist/core/blobs/index.d.ts.map +1 -0
- package/dist/core/blobs/index.js +232 -0
- package/dist/core/blobs/index.js.map +1 -0
- package/dist/core/blobs/payload.d.ts +55 -0
- package/dist/core/blobs/payload.d.ts.map +1 -0
- package/dist/core/blobs/payload.js +255 -0
- package/dist/core/blobs/payload.js.map +1 -0
- package/dist/core/blobs/proveedor.d.ts +85 -0
- package/dist/core/blobs/proveedor.d.ts.map +1 -0
- package/dist/core/blobs/proveedor.js +196 -0
- package/dist/core/blobs/proveedor.js.map +1 -0
- package/dist/core/browser/cdp.d.ts +41 -0
- package/dist/core/browser/cdp.d.ts.map +1 -0
- package/dist/core/browser/cdp.js +119 -0
- package/dist/core/browser/cdp.js.map +1 -0
- package/dist/core/browser/politica.d.ts +51 -0
- package/dist/core/browser/politica.d.ts.map +1 -0
- package/dist/core/browser/politica.js +123 -0
- package/dist/core/browser/politica.js.map +1 -0
- package/dist/core/browser/sesion.d.ts +52 -0
- package/dist/core/browser/sesion.d.ts.map +1 -0
- package/dist/core/browser/sesion.js +176 -0
- package/dist/core/browser/sesion.js.map +1 -0
- package/dist/core/browser/tools.d.ts +16 -0
- package/dist/core/browser/tools.d.ts.map +1 -0
- package/dist/core/browser/tools.js +279 -0
- package/dist/core/browser/tools.js.map +1 -0
- package/dist/core/commit/diff.d.ts +56 -0
- package/dist/core/commit/diff.d.ts.map +1 -0
- package/dist/core/commit/diff.js +145 -0
- package/dist/core/commit/diff.js.map +1 -0
- package/dist/core/commit/mensaje.d.ts +80 -0
- package/dist/core/commit/mensaje.d.ts.map +1 -0
- package/dist/core/commit/mensaje.js +207 -0
- package/dist/core/commit/mensaje.js.map +1 -0
- package/dist/core/compactar/index.d.ts +52 -0
- package/dist/core/compactar/index.d.ts.map +1 -0
- package/dist/core/compactar/index.js +91 -0
- package/dist/core/compactar/index.js.map +1 -0
- package/dist/core/compactar/registro-denso.d.ts +160 -0
- package/dist/core/compactar/registro-denso.d.ts.map +1 -0
- package/dist/core/compactar/registro-denso.js +620 -0
- package/dist/core/compactar/registro-denso.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +3 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +4 -3
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +41 -32
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/computer/captura.d.ts +35 -0
- package/dist/core/computer/captura.d.ts.map +1 -0
- package/dist/core/computer/captura.js +140 -0
- package/dist/core/computer/captura.js.map +1 -0
- package/dist/core/computer/driver.d.ts +130 -0
- package/dist/core/computer/driver.d.ts.map +1 -0
- package/dist/core/computer/driver.js +206 -0
- package/dist/core/computer/driver.js.map +1 -0
- package/dist/core/computer/motor/actions.d.ts +109 -0
- package/dist/core/computer/motor/actions.d.ts.map +1 -0
- package/dist/core/computer/motor/actions.js +157 -0
- package/dist/core/computer/motor/actions.js.map +1 -0
- package/dist/core/computer/motor/bridge.d.ts +232 -0
- package/dist/core/computer/motor/bridge.d.ts.map +1 -0
- package/dist/core/computer/motor/bridge.js +2335 -0
- package/dist/core/computer/motor/bridge.js.map +1 -0
- package/dist/core/computer/motor/cdp.d.ts +107 -0
- package/dist/core/computer/motor/cdp.d.ts.map +1 -0
- package/dist/core/computer/motor/cdp.js +659 -0
- package/dist/core/computer/motor/cdp.js.map +1 -0
- package/dist/core/computer/motor/config.d.ts +23 -0
- package/dist/core/computer/motor/config.d.ts.map +1 -0
- package/dist/core/computer/motor/config.js +100 -0
- package/dist/core/computer/motor/config.js.map +1 -0
- package/dist/core/computer/motor/contract.d.ts +81 -0
- package/dist/core/computer/motor/contract.d.ts.map +1 -0
- package/dist/core/computer/motor/contract.js +14 -0
- package/dist/core/computer/motor/contract.js.map +1 -0
- package/dist/core/computer/motor/note.d.ts +37 -0
- package/dist/core/computer/motor/note.d.ts.map +1 -0
- package/dist/core/computer/motor/note.js +162 -0
- package/dist/core/computer/motor/note.js.map +1 -0
- package/dist/core/computer/motor/outline.d.ts +155 -0
- package/dist/core/computer/motor/outline.d.ts.map +1 -0
- package/dist/core/computer/motor/outline.js +590 -0
- package/dist/core/computer/motor/outline.js.map +1 -0
- package/dist/core/computer/motor/output.d.ts +18 -0
- package/dist/core/computer/motor/output.d.ts.map +1 -0
- package/dist/core/computer/motor/output.js +148 -0
- package/dist/core/computer/motor/output.js.map +1 -0
- package/dist/core/computer/motor/permissions.d.ts +41 -0
- package/dist/core/computer/motor/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/permissions.js +51 -0
- package/dist/core/computer/motor/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
- package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/architecture.js +21 -0
- package/dist/core/computer/motor/platform/architecture.js.map +1 -0
- package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
- package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/coerce.js +17 -0
- package/dist/core/computer/motor/platform/coerce.js.map +1 -0
- package/dist/core/computer/motor/platform/index.d.ts +4 -0
- package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/index.js +79 -0
- package/dist/core/computer/motor/platform/index.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.js +173 -0
- package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.js +261 -0
- package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.js +124 -0
- package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.js +101 -0
- package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper.js +277 -0
- package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
- package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/types.d.ts +263 -0
- package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/types.js +2 -0
- package/dist/core/computer/motor/platform/types.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.js +163 -0
- package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.js +174 -0
- package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
- package/dist/core/computer/motor/root-selection.d.ts +6 -0
- package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
- package/dist/core/computer/motor/root-selection.js +28 -0
- package/dist/core/computer/motor/root-selection.js.map +1 -0
- package/dist/core/computer/motor/runtime.d.ts +50 -0
- package/dist/core/computer/motor/runtime.d.ts.map +1 -0
- package/dist/core/computer/motor/runtime.js +119 -0
- package/dist/core/computer/motor/runtime.js.map +1 -0
- package/dist/core/computer/motor/state.d.ts +68 -0
- package/dist/core/computer/motor/state.d.ts.map +1 -0
- package/dist/core/computer/motor/state.js +100 -0
- package/dist/core/computer/motor/state.js.map +1 -0
- package/dist/core/computer/motor/view.d.ts +6 -0
- package/dist/core/computer/motor/view.d.ts.map +1 -0
- package/dist/core/computer/motor/view.js +185 -0
- package/dist/core/computer/motor/view.js.map +1 -0
- package/dist/core/computer/motor-ada.d.ts +159 -0
- package/dist/core/computer/motor-ada.d.ts.map +1 -0
- package/dist/core/computer/motor-ada.js +412 -0
- package/dist/core/computer/motor-ada.js.map +1 -0
- package/dist/core/computer/politica.d.ts +56 -0
- package/dist/core/computer/politica.d.ts.map +1 -0
- package/dist/core/computer/politica.js +163 -0
- package/dist/core/computer/politica.js.map +1 -0
- package/dist/core/computer/tools.d.ts +26 -0
- package/dist/core/computer/tools.d.ts.map +1 -0
- package/dist/core/computer/tools.js +399 -0
- package/dist/core/computer/tools.js.map +1 -0
- package/dist/core/context-breakdown.d.ts +80 -0
- package/dist/core/context-breakdown.d.ts.map +1 -0
- package/dist/core/context-breakdown.js +87 -0
- package/dist/core/context-breakdown.js.map +1 -0
- package/dist/core/credenciales/cliente.d.ts +60 -0
- package/dist/core/credenciales/cliente.d.ts.map +1 -0
- package/dist/core/credenciales/cliente.js +81 -0
- package/dist/core/credenciales/cliente.js.map +1 -0
- package/dist/core/credenciales/pool.d.ts +96 -0
- package/dist/core/credenciales/pool.d.ts.map +1 -0
- package/dist/core/credenciales/pool.js +128 -0
- package/dist/core/credenciales/pool.js.map +1 -0
- package/dist/core/credenciales/reposo.d.ts +93 -0
- package/dist/core/credenciales/reposo.d.ts.map +1 -0
- package/dist/core/credenciales/reposo.js +489 -0
- package/dist/core/credenciales/reposo.js.map +1 -0
- package/dist/core/credenciales/servidor.d.ts +55 -0
- package/dist/core/credenciales/servidor.d.ts.map +1 -0
- package/dist/core/credenciales/servidor.js +205 -0
- package/dist/core/credenciales/servidor.js.map +1 -0
- package/dist/core/defaults.d.ts +1 -0
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/defaults.js +9 -0
- package/dist/core/defaults.js.map +1 -1
- package/dist/core/descubrimiento/comandos.d.ts +30 -0
- package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
- package/dist/core/descubrimiento/comandos.js +76 -0
- package/dist/core/descubrimiento/comandos.js.map +1 -0
- package/dist/core/descubrimiento/mcp.d.ts +42 -0
- package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
- package/dist/core/descubrimiento/mcp.js +130 -0
- package/dist/core/descubrimiento/mcp.js.map +1 -0
- package/dist/core/descubrimiento/reglas.d.ts +61 -0
- package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
- package/dist/core/descubrimiento/reglas.js +134 -0
- package/dist/core/descubrimiento/reglas.js.map +1 -0
- package/dist/core/descubrimiento/skills.d.ts +57 -0
- package/dist/core/descubrimiento/skills.d.ts.map +1 -0
- package/dist/core/descubrimiento/skills.js +113 -0
- package/dist/core/descubrimiento/skills.js.map +1 -0
- package/dist/core/dificultad/clasificador.d.ts +133 -0
- package/dist/core/dificultad/clasificador.d.ts.map +1 -0
- package/dist/core/dificultad/clasificador.js +288 -0
- package/dist/core/dificultad/clasificador.js.map +1 -0
- package/dist/core/edicion/diario.d.ts +37 -0
- package/dist/core/edicion/diario.d.ts.map +1 -0
- package/dist/core/edicion/diario.js +51 -0
- package/dist/core/edicion/diario.js.map +1 -0
- package/dist/core/edicion/hashline.d.ts +71 -0
- package/dist/core/edicion/hashline.d.ts.map +1 -0
- package/dist/core/edicion/hashline.js +111 -0
- package/dist/core/edicion/hashline.js.map +1 -0
- package/dist/core/edicion/hueco.d.ts +64 -0
- package/dist/core/edicion/hueco.d.ts.map +1 -0
- package/dist/core/edicion/hueco.js +162 -0
- package/dist/core/edicion/hueco.js.map +1 -0
- package/dist/core/edicion/limpiar-carga.d.ts +39 -0
- package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
- package/dist/core/edicion/limpiar-carga.js +121 -0
- package/dist/core/edicion/limpiar-carga.js.map +1 -0
- package/dist/core/edicion/observador.d.ts +80 -0
- package/dist/core/edicion/observador.d.ts.map +1 -0
- package/dist/core/edicion/observador.js +183 -0
- package/dist/core/edicion/observador.js.map +1 -0
- package/dist/core/edicion/parecido.d.ts +53 -0
- package/dist/core/edicion/parecido.d.ts.map +1 -0
- package/dist/core/edicion/parecido.js +145 -0
- package/dist/core/edicion/parecido.js.map +1 -0
- package/dist/core/edicion/parseo.d.ts +58 -0
- package/dist/core/edicion/parseo.d.ts.map +1 -0
- package/dist/core/edicion/parseo.js +124 -0
- package/dist/core/edicion/parseo.js.map +1 -0
- package/dist/core/edicion/reparacion.d.ts +67 -0
- package/dist/core/edicion/reparacion.d.ts.map +1 -0
- package/dist/core/edicion/reparacion.js +202 -0
- package/dist/core/edicion/reparacion.js.map +1 -0
- package/dist/core/edicion/sangria.d.ts +121 -0
- package/dist/core/edicion/sangria.d.ts.map +1 -0
- package/dist/core/edicion/sangria.js +341 -0
- package/dist/core/edicion/sangria.js.map +1 -0
- package/dist/core/edicion/tipos.d.ts +58 -0
- package/dist/core/edicion/tipos.d.ts.map +1 -0
- package/dist/core/edicion/tipos.js +160 -0
- package/dist/core/edicion/tipos.js.map +1 -0
- package/dist/core/engine-personality.d.ts +12 -0
- package/dist/core/engine-personality.d.ts.map +1 -0
- package/dist/core/engine-personality.js +53 -0
- package/dist/core/engine-personality.js.map +1 -0
- package/dist/core/errores/proveedor.d.ts +53 -0
- package/dist/core/errores/proveedor.d.ts.map +1 -0
- package/dist/core/errores/proveedor.js +191 -0
- package/dist/core/errores/proveedor.js.map +1 -0
- package/dist/core/estructural/buscar.d.ts +61 -0
- package/dist/core/estructural/buscar.d.ts.map +1 -0
- package/dist/core/estructural/buscar.js +261 -0
- package/dist/core/estructural/buscar.js.map +1 -0
- package/dist/core/estructural/editar.d.ts +36 -0
- package/dist/core/estructural/editar.d.ts.map +1 -0
- package/dist/core/estructural/editar.js +123 -0
- package/dist/core/estructural/editar.js.map +1 -0
- package/dist/core/estructural/tools.d.ts +11 -0
- package/dist/core/estructural/tools.d.ts.map +1 -0
- package/dist/core/estructural/tools.js +100 -0
- package/dist/core/estructural/tools.js.map +1 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +10 -1
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensiones/suplantacion.d.ts +49 -0
- package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
- package/dist/core/extensiones/suplantacion.js +61 -0
- package/dist/core/extensiones/suplantacion.js.map +1 -0
- package/dist/core/extensiones/vigilancia.d.ts +54 -0
- package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
- package/dist/core/extensiones/vigilancia.js +217 -0
- package/dist/core/extensiones/vigilancia.js.map +1 -0
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +21 -6
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +23 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
- package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
- package/dist/core/harness/fuentes-de-contexto.js +44 -0
- package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
- package/dist/core/harness/refine.d.ts +40 -0
- package/dist/core/harness/refine.d.ts.map +1 -0
- package/dist/core/harness/refine.js +109 -0
- package/dist/core/harness/refine.js.map +1 -0
- package/dist/core/harness/store.d.ts +75 -0
- package/dist/core/harness/store.d.ts.map +1 -0
- package/dist/core/harness/store.js +149 -0
- package/dist/core/harness/store.js.map +1 -0
- package/dist/core/hooks/contract.d.ts +85 -0
- package/dist/core/hooks/contract.d.ts.map +1 -0
- package/dist/core/hooks/contract.js +140 -0
- package/dist/core/hooks/contract.js.map +1 -0
- package/dist/core/hooks/runner.d.ts +42 -0
- package/dist/core/hooks/runner.d.ts.map +1 -0
- package/dist/core/hooks/runner.js +85 -0
- package/dist/core/hooks/runner.js.map +1 -0
- package/dist/core/hooks/session-hooks.d.ts +62 -0
- package/dist/core/hooks/session-hooks.d.ts.map +1 -0
- package/dist/core/hooks/session-hooks.js +84 -0
- package/dist/core/hooks/session-hooks.js.map +1 -0
- package/dist/core/importar/formatos.d.ts +69 -0
- package/dist/core/importar/formatos.d.ts.map +1 -0
- package/dist/core/importar/formatos.js +235 -0
- package/dist/core/importar/formatos.js.map +1 -0
- package/dist/core/interactivo/deteccion.d.ts +44 -0
- package/dist/core/interactivo/deteccion.d.ts.map +1 -0
- package/dist/core/interactivo/deteccion.js +82 -0
- package/dist/core/interactivo/deteccion.js.map +1 -0
- package/dist/core/interactivo/sesion.d.ts +50 -0
- package/dist/core/interactivo/sesion.d.ts.map +1 -0
- package/dist/core/interactivo/sesion.js +156 -0
- package/dist/core/interactivo/sesion.js.map +1 -0
- package/dist/core/interactivo/tools.d.ts +21 -0
- package/dist/core/interactivo/tools.d.ts.map +1 -0
- package/dist/core/interactivo/tools.js +122 -0
- package/dist/core/interactivo/tools.js.map +1 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/lectura/mapa.d.ts +70 -0
- package/dist/core/lectura/mapa.d.ts.map +1 -0
- package/dist/core/lectura/mapa.js +177 -0
- package/dist/core/lectura/mapa.js.map +1 -0
- package/dist/core/lectura/pdf.d.ts +49 -0
- package/dist/core/lectura/pdf.d.ts.map +1 -0
- package/dist/core/lectura/pdf.js +337 -0
- package/dist/core/lectura/pdf.js.map +1 -0
- package/dist/core/limpieza/comprobadores.d.ts +28 -0
- package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
- package/dist/core/limpieza/comprobadores.js +311 -0
- package/dist/core/limpieza/comprobadores.js.map +1 -0
- package/dist/core/limpieza/parseo.d.ts +19 -0
- package/dist/core/limpieza/parseo.d.ts.map +1 -0
- package/dist/core/limpieza/parseo.js +124 -0
- package/dist/core/limpieza/parseo.js.map +1 -0
- package/dist/core/limpieza/reparacion.d.ts +77 -0
- package/dist/core/limpieza/reparacion.d.ts.map +1 -0
- package/dist/core/limpieza/reparacion.js +254 -0
- package/dist/core/limpieza/reparacion.js.map +1 -0
- package/dist/core/limpieza/tipos.d.ts +56 -0
- package/dist/core/limpieza/tipos.d.ts.map +1 -0
- package/dist/core/limpieza/tipos.js +9 -0
- package/dist/core/limpieza/tipos.js.map +1 -0
- package/dist/core/lsp/cliente.d.ts +52 -0
- package/dist/core/lsp/cliente.d.ts.map +1 -0
- package/dist/core/lsp/cliente.js +232 -0
- package/dist/core/lsp/cliente.js.map +1 -0
- package/dist/core/lsp/descubrimiento.d.ts +62 -0
- package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
- package/dist/core/lsp/descubrimiento.js +152 -0
- package/dist/core/lsp/descubrimiento.js.map +1 -0
- package/dist/core/lsp/ediciones.d.ts +59 -0
- package/dist/core/lsp/ediciones.d.ts.map +1 -0
- package/dist/core/lsp/ediciones.js +89 -0
- package/dist/core/lsp/ediciones.js.map +1 -0
- package/dist/core/lsp/extension.d.ts +28 -0
- package/dist/core/lsp/extension.d.ts.map +1 -0
- package/dist/core/lsp/extension.js +34 -0
- package/dist/core/lsp/extension.js.map +1 -0
- package/dist/core/lsp/tools.d.ts +45 -0
- package/dist/core/lsp/tools.d.ts.map +1 -0
- package/dist/core/lsp/tools.js +265 -0
- package/dist/core/lsp/tools.js.map +1 -0
- package/dist/core/mcp/client.d.ts +60 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +139 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/manager.d.ts +86 -0
- package/dist/core/mcp/manager.d.ts.map +1 -0
- package/dist/core/mcp/manager.js +124 -0
- package/dist/core/mcp/manager.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +15 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +84 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/memory-engine/audit-export.d.ts +56 -0
- package/dist/core/memory-engine/audit-export.d.ts.map +1 -0
- package/dist/core/memory-engine/audit-export.js +100 -0
- package/dist/core/memory-engine/audit-export.js.map +1 -0
- package/dist/core/memory-engine/audit-indice.d.ts +153 -0
- package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
- package/dist/core/memory-engine/audit-indice.js +271 -0
- package/dist/core/memory-engine/audit-indice.js.map +1 -0
- package/dist/core/memory-engine/audit.d.ts +18 -6
- package/dist/core/memory-engine/audit.d.ts.map +1 -1
- package/dist/core/memory-engine/audit.js +32 -50
- package/dist/core/memory-engine/audit.js.map +1 -1
- package/dist/core/memory-engine/engine.d.ts +21 -4
- package/dist/core/memory-engine/engine.d.ts.map +1 -1
- package/dist/core/memory-engine/engine.js +219 -55
- package/dist/core/memory-engine/engine.js.map +1 -1
- package/dist/core/memory-engine/inverted-index.d.ts.map +1 -1
- package/dist/core/memory-engine/inverted-index.js +67 -10
- package/dist/core/memory-engine/inverted-index.js.map +1 -1
- package/dist/core/memory-engine/keychain.d.ts.map +1 -1
- package/dist/core/memory-engine/keychain.js +1 -6
- package/dist/core/memory-engine/keychain.js.map +1 -1
- package/dist/core/memory-engine/observation-store.d.ts +0 -1
- package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
- package/dist/core/memory-engine/observation-store.js +40 -12
- package/dist/core/memory-engine/observation-store.js.map +1 -1
- package/dist/core/memory-engine/refinements.d.ts +51 -0
- package/dist/core/memory-engine/refinements.d.ts.map +1 -0
- package/dist/core/memory-engine/refinements.js +99 -0
- package/dist/core/memory-engine/refinements.js.map +1 -0
- package/dist/core/memory-engine/scanner.d.ts.map +1 -1
- package/dist/core/memory-engine/scanner.js +25 -5
- package/dist/core/memory-engine/scanner.js.map +1 -1
- package/dist/core/memory-engine/security.d.ts.map +1 -1
- package/dist/core/memory-engine/security.js +131 -23
- package/dist/core/memory-engine/security.js.map +1 -1
- package/dist/core/memory-engine/session-indexer.d.ts.map +1 -1
- package/dist/core/memory-engine/session-indexer.js +8 -2
- package/dist/core/memory-engine/session-indexer.js.map +1 -1
- package/dist/core/memory-engine/tools.d.ts +2 -2
- package/dist/core/memory-engine/tools.d.ts.map +1 -1
- package/dist/core/memory-engine/tools.js +41 -8
- package/dist/core/memory-engine/tools.js.map +1 -1
- package/dist/core/memory-engine/types.d.ts +2 -0
- package/dist/core/memory-engine/types.d.ts.map +1 -1
- package/dist/core/memory-engine/types.js.map +1 -1
- package/dist/core/memory-engine/vault.d.ts.map +1 -1
- package/dist/core/memory-engine/vault.js +2 -2
- package/dist/core/memory-engine/vault.js.map +1 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +2 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +19 -7
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js +2 -1
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/muestreo-restringido.d.ts +49 -0
- package/dist/core/muestreo-restringido.d.ts.map +1 -0
- package/dist/core/muestreo-restringido.js +65 -0
- package/dist/core/muestreo-restringido.js.map +1 -0
- package/dist/core/orphan-process-journal.d.ts +48 -0
- package/dist/core/orphan-process-journal.d.ts.map +1 -0
- package/dist/core/orphan-process-journal.js +116 -0
- package/dist/core/orphan-process-journal.js.map +1 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +11 -6
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-manifest.d.ts.map +1 -1
- package/dist/core/pi-manifest.js +2 -1
- package/dist/core/pi-manifest.js.map +1 -1
- package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
- package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
- package/dist/core/privacidad/categorias-especiales.js +745 -0
- package/dist/core/privacidad/categorias-especiales.js.map +1 -0
- package/dist/core/privacidad/tapar.d.ts +48 -0
- package/dist/core/privacidad/tapar.d.ts.map +1 -0
- package/dist/core/privacidad/tapar.js +66 -0
- package/dist/core/privacidad/tapar.js.map +1 -0
- package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
- package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
- package/dist/core/prompt-cache/diagnostics.js +100 -0
- package/dist/core/prompt-cache/diagnostics.js.map +1 -0
- package/dist/core/prompt-cache/index.d.ts +33 -0
- package/dist/core/prompt-cache/index.d.ts.map +1 -0
- package/dist/core/prompt-cache/index.js +189 -0
- package/dist/core/prompt-cache/index.js.map +1 -0
- package/dist/core/prompt-cache/payload.d.ts +58 -0
- package/dist/core/prompt-cache/payload.d.ts.map +1 -0
- package/dist/core/prompt-cache/payload.js +122 -0
- package/dist/core/prompt-cache/payload.js.map +1 -0
- package/dist/core/prompt-cache/stabilize.d.ts +65 -0
- package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
- package/dist/core/prompt-cache/stabilize.js +137 -0
- package/dist/core/prompt-cache/stabilize.js.map +1 -0
- package/dist/core/prompt-cache/stats.d.ts +55 -0
- package/dist/core/prompt-cache/stats.d.ts.map +1 -0
- package/dist/core/prompt-cache/stats.js +158 -0
- package/dist/core/prompt-cache/stats.js.map +1 -0
- package/dist/core/prompt-eleccion.d.ts +38 -0
- package/dist/core/prompt-eleccion.d.ts.map +1 -0
- package/dist/core/prompt-eleccion.js +46 -0
- package/dist/core/prompt-eleccion.js.map +1 -0
- package/dist/core/prompt-optimizer.d.ts +53 -0
- package/dist/core/prompt-optimizer.d.ts.map +1 -0
- package/dist/core/prompt-optimizer.js +138 -0
- package/dist/core/prompt-optimizer.js.map +1 -0
- package/dist/core/prompts/montar.d.ts +75 -0
- package/dist/core/prompts/montar.d.ts.map +1 -0
- package/dist/core/prompts/montar.js +146 -0
- package/dist/core/prompts/montar.js.map +1 -0
- package/dist/core/prompts/plantilla.d.ts +54 -0
- package/dist/core/prompts/plantilla.d.ts.map +1 -0
- package/dist/core/prompts/plantilla.js +153 -0
- package/dist/core/prompts/plantilla.js.map +1 -0
- package/dist/core/prompts/sistema.md +134 -0
- package/dist/core/provider-attribution.d.ts +24 -2
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js +24 -42
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +2 -1
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/remoto/destino.d.ts +38 -0
- package/dist/core/remoto/destino.d.ts.map +1 -0
- package/dist/core/remoto/destino.js +105 -0
- package/dist/core/remoto/destino.js.map +1 -0
- package/dist/core/remoto/ejecutor.d.ts +59 -0
- package/dist/core/remoto/ejecutor.d.ts.map +1 -0
- package/dist/core/remoto/ejecutor.js +225 -0
- package/dist/core/remoto/ejecutor.js.map +1 -0
- package/dist/core/remoto/ficheros.d.ts +29 -0
- package/dist/core/remoto/ficheros.d.ts.map +1 -0
- package/dist/core/remoto/ficheros.js +90 -0
- package/dist/core/remoto/ficheros.js.map +1 -0
- package/dist/core/remoto/registro-extension.d.ts +15 -0
- package/dist/core/remoto/registro-extension.d.ts.map +1 -0
- package/dist/core/remoto/registro-extension.js +17 -0
- package/dist/core/remoto/registro-extension.js.map +1 -0
- package/dist/core/remoto/tools.d.ts +28 -0
- package/dist/core/remoto/tools.d.ts.map +1 -0
- package/dist/core/remoto/tools.js +31 -0
- package/dist/core/remoto/tools.js.map +1 -0
- package/dist/core/resource-loader.d.ts +58 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +326 -8
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/revision/hallazgo.d.ts +51 -0
- package/dist/core/revision/hallazgo.d.ts.map +1 -0
- package/dist/core/revision/hallazgo.js +73 -0
- package/dist/core/revision/hallazgo.js.map +1 -0
- package/dist/core/revision/revisor.d.ts +81 -0
- package/dist/core/revision/revisor.d.ts.map +1 -0
- package/dist/core/revision/revisor.js +132 -0
- package/dist/core/revision/revisor.js.map +1 -0
- package/dist/core/revision/sarif.d.ts +30 -0
- package/dist/core/revision/sarif.d.ts.map +1 -0
- package/dist/core/revision/sarif.js +83 -0
- package/dist/core/revision/sarif.js.map +1 -0
- package/dist/core/scheduler/scheduler.d.ts +87 -0
- package/dist/core/scheduler/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler/scheduler.js +178 -0
- package/dist/core/scheduler/scheduler.js.map +1 -0
- package/dist/core/sdk.d.ts +8 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +11 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +2 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-diagnostics.d.ts +9 -0
- package/dist/core/settings-diagnostics.d.ts.map +1 -0
- package/dist/core/settings-diagnostics.js +21 -0
- package/dist/core/settings-diagnostics.js.map +1 -0
- package/dist/core/settings-manager.d.ts +156 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +255 -10
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +51 -33
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +2 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts +17 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +13 -5
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetria/otlp.d.ts +122 -0
- package/dist/core/telemetria/otlp.d.ts.map +1 -0
- package/dist/core/telemetria/otlp.js +373 -0
- package/dist/core/telemetria/otlp.js.map +1 -0
- package/dist/core/tools/coercion-argumentos.d.ts +48 -0
- package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
- package/dist/core/tools/coercion-argumentos.js +99 -0
- package/dist/core/tools/coercion-argumentos.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +0 -12
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +234 -12
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +28 -5
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +5 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +2 -2
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/json-tolerante.d.ts +30 -0
- package/dist/core/tools/json-tolerante.d.ts.map +1 -0
- package/dist/core/tools/json-tolerante.js +70 -0
- package/dist/core/tools/json-tolerante.js.map +1 -0
- package/dist/core/tools/project-memory-tool.d.ts.map +1 -1
- package/dist/core/tools/project-memory-tool.js +4 -1
- package/dist/core/tools/project-memory-tool.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +17 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +17 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +2 -1
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/turno-vacio/detectar.d.ts +38 -0
- package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
- package/dist/core/turno-vacio/detectar.js +66 -0
- package/dist/core/turno-vacio/detectar.js.map +1 -0
- package/dist/core/undo/journal.d.ts +57 -0
- package/dist/core/undo/journal.d.ts.map +1 -0
- package/dist/core/undo/journal.js +178 -0
- package/dist/core/undo/journal.js.map +1 -0
- package/dist/core/urls-internas/auditoria.d.ts +10 -0
- package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
- package/dist/core/urls-internas/auditoria.js +42 -0
- package/dist/core/urls-internas/auditoria.js.map +1 -0
- package/dist/core/urls-internas/boveda.d.ts +13 -0
- package/dist/core/urls-internas/boveda.d.ts.map +1 -0
- package/dist/core/urls-internas/boveda.js +40 -0
- package/dist/core/urls-internas/boveda.js.map +1 -0
- package/dist/core/urls-internas/lector.d.ts +30 -0
- package/dist/core/urls-internas/lector.d.ts.map +1 -0
- package/dist/core/urls-internas/lector.js +56 -0
- package/dist/core/urls-internas/lector.js.map +1 -0
- package/dist/core/urls-internas/memoria.d.ts +11 -0
- package/dist/core/urls-internas/memoria.d.ts.map +1 -0
- package/dist/core/urls-internas/memoria.js +25 -0
- package/dist/core/urls-internas/memoria.js.map +1 -0
- package/dist/core/urls-internas/parse.d.ts +28 -0
- package/dist/core/urls-internas/parse.d.ts.map +1 -0
- package/dist/core/urls-internas/parse.js +32 -0
- package/dist/core/urls-internas/parse.js.map +1 -0
- package/dist/core/urls-internas/reglas.d.ts +10 -0
- package/dist/core/urls-internas/reglas.d.ts.map +1 -0
- package/dist/core/urls-internas/reglas.js +31 -0
- package/dist/core/urls-internas/reglas.js.map +1 -0
- package/dist/core/usage/aggregate.d.ts +68 -0
- package/dist/core/usage/aggregate.d.ts.map +1 -0
- package/dist/core/usage/aggregate.js +93 -0
- package/dist/core/usage/aggregate.js.map +1 -0
- package/dist/core/usage/cuota/anthropic.d.ts +10 -0
- package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
- package/dist/core/usage/cuota/anthropic.js +63 -0
- package/dist/core/usage/cuota/anthropic.js.map +1 -0
- package/dist/core/usage/cuota/cache.d.ts +20 -0
- package/dist/core/usage/cuota/cache.d.ts.map +1 -0
- package/dist/core/usage/cuota/cache.js +36 -0
- package/dist/core/usage/cuota/cache.js.map +1 -0
- package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
- package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
- package/dist/core/usage/cuota/github-copilot.js +67 -0
- package/dist/core/usage/cuota/github-copilot.js.map +1 -0
- package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
- package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
- package/dist/core/usage/cuota/google-gemini.js +72 -0
- package/dist/core/usage/cuota/google-gemini.js.map +1 -0
- package/dist/core/usage/cuota/index.d.ts +25 -0
- package/dist/core/usage/cuota/index.d.ts.map +1 -0
- package/dist/core/usage/cuota/index.js +50 -0
- package/dist/core/usage/cuota/index.js.map +1 -0
- package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
- package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
- package/dist/core/usage/cuota/openai-codex.js +59 -0
- package/dist/core/usage/cuota/openai-codex.js.map +1 -0
- package/dist/core/usage/cuota/openrouter.d.ts +10 -0
- package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
- package/dist/core/usage/cuota/openrouter.js +47 -0
- package/dist/core/usage/cuota/openrouter.js.map +1 -0
- package/dist/core/usage/cuota/tipos.d.ts +50 -0
- package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
- package/dist/core/usage/cuota/tipos.js +25 -0
- package/dist/core/usage/cuota/tipos.js.map +1 -0
- package/dist/core/web/busqueda-nativa.d.ts +82 -0
- package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
- package/dist/core/web/busqueda-nativa.js +163 -0
- package/dist/core/web/busqueda-nativa.js.map +1 -0
- package/dist/core/web/destino.d.ts +58 -0
- package/dist/core/web/destino.d.ts.map +1 -0
- package/dist/core/web/destino.js +127 -0
- package/dist/core/web/destino.js.map +1 -0
- package/dist/core/web/proveedores/brave.d.ts +6 -0
- package/dist/core/web/proveedores/brave.d.ts.map +1 -0
- package/dist/core/web/proveedores/brave.js +20 -0
- package/dist/core/web/proveedores/brave.js.map +1 -0
- package/dist/core/web/proveedores/claves.d.ts +19 -0
- package/dist/core/web/proveedores/claves.d.ts.map +1 -0
- package/dist/core/web/proveedores/claves.js +36 -0
- package/dist/core/web/proveedores/claves.js.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.js +109 -0
- package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
- package/dist/core/web/proveedores/ecosia.d.ts +3 -0
- package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
- package/dist/core/web/proveedores/ecosia.js +72 -0
- package/dist/core/web/proveedores/ecosia.js.map +1 -0
- package/dist/core/web/proveedores/exa.d.ts +6 -0
- package/dist/core/web/proveedores/exa.d.ts.map +1 -0
- package/dist/core/web/proveedores/exa.js +24 -0
- package/dist/core/web/proveedores/exa.js.map +1 -0
- package/dist/core/web/proveedores/mojeek.d.ts +3 -0
- package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
- package/dist/core/web/proveedores/mojeek.js +65 -0
- package/dist/core/web/proveedores/mojeek.js.map +1 -0
- package/dist/core/web/proveedores/navegador.d.ts +10 -0
- package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
- package/dist/core/web/proveedores/navegador.js +13 -0
- package/dist/core/web/proveedores/navegador.js.map +1 -0
- package/dist/core/web/proveedores/registro.d.ts +43 -0
- package/dist/core/web/proveedores/registro.d.ts.map +1 -0
- package/dist/core/web/proveedores/registro.js +49 -0
- package/dist/core/web/proveedores/registro.js.map +1 -0
- package/dist/core/web/proveedores/searxng.d.ts +9 -0
- package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
- package/dist/core/web/proveedores/searxng.js +17 -0
- package/dist/core/web/proveedores/searxng.js.map +1 -0
- package/dist/core/web/proveedores/serper.d.ts +9 -0
- package/dist/core/web/proveedores/serper.d.ts.map +1 -0
- package/dist/core/web/proveedores/serper.js +19 -0
- package/dist/core/web/proveedores/serper.js.map +1 -0
- package/dist/core/web/proveedores/tavily.d.ts +6 -0
- package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
- package/dist/core/web/proveedores/tavily.js +19 -0
- package/dist/core/web/proveedores/tavily.js.map +1 -0
- package/dist/core/web/proveedores/tipos.d.ts +36 -0
- package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
- package/dist/core/web/proveedores/tipos.js +10 -0
- package/dist/core/web/proveedores/tipos.js.map +1 -0
- package/dist/core/web/registro-red.d.ts +43 -0
- package/dist/core/web/registro-red.d.ts.map +1 -0
- package/dist/core/web/registro-red.js +86 -0
- package/dist/core/web/registro-red.js.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.js +38 -0
- package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
- package/dist/core/web/scrapers/crates-io.d.ts +11 -0
- package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
- package/dist/core/web/scrapers/crates-io.js +29 -0
- package/dist/core/web/scrapers/crates-io.js.map +1 -0
- package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
- package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
- package/dist/core/web/scrapers/docs-rs.js +35 -0
- package/dist/core/web/scrapers/docs-rs.js.map +1 -0
- package/dist/core/web/scrapers/github.d.ts +3 -0
- package/dist/core/web/scrapers/github.d.ts.map +1 -0
- package/dist/core/web/scrapers/github.js +72 -0
- package/dist/core/web/scrapers/github.js.map +1 -0
- package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
- package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
- package/dist/core/web/scrapers/go-pkg.js +30 -0
- package/dist/core/web/scrapers/go-pkg.js.map +1 -0
- package/dist/core/web/scrapers/hex.d.ts +6 -0
- package/dist/core/web/scrapers/hex.d.ts.map +1 -0
- package/dist/core/web/scrapers/hex.js +27 -0
- package/dist/core/web/scrapers/hex.js.map +1 -0
- package/dist/core/web/scrapers/maven.d.ts +8 -0
- package/dist/core/web/scrapers/maven.d.ts.map +1 -0
- package/dist/core/web/scrapers/maven.js +41 -0
- package/dist/core/web/scrapers/maven.js.map +1 -0
- package/dist/core/web/scrapers/mdn.d.ts +6 -0
- package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
- package/dist/core/web/scrapers/mdn.js +28 -0
- package/dist/core/web/scrapers/mdn.js.map +1 -0
- package/dist/core/web/scrapers/npm.d.ts +11 -0
- package/dist/core/web/scrapers/npm.d.ts.map +1 -0
- package/dist/core/web/scrapers/npm.js +57 -0
- package/dist/core/web/scrapers/npm.js.map +1 -0
- package/dist/core/web/scrapers/nuget.d.ts +8 -0
- package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
- package/dist/core/web/scrapers/nuget.js +22 -0
- package/dist/core/web/scrapers/nuget.js.map +1 -0
- package/dist/core/web/scrapers/nvd.d.ts +7 -0
- package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
- package/dist/core/web/scrapers/nvd.js +37 -0
- package/dist/core/web/scrapers/nvd.js.map +1 -0
- package/dist/core/web/scrapers/pypi.d.ts +6 -0
- package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
- package/dist/core/web/scrapers/pypi.js +31 -0
- package/dist/core/web/scrapers/pypi.js.map +1 -0
- package/dist/core/web/scrapers/registro.d.ts +13 -0
- package/dist/core/web/scrapers/registro.d.ts.map +1 -0
- package/dist/core/web/scrapers/registro.js +65 -0
- package/dist/core/web/scrapers/registro.js.map +1 -0
- package/dist/core/web/scrapers/rubygems.d.ts +6 -0
- package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
- package/dist/core/web/scrapers/rubygems.js +23 -0
- package/dist/core/web/scrapers/rubygems.js.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.js +46 -0
- package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
- package/dist/core/web/scrapers/tipos.d.ts +42 -0
- package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
- package/dist/core/web/scrapers/tipos.js +23 -0
- package/dist/core/web/scrapers/tipos.js.map +1 -0
- package/dist/core/web/texto.d.ts +10 -0
- package/dist/core/web/texto.d.ts.map +1 -0
- package/dist/core/web/texto.js +26 -0
- package/dist/core/web/texto.js.map +1 -0
- package/dist/core/web/tools.d.ts +91 -0
- package/dist/core/web/tools.d.ts.map +1 -0
- package/dist/core/web/tools.js +304 -0
- package/dist/core/web/tools.js.map +1 -0
- package/dist/core/wiki/almacen.d.ts +33 -0
- package/dist/core/wiki/almacen.d.ts.map +1 -0
- package/dist/core/wiki/almacen.js +93 -0
- package/dist/core/wiki/almacen.js.map +1 -0
- package/dist/core/wiki/citas.d.ts +111 -0
- package/dist/core/wiki/citas.d.ts.map +1 -0
- package/dist/core/wiki/citas.js +146 -0
- package/dist/core/wiki/citas.js.map +1 -0
- package/dist/core/workflows/agent-runner.d.ts +88 -0
- package/dist/core/workflows/agent-runner.d.ts.map +1 -0
- package/dist/core/workflows/agent-runner.js +312 -0
- package/dist/core/workflows/agent-runner.js.map +1 -0
- package/dist/core/workflows/builtins.d.ts +41 -0
- package/dist/core/workflows/builtins.d.ts.map +1 -0
- package/dist/core/workflows/builtins.js +283 -0
- package/dist/core/workflows/builtins.js.map +1 -0
- package/dist/core/workflows/contrato/esquema.d.ts +32 -0
- package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
- package/dist/core/workflows/contrato/esquema.js +25 -0
- package/dist/core/workflows/contrato/esquema.js.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
- package/dist/core/workflows/contrato/validador.d.ts +30 -0
- package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
- package/dist/core/workflows/contrato/validador.js +56 -0
- package/dist/core/workflows/contrato/validador.js.map +1 -0
- package/dist/core/workflows/contrato/yield.d.ts +65 -0
- package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
- package/dist/core/workflows/contrato/yield.js +80 -0
- package/dist/core/workflows/contrato/yield.js.map +1 -0
- package/dist/core/workflows/goal-engine/engine.d.ts +151 -0
- package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/engine.js +503 -0
- package/dist/core/workflows/goal-engine/engine.js.map +1 -0
- package/dist/core/workflows/goal-engine/errors.d.ts +7 -0
- package/dist/core/workflows/goal-engine/errors.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/errors.js +9 -0
- package/dist/core/workflows/goal-engine/errors.js.map +1 -0
- package/dist/core/workflows/goal-engine/index.d.ts +13 -0
- package/dist/core/workflows/goal-engine/index.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/index.js +8 -0
- package/dist/core/workflows/goal-engine/index.js.map +1 -0
- package/dist/core/workflows/goal-engine/persistence.d.ts +31 -0
- package/dist/core/workflows/goal-engine/persistence.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/persistence.js +145 -0
- package/dist/core/workflows/goal-engine/persistence.js.map +1 -0
- package/dist/core/workflows/goal-engine/prompts.d.ts +37 -0
- package/dist/core/workflows/goal-engine/prompts.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/prompts.js +131 -0
- package/dist/core/workflows/goal-engine/prompts.js.map +1 -0
- package/dist/core/workflows/goal-engine/state.d.ts +41 -0
- package/dist/core/workflows/goal-engine/state.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/state.js +397 -0
- package/dist/core/workflows/goal-engine/state.js.map +1 -0
- package/dist/core/workflows/goal-engine/tools.d.ts +31 -0
- package/dist/core/workflows/goal-engine/tools.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/tools.js +211 -0
- package/dist/core/workflows/goal-engine/tools.js.map +1 -0
- package/dist/core/workflows/goal-engine/types.d.ts +286 -0
- package/dist/core/workflows/goal-engine/types.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/types.js +17 -0
- package/dist/core/workflows/goal-engine/types.js.map +1 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts +23 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.js +72 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.js.map +1 -0
- package/dist/core/workflows/graph-sync.d.ts +67 -0
- package/dist/core/workflows/graph-sync.d.ts.map +1 -0
- package/dist/core/workflows/graph-sync.js +188 -0
- package/dist/core/workflows/graph-sync.js.map +1 -0
- package/dist/core/workflows/graph.d.ts +143 -0
- package/dist/core/workflows/graph.d.ts.map +1 -0
- package/dist/core/workflows/graph.js +319 -0
- package/dist/core/workflows/graph.js.map +1 -0
- package/dist/core/workflows/index.d.ts +26 -0
- package/dist/core/workflows/index.d.ts.map +1 -0
- package/dist/core/workflows/index.js +18 -0
- package/dist/core/workflows/index.js.map +1 -0
- package/dist/core/workflows/journal.d.ts +68 -0
- package/dist/core/workflows/journal.d.ts.map +1 -0
- package/dist/core/workflows/journal.js +83 -0
- package/dist/core/workflows/journal.js.map +1 -0
- package/dist/core/workflows/manager.d.ts +122 -0
- package/dist/core/workflows/manager.d.ts.map +1 -0
- package/dist/core/workflows/manager.js +351 -0
- package/dist/core/workflows/manager.js.map +1 -0
- package/dist/core/workflows/resolve-script.d.ts +35 -0
- package/dist/core/workflows/resolve-script.d.ts.map +1 -0
- package/dist/core/workflows/resolve-script.js +66 -0
- package/dist/core/workflows/resolve-script.js.map +1 -0
- package/dist/core/workflows/runtime.d.ts +62 -0
- package/dist/core/workflows/runtime.d.ts.map +1 -0
- package/dist/core/workflows/runtime.js +380 -0
- package/dist/core/workflows/runtime.js.map +1 -0
- package/dist/core/workflows/save-as-skill.d.ts +27 -0
- package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
- package/dist/core/workflows/save-as-skill.js +54 -0
- package/dist/core/workflows/save-as-skill.js.map +1 -0
- package/dist/core/workflows/shared-store.d.ts +31 -0
- package/dist/core/workflows/shared-store.d.ts.map +1 -0
- package/dist/core/workflows/shared-store.js +80 -0
- package/dist/core/workflows/shared-store.js.map +1 -0
- package/dist/core/workflows/subagent-host.d.ts +50 -0
- package/dist/core/workflows/subagent-host.d.ts.map +1 -0
- package/dist/core/workflows/subagent-host.js +225 -0
- package/dist/core/workflows/subagent-host.js.map +1 -0
- package/dist/core/workflows/tool-workflow.d.ts +22 -0
- package/dist/core/workflows/tool-workflow.d.ts.map +1 -0
- package/dist/core/workflows/tool-workflow.js +120 -0
- package/dist/core/workflows/tool-workflow.js.map +1 -0
- package/dist/core/workflows/types.d.ts +191 -0
- package/dist/core/workflows/types.d.ts.map +1 -0
- package/dist/core/workflows/types.js +26 -0
- package/dist/core/workflows/types.js.map +1 -0
- package/dist/core/workflows/worktree.d.ts +42 -0
- package/dist/core/workflows/worktree.d.ts.map +1 -0
- package/dist/core/workflows/worktree.js +107 -0
- package/dist/core/workflows/worktree.js.map +1 -0
- package/dist/extensions/llama/index.d.ts.map +1 -1
- package/dist/extensions/llama/index.js +2 -0
- package/dist/extensions/llama/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +6 -2
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/remoto/index.d.ts +22 -0
- package/dist/extensions/remoto/index.d.ts.map +1 -0
- package/dist/extensions/remoto/index.js +54 -0
- package/dist/extensions/remoto/index.js.map +1 -0
- package/dist/index.d.ts +1 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -13
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +4 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +26 -15
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +4 -3
- package/dist/migrations.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts +42 -0
- package/dist/modes/acp/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp/acp-mode.js +190 -0
- package/dist/modes/acp/acp-mode.js.map +1 -0
- package/dist/modes/acp/events.d.ts +74 -0
- package/dist/modes/acp/events.d.ts.map +1 -0
- package/dist/modes/acp/events.js +116 -0
- package/dist/modes/acp/events.js.map +1 -0
- package/dist/modes/interactive/components/home-screen.d.ts.map +1 -1
- package/dist/modes/interactive/components/home-screen.js +2 -2
- package/dist/modes/interactive/components/home-screen.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +9 -3
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +56 -12
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/prompt-optimization.d.ts +16 -0
- package/dist/modes/interactive/components/prompt-optimization.d.ts.map +1 -0
- package/dist/modes/interactive/components/prompt-optimization.js +46 -0
- package/dist/modes/interactive/components/prompt-optimization.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +19 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +180 -56
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-submenu.js +165 -0
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +74 -17
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +2 -1
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +21 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +709 -75
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +4 -3
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +16 -13
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +20 -6
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +11 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +173 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +29 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +27 -5
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/server/attach.d.ts +56 -0
- package/dist/server/attach.d.ts.map +1 -0
- package/dist/server/attach.js +130 -0
- package/dist/server/attach.js.map +1 -0
- package/dist/server/extension-ops.d.ts +40 -0
- package/dist/server/extension-ops.d.ts.map +1 -0
- package/dist/server/extension-ops.js +146 -0
- package/dist/server/extension-ops.js.map +1 -0
- package/dist/server/pi-server-service.d.ts +85 -0
- package/dist/server/pi-server-service.d.ts.map +1 -0
- package/dist/server/pi-server-service.js +213 -0
- package/dist/server/pi-server-service.js.map +1 -0
- package/dist/server/scheduler-tick.d.ts +32 -0
- package/dist/server/scheduler-tick.d.ts.map +1 -0
- package/dist/server/scheduler-tick.js +47 -0
- package/dist/server/scheduler-tick.js.map +1 -0
- package/dist/server/serve.d.ts +25 -0
- package/dist/server/serve.d.ts.map +1 -0
- package/dist/server/serve.js +83 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/server/transcript.d.ts +38 -0
- package/dist/server/transcript.d.ts.map +1 -0
- package/dist/server/transcript.js +176 -0
- package/dist/server/transcript.js.map +1 -0
- package/dist/skills/ada-engine/SKILL.md +153 -0
- package/dist/skills/skill-creator/SKILL.md +90 -0
- package/dist/telegram/api.d.ts +75 -0
- package/dist/telegram/api.d.ts.map +1 -0
- package/dist/telegram/api.js +104 -0
- package/dist/telegram/api.js.map +1 -0
- package/dist/telegram/bridge.d.ts +85 -0
- package/dist/telegram/bridge.d.ts.map +1 -0
- package/dist/telegram/bridge.js +182 -0
- package/dist/telegram/bridge.js.map +1 -0
- package/dist/telegram/journal.d.ts +67 -0
- package/dist/telegram/journal.d.ts.map +1 -0
- package/dist/telegram/journal.js +119 -0
- package/dist/telegram/journal.js.map +1 -0
- package/dist/telegram/servidor.d.ts +15 -0
- package/dist/telegram/servidor.d.ts.map +1 -0
- package/dist/telegram/servidor.js +74 -0
- package/dist/telegram/servidor.js.map +1 -0
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +2 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/management-http.d.ts +5 -3
- package/dist/utils/management-http.d.ts.map +1 -1
- package/dist/utils/management-http.js +14 -10
- package/dist/utils/management-http.js.map +1 -1
- package/dist/utils/shell.d.ts +11 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +11 -0
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/text.d.ts +8 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +9 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +29 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +25 -10
- package/docs/compliance.md +241 -0
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +15 -12
- package/docs/development.md +47 -10
- package/docs/docs.json +14 -2
- package/docs/environment-variables.md +20 -17
- package/docs/extensions.md +62 -51
- package/docs/index.md +15 -21
- package/docs/json.md +10 -5
- package/docs/keybindings.md +5 -5
- package/docs/llama-cpp.md +9 -7
- package/docs/models.md +18 -12
- package/docs/packages.md +45 -45
- package/docs/prompt-templates.md +5 -5
- package/docs/providers.md +12 -12
- package/docs/quickstart.md +39 -39
- package/docs/rpc.md +21 -15
- package/docs/sdk.md +38 -38
- package/docs/security.md +26 -21
- package/docs/session-format.md +7 -7
- package/docs/sessions.md +14 -14
- package/docs/settings.md +47 -22
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +14 -13
- package/docs/terminal-setup.md +14 -14
- package/docs/termux.md +7 -7
- package/docs/themes.md +11 -11
- package/docs/tmux.md +4 -4
- package/docs/tui.md +3 -3
- package/docs/usage.md +54 -54
- package/docs/windows.md +2 -2
- package/examples/extensions/border-status-editor.ts +1 -1
- package/examples/extensions/git-checkpoint.ts +2 -2
- package/examples/extensions/notify.ts +3 -1
- package/examples/extensions/subagent/README.md +1 -1
- package/examples/extensions/subagent/index.ts +6 -1
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/rpc-extension-ui.ts +1 -1
- package/examples/sdk/06-extensions.ts +1 -1
- package/examples/sdk/12-full-control.ts +9 -0
- package/examples/sdk/README.md +1 -1
- package/npm-shrinkwrap.json +35 -261
- package/package.json +9 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/acp/acp-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,GAAG,MAAM,0BAA0B,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAInF,6EAA0E;AAC1E,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAEpF,MAAM,WAAW,cAAc;IAC9B,aAAa,EAAE,iBAAiB,CAAC;IACjC,iEAAiE;IACjE,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;IACpB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAwBD,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,GAAG,MAAM,CAY7G;AAoBD,mFAAkF;AAClF,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA4HvE","sourcesContent":["/**\n * Modo ACP — Ada como agente del Agent Client Protocol.\n *\n * Permite conducir Ada desde cualquier cliente ACP (Zed y compañía) en vez de\n * solo desde nuestro TUI: el editor abre el proceso, habla JSON-RPC por stdio y\n * recibe el streaming del turno.\n *\n * Dos invariantes que no son opcionales:\n *\n * 1. **ACP es el dueño de stdout.** Un solo `console.log` perdido en cualquier\n * parte del proceso mete texto suelto en medio del stream JSON-RPC y el\n * cliente se desconecta. Por eso se desvía stdout a stderr antes de abrir la\n * conexión: los logs siguen siendo visibles, pero fuera del cable.\n *\n * 2. **Una conexión, una sesión.** Un segundo `session/new` se rechaza en vez de\n * compartir en silencio historial y cwd con el primero, que dejaría eventos\n * sin poder atribuirse a una sesión concreta.\n *\n * La traducción de eventos vive aparte, en `events.ts`, y se testea sin socket.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { Readable, Writable } from \"node:stream\";\nimport * as acp from \"@agentclientprotocol/sdk\";\nimport type { AgentSession, AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport { killTrackedDetachedChildren } from \"../../utils/shell.ts\";\nimport { type AcpStopReason, stopReasonFor, toAcpUpdates } from \"./events.ts\";\n\n/** Crea la sesión que atenderá la conexión. Inyectable para los tests. */\nexport type AcpSessionFactory = (options: { cwd: string }) => Promise<AgentSession>;\n\nexport interface AcpModeOptions {\n\tcreateSession: AcpSessionFactory;\n\t/** Stream ya montado (tests). Por defecto, stdio del proceso. */\n\tstream?: acp.Stream;\n\t/** Desviar stdout a stderr. Solo se desactiva en tests. */\n\townStdout?: boolean;\n}\n\n/**\n * Desvía `process.stdout` a stderr y devuelve el sink crudo original.\n *\n * Sin esto, cualquier `console.log` del resto del programa —un aviso de\n * actualización, una traza olvidada— se cuela entre dos mensajes JSON-RPC y\n * corrompe el stream. Se desvía en lugar de silenciar para no perder\n * diagnósticos: acaban en stderr, que el cliente ACP no parsea.\n */\nfunction takeOverStdout(): WritableStream<Uint8Array> {\n\tconst write = process.stdout.write.bind(process.stdout);\n\tprocess.stdout.write = ((chunk: string | Uint8Array, ...rest: unknown[]) =>\n\t\t(process.stderr.write as (...args: unknown[]) => boolean)(chunk, ...rest)) as typeof process.stdout.write;\n\treturn Writable.toWeb(\n\t\tnew Writable({\n\t\t\twrite(chunk, _enc, cb) {\n\t\t\t\twrite(chunk);\n\t\t\t\tcb();\n\t\t\t},\n\t\t}),\n\t) as WritableStream<Uint8Array>;\n}\n\n/** Extrae el texto de los bloques de contenido de un prompt ACP. */\nexport function promptText(content: Array<{ type?: string; text?: string; uri?: string }> | undefined): string {\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.map((block) => {\n\t\t\tif (block?.type === \"text\" && typeof block.text === \"string\") return block.text;\n\t\t\t// Un resource_link es una referencia a un fichero: se pasa como ruta\n\t\t\t// para que el agente pueda leerlo con sus propias tools.\n\t\t\tif (block?.type === \"resource_link\" && typeof block.uri === \"string\") return block.uri;\n\t\t\treturn \"\";\n\t\t})\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\");\n}\n\n/**\n * Espera a que el turno se asiente y dice por qué terminó.\n *\n * Se escucha `agent_settled`, no `agent_end`: `agent_end` con `willRetry` no\n * cierra el turno —el agente va a reintentar solo— y anunciar `end_turn` ahí\n * dejaría al cliente creyendo que puede escribir mientras la sesión sigue\n * ocupada.\n */\nfunction settled(session: AgentSession, signal: { aborted: boolean }): Promise<AcpStopReason> {\n\treturn new Promise<AcpStopReason>((resolve) => {\n\t\tconst unsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\tif (event.type !== \"agent_settled\") return;\n\t\t\tunsubscribe();\n\t\t\tresolve(stopReasonFor({ aborted: signal.aborted }));\n\t\t});\n\t});\n}\n\n/** Arranca el modo ACP. No retorna: el proceso vive mientras dure la conexión. */\nexport async function runAcpMode(options: AcpModeOptions): Promise<void> {\n\tconst stdout = options.ownStdout === false ? undefined : takeOverStdout();\n\tconst stream =\n\t\toptions.stream ??\n\t\tacp.ndJsonStream(\n\t\t\tstdout ?? (Writable.toWeb(process.stdout) as WritableStream<Uint8Array>),\n\t\t\tReadable.toWeb(process.stdin) as ReadableStream<Uint8Array>,\n\t\t);\n\n\tlet session: AgentSession | undefined;\n\tlet sessionId: string | undefined;\n\tlet unsubscribe: (() => void) | undefined;\n\tlet cancelled = false;\n\t/** Reserva síncrona de la única sesión de esta conexión. Ver newSession. */\n\tlet sessionClaimed = false;\n\n\tconst connection = new acp.AgentSideConnection(\n\t\t(conn) => ({\n\t\t\tasync initialize(params: { protocolVersion?: number }) {\n\t\t\t\treturn {\n\t\t\t\t\tprotocolVersion: params?.protocolVersion ?? acp.PROTOCOL_VERSION,\n\t\t\t\t\tagentCapabilities: {\n\t\t\t\t\t\t// `session/load` no está implementado: declararlo y luego fallar\n\t\t\t\t\t\t// es peor que no ofrecerlo.\n\t\t\t\t\t\tloadSession: false,\n\t\t\t\t\t\tpromptCapabilities: { image: false, audio: false, embeddedContext: false },\n\t\t\t\t\t},\n\t\t\t\t\tauthMethods: [],\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tasync authenticate() {\n\t\t\t\t// Las credenciales se configuran fuera del cable (vault, auth.json):\n\t\t\t\t// el cliente ACP no debe manejarlas ni verlas pasar.\n\t\t\t\treturn {};\n\t\t\t},\n\n\t\t\tasync newSession(params: { cwd?: string; mcpServers?: unknown[] }) {\n\t\t\t\t// La reserva se hace ANTES del primer await. Comprobar `session` no\n\t\t\t\t// vale: crear la sesión es asíncrono, así que dos `session/new`\n\t\t\t\t// encadenados —lo normal en un cliente que no espera respuesta antes\n\t\t\t\t// de mandar el siguiente— pasaban los dos la comprobación y acababan\n\t\t\t\t// con dos sesiones sobre una conexión.\n\t\t\t\tif (sessionClaimed) {\n\t\t\t\t\tthrow acp.RequestError.invalidRequest(\n\t\t\t\t\t\t\"Esta conexión ya tiene una sesión. Abre otra conexión para una sesión nueva.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tsessionClaimed = true;\n\t\t\t\t// El cliente puede proponer servidores MCP para la sesión. No los\n\t\t\t\t// conectamos: los nuestros salen de la configuración del proyecto y\n\t\t\t\t// sus credenciales del Vault, y aceptar un servidor arbitrario por el\n\t\t\t\t// cable saltaría ese control. Se avisa por stderr en vez de callar,\n\t\t\t\t// porque si no el editor esperaría tools que nunca aparecerán.\n\t\t\t\tif (Array.isArray(params?.mcpServers) && params.mcpServers.length > 0) {\n\t\t\t\t\tprocess.stderr.write(\n\t\t\t\t\t\t`[acp] ${params.mcpServers.length} servidor(es) MCP propuestos por el cliente: ignorados. ` +\n\t\t\t\t\t\t\t\"Declara los servidores MCP en la configuración de Ada.\\n\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tsession = await options.createSession({ cwd: params?.cwd ?? process.cwd() });\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Liberar la reserva: si crear la sesión falló, la conexión debe\n\t\t\t\t\t// poder reintentar en vez de quedarse inservible para siempre.\n\t\t\t\t\tsessionClaimed = false;\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tsessionId = randomUUID();\n\t\t\t\tconst id = sessionId;\n\t\t\t\tunsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\t\t\tfor (const update of toAcpUpdates(event)) {\n\t\t\t\t\t\t// Notificación: si el cliente se cae a mitad de turno no debe\n\t\t\t\t\t\t// tumbar la sesión, solo dejar de recibir.\n\t\t\t\t\t\tvoid conn.sessionUpdate({ sessionId: id, update } as never).catch(() => {});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn { sessionId: id };\n\t\t\t},\n\n\t\t\tasync prompt(params: { sessionId?: string; prompt?: Array<{ type?: string; text?: string }> }) {\n\t\t\t\tconst active = session;\n\t\t\t\tif (!active || params?.sessionId !== sessionId) {\n\t\t\t\t\tthrow acp.RequestError.invalidParams(\"sessionId desconocido\");\n\t\t\t\t}\n\t\t\t\tconst text = promptText(params.prompt);\n\t\t\t\tif (!text) return { stopReason: \"end_turn\" as AcpStopReason };\n\t\t\t\tcancelled = false;\n\t\t\t\tconst done = settled(active, {\n\t\t\t\t\tget aborted() {\n\t\t\t\t\t\treturn cancelled;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tawait active.prompt(text);\n\t\t\t\treturn { stopReason: await done };\n\t\t\t},\n\n\t\t\tasync cancel(params: { sessionId?: string }) {\n\t\t\t\tif (!session || params?.sessionId !== sessionId) return;\n\t\t\t\tcancelled = true;\n\t\t\t\tawait session.abort();\n\t\t\t},\n\t\t}),\n\t\tstream,\n\t);\n\n\t// El proceso vive mientras la conexión. Se espera a `connection.closed`, del\n\t// propio SDK, no al evento `end` de stdin: `end` salta en cuanto se agota la\n\t// entrada, antes de que el SDK haya despachado los mensajes ya recibidos.\n\t//\n\t// Cuando el cliente cierra la conexión, el transporte se cierra con ella y\n\t// una respuesta que todavía se estuviera calculando ya no tiene a dónde ir.\n\t// No se intenta rescatarla: no hay nadie escuchando. Un cliente ACP real\n\t// mantiene la conexión abierta mientras dure la sesión.\n\tawait connection.closed;\n\tunsubscribe?.();\n\t// Abortar el turno en curso: si el editor se fue, seguir llamando al modelo\n\t// solo gasta dinero para nadie.\n\tawait session?.abort().catch(() => {});\n\t// Igual que print/interactive/rpc al recibir su señal de apagado: una\n\t// sesión de bash_interactivo se lanza `detached` a propósito para\n\t// sobrevivir a un Ctrl-C dentro del turno, así que necesita este kill\n\t// explícito o sobrevive al editor que cerró la conexión.\n\tkillTrackedDetachedChildren();\n}\n"]}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modo ACP — Ada como agente del Agent Client Protocol.
|
|
3
|
+
*
|
|
4
|
+
* Permite conducir Ada desde cualquier cliente ACP (Zed y compañía) en vez de
|
|
5
|
+
* solo desde nuestro TUI: el editor abre el proceso, habla JSON-RPC por stdio y
|
|
6
|
+
* recibe el streaming del turno.
|
|
7
|
+
*
|
|
8
|
+
* Dos invariantes que no son opcionales:
|
|
9
|
+
*
|
|
10
|
+
* 1. **ACP es el dueño de stdout.** Un solo `console.log` perdido en cualquier
|
|
11
|
+
* parte del proceso mete texto suelto en medio del stream JSON-RPC y el
|
|
12
|
+
* cliente se desconecta. Por eso se desvía stdout a stderr antes de abrir la
|
|
13
|
+
* conexión: los logs siguen siendo visibles, pero fuera del cable.
|
|
14
|
+
*
|
|
15
|
+
* 2. **Una conexión, una sesión.** Un segundo `session/new` se rechaza en vez de
|
|
16
|
+
* compartir en silencio historial y cwd con el primero, que dejaría eventos
|
|
17
|
+
* sin poder atribuirse a una sesión concreta.
|
|
18
|
+
*
|
|
19
|
+
* La traducción de eventos vive aparte, en `events.ts`, y se testea sin socket.
|
|
20
|
+
*/
|
|
21
|
+
import { randomUUID } from "node:crypto";
|
|
22
|
+
import { Readable, Writable } from "node:stream";
|
|
23
|
+
import * as acp from "@agentclientprotocol/sdk";
|
|
24
|
+
import { killTrackedDetachedChildren } from "../../utils/shell.js";
|
|
25
|
+
import { stopReasonFor, toAcpUpdates } from "./events.js";
|
|
26
|
+
/**
|
|
27
|
+
* Desvía `process.stdout` a stderr y devuelve el sink crudo original.
|
|
28
|
+
*
|
|
29
|
+
* Sin esto, cualquier `console.log` del resto del programa —un aviso de
|
|
30
|
+
* actualización, una traza olvidada— se cuela entre dos mensajes JSON-RPC y
|
|
31
|
+
* corrompe el stream. Se desvía en lugar de silenciar para no perder
|
|
32
|
+
* diagnósticos: acaban en stderr, que el cliente ACP no parsea.
|
|
33
|
+
*/
|
|
34
|
+
function takeOverStdout() {
|
|
35
|
+
const write = process.stdout.write.bind(process.stdout);
|
|
36
|
+
process.stdout.write = ((chunk, ...rest) => process.stderr.write(chunk, ...rest));
|
|
37
|
+
return Writable.toWeb(new Writable({
|
|
38
|
+
write(chunk, _enc, cb) {
|
|
39
|
+
write(chunk);
|
|
40
|
+
cb();
|
|
41
|
+
},
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
/** Extrae el texto de los bloques de contenido de un prompt ACP. */
|
|
45
|
+
export function promptText(content) {
|
|
46
|
+
if (!Array.isArray(content))
|
|
47
|
+
return "";
|
|
48
|
+
return content
|
|
49
|
+
.map((block) => {
|
|
50
|
+
if (block?.type === "text" && typeof block.text === "string")
|
|
51
|
+
return block.text;
|
|
52
|
+
// Un resource_link es una referencia a un fichero: se pasa como ruta
|
|
53
|
+
// para que el agente pueda leerlo con sus propias tools.
|
|
54
|
+
if (block?.type === "resource_link" && typeof block.uri === "string")
|
|
55
|
+
return block.uri;
|
|
56
|
+
return "";
|
|
57
|
+
})
|
|
58
|
+
.filter(Boolean)
|
|
59
|
+
.join("\n");
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Espera a que el turno se asiente y dice por qué terminó.
|
|
63
|
+
*
|
|
64
|
+
* Se escucha `agent_settled`, no `agent_end`: `agent_end` con `willRetry` no
|
|
65
|
+
* cierra el turno —el agente va a reintentar solo— y anunciar `end_turn` ahí
|
|
66
|
+
* dejaría al cliente creyendo que puede escribir mientras la sesión sigue
|
|
67
|
+
* ocupada.
|
|
68
|
+
*/
|
|
69
|
+
function settled(session, signal) {
|
|
70
|
+
return new Promise((resolve) => {
|
|
71
|
+
const unsubscribe = session.subscribe((event) => {
|
|
72
|
+
if (event.type !== "agent_settled")
|
|
73
|
+
return;
|
|
74
|
+
unsubscribe();
|
|
75
|
+
resolve(stopReasonFor({ aborted: signal.aborted }));
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/** Arranca el modo ACP. No retorna: el proceso vive mientras dure la conexión. */
|
|
80
|
+
export async function runAcpMode(options) {
|
|
81
|
+
const stdout = options.ownStdout === false ? undefined : takeOverStdout();
|
|
82
|
+
const stream = options.stream ??
|
|
83
|
+
acp.ndJsonStream(stdout ?? Writable.toWeb(process.stdout), Readable.toWeb(process.stdin));
|
|
84
|
+
let session;
|
|
85
|
+
let sessionId;
|
|
86
|
+
let unsubscribe;
|
|
87
|
+
let cancelled = false;
|
|
88
|
+
/** Reserva síncrona de la única sesión de esta conexión. Ver newSession. */
|
|
89
|
+
let sessionClaimed = false;
|
|
90
|
+
const connection = new acp.AgentSideConnection((conn) => ({
|
|
91
|
+
async initialize(params) {
|
|
92
|
+
return {
|
|
93
|
+
protocolVersion: params?.protocolVersion ?? acp.PROTOCOL_VERSION,
|
|
94
|
+
agentCapabilities: {
|
|
95
|
+
// `session/load` no está implementado: declararlo y luego fallar
|
|
96
|
+
// es peor que no ofrecerlo.
|
|
97
|
+
loadSession: false,
|
|
98
|
+
promptCapabilities: { image: false, audio: false, embeddedContext: false },
|
|
99
|
+
},
|
|
100
|
+
authMethods: [],
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
async authenticate() {
|
|
104
|
+
// Las credenciales se configuran fuera del cable (vault, auth.json):
|
|
105
|
+
// el cliente ACP no debe manejarlas ni verlas pasar.
|
|
106
|
+
return {};
|
|
107
|
+
},
|
|
108
|
+
async newSession(params) {
|
|
109
|
+
// La reserva se hace ANTES del primer await. Comprobar `session` no
|
|
110
|
+
// vale: crear la sesión es asíncrono, así que dos `session/new`
|
|
111
|
+
// encadenados —lo normal en un cliente que no espera respuesta antes
|
|
112
|
+
// de mandar el siguiente— pasaban los dos la comprobación y acababan
|
|
113
|
+
// con dos sesiones sobre una conexión.
|
|
114
|
+
if (sessionClaimed) {
|
|
115
|
+
throw acp.RequestError.invalidRequest("Esta conexión ya tiene una sesión. Abre otra conexión para una sesión nueva.");
|
|
116
|
+
}
|
|
117
|
+
sessionClaimed = true;
|
|
118
|
+
// El cliente puede proponer servidores MCP para la sesión. No los
|
|
119
|
+
// conectamos: los nuestros salen de la configuración del proyecto y
|
|
120
|
+
// sus credenciales del Vault, y aceptar un servidor arbitrario por el
|
|
121
|
+
// cable saltaría ese control. Se avisa por stderr en vez de callar,
|
|
122
|
+
// porque si no el editor esperaría tools que nunca aparecerán.
|
|
123
|
+
if (Array.isArray(params?.mcpServers) && params.mcpServers.length > 0) {
|
|
124
|
+
process.stderr.write(`[acp] ${params.mcpServers.length} servidor(es) MCP propuestos por el cliente: ignorados. ` +
|
|
125
|
+
"Declara los servidores MCP en la configuración de Ada.\n");
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
session = await options.createSession({ cwd: params?.cwd ?? process.cwd() });
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
// Liberar la reserva: si crear la sesión falló, la conexión debe
|
|
132
|
+
// poder reintentar en vez de quedarse inservible para siempre.
|
|
133
|
+
sessionClaimed = false;
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
sessionId = randomUUID();
|
|
137
|
+
const id = sessionId;
|
|
138
|
+
unsubscribe = session.subscribe((event) => {
|
|
139
|
+
for (const update of toAcpUpdates(event)) {
|
|
140
|
+
// Notificación: si el cliente se cae a mitad de turno no debe
|
|
141
|
+
// tumbar la sesión, solo dejar de recibir.
|
|
142
|
+
void conn.sessionUpdate({ sessionId: id, update }).catch(() => { });
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
return { sessionId: id };
|
|
146
|
+
},
|
|
147
|
+
async prompt(params) {
|
|
148
|
+
const active = session;
|
|
149
|
+
if (!active || params?.sessionId !== sessionId) {
|
|
150
|
+
throw acp.RequestError.invalidParams("sessionId desconocido");
|
|
151
|
+
}
|
|
152
|
+
const text = promptText(params.prompt);
|
|
153
|
+
if (!text)
|
|
154
|
+
return { stopReason: "end_turn" };
|
|
155
|
+
cancelled = false;
|
|
156
|
+
const done = settled(active, {
|
|
157
|
+
get aborted() {
|
|
158
|
+
return cancelled;
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
await active.prompt(text);
|
|
162
|
+
return { stopReason: await done };
|
|
163
|
+
},
|
|
164
|
+
async cancel(params) {
|
|
165
|
+
if (!session || params?.sessionId !== sessionId)
|
|
166
|
+
return;
|
|
167
|
+
cancelled = true;
|
|
168
|
+
await session.abort();
|
|
169
|
+
},
|
|
170
|
+
}), stream);
|
|
171
|
+
// El proceso vive mientras la conexión. Se espera a `connection.closed`, del
|
|
172
|
+
// propio SDK, no al evento `end` de stdin: `end` salta en cuanto se agota la
|
|
173
|
+
// entrada, antes de que el SDK haya despachado los mensajes ya recibidos.
|
|
174
|
+
//
|
|
175
|
+
// Cuando el cliente cierra la conexión, el transporte se cierra con ella y
|
|
176
|
+
// una respuesta que todavía se estuviera calculando ya no tiene a dónde ir.
|
|
177
|
+
// No se intenta rescatarla: no hay nadie escuchando. Un cliente ACP real
|
|
178
|
+
// mantiene la conexión abierta mientras dure la sesión.
|
|
179
|
+
await connection.closed;
|
|
180
|
+
unsubscribe?.();
|
|
181
|
+
// Abortar el turno en curso: si el editor se fue, seguir llamando al modelo
|
|
182
|
+
// solo gasta dinero para nadie.
|
|
183
|
+
await session?.abort().catch(() => { });
|
|
184
|
+
// Igual que print/interactive/rpc al recibir su señal de apagado: una
|
|
185
|
+
// sesión de bash_interactivo se lanza `detached` a propósito para
|
|
186
|
+
// sobrevivir a un Ctrl-C dentro del turno, así que necesita este kill
|
|
187
|
+
// explícito o sobrevive al editor que cerró la conexión.
|
|
188
|
+
killTrackedDetachedChildren();
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=acp-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-mode.js","sourceRoot":"","sources":["../../../src/modes/acp/acp-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Modo ACP — Ada como agente del Agent Client Protocol.\n *\n * Permite conducir Ada desde cualquier cliente ACP (Zed y compañía) en vez de\n * solo desde nuestro TUI: el editor abre el proceso, habla JSON-RPC por stdio y\n * recibe el streaming del turno.\n *\n * Dos invariantes que no son opcionales:\n *\n * 1. **ACP es el dueño de stdout.** Un solo `console.log` perdido en cualquier\n * parte del proceso mete texto suelto en medio del stream JSON-RPC y el\n * cliente se desconecta. Por eso se desvía stdout a stderr antes de abrir la\n * conexión: los logs siguen siendo visibles, pero fuera del cable.\n *\n * 2. **Una conexión, una sesión.** Un segundo `session/new` se rechaza en vez de\n * compartir en silencio historial y cwd con el primero, que dejaría eventos\n * sin poder atribuirse a una sesión concreta.\n *\n * La traducción de eventos vive aparte, en `events.ts`, y se testea sin socket.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { Readable, Writable } from \"node:stream\";\nimport * as acp from \"@agentclientprotocol/sdk\";\nimport type { AgentSession, AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport { killTrackedDetachedChildren } from \"../../utils/shell.ts\";\nimport { type AcpStopReason, stopReasonFor, toAcpUpdates } from \"./events.ts\";\n\n/** Crea la sesión que atenderá la conexión. Inyectable para los tests. */\nexport type AcpSessionFactory = (options: { cwd: string }) => Promise<AgentSession>;\n\nexport interface AcpModeOptions {\n\tcreateSession: AcpSessionFactory;\n\t/** Stream ya montado (tests). Por defecto, stdio del proceso. */\n\tstream?: acp.Stream;\n\t/** Desviar stdout a stderr. Solo se desactiva en tests. */\n\townStdout?: boolean;\n}\n\n/**\n * Desvía `process.stdout` a stderr y devuelve el sink crudo original.\n *\n * Sin esto, cualquier `console.log` del resto del programa —un aviso de\n * actualización, una traza olvidada— se cuela entre dos mensajes JSON-RPC y\n * corrompe el stream. Se desvía en lugar de silenciar para no perder\n * diagnósticos: acaban en stderr, que el cliente ACP no parsea.\n */\nfunction takeOverStdout(): WritableStream<Uint8Array> {\n\tconst write = process.stdout.write.bind(process.stdout);\n\tprocess.stdout.write = ((chunk: string | Uint8Array, ...rest: unknown[]) =>\n\t\t(process.stderr.write as (...args: unknown[]) => boolean)(chunk, ...rest)) as typeof process.stdout.write;\n\treturn Writable.toWeb(\n\t\tnew Writable({\n\t\t\twrite(chunk, _enc, cb) {\n\t\t\t\twrite(chunk);\n\t\t\t\tcb();\n\t\t\t},\n\t\t}),\n\t) as WritableStream<Uint8Array>;\n}\n\n/** Extrae el texto de los bloques de contenido de un prompt ACP. */\nexport function promptText(content: Array<{ type?: string; text?: string; uri?: string }> | undefined): string {\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.map((block) => {\n\t\t\tif (block?.type === \"text\" && typeof block.text === \"string\") return block.text;\n\t\t\t// Un resource_link es una referencia a un fichero: se pasa como ruta\n\t\t\t// para que el agente pueda leerlo con sus propias tools.\n\t\t\tif (block?.type === \"resource_link\" && typeof block.uri === \"string\") return block.uri;\n\t\t\treturn \"\";\n\t\t})\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\");\n}\n\n/**\n * Espera a que el turno se asiente y dice por qué terminó.\n *\n * Se escucha `agent_settled`, no `agent_end`: `agent_end` con `willRetry` no\n * cierra el turno —el agente va a reintentar solo— y anunciar `end_turn` ahí\n * dejaría al cliente creyendo que puede escribir mientras la sesión sigue\n * ocupada.\n */\nfunction settled(session: AgentSession, signal: { aborted: boolean }): Promise<AcpStopReason> {\n\treturn new Promise<AcpStopReason>((resolve) => {\n\t\tconst unsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\tif (event.type !== \"agent_settled\") return;\n\t\t\tunsubscribe();\n\t\t\tresolve(stopReasonFor({ aborted: signal.aborted }));\n\t\t});\n\t});\n}\n\n/** Arranca el modo ACP. No retorna: el proceso vive mientras dure la conexión. */\nexport async function runAcpMode(options: AcpModeOptions): Promise<void> {\n\tconst stdout = options.ownStdout === false ? undefined : takeOverStdout();\n\tconst stream =\n\t\toptions.stream ??\n\t\tacp.ndJsonStream(\n\t\t\tstdout ?? (Writable.toWeb(process.stdout) as WritableStream<Uint8Array>),\n\t\t\tReadable.toWeb(process.stdin) as ReadableStream<Uint8Array>,\n\t\t);\n\n\tlet session: AgentSession | undefined;\n\tlet sessionId: string | undefined;\n\tlet unsubscribe: (() => void) | undefined;\n\tlet cancelled = false;\n\t/** Reserva síncrona de la única sesión de esta conexión. Ver newSession. */\n\tlet sessionClaimed = false;\n\n\tconst connection = new acp.AgentSideConnection(\n\t\t(conn) => ({\n\t\t\tasync initialize(params: { protocolVersion?: number }) {\n\t\t\t\treturn {\n\t\t\t\t\tprotocolVersion: params?.protocolVersion ?? acp.PROTOCOL_VERSION,\n\t\t\t\t\tagentCapabilities: {\n\t\t\t\t\t\t// `session/load` no está implementado: declararlo y luego fallar\n\t\t\t\t\t\t// es peor que no ofrecerlo.\n\t\t\t\t\t\tloadSession: false,\n\t\t\t\t\t\tpromptCapabilities: { image: false, audio: false, embeddedContext: false },\n\t\t\t\t\t},\n\t\t\t\t\tauthMethods: [],\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tasync authenticate() {\n\t\t\t\t// Las credenciales se configuran fuera del cable (vault, auth.json):\n\t\t\t\t// el cliente ACP no debe manejarlas ni verlas pasar.\n\t\t\t\treturn {};\n\t\t\t},\n\n\t\t\tasync newSession(params: { cwd?: string; mcpServers?: unknown[] }) {\n\t\t\t\t// La reserva se hace ANTES del primer await. Comprobar `session` no\n\t\t\t\t// vale: crear la sesión es asíncrono, así que dos `session/new`\n\t\t\t\t// encadenados —lo normal en un cliente que no espera respuesta antes\n\t\t\t\t// de mandar el siguiente— pasaban los dos la comprobación y acababan\n\t\t\t\t// con dos sesiones sobre una conexión.\n\t\t\t\tif (sessionClaimed) {\n\t\t\t\t\tthrow acp.RequestError.invalidRequest(\n\t\t\t\t\t\t\"Esta conexión ya tiene una sesión. Abre otra conexión para una sesión nueva.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tsessionClaimed = true;\n\t\t\t\t// El cliente puede proponer servidores MCP para la sesión. No los\n\t\t\t\t// conectamos: los nuestros salen de la configuración del proyecto y\n\t\t\t\t// sus credenciales del Vault, y aceptar un servidor arbitrario por el\n\t\t\t\t// cable saltaría ese control. Se avisa por stderr en vez de callar,\n\t\t\t\t// porque si no el editor esperaría tools que nunca aparecerán.\n\t\t\t\tif (Array.isArray(params?.mcpServers) && params.mcpServers.length > 0) {\n\t\t\t\t\tprocess.stderr.write(\n\t\t\t\t\t\t`[acp] ${params.mcpServers.length} servidor(es) MCP propuestos por el cliente: ignorados. ` +\n\t\t\t\t\t\t\t\"Declara los servidores MCP en la configuración de Ada.\\n\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tsession = await options.createSession({ cwd: params?.cwd ?? process.cwd() });\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Liberar la reserva: si crear la sesión falló, la conexión debe\n\t\t\t\t\t// poder reintentar en vez de quedarse inservible para siempre.\n\t\t\t\t\tsessionClaimed = false;\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tsessionId = randomUUID();\n\t\t\t\tconst id = sessionId;\n\t\t\t\tunsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\t\t\tfor (const update of toAcpUpdates(event)) {\n\t\t\t\t\t\t// Notificación: si el cliente se cae a mitad de turno no debe\n\t\t\t\t\t\t// tumbar la sesión, solo dejar de recibir.\n\t\t\t\t\t\tvoid conn.sessionUpdate({ sessionId: id, update } as never).catch(() => {});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn { sessionId: id };\n\t\t\t},\n\n\t\t\tasync prompt(params: { sessionId?: string; prompt?: Array<{ type?: string; text?: string }> }) {\n\t\t\t\tconst active = session;\n\t\t\t\tif (!active || params?.sessionId !== sessionId) {\n\t\t\t\t\tthrow acp.RequestError.invalidParams(\"sessionId desconocido\");\n\t\t\t\t}\n\t\t\t\tconst text = promptText(params.prompt);\n\t\t\t\tif (!text) return { stopReason: \"end_turn\" as AcpStopReason };\n\t\t\t\tcancelled = false;\n\t\t\t\tconst done = settled(active, {\n\t\t\t\t\tget aborted() {\n\t\t\t\t\t\treturn cancelled;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tawait active.prompt(text);\n\t\t\t\treturn { stopReason: await done };\n\t\t\t},\n\n\t\t\tasync cancel(params: { sessionId?: string }) {\n\t\t\t\tif (!session || params?.sessionId !== sessionId) return;\n\t\t\t\tcancelled = true;\n\t\t\t\tawait session.abort();\n\t\t\t},\n\t\t}),\n\t\tstream,\n\t);\n\n\t// El proceso vive mientras la conexión. Se espera a `connection.closed`, del\n\t// propio SDK, no al evento `end` de stdin: `end` salta en cuanto se agota la\n\t// entrada, antes de que el SDK haya despachado los mensajes ya recibidos.\n\t//\n\t// Cuando el cliente cierra la conexión, el transporte se cierra con ella y\n\t// una respuesta que todavía se estuviera calculando ya no tiene a dónde ir.\n\t// No se intenta rescatarla: no hay nadie escuchando. Un cliente ACP real\n\t// mantiene la conexión abierta mientras dure la sesión.\n\tawait connection.closed;\n\tunsubscribe?.();\n\t// Abortar el turno en curso: si el editor se fue, seguir llamando al modelo\n\t// solo gasta dinero para nadie.\n\tawait session?.abort().catch(() => {});\n\t// Igual que print/interactive/rpc al recibir su señal de apagado: una\n\t// sesión de bash_interactivo se lanza `detached` a propósito para\n\t// sobrevivir a un Ctrl-C dentro del turno, así que necesita este kill\n\t// explícito o sobrevive al editor que cerró la conexión.\n\tkillTrackedDetachedChildren();\n}\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Traducción de eventos de `AgentSession` a notificaciones `session/update` de ACP.
|
|
3
|
+
*
|
|
4
|
+
* Se mantiene PURA y aparte del transporte a propósito: es la parte con lógica
|
|
5
|
+
* real (qué es un delta de texto, qué es pensamiento, cuándo una tool pasa a
|
|
6
|
+
* fallida) y así se puede testear entera sin abrir un socket ni arrancar una
|
|
7
|
+
* sesión. El fichero de al lado solo mueve bytes.
|
|
8
|
+
*
|
|
9
|
+
* Ver https://agentclientprotocol.com/protocol/overview
|
|
10
|
+
*/
|
|
11
|
+
import type { AgentSessionEvent } from "../../core/agent-session.ts";
|
|
12
|
+
/**
|
|
13
|
+
* Los tipos del schema no se reexportan desde la raíz del SDK, así que se
|
|
14
|
+
* declara aquí la unión ESTRECHA de lo que realmente emitimos. Sale mejor que
|
|
15
|
+
* importar la unión entera: el contrato de este módulo queda legible, y el SDK
|
|
16
|
+
* la sigue validando estructuralmente en la frontera (ver acp-mode.ts).
|
|
17
|
+
*/
|
|
18
|
+
export type AcpToolKind = "read" | "edit" | "delete" | "move" | "search" | "execute" | "think" | "fetch" | "other";
|
|
19
|
+
export type AcpToolCallStatus = "pending" | "in_progress" | "completed" | "failed";
|
|
20
|
+
export type AcpContentBlock = {
|
|
21
|
+
type: "text";
|
|
22
|
+
text: string;
|
|
23
|
+
};
|
|
24
|
+
export type AcpToolCallContent = {
|
|
25
|
+
type: "content";
|
|
26
|
+
content: AcpContentBlock;
|
|
27
|
+
};
|
|
28
|
+
export type AcpStopReason = "end_turn" | "max_tokens" | "max_turn_requests" | "refusal" | "cancelled";
|
|
29
|
+
export type AcpSessionUpdate = {
|
|
30
|
+
sessionUpdate: "agent_message_chunk";
|
|
31
|
+
content: AcpContentBlock;
|
|
32
|
+
} | {
|
|
33
|
+
sessionUpdate: "agent_thought_chunk";
|
|
34
|
+
content: AcpContentBlock;
|
|
35
|
+
} | {
|
|
36
|
+
sessionUpdate: "tool_call";
|
|
37
|
+
toolCallId: string;
|
|
38
|
+
title: string;
|
|
39
|
+
kind: AcpToolKind;
|
|
40
|
+
status: AcpToolCallStatus;
|
|
41
|
+
rawInput?: Record<string, unknown>;
|
|
42
|
+
} | {
|
|
43
|
+
sessionUpdate: "tool_call_update";
|
|
44
|
+
toolCallId: string;
|
|
45
|
+
status: AcpToolCallStatus;
|
|
46
|
+
content: AcpToolCallContent[];
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Clasifica una tool para que el cliente pinte el icono correcto.
|
|
50
|
+
*
|
|
51
|
+
* ACP usa esto solo para presentación, así que ante la duda `other` es una
|
|
52
|
+
* respuesta honesta: mejor un icono genérico que insinuar que algo escribe
|
|
53
|
+
* cuando solo lee.
|
|
54
|
+
*/
|
|
55
|
+
export declare function toolKindFor(toolName: string): AcpToolKind;
|
|
56
|
+
/**
|
|
57
|
+
* Traduce un evento de sesión a cero o más `session/update`.
|
|
58
|
+
*
|
|
59
|
+
* Devuelve una lista, no un único update, porque la relación no es 1:1: la
|
|
60
|
+
* mayoría de eventos internos no tienen nada que decirle al cliente y se
|
|
61
|
+
* traducen a lista vacía.
|
|
62
|
+
*/
|
|
63
|
+
export declare function toAcpUpdates(event: AgentSessionEvent): AcpSessionUpdate[];
|
|
64
|
+
/**
|
|
65
|
+
* Por qué terminó el turno, en el vocabulario de ACP.
|
|
66
|
+
*
|
|
67
|
+
* `agent_end` con `willRetry` NO cierra el turno: el agente va a reintentar
|
|
68
|
+
* solo, y anunciar `end_turn` dejaría al cliente creyendo que puede escribir
|
|
69
|
+
* mientras la sesión sigue ocupada.
|
|
70
|
+
*/
|
|
71
|
+
export declare function stopReasonFor(options: {
|
|
72
|
+
aborted: boolean;
|
|
73
|
+
}): AcpStopReason;
|
|
74
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/modes/acp/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACnH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;AACnF,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC7D,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAC/E,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,mBAAmB,GAAG,SAAS,GAAG,WAAW,CAAC;AAEtG,MAAM,MAAM,gBAAgB,GACzB;IAAE,aAAa,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAClE;IAAE,aAAa,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAClE;IACA,aAAa,EAAE,WAAW,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,GACD;IACA,aAAa,EAAE,kBAAkB,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC7B,CAAC;AAEL;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAmBzD;AAyBD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,gBAAgB,EAAE,CA2CzE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CAE1E","sourcesContent":["/**\n * Traducción de eventos de `AgentSession` a notificaciones `session/update` de ACP.\n *\n * Se mantiene PURA y aparte del transporte a propósito: es la parte con lógica\n * real (qué es un delta de texto, qué es pensamiento, cuándo una tool pasa a\n * fallida) y así se puede testear entera sin abrir un socket ni arrancar una\n * sesión. El fichero de al lado solo mueve bytes.\n *\n * Ver https://agentclientprotocol.com/protocol/overview\n */\n\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\n\n/**\n * Los tipos del schema no se reexportan desde la raíz del SDK, así que se\n * declara aquí la unión ESTRECHA de lo que realmente emitimos. Sale mejor que\n * importar la unión entera: el contrato de este módulo queda legible, y el SDK\n * la sigue validando estructuralmente en la frontera (ver acp-mode.ts).\n */\nexport type AcpToolKind = \"read\" | \"edit\" | \"delete\" | \"move\" | \"search\" | \"execute\" | \"think\" | \"fetch\" | \"other\";\nexport type AcpToolCallStatus = \"pending\" | \"in_progress\" | \"completed\" | \"failed\";\nexport type AcpContentBlock = { type: \"text\"; text: string };\nexport type AcpToolCallContent = { type: \"content\"; content: AcpContentBlock };\nexport type AcpStopReason = \"end_turn\" | \"max_tokens\" | \"max_turn_requests\" | \"refusal\" | \"cancelled\";\n\nexport type AcpSessionUpdate =\n\t| { sessionUpdate: \"agent_message_chunk\"; content: AcpContentBlock }\n\t| { sessionUpdate: \"agent_thought_chunk\"; content: AcpContentBlock }\n\t| {\n\t\t\tsessionUpdate: \"tool_call\";\n\t\t\ttoolCallId: string;\n\t\t\ttitle: string;\n\t\t\tkind: AcpToolKind;\n\t\t\tstatus: AcpToolCallStatus;\n\t\t\trawInput?: Record<string, unknown>;\n\t }\n\t| {\n\t\t\tsessionUpdate: \"tool_call_update\";\n\t\t\ttoolCallId: string;\n\t\t\tstatus: AcpToolCallStatus;\n\t\t\tcontent: AcpToolCallContent[];\n\t };\n\n/**\n * Clasifica una tool para que el cliente pinte el icono correcto.\n *\n * ACP usa esto solo para presentación, así que ante la duda `other` es una\n * respuesta honesta: mejor un icono genérico que insinuar que algo escribe\n * cuando solo lee.\n */\nexport function toolKindFor(toolName: string): AcpToolKind {\n\tswitch (toolName) {\n\t\tcase \"read\":\n\t\tcase \"ls\":\n\t\t\treturn \"read\";\n\t\tcase \"grep\":\n\t\tcase \"find\":\n\t\t\treturn \"search\";\n\t\tcase \"edit\":\n\t\tcase \"write\":\n\t\t\treturn \"edit\";\n\t\tcase \"bash\":\n\t\t\treturn \"execute\";\n\t\tcase \"web_search\":\n\t\tcase \"web_fetch\":\n\t\t\treturn \"fetch\";\n\t\tdefault:\n\t\t\treturn \"other\";\n\t}\n}\n\n/** Texto plano como bloque de contenido ACP. */\nfunction text(value: string): AcpContentBlock {\n\treturn { type: \"text\", text: value };\n}\n\n/**\n * Resultado de una tool como contenido mostrable.\n *\n * El resultado de una tool nuestra es `AgentToolResult`, con `content` ya en\n * bloques compatibles con MCP. Se filtra a texto porque es lo único que todo\n * cliente ACP sabe pintar; un cliente que no entienda una imagen no debe\n * quedarse sin ver que la tool terminó.\n */\nfunction toolResultContent(result: unknown): AcpToolCallContent[] {\n\tconst blocks = (result as { content?: Array<{ type?: string; text?: string }> } | undefined)?.content;\n\tif (!Array.isArray(blocks)) return [];\n\treturn blocks\n\t\t.filter(\n\t\t\t(block): block is { type: \"text\"; text: string } => block?.type === \"text\" && typeof block.text === \"string\",\n\t\t)\n\t\t.map((block) => ({ type: \"content\", content: text(block.text) }));\n}\n\n/**\n * Traduce un evento de sesión a cero o más `session/update`.\n *\n * Devuelve una lista, no un único update, porque la relación no es 1:1: la\n * mayoría de eventos internos no tienen nada que decirle al cliente y se\n * traducen a lista vacía.\n */\nexport function toAcpUpdates(event: AgentSessionEvent): AcpSessionUpdate[] {\n\tswitch (event.type) {\n\t\tcase \"message_update\": {\n\t\t\tconst inner = event.assistantMessageEvent;\n\t\t\t// Solo los deltas: `partial` trae el mensaje acumulado entero, y\n\t\t\t// reenviarlo en cada token haría que el cliente pintara el texto\n\t\t\t// duplicándose a cada paso.\n\t\t\tif (inner.type === \"text_delta\") {\n\t\t\t\treturn inner.delta ? [{ sessionUpdate: \"agent_message_chunk\", content: text(inner.delta) }] : [];\n\t\t\t}\n\t\t\tif (inner.type === \"thinking_delta\") {\n\t\t\t\treturn inner.delta ? [{ sessionUpdate: \"agent_thought_chunk\", content: text(inner.delta) }] : [];\n\t\t\t}\n\t\t\treturn [];\n\t\t}\n\n\t\tcase \"tool_execution_start\":\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsessionUpdate: \"tool_call\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\ttitle: event.toolName,\n\t\t\t\t\tkind: toolKindFor(event.toolName),\n\t\t\t\t\tstatus: \"in_progress\",\n\t\t\t\t\trawInput: event.args as Record<string, unknown>,\n\t\t\t\t},\n\t\t\t];\n\n\t\tcase \"tool_execution_end\":\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsessionUpdate: \"tool_call_update\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\t// `isError` viene del resultado de la tool, no de una excepción: una\n\t\t\t\t\t// tool puede fallar limpiamente y el cliente debe verlo en rojo.\n\t\t\t\t\tstatus: event.isError ? \"failed\" : \"completed\",\n\t\t\t\t\tcontent: toolResultContent(event.result),\n\t\t\t\t},\n\t\t\t];\n\n\t\tdefault:\n\t\t\treturn [];\n\t}\n}\n\n/**\n * Por qué terminó el turno, en el vocabulario de ACP.\n *\n * `agent_end` con `willRetry` NO cierra el turno: el agente va a reintentar\n * solo, y anunciar `end_turn` dejaría al cliente creyendo que puede escribir\n * mientras la sesión sigue ocupada.\n */\nexport function stopReasonFor(options: { aborted: boolean }): AcpStopReason {\n\treturn options.aborted ? \"cancelled\" : \"end_turn\";\n}\n"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Traducción de eventos de `AgentSession` a notificaciones `session/update` de ACP.
|
|
3
|
+
*
|
|
4
|
+
* Se mantiene PURA y aparte del transporte a propósito: es la parte con lógica
|
|
5
|
+
* real (qué es un delta de texto, qué es pensamiento, cuándo una tool pasa a
|
|
6
|
+
* fallida) y así se puede testear entera sin abrir un socket ni arrancar una
|
|
7
|
+
* sesión. El fichero de al lado solo mueve bytes.
|
|
8
|
+
*
|
|
9
|
+
* Ver https://agentclientprotocol.com/protocol/overview
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Clasifica una tool para que el cliente pinte el icono correcto.
|
|
13
|
+
*
|
|
14
|
+
* ACP usa esto solo para presentación, así que ante la duda `other` es una
|
|
15
|
+
* respuesta honesta: mejor un icono genérico que insinuar que algo escribe
|
|
16
|
+
* cuando solo lee.
|
|
17
|
+
*/
|
|
18
|
+
export function toolKindFor(toolName) {
|
|
19
|
+
switch (toolName) {
|
|
20
|
+
case "read":
|
|
21
|
+
case "ls":
|
|
22
|
+
return "read";
|
|
23
|
+
case "grep":
|
|
24
|
+
case "find":
|
|
25
|
+
return "search";
|
|
26
|
+
case "edit":
|
|
27
|
+
case "write":
|
|
28
|
+
return "edit";
|
|
29
|
+
case "bash":
|
|
30
|
+
return "execute";
|
|
31
|
+
case "web_search":
|
|
32
|
+
case "web_fetch":
|
|
33
|
+
return "fetch";
|
|
34
|
+
default:
|
|
35
|
+
return "other";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Texto plano como bloque de contenido ACP. */
|
|
39
|
+
function text(value) {
|
|
40
|
+
return { type: "text", text: value };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resultado de una tool como contenido mostrable.
|
|
44
|
+
*
|
|
45
|
+
* El resultado de una tool nuestra es `AgentToolResult`, con `content` ya en
|
|
46
|
+
* bloques compatibles con MCP. Se filtra a texto porque es lo único que todo
|
|
47
|
+
* cliente ACP sabe pintar; un cliente que no entienda una imagen no debe
|
|
48
|
+
* quedarse sin ver que la tool terminó.
|
|
49
|
+
*/
|
|
50
|
+
function toolResultContent(result) {
|
|
51
|
+
const blocks = result?.content;
|
|
52
|
+
if (!Array.isArray(blocks))
|
|
53
|
+
return [];
|
|
54
|
+
return blocks
|
|
55
|
+
.filter((block) => block?.type === "text" && typeof block.text === "string")
|
|
56
|
+
.map((block) => ({ type: "content", content: text(block.text) }));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Traduce un evento de sesión a cero o más `session/update`.
|
|
60
|
+
*
|
|
61
|
+
* Devuelve una lista, no un único update, porque la relación no es 1:1: la
|
|
62
|
+
* mayoría de eventos internos no tienen nada que decirle al cliente y se
|
|
63
|
+
* traducen a lista vacía.
|
|
64
|
+
*/
|
|
65
|
+
export function toAcpUpdates(event) {
|
|
66
|
+
switch (event.type) {
|
|
67
|
+
case "message_update": {
|
|
68
|
+
const inner = event.assistantMessageEvent;
|
|
69
|
+
// Solo los deltas: `partial` trae el mensaje acumulado entero, y
|
|
70
|
+
// reenviarlo en cada token haría que el cliente pintara el texto
|
|
71
|
+
// duplicándose a cada paso.
|
|
72
|
+
if (inner.type === "text_delta") {
|
|
73
|
+
return inner.delta ? [{ sessionUpdate: "agent_message_chunk", content: text(inner.delta) }] : [];
|
|
74
|
+
}
|
|
75
|
+
if (inner.type === "thinking_delta") {
|
|
76
|
+
return inner.delta ? [{ sessionUpdate: "agent_thought_chunk", content: text(inner.delta) }] : [];
|
|
77
|
+
}
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
case "tool_execution_start":
|
|
81
|
+
return [
|
|
82
|
+
{
|
|
83
|
+
sessionUpdate: "tool_call",
|
|
84
|
+
toolCallId: event.toolCallId,
|
|
85
|
+
title: event.toolName,
|
|
86
|
+
kind: toolKindFor(event.toolName),
|
|
87
|
+
status: "in_progress",
|
|
88
|
+
rawInput: event.args,
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
case "tool_execution_end":
|
|
92
|
+
return [
|
|
93
|
+
{
|
|
94
|
+
sessionUpdate: "tool_call_update",
|
|
95
|
+
toolCallId: event.toolCallId,
|
|
96
|
+
// `isError` viene del resultado de la tool, no de una excepción: una
|
|
97
|
+
// tool puede fallar limpiamente y el cliente debe verlo en rojo.
|
|
98
|
+
status: event.isError ? "failed" : "completed",
|
|
99
|
+
content: toolResultContent(event.result),
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
default:
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Por qué terminó el turno, en el vocabulario de ACP.
|
|
108
|
+
*
|
|
109
|
+
* `agent_end` con `willRetry` NO cierra el turno: el agente va a reintentar
|
|
110
|
+
* solo, y anunciar `end_turn` dejaría al cliente creyendo que puede escribir
|
|
111
|
+
* mientras la sesión sigue ocupada.
|
|
112
|
+
*/
|
|
113
|
+
export function stopReasonFor(options) {
|
|
114
|
+
return options.aborted ? "cancelled" : "end_turn";
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/modes/acp/events.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Traducción de eventos de `AgentSession` a notificaciones `session/update` de ACP.\n *\n * Se mantiene PURA y aparte del transporte a propósito: es la parte con lógica\n * real (qué es un delta de texto, qué es pensamiento, cuándo una tool pasa a\n * fallida) y así se puede testear entera sin abrir un socket ni arrancar una\n * sesión. El fichero de al lado solo mueve bytes.\n *\n * Ver https://agentclientprotocol.com/protocol/overview\n */\n\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\n\n/**\n * Los tipos del schema no se reexportan desde la raíz del SDK, así que se\n * declara aquí la unión ESTRECHA de lo que realmente emitimos. Sale mejor que\n * importar la unión entera: el contrato de este módulo queda legible, y el SDK\n * la sigue validando estructuralmente en la frontera (ver acp-mode.ts).\n */\nexport type AcpToolKind = \"read\" | \"edit\" | \"delete\" | \"move\" | \"search\" | \"execute\" | \"think\" | \"fetch\" | \"other\";\nexport type AcpToolCallStatus = \"pending\" | \"in_progress\" | \"completed\" | \"failed\";\nexport type AcpContentBlock = { type: \"text\"; text: string };\nexport type AcpToolCallContent = { type: \"content\"; content: AcpContentBlock };\nexport type AcpStopReason = \"end_turn\" | \"max_tokens\" | \"max_turn_requests\" | \"refusal\" | \"cancelled\";\n\nexport type AcpSessionUpdate =\n\t| { sessionUpdate: \"agent_message_chunk\"; content: AcpContentBlock }\n\t| { sessionUpdate: \"agent_thought_chunk\"; content: AcpContentBlock }\n\t| {\n\t\t\tsessionUpdate: \"tool_call\";\n\t\t\ttoolCallId: string;\n\t\t\ttitle: string;\n\t\t\tkind: AcpToolKind;\n\t\t\tstatus: AcpToolCallStatus;\n\t\t\trawInput?: Record<string, unknown>;\n\t }\n\t| {\n\t\t\tsessionUpdate: \"tool_call_update\";\n\t\t\ttoolCallId: string;\n\t\t\tstatus: AcpToolCallStatus;\n\t\t\tcontent: AcpToolCallContent[];\n\t };\n\n/**\n * Clasifica una tool para que el cliente pinte el icono correcto.\n *\n * ACP usa esto solo para presentación, así que ante la duda `other` es una\n * respuesta honesta: mejor un icono genérico que insinuar que algo escribe\n * cuando solo lee.\n */\nexport function toolKindFor(toolName: string): AcpToolKind {\n\tswitch (toolName) {\n\t\tcase \"read\":\n\t\tcase \"ls\":\n\t\t\treturn \"read\";\n\t\tcase \"grep\":\n\t\tcase \"find\":\n\t\t\treturn \"search\";\n\t\tcase \"edit\":\n\t\tcase \"write\":\n\t\t\treturn \"edit\";\n\t\tcase \"bash\":\n\t\t\treturn \"execute\";\n\t\tcase \"web_search\":\n\t\tcase \"web_fetch\":\n\t\t\treturn \"fetch\";\n\t\tdefault:\n\t\t\treturn \"other\";\n\t}\n}\n\n/** Texto plano como bloque de contenido ACP. */\nfunction text(value: string): AcpContentBlock {\n\treturn { type: \"text\", text: value };\n}\n\n/**\n * Resultado de una tool como contenido mostrable.\n *\n * El resultado de una tool nuestra es `AgentToolResult`, con `content` ya en\n * bloques compatibles con MCP. Se filtra a texto porque es lo único que todo\n * cliente ACP sabe pintar; un cliente que no entienda una imagen no debe\n * quedarse sin ver que la tool terminó.\n */\nfunction toolResultContent(result: unknown): AcpToolCallContent[] {\n\tconst blocks = (result as { content?: Array<{ type?: string; text?: string }> } | undefined)?.content;\n\tif (!Array.isArray(blocks)) return [];\n\treturn blocks\n\t\t.filter(\n\t\t\t(block): block is { type: \"text\"; text: string } => block?.type === \"text\" && typeof block.text === \"string\",\n\t\t)\n\t\t.map((block) => ({ type: \"content\", content: text(block.text) }));\n}\n\n/**\n * Traduce un evento de sesión a cero o más `session/update`.\n *\n * Devuelve una lista, no un único update, porque la relación no es 1:1: la\n * mayoría de eventos internos no tienen nada que decirle al cliente y se\n * traducen a lista vacía.\n */\nexport function toAcpUpdates(event: AgentSessionEvent): AcpSessionUpdate[] {\n\tswitch (event.type) {\n\t\tcase \"message_update\": {\n\t\t\tconst inner = event.assistantMessageEvent;\n\t\t\t// Solo los deltas: `partial` trae el mensaje acumulado entero, y\n\t\t\t// reenviarlo en cada token haría que el cliente pintara el texto\n\t\t\t// duplicándose a cada paso.\n\t\t\tif (inner.type === \"text_delta\") {\n\t\t\t\treturn inner.delta ? [{ sessionUpdate: \"agent_message_chunk\", content: text(inner.delta) }] : [];\n\t\t\t}\n\t\t\tif (inner.type === \"thinking_delta\") {\n\t\t\t\treturn inner.delta ? [{ sessionUpdate: \"agent_thought_chunk\", content: text(inner.delta) }] : [];\n\t\t\t}\n\t\t\treturn [];\n\t\t}\n\n\t\tcase \"tool_execution_start\":\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsessionUpdate: \"tool_call\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\ttitle: event.toolName,\n\t\t\t\t\tkind: toolKindFor(event.toolName),\n\t\t\t\t\tstatus: \"in_progress\",\n\t\t\t\t\trawInput: event.args as Record<string, unknown>,\n\t\t\t\t},\n\t\t\t];\n\n\t\tcase \"tool_execution_end\":\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsessionUpdate: \"tool_call_update\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\t// `isError` viene del resultado de la tool, no de una excepción: una\n\t\t\t\t\t// tool puede fallar limpiamente y el cliente debe verlo en rojo.\n\t\t\t\t\tstatus: event.isError ? \"failed\" : \"completed\",\n\t\t\t\t\tcontent: toolResultContent(event.result),\n\t\t\t\t},\n\t\t\t];\n\n\t\tdefault:\n\t\t\treturn [];\n\t}\n}\n\n/**\n * Por qué terminó el turno, en el vocabulario de ACP.\n *\n * `agent_end` con `willRetry` NO cierra el turno: el agente va a reintentar\n * solo, y anunciar `end_turn` dejaría al cliente creyendo que puede escribir\n * mientras la sesión sigue ocupada.\n */\nexport function stopReasonFor(options: { aborted: boolean }): AcpStopReason {\n\treturn options.aborted ? \"cancelled\" : \"end_turn\";\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home-screen.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/home-screen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAwD,MAAM,wBAAwB,CAAC;AACzH,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAKzF,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC;AAEzF,KAAK,cAAc,GAAG,CAAC,UAAU,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAwDnF;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,SAAU,YAAW,SAAS;IACtE,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAwB;IAExC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,kEAAkE;IAC3D,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEhC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAExC;IAED,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/B;IAED,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEvC;IAED,YAAY,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAMxD;IAGD,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAW5B;IAED,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,SAAS;YAQH,WAAW;IAczB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAkD9B;IAED,UAAU,IAAI,IAAI,CAAG;IAErB,gBAAgB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAErC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA2H9B;IAED,8DAA8D;IAC9D,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,WAAW;CAGnB","sourcesContent":["import { type Component, Container, Input, getKeybindings, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { SessionInfo, SessionListProgress } from \"../../../core/session-manager.ts\";\nimport { checkForNewPiVersion } from \"../../../utils/version-check.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { filterAndSortSessions } from \"./session-selector-search.ts\";\n\nexport type HomeScreenResult = { kind: \"new\" } | { kind: \"resume\"; path: string } | null;\n\ntype SessionsLoader = (onProgress?: SessionListProgress) => Promise<SessionInfo[]>;\n\nconst ASCII_LOGO = [\n\t\" █████╗ ██████╗ █████╗\",\n\t\" ██╔══██╗██╔══██╗██╔══██╗\",\n\t\" ███████║██║ ██║███████║\",\n\t\" ██╔══██║██║ ██║██╔══██║\",\n\t\" ██║ ██║██████╔╝██║ ██║\",\n\t\" ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝\",\n].join(\"\\n\");\n\n/** Vertical teal-to-gray gradient for the ASCII logo. */\nconst LOGO_GRADIENT = [\"accent\", \"accent\", \"borderAccent\", \"border\", \"borderMuted\", \"muted\"] as const;\n\n/** Draw a rounded box around centered content with an optional title. */\nfunction box(\n\tcontentLines: string[],\n\twidth: number,\n\toptions: { title?: string; color?: (str: string) => string } = {},\n): string[] {\n\tconst color = options.color ?? ((str: string) => theme.fg(\"border\", str));\n\tconst innerWidth = Math.max(10, width - 4);\n\tconst top =\n\t\toptions.title !== undefined\n\t\t\t? color(`╭─ ${options.title} `) + \"─\".repeat(Math.max(1, innerWidth - options.title.length - 2)) + color(\"─╮\")\n\t\t\t: color(`╭${\"─\".repeat(innerWidth)}╮`);\n\tconst bottom = color(`╰${\"─\".repeat(innerWidth)}╯`);\n\tconst pad = (line: string) => {\n\t\tconst visible = visibleWidth(line);\n\t\tconst left = Math.max(0, Math.floor((innerWidth - visible) / 2));\n\t\tconst right = Math.max(0, innerWidth - visible - left);\n\t\treturn color(\"│ \") + \" \".repeat(left) + line + \" \".repeat(right) + color(\" │\");\n\t};\n\treturn [top, ...contentLines.map(pad), bottom];\n}\n\nfunction sessionTitle(session: SessionInfo): string {\n\tif (session.name) return session.name;\n\tconst first = (session.firstMessage ?? \"\").replace(/\\s+/g, \" \").trim();\n\tif (first.length > 0) return first.length > 60 ? `${first.slice(0, 60)}…` : first;\n\treturn \"Conversation\";\n}\n\nfunction relativeTime(iso: string): string {\n\tconst diffMs = Date.now() - new Date(iso).getTime();\n\tconst mins = Math.floor(diffMs / 60000);\n\tif (mins < 1) return \"now\";\n\tif (mins < 60) return `${mins}m`;\n\tconst hours = Math.floor(mins / 60);\n\tif (hours < 24) return `${hours}h`;\n\tconst days = Math.floor(hours / 24);\n\tif (days < 7) return `${days}d`;\n\tif (days < 30) return `${Math.floor(days / 7)}w`;\n\treturn `${Math.floor(days / 30)}mo`;\n}\n\n/**\n * Central welcome flow (opencode style) shown when the CLI starts:\n * 1) entry screen: \"Enter as guest\" (login is disabled for now)\n * 2) home screen: welcome banner, update notice, recent conversations and\n * a \"New conversation\" action.\n */\nexport class HomeScreenComponent extends Container implements Component {\n\tprivate phase: \"login\" | \"home\" = \"login\";\n\tprivate sessions: SessionInfo[] = [];\n\tprivate filtered: SessionInfo[] = [];\n\tprivate selectedIndex = 0; // 0 = \"New conversation\", then sessions\n\tprivate query = \"\";\n\tprivate loading = false;\n\tprivate updateAvailable: string | null = null;\n\tprivate updateChecked = false;\n\tprivate searchInput: Input;\n\tprivate loadSessions: SessionsLoader;\n\tprivate version: string;\n\tprivate modelLabel: string | null = null;\n\tprivate cwdLabelValue: string | null = null;\n\tprivate memoryEnabled = true;\n\tprivate _focused = false;\n\tprivate requestRenderFn: () => void = () => {};\n\n\tpublic onNew?: () => void;\n\tpublic onResume?: (path: string) => void;\n\tpublic onExit?: () => void;\n\tpublic onUpdate?: () => void;\n\t/** Fired when the entry screen transitions to the home screen. */\n\tpublic onEnterHome?: () => void;\n\n\tsetModelLabel(label: string | null): void {\n\t\tthis.modelLabel = label;\n\t}\n\n\tsetCwdLabel(label: string): void {\n\t\tthis.cwdLabelValue = label;\n\t}\n\n\tsetMemoryEnabled(enabled: boolean): void {\n\t\tthis.memoryEnabled = enabled;\n\t}\n\n\tconstructor(loadSessions: SessionsLoader, version: string) {\n\t\tsuper();\n\t\tthis.loadSessions = loadSessions;\n\t\tthis.version = version;\n\t\tthis.searchInput = new Input();\n\t\tthis.searchInput.onSubmit = () => this.confirmSelection();\n\t}\n\n\t// Focusable\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tthis.loading = true;\n\t\tthis.requestRenderFn();\n\t\ttry {\n\t\t\tthis.sessions = await this.loadSessions();\n\t\t} catch {\n\t\t\tthis.sessions = [];\n\t\t}\n\t\tthis.loading = false;\n\t\tthis.applyFilter();\n\t\tthis.requestRenderFn();\n\t}\n\n\tprivate applyFilter(): void {\n\t\tconst q = this.query.trim();\n\t\tthis.filtered = q\n\t\t\t? filterAndSortSessions(this.sessions, q, \"recent\", \"all\")\n\t\t\t: [...this.sessions].sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, this.filtered.length);\n\t}\n\n\tprivate confirmSelection(): void {\n\t\tif (this.phase === \"login\") {\n\t\t\tthis.enterHome();\n\t\t\treturn;\n\t\t}\n\t\tif (this.selectedIndex === 0) {\n\t\t\tthis.onNew?.();\n\t\t} else {\n\t\t\tconst session = this.filtered[this.selectedIndex - 1];\n\t\t\tif (session) this.onResume?.(session.path);\n\t\t}\n\t}\n\n\tprivate enterHome(): void {\n\t\tthis.phase = \"home\";\n\t\tthis.selectedIndex = 0;\n\t\tthis.onEnterHome?.();\n\t\tvoid this.reload();\n\t\tvoid this.checkUpdate();\n\t}\n\n\tprivate async checkUpdate(): Promise<void> {\n\t\tif (this.updateChecked) return;\n\t\tthis.updateChecked = true;\n\t\ttry {\n\t\t\tconst release = await checkForNewPiVersion(this.version);\n\t\t\tif (release) {\n\t\t\t\tthis.updateAvailable = release.version;\n\t\t\t\tthis.requestRenderFn();\n\t\t\t}\n\t\t} catch {\n\t\t\t// Offline or unreachable — ignore silently.\n\t\t}\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (this.phase === \"login\") {\n\t\t\tif (kb.matches(data, \"tui.select.confirm\") || data === \"\\r\" || data === \"\\n\") {\n\t\t\t\tthis.enterHome();\n\t\t\t} else if (kb.matches(data, \"tui.select.cancel\") || data === \"q\" || data === \"Q\") {\n\t\t\t\tthis.onExit?.();\n\t\t\t} else if (kb.matches(data, \"tui.select.down\")) {\n\t\t\t\t// Only one actionable option on the login screen; ignore.\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.requestRenderFn();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.selectedIndex = Math.min(this.filtered.length, this.selectedIndex + 1);\n\t\t\tthis.requestRenderFn();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\") || data === \"\\r\" || data === \"\\n\") {\n\t\t\tthis.confirmSelection();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.onExit?.();\n\t\t\treturn;\n\t\t}\n\t\tif (data === \"n\" || data === \"N\") {\n\t\t\tthis.onNew?.();\n\t\t\treturn;\n\t\t}\n\t\tif (data === \"u\" || data === \"U\") {\n\t\t\tif (this.updateAvailable) {\n\t\t\t\tthis.onUpdate?.();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (data === \"q\" || data === \"Q\") {\n\t\t\tthis.onExit?.();\n\t\t\treturn;\n\t\t}\n\t\t// Anything else goes to the search input (filters sessions)\n\t\tthis.searchInput.handleInput(data);\n\t\tthis.query = this.searchInput.getValue();\n\t\tthis.applyFilter();\n\t\tthis.requestRenderFn();\n\t}\n\n\tinvalidate(): void {}\n\n\tsetRequestRender(fn: () => void): void {\n\t\tthis.requestRenderFn = fn;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst center = (text: string) => {\n\t\t\tconst pad = Math.max(0, Math.floor((width - visibleWidth(text)) / 2));\n\t\t\treturn \" \".repeat(pad) + text;\n\t\t};\n\t\tconst dim = (t: string) => theme.fg(\"dim\", t);\n\t\tconst muted = (t: string) => theme.fg(\"muted\", t);\n\t\tconst accent = (t: string) => theme.fg(\"accent\", t);\n\t\tconst border = (t: string) => theme.fg(\"border\", t);\n\t\tconst success = (t: string) => theme.fg(\"success\", t);\n\t\tconst warning = (t: string) => theme.fg(\"warning\", t);\n\n\t\t// Gradient logo (teal -> gray)\n\t\tconst logoLines = ASCII_LOGO.split(\"\\n\").map((line, i) =>\n\t\t\ttheme.fg(LOGO_GRADIENT[Math.min(i, LOGO_GRADIENT.length - 1)], line),\n\t\t);\n\t\tconst tagline =\n\t\t\taccent(\"Ada\") + dim(\" · coding agent · HOILAB TECH\") + muted(` v${this.version}`);\n\n\t\tlines.push(\"\");\n\n\t\tif (this.phase === \"login\") {\n\t\t\t// ---- Entry screen -------------------------------------------\n\t\t\tconst boxW = Math.min(56, width - 4);\n\t\t\tconst boxLines = box(\n\t\t\t\t[\n\t\t\t\t\t\"\",\n\t\t\t\t\t...logoLines,\n\t\t\t\t\ttagline,\n\t\t\t\t\t\"\",\n\t\t\t\t\tdim(\"Bienvenido a Ada — el agente de codificación de HOILAB TECH\"),\n\t\t\t\t\t\"\",\n\t\t\t\t\taccent(\"▸ \") + theme.bold(\"Entrar como invitado\"),\n\t\t\t\t\tmuted(\" Loguearme\") + dim(\" (próximamente)\"),\n\t\t\t\t\t\"\",\n\t\t\t\t],\n\t\t\t\tboxW,\n\t\t\t\t{ title: \" ✦ HOILAB TECH ✦ \" },\n\t\t\t);\n\t\t\tlines.push(...boxLines.map((l) => center(l)));\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(center(success(\"●\") + dim(\" En línea · sin conexión a cuentas\") + muted(\" · todo queda en tu máquina\")));\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(\n\t\t\t\tcenter(muted([\"Enter para continuar\", \"q para salir\"].join(\" · \"))),\n\t\t\t);\n\t\t\treturn this.finishRender(lines, width);\n\t\t}\n\n\t\t// ---- Home screen ------------------------------------------------\n\t\tconst boxW = Math.min(width - 4, 72);\n\n\t\t// Header box: logo + status\n\t\tconst statusParts = [\n\t\t\tdim(`model: ${this.defaultModelLabel()}`),\n\t\t\tdim(`cwd: ${this.cwdLabel()}`),\n\t\t\tdim(`memoria: ${this.memoryLabel()}`),\n\t\t\t\"\",\n\t\t];\n\t\tif (this.updateAvailable) {\n\t\t\tstatusParts.push(\n\t\t\t\twarning(\n\t\t\t\t\t`⚠ Nueva versión disponible: v${this.updateAvailable} ` +\n\t\t\t\t\t\taccent(\"[u] actualizar\") +\n\t\t\t\t\t\tdim(\" · q para ignorar\"),\n\t\t\t\t),\n\t\t\t);\n\t\t} else if (this.updateChecked) {\n\t\t\tstatusParts.push(success(\"✓ Sistema actualizado\"));\n\t\t}\n\t\tlines.push(...box([\"\", ...logoLines, tagline, \"\", ...statusParts], boxW, { title: \" ✦ HOILAB TECH ✦ \" }).map((l) => center(l)));\n\t\tlines.push(\"\");\n\n\t\t// Conversations box\n\t\tconst convLines: string[] = [\"\"];\n\t\tconst isNew = this.selectedIndex === 0;\n\t\tconvLines.push(\n\t\t\t`${isNew ? accent(\"▸ \") : \" \"}${accent(\"✦\")} ${isNew ? theme.bold(\"Nueva conversación\") : \"Nueva conversación\"}`,\n\t\t);\n\t\tconvLines.push(\"\");\n\n\t\tif (this.loading) {\n\t\t\tconvLines.push(dim(\"Cargando conversaciones…\"));\n\t\t} else if (this.filtered.length === 0) {\n\t\t\tconvLines.push(\n\t\t\t\tmuted(\n\t\t\t\t\tthis.query\n\t\t\t\t\t\t? \"No hay conversaciones que coincidan con tu búsqueda\"\n\t\t\t\t\t\t: \"Todavía no hay conversaciones anteriores\",\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tconst maxVisible = Math.max(1, Math.min(12, Math.floor((width * 2) / 3)));\n\t\t\tconst visible = this.filtered.slice(0, maxVisible);\n\t\t\tfor (let i = 0; i < visible.length; i++) {\n\t\t\t\tconst session = visible[i];\n\t\t\t\tconst isSelected = this.selectedIndex === i + 1;\n\t\t\t\tconst title = sessionTitle(session);\n\t\t\t\tconst meta = muted(\n\t\t\t\t\t`${relativeTime(session.modified.toISOString())} · ${session.messageCount} msgs`,\n\t\t\t\t);\n\t\t\t\tconst arrow = isSelected ? accent(\"▸ \") : \" \";\n\t\t\t\tconst titleStyled = isSelected ? theme.bold(accent(title)) : title;\n\t\t\t\tconvLines.push(`${arrow}${titleStyled} ${meta}`);\n\t\t\t}\n\t\t\tif (this.filtered.length > maxVisible) {\n\t\t\t\tconvLines.push(dim(`… y ${this.filtered.length - maxVisible} más`));\n\t\t\t}\n\t\t}\n\t\tconvLines.push(\"\");\n\t\tlines.push(...box(convLines, boxW, { title: \" Conversaciones \" }).map((l) => center(l)));\n\t\tlines.push(\"\");\n\n\t\tconst hints = [\n\t\t\t\"↑/↓ navegar\",\n\t\t\t\"Enter seleccionar\",\n\t\t\t\"n nueva\",\n\t\t\tthis.updateAvailable ? \"u actualizar\" : null,\n\t\t\t\"q salir\",\n\t\t].filter((h): h is string => h !== null);\n\t\tlines.push(center(muted(hints.join(\" · \"))));\n\t\treturn this.finishRender(lines, width);\n\t}\n\n\t/** Vertical centering + truncation of every rendered line. */\n\tprivate finishRender(lines: string[], width: number): string[] {\n\t\tconst rows = process.stdout.rows ?? 24;\n\t\tconst contentHeight = lines.length;\n\t\tconst topPad = Math.min(3, Math.max(0, Math.floor((rows - contentHeight) / 3)));\n\t\treturn [...Array<string>(topPad).fill(\"\"), ...lines.map((line) => truncateToWidth(line, width))];\n\t}\n\n\tprivate defaultModelLabel(): string {\n\t\treturn this.modelLabel ?? \"no configurado (/model)\";\n\t}\n\n\tprivate cwdLabel(): string {\n\t\treturn this.cwdLabelValue ?? process.cwd();\n\t}\n\n\tprivate memoryLabel(): string {\n\t\treturn this.memoryEnabled ? \"activada\" : \"desactivada\";\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"home-screen.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/home-screen.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EACd,SAAS,EAKT,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAKzF,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC;AAEzF,KAAK,cAAc,GAAG,CAAC,UAAU,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAwDnF;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,SAAU,YAAW,SAAS;IACtE,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAwB;IAExC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,kEAAkE;IAC3D,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEhC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAExC;IAED,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/B;IAED,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEvC;IAED,YAAY,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAMxD;IAGD,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAW5B;IAED,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,SAAS;YAQH,WAAW;IAczB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAkD9B;IAED,UAAU,IAAI,IAAI,CAAG;IAErB,gBAAgB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAErC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA4H9B;IAED,8DAA8D;IAC9D,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,WAAW;CAGnB","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\tgetKeybindings,\n\tInput,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport type { SessionInfo, SessionListProgress } from \"../../../core/session-manager.ts\";\nimport { checkForNewPiVersion } from \"../../../utils/version-check.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { filterAndSortSessions } from \"./session-selector-search.ts\";\n\nexport type HomeScreenResult = { kind: \"new\" } | { kind: \"resume\"; path: string } | null;\n\ntype SessionsLoader = (onProgress?: SessionListProgress) => Promise<SessionInfo[]>;\n\nconst ASCII_LOGO = [\n\t\" █████╗ ██████╗ █████╗\",\n\t\" ██╔══██╗██╔══██╗██╔══██╗\",\n\t\" ███████║██║ ██║███████║\",\n\t\" ██╔══██║██║ ██║██╔══██║\",\n\t\" ██║ ██║██████╔╝██║ ██║\",\n\t\" ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝\",\n].join(\"\\n\");\n\n/** Vertical teal-to-gray gradient for the ASCII logo. */\nconst LOGO_GRADIENT = [\"accent\", \"accent\", \"borderAccent\", \"border\", \"borderMuted\", \"muted\"] as const;\n\n/** Draw a rounded box around centered content with an optional title. */\nfunction box(\n\tcontentLines: string[],\n\twidth: number,\n\toptions: { title?: string; color?: (str: string) => string } = {},\n): string[] {\n\tconst color = options.color ?? ((str: string) => theme.fg(\"border\", str));\n\tconst innerWidth = Math.max(10, width - 4);\n\tconst top =\n\t\toptions.title !== undefined\n\t\t\t? color(`╭─ ${options.title} `) + \"─\".repeat(Math.max(1, innerWidth - options.title.length - 2)) + color(\"─╮\")\n\t\t\t: color(`╭${\"─\".repeat(innerWidth)}╮`);\n\tconst bottom = color(`╰${\"─\".repeat(innerWidth)}╯`);\n\tconst pad = (line: string) => {\n\t\tconst visible = visibleWidth(line);\n\t\tconst left = Math.max(0, Math.floor((innerWidth - visible) / 2));\n\t\tconst right = Math.max(0, innerWidth - visible - left);\n\t\treturn color(\"│ \") + \" \".repeat(left) + line + \" \".repeat(right) + color(\" │\");\n\t};\n\treturn [top, ...contentLines.map(pad), bottom];\n}\n\nfunction sessionTitle(session: SessionInfo): string {\n\tif (session.name) return session.name;\n\tconst first = (session.firstMessage ?? \"\").replace(/\\s+/g, \" \").trim();\n\tif (first.length > 0) return first.length > 60 ? `${first.slice(0, 60)}…` : first;\n\treturn \"Conversation\";\n}\n\nfunction relativeTime(iso: string): string {\n\tconst diffMs = Date.now() - new Date(iso).getTime();\n\tconst mins = Math.floor(diffMs / 60000);\n\tif (mins < 1) return \"now\";\n\tif (mins < 60) return `${mins}m`;\n\tconst hours = Math.floor(mins / 60);\n\tif (hours < 24) return `${hours}h`;\n\tconst days = Math.floor(hours / 24);\n\tif (days < 7) return `${days}d`;\n\tif (days < 30) return `${Math.floor(days / 7)}w`;\n\treturn `${Math.floor(days / 30)}mo`;\n}\n\n/**\n * Central welcome flow (opencode style) shown when the CLI starts:\n * 1) entry screen: \"Enter as guest\" (login is disabled for now)\n * 2) home screen: welcome banner, update notice, recent conversations and\n * a \"New conversation\" action.\n */\nexport class HomeScreenComponent extends Container implements Component {\n\tprivate phase: \"login\" | \"home\" = \"login\";\n\tprivate sessions: SessionInfo[] = [];\n\tprivate filtered: SessionInfo[] = [];\n\tprivate selectedIndex = 0; // 0 = \"New conversation\", then sessions\n\tprivate query = \"\";\n\tprivate loading = false;\n\tprivate updateAvailable: string | null = null;\n\tprivate updateChecked = false;\n\tprivate searchInput: Input;\n\tprivate loadSessions: SessionsLoader;\n\tprivate version: string;\n\tprivate modelLabel: string | null = null;\n\tprivate cwdLabelValue: string | null = null;\n\tprivate memoryEnabled = true;\n\tprivate _focused = false;\n\tprivate requestRenderFn: () => void = () => {};\n\n\tpublic onNew?: () => void;\n\tpublic onResume?: (path: string) => void;\n\tpublic onExit?: () => void;\n\tpublic onUpdate?: () => void;\n\t/** Fired when the entry screen transitions to the home screen. */\n\tpublic onEnterHome?: () => void;\n\n\tsetModelLabel(label: string | null): void {\n\t\tthis.modelLabel = label;\n\t}\n\n\tsetCwdLabel(label: string): void {\n\t\tthis.cwdLabelValue = label;\n\t}\n\n\tsetMemoryEnabled(enabled: boolean): void {\n\t\tthis.memoryEnabled = enabled;\n\t}\n\n\tconstructor(loadSessions: SessionsLoader, version: string) {\n\t\tsuper();\n\t\tthis.loadSessions = loadSessions;\n\t\tthis.version = version;\n\t\tthis.searchInput = new Input();\n\t\tthis.searchInput.onSubmit = () => this.confirmSelection();\n\t}\n\n\t// Focusable\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tthis.loading = true;\n\t\tthis.requestRenderFn();\n\t\ttry {\n\t\t\tthis.sessions = await this.loadSessions();\n\t\t} catch {\n\t\t\tthis.sessions = [];\n\t\t}\n\t\tthis.loading = false;\n\t\tthis.applyFilter();\n\t\tthis.requestRenderFn();\n\t}\n\n\tprivate applyFilter(): void {\n\t\tconst q = this.query.trim();\n\t\tthis.filtered = q\n\t\t\t? filterAndSortSessions(this.sessions, q, \"recent\", \"all\")\n\t\t\t: [...this.sessions].sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, this.filtered.length);\n\t}\n\n\tprivate confirmSelection(): void {\n\t\tif (this.phase === \"login\") {\n\t\t\tthis.enterHome();\n\t\t\treturn;\n\t\t}\n\t\tif (this.selectedIndex === 0) {\n\t\t\tthis.onNew?.();\n\t\t} else {\n\t\t\tconst session = this.filtered[this.selectedIndex - 1];\n\t\t\tif (session) this.onResume?.(session.path);\n\t\t}\n\t}\n\n\tprivate enterHome(): void {\n\t\tthis.phase = \"home\";\n\t\tthis.selectedIndex = 0;\n\t\tthis.onEnterHome?.();\n\t\tvoid this.reload();\n\t\tvoid this.checkUpdate();\n\t}\n\n\tprivate async checkUpdate(): Promise<void> {\n\t\tif (this.updateChecked) return;\n\t\tthis.updateChecked = true;\n\t\ttry {\n\t\t\tconst release = await checkForNewPiVersion(this.version);\n\t\t\tif (release) {\n\t\t\t\tthis.updateAvailable = release.version;\n\t\t\t\tthis.requestRenderFn();\n\t\t\t}\n\t\t} catch {\n\t\t\t// Offline or unreachable — ignore silently.\n\t\t}\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (this.phase === \"login\") {\n\t\t\tif (kb.matches(data, \"tui.select.confirm\") || data === \"\\r\" || data === \"\\n\") {\n\t\t\t\tthis.enterHome();\n\t\t\t} else if (kb.matches(data, \"tui.select.cancel\") || data === \"q\" || data === \"Q\") {\n\t\t\t\tthis.onExit?.();\n\t\t\t} else if (kb.matches(data, \"tui.select.down\")) {\n\t\t\t\t// Only one actionable option on the login screen; ignore.\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.requestRenderFn();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.selectedIndex = Math.min(this.filtered.length, this.selectedIndex + 1);\n\t\t\tthis.requestRenderFn();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.confirm\") || data === \"\\r\" || data === \"\\n\") {\n\t\t\tthis.confirmSelection();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.onExit?.();\n\t\t\treturn;\n\t\t}\n\t\tif (data === \"n\" || data === \"N\") {\n\t\t\tthis.onNew?.();\n\t\t\treturn;\n\t\t}\n\t\tif (data === \"u\" || data === \"U\") {\n\t\t\tif (this.updateAvailable) {\n\t\t\t\tthis.onUpdate?.();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (data === \"q\" || data === \"Q\") {\n\t\t\tthis.onExit?.();\n\t\t\treturn;\n\t\t}\n\t\t// Anything else goes to the search input (filters sessions)\n\t\tthis.searchInput.handleInput(data);\n\t\tthis.query = this.searchInput.getValue();\n\t\tthis.applyFilter();\n\t\tthis.requestRenderFn();\n\t}\n\n\tinvalidate(): void {}\n\n\tsetRequestRender(fn: () => void): void {\n\t\tthis.requestRenderFn = fn;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst center = (text: string) => {\n\t\t\tconst pad = Math.max(0, Math.floor((width - visibleWidth(text)) / 2));\n\t\t\treturn \" \".repeat(pad) + text;\n\t\t};\n\t\tconst dim = (t: string) => theme.fg(\"dim\", t);\n\t\tconst muted = (t: string) => theme.fg(\"muted\", t);\n\t\tconst accent = (t: string) => theme.fg(\"accent\", t);\n\t\tconst _border = (t: string) => theme.fg(\"border\", t);\n\t\tconst success = (t: string) => theme.fg(\"success\", t);\n\t\tconst warning = (t: string) => theme.fg(\"warning\", t);\n\n\t\t// Gradient logo (teal -> gray)\n\t\tconst logoLines = ASCII_LOGO.split(\"\\n\").map((line, i) =>\n\t\t\ttheme.fg(LOGO_GRADIENT[Math.min(i, LOGO_GRADIENT.length - 1)], line),\n\t\t);\n\t\tconst tagline = accent(\"Ada\") + dim(\" · coding agent · HOILAB TECH\") + muted(` v${this.version}`);\n\n\t\tlines.push(\"\");\n\n\t\tif (this.phase === \"login\") {\n\t\t\t// ---- Entry screen -------------------------------------------\n\t\t\tconst boxW = Math.min(56, width - 4);\n\t\t\tconst boxLines = box(\n\t\t\t\t[\n\t\t\t\t\t\"\",\n\t\t\t\t\t...logoLines,\n\t\t\t\t\ttagline,\n\t\t\t\t\t\"\",\n\t\t\t\t\tdim(\"Bienvenido a Ada — el agente de codificación de HOILAB TECH\"),\n\t\t\t\t\t\"\",\n\t\t\t\t\taccent(\"▸ \") + theme.bold(\"Entrar como invitado\"),\n\t\t\t\t\tmuted(\" Loguearme\") + dim(\" (próximamente)\"),\n\t\t\t\t\t\"\",\n\t\t\t\t],\n\t\t\t\tboxW,\n\t\t\t\t{ title: \" ✦ HOILAB TECH ✦ \" },\n\t\t\t);\n\t\t\tlines.push(...boxLines.map((l) => center(l)));\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(\n\t\t\t\tcenter(success(\"●\") + dim(\" En línea · sin conexión a cuentas\") + muted(\" · todo queda en tu máquina\")),\n\t\t\t);\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(center(muted([\"Enter para continuar\", \"q para salir\"].join(\" · \"))));\n\t\t\treturn this.finishRender(lines, width);\n\t\t}\n\n\t\t// ---- Home screen ------------------------------------------------\n\t\tconst boxW = Math.min(width - 4, 72);\n\n\t\t// Header box: logo + status\n\t\tconst statusParts = [\n\t\t\tdim(`model: ${this.defaultModelLabel()}`),\n\t\t\tdim(`cwd: ${this.cwdLabel()}`),\n\t\t\tdim(`memoria: ${this.memoryLabel()}`),\n\t\t\t\"\",\n\t\t];\n\t\tif (this.updateAvailable) {\n\t\t\tstatusParts.push(\n\t\t\t\twarning(\n\t\t\t\t\t`⚠ Nueva versión disponible: v${this.updateAvailable} ` +\n\t\t\t\t\t\taccent(\"[u] actualizar\") +\n\t\t\t\t\t\tdim(\" · q para ignorar\"),\n\t\t\t\t),\n\t\t\t);\n\t\t} else if (this.updateChecked) {\n\t\t\tstatusParts.push(success(\"✓ Sistema actualizado\"));\n\t\t}\n\t\tlines.push(\n\t\t\t...box([\"\", ...logoLines, tagline, \"\", ...statusParts], boxW, { title: \" ✦ HOILAB TECH ✦ \" }).map((l) =>\n\t\t\t\tcenter(l),\n\t\t\t),\n\t\t);\n\t\tlines.push(\"\");\n\n\t\t// Conversations box\n\t\tconst convLines: string[] = [\"\"];\n\t\tconst isNew = this.selectedIndex === 0;\n\t\tconvLines.push(\n\t\t\t`${isNew ? accent(\"▸ \") : \" \"}${accent(\"✦\")} ${isNew ? theme.bold(\"Nueva conversación\") : \"Nueva conversación\"}`,\n\t\t);\n\t\tconvLines.push(\"\");\n\n\t\tif (this.loading) {\n\t\t\tconvLines.push(dim(\"Cargando conversaciones…\"));\n\t\t} else if (this.filtered.length === 0) {\n\t\t\tconvLines.push(\n\t\t\t\tmuted(\n\t\t\t\t\tthis.query\n\t\t\t\t\t\t? \"No hay conversaciones que coincidan con tu búsqueda\"\n\t\t\t\t\t\t: \"Todavía no hay conversaciones anteriores\",\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tconst maxVisible = Math.max(1, Math.min(12, Math.floor((width * 2) / 3)));\n\t\t\tconst visible = this.filtered.slice(0, maxVisible);\n\t\t\tfor (let i = 0; i < visible.length; i++) {\n\t\t\t\tconst session = visible[i];\n\t\t\t\tconst isSelected = this.selectedIndex === i + 1;\n\t\t\t\tconst title = sessionTitle(session);\n\t\t\t\tconst meta = muted(`${relativeTime(session.modified.toISOString())} · ${session.messageCount} msgs`);\n\t\t\t\tconst arrow = isSelected ? accent(\"▸ \") : \" \";\n\t\t\t\tconst titleStyled = isSelected ? theme.bold(accent(title)) : title;\n\t\t\t\tconvLines.push(`${arrow}${titleStyled} ${meta}`);\n\t\t\t}\n\t\t\tif (this.filtered.length > maxVisible) {\n\t\t\t\tconvLines.push(dim(`… y ${this.filtered.length - maxVisible} más`));\n\t\t\t}\n\t\t}\n\t\tconvLines.push(\"\");\n\t\tlines.push(...box(convLines, boxW, { title: \" Conversaciones \" }).map((l) => center(l)));\n\t\tlines.push(\"\");\n\n\t\tconst hints = [\n\t\t\t\"↑/↓ navegar\",\n\t\t\t\"Enter seleccionar\",\n\t\t\t\"n nueva\",\n\t\t\tthis.updateAvailable ? \"u actualizar\" : null,\n\t\t\t\"q salir\",\n\t\t].filter((h): h is string => h !== null);\n\t\tlines.push(center(muted(hints.join(\" · \"))));\n\t\treturn this.finishRender(lines, width);\n\t}\n\n\t/** Vertical centering + truncation of every rendered line. */\n\tprivate finishRender(lines: string[], width: number): string[] {\n\t\tconst rows = process.stdout.rows ?? 24;\n\t\tconst contentHeight = lines.length;\n\t\tconst topPad = Math.min(3, Math.max(0, Math.floor((rows - contentHeight) / 3)));\n\t\treturn [...Array<string>(topPad).fill(\"\"), ...lines.map((line) => truncateToWidth(line, width))];\n\t}\n\n\tprivate defaultModelLabel(): string {\n\t\treturn this.modelLabel ?? \"no configurado (/model)\";\n\t}\n\n\tprivate cwdLabel(): string {\n\t\treturn this.cwdLabelValue ?? process.cwd();\n\t}\n\n\tprivate memoryLabel(): string {\n\t\treturn this.memoryEnabled ? \"activada\" : \"desactivada\";\n\t}\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Container,
|
|
1
|
+
import { Container, getKeybindings, Input, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
|
|
2
2
|
import { checkForNewPiVersion } from "../../../utils/version-check.js";
|
|
3
3
|
import { theme } from "../theme/theme.js";
|
|
4
4
|
import { filterAndSortSessions } from "./session-selector-search.js";
|
|
@@ -227,7 +227,7 @@ export class HomeScreenComponent extends Container {
|
|
|
227
227
|
const dim = (t) => theme.fg("dim", t);
|
|
228
228
|
const muted = (t) => theme.fg("muted", t);
|
|
229
229
|
const accent = (t) => theme.fg("accent", t);
|
|
230
|
-
const
|
|
230
|
+
const _border = (t) => theme.fg("border", t);
|
|
231
231
|
const success = (t) => theme.fg("success", t);
|
|
232
232
|
const warning = (t) => theme.fg("warning", t);
|
|
233
233
|
// Gradient logo (teal -> gray)
|