@hoilab/ada-cli 0.84.22 → 0.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -2
- package/README.es.md +17 -6
- package/README.md +109 -11
- package/dist/ada-publico.d.ts +35 -0
- package/dist/ada-publico.d.ts.map +1 -0
- package/dist/ada-publico.js +40 -0
- package/dist/ada-publico.js.map +1 -0
- package/dist/cli/audit-command.d.ts +15 -0
- package/dist/cli/audit-command.d.ts.map +1 -0
- package/dist/cli/audit-command.js +280 -0
- package/dist/cli/audit-command.js.map +1 -0
- package/dist/cli/banco-command.d.ts +15 -0
- package/dist/cli/banco-command.d.ts.map +1 -0
- package/dist/cli/banco-command.js +213 -0
- package/dist/cli/banco-command.js.map +1 -0
- package/dist/cli/cleanse-command.d.ts +11 -0
- package/dist/cli/cleanse-command.d.ts.map +1 -0
- package/dist/cli/cleanse-command.js +101 -0
- package/dist/cli/cleanse-command.js.map +1 -0
- package/dist/cli/commit-command.d.ts +31 -0
- package/dist/cli/commit-command.d.ts.map +1 -0
- package/dist/cli/commit-command.js +158 -0
- package/dist/cli/commit-command.js.map +1 -0
- package/dist/cli/computer-command.d.ts +12 -0
- package/dist/cli/computer-command.d.ts.map +1 -0
- package/dist/cli/computer-command.js +141 -0
- package/dist/cli/computer-command.js.map +1 -0
- package/dist/cli/discover-command.d.ts +18 -0
- package/dist/cli/discover-command.d.ts.map +1 -0
- package/dist/cli/discover-command.js +108 -0
- package/dist/cli/discover-command.js.map +1 -0
- package/dist/cli/hashline-command.d.ts +11 -0
- package/dist/cli/hashline-command.d.ts.map +1 -0
- package/dist/cli/hashline-command.js +106 -0
- package/dist/cli/hashline-command.js.map +1 -0
- package/dist/cli/import-command.d.ts +35 -0
- package/dist/cli/import-command.d.ts.map +1 -0
- package/dist/cli/import-command.js +164 -0
- package/dist/cli/import-command.js.map +1 -0
- package/dist/cli/politica-command.d.ts +20 -0
- package/dist/cli/politica-command.d.ts.map +1 -0
- package/dist/cli/politica-command.js +93 -0
- package/dist/cli/politica-command.js.map +1 -0
- package/dist/cli/refine-command.d.ts +18 -0
- package/dist/cli/refine-command.d.ts.map +1 -0
- package/dist/cli/refine-command.js +101 -0
- package/dist/cli/refine-command.js.map +1 -0
- package/dist/cli/review-command.d.ts +24 -0
- package/dist/cli/review-command.d.ts.map +1 -0
- package/dist/cli/review-command.js +168 -0
- package/dist/cli/review-command.js.map +1 -0
- package/dist/cli/schedule-command.d.ts +17 -0
- package/dist/cli/schedule-command.d.ts.map +1 -0
- package/dist/cli/schedule-command.js +117 -0
- package/dist/cli/schedule-command.js.map +1 -0
- package/dist/cli/serve-command.d.ts +72 -0
- package/dist/cli/serve-command.d.ts.map +1 -0
- package/dist/cli/serve-command.js +568 -0
- package/dist/cli/serve-command.js.map +1 -0
- package/dist/cli/telegram-command.d.ts +18 -0
- package/dist/cli/telegram-command.d.ts.map +1 -0
- package/dist/cli/telegram-command.js +137 -0
- package/dist/cli/telegram-command.js.map +1 -0
- package/dist/cli/telemetria-command.d.ts +22 -0
- package/dist/cli/telemetria-command.d.ts.map +1 -0
- package/dist/cli/telemetria-command.js +127 -0
- package/dist/cli/telemetria-command.js.map +1 -0
- package/dist/cli/undo-command.d.ts +9 -0
- package/dist/cli/undo-command.d.ts.map +1 -0
- package/dist/cli/undo-command.js +56 -0
- package/dist/cli/undo-command.js.map +1 -0
- package/dist/cli/usage-command.d.ts +10 -0
- package/dist/cli/usage-command.d.ts.map +1 -0
- package/dist/cli/usage-command.js +209 -0
- package/dist/cli/usage-command.js.map +1 -0
- package/dist/cli/wiki-command.d.ts +9 -0
- package/dist/cli/wiki-command.d.ts.map +1 -0
- package/dist/cli/wiki-command.js +76 -0
- package/dist/cli/wiki-command.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -11
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/ada.d.ts +58 -0
- package/dist/core/ada.d.ts.map +1 -0
- package/dist/core/ada.js +61 -0
- package/dist/core/ada.js.map +1 -0
- package/dist/core/advisor/guarda.d.ts +66 -0
- package/dist/core/advisor/guarda.d.ts.map +1 -0
- package/dist/core/advisor/guarda.js +191 -0
- package/dist/core/advisor/guarda.js.map +1 -0
- package/dist/core/advisor/runtime.d.ts +66 -0
- package/dist/core/advisor/runtime.d.ts.map +1 -0
- package/dist/core/advisor/runtime.js +121 -0
- package/dist/core/advisor/runtime.js.map +1 -0
- package/dist/core/advisor/sesion.d.ts +109 -0
- package/dist/core/advisor/sesion.d.ts.map +1 -0
- package/dist/core/advisor/sesion.js +139 -0
- package/dist/core/advisor/sesion.js.map +1 -0
- package/dist/core/agent-session.d.ts +30 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +430 -22
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents/loader.d.ts +77 -0
- package/dist/core/agents/loader.d.ts.map +1 -0
- package/dist/core/agents/loader.js +154 -0
- package/dist/core/agents/loader.js.map +1 -0
- package/dist/core/aprobacion/generados.d.ts +37 -0
- package/dist/core/aprobacion/generados.d.ts.map +1 -0
- package/dist/core/aprobacion/generados.js +85 -0
- package/dist/core/aprobacion/generados.js.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.js +212 -0
- package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
- package/dist/core/aprobacion/politica.d.ts +90 -0
- package/dist/core/aprobacion/politica.d.ts.map +1 -0
- package/dist/core/aprobacion/politica.js +375 -0
- package/dist/core/aprobacion/politica.js.map +1 -0
- package/dist/core/arranque/atajos.d.ts +46 -0
- package/dist/core/arranque/atajos.d.ts.map +1 -0
- package/dist/core/arranque/atajos.js +113 -0
- package/dist/core/arranque/atajos.js.map +1 -0
- package/dist/core/audit/exportacion.d.ts +54 -0
- package/dist/core/audit/exportacion.d.ts.map +1 -0
- package/dist/core/audit/exportacion.js +265 -0
- package/dist/core/audit/exportacion.js.map +1 -0
- package/dist/core/audit/libro.d.ts +318 -0
- package/dist/core/audit/libro.d.ts.map +1 -0
- package/dist/core/audit/libro.js +508 -0
- package/dist/core/audit/libro.js.map +1 -0
- package/dist/core/audit/registro-sesion.d.ts +78 -0
- package/dist/core/audit/registro-sesion.d.ts.map +1 -0
- package/dist/core/audit/registro-sesion.js +202 -0
- package/dist/core/audit/registro-sesion.js.map +1 -0
- package/dist/core/audit/retencion.d.ts +82 -0
- package/dist/core/audit/retencion.d.ts.map +1 -0
- package/dist/core/audit/retencion.js +152 -0
- package/dist/core/audit/retencion.js.map +1 -0
- package/dist/core/audit/rutas.d.ts +23 -0
- package/dist/core/audit/rutas.d.ts.map +1 -0
- package/dist/core/audit/rutas.js +23 -0
- package/dist/core/audit/rutas.js.map +1 -0
- package/dist/core/auth-storage.d.ts +0 -3
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +17 -5
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/banco/almacenamiento.d.ts +18 -0
- package/dist/core/banco/almacenamiento.d.ts.map +1 -0
- package/dist/core/banco/almacenamiento.js +50 -0
- package/dist/core/banco/almacenamiento.js.map +1 -0
- package/dist/core/banco/analisis.d.ts +37 -0
- package/dist/core/banco/analisis.d.ts.map +1 -0
- package/dist/core/banco/analisis.js +164 -0
- package/dist/core/banco/analisis.js.map +1 -0
- package/dist/core/banco/bloques.d.ts +39 -0
- package/dist/core/banco/bloques.d.ts.map +1 -0
- package/dist/core/banco/bloques.js +84 -0
- package/dist/core/banco/bloques.js.map +1 -0
- package/dist/core/banco/cargas.d.ts +84 -0
- package/dist/core/banco/cargas.d.ts.map +1 -0
- package/dist/core/banco/cargas.js +520 -0
- package/dist/core/banco/cargas.js.map +1 -0
- package/dist/core/banco/comparar.d.ts +29 -0
- package/dist/core/banco/comparar.d.ts.map +1 -0
- package/dist/core/banco/comparar.js +28 -0
- package/dist/core/banco/comparar.js.map +1 -0
- package/dist/core/banco/ejecutar.d.ts +44 -0
- package/dist/core/banco/ejecutar.d.ts.map +1 -0
- package/dist/core/banco/ejecutar.js +183 -0
- package/dist/core/banco/ejecutar.js.map +1 -0
- package/dist/core/banco/generar.d.ts +24 -0
- package/dist/core/banco/generar.d.ts.map +1 -0
- package/dist/core/banco/generar.js +159 -0
- package/dist/core/banco/generar.js.map +1 -0
- package/dist/core/banco/mutaciones.d.ts +25 -0
- package/dist/core/banco/mutaciones.d.ts.map +1 -0
- package/dist/core/banco/mutaciones.js +215 -0
- package/dist/core/banco/mutaciones.js.map +1 -0
- package/dist/core/banco/tipos.d.ts +121 -0
- package/dist/core/banco/tipos.d.ts.map +1 -0
- package/dist/core/banco/tipos.js +16 -0
- package/dist/core/banco/tipos.js.map +1 -0
- package/dist/core/blobs/almacen.d.ts +81 -0
- package/dist/core/blobs/almacen.d.ts.map +1 -0
- package/dist/core/blobs/almacen.js +198 -0
- package/dist/core/blobs/almacen.js.map +1 -0
- package/dist/core/blobs/broker.d.ts +103 -0
- package/dist/core/blobs/broker.d.ts.map +1 -0
- package/dist/core/blobs/broker.js +204 -0
- package/dist/core/blobs/broker.js.map +1 -0
- package/dist/core/blobs/index.d.ts +70 -0
- package/dist/core/blobs/index.d.ts.map +1 -0
- package/dist/core/blobs/index.js +232 -0
- package/dist/core/blobs/index.js.map +1 -0
- package/dist/core/blobs/payload.d.ts +55 -0
- package/dist/core/blobs/payload.d.ts.map +1 -0
- package/dist/core/blobs/payload.js +255 -0
- package/dist/core/blobs/payload.js.map +1 -0
- package/dist/core/blobs/proveedor.d.ts +85 -0
- package/dist/core/blobs/proveedor.d.ts.map +1 -0
- package/dist/core/blobs/proveedor.js +196 -0
- package/dist/core/blobs/proveedor.js.map +1 -0
- package/dist/core/browser/cdp.d.ts +41 -0
- package/dist/core/browser/cdp.d.ts.map +1 -0
- package/dist/core/browser/cdp.js +119 -0
- package/dist/core/browser/cdp.js.map +1 -0
- package/dist/core/browser/politica.d.ts +51 -0
- package/dist/core/browser/politica.d.ts.map +1 -0
- package/dist/core/browser/politica.js +123 -0
- package/dist/core/browser/politica.js.map +1 -0
- package/dist/core/browser/sesion.d.ts +52 -0
- package/dist/core/browser/sesion.d.ts.map +1 -0
- package/dist/core/browser/sesion.js +176 -0
- package/dist/core/browser/sesion.js.map +1 -0
- package/dist/core/browser/tools.d.ts +16 -0
- package/dist/core/browser/tools.d.ts.map +1 -0
- package/dist/core/browser/tools.js +279 -0
- package/dist/core/browser/tools.js.map +1 -0
- package/dist/core/commit/diff.d.ts +56 -0
- package/dist/core/commit/diff.d.ts.map +1 -0
- package/dist/core/commit/diff.js +145 -0
- package/dist/core/commit/diff.js.map +1 -0
- package/dist/core/commit/mensaje.d.ts +80 -0
- package/dist/core/commit/mensaje.d.ts.map +1 -0
- package/dist/core/commit/mensaje.js +207 -0
- package/dist/core/commit/mensaje.js.map +1 -0
- package/dist/core/compactar/index.d.ts +52 -0
- package/dist/core/compactar/index.d.ts.map +1 -0
- package/dist/core/compactar/index.js +91 -0
- package/dist/core/compactar/index.js.map +1 -0
- package/dist/core/compactar/registro-denso.d.ts +160 -0
- package/dist/core/compactar/registro-denso.d.ts.map +1 -0
- package/dist/core/compactar/registro-denso.js +620 -0
- package/dist/core/compactar/registro-denso.js.map +1 -0
- package/dist/core/computer/captura.d.ts +35 -0
- package/dist/core/computer/captura.d.ts.map +1 -0
- package/dist/core/computer/captura.js +140 -0
- package/dist/core/computer/captura.js.map +1 -0
- package/dist/core/computer/driver.d.ts +130 -0
- package/dist/core/computer/driver.d.ts.map +1 -0
- package/dist/core/computer/driver.js +206 -0
- package/dist/core/computer/driver.js.map +1 -0
- package/dist/core/computer/motor/actions.d.ts +109 -0
- package/dist/core/computer/motor/actions.d.ts.map +1 -0
- package/dist/core/computer/motor/actions.js +157 -0
- package/dist/core/computer/motor/actions.js.map +1 -0
- package/dist/core/computer/motor/bridge.d.ts +232 -0
- package/dist/core/computer/motor/bridge.d.ts.map +1 -0
- package/dist/core/computer/motor/bridge.js +2335 -0
- package/dist/core/computer/motor/bridge.js.map +1 -0
- package/dist/core/computer/motor/cdp.d.ts +107 -0
- package/dist/core/computer/motor/cdp.d.ts.map +1 -0
- package/dist/core/computer/motor/cdp.js +659 -0
- package/dist/core/computer/motor/cdp.js.map +1 -0
- package/dist/core/computer/motor/config.d.ts +23 -0
- package/dist/core/computer/motor/config.d.ts.map +1 -0
- package/dist/core/computer/motor/config.js +100 -0
- package/dist/core/computer/motor/config.js.map +1 -0
- package/dist/core/computer/motor/contract.d.ts +81 -0
- package/dist/core/computer/motor/contract.d.ts.map +1 -0
- package/dist/core/computer/motor/contract.js +14 -0
- package/dist/core/computer/motor/contract.js.map +1 -0
- package/dist/core/computer/motor/note.d.ts +37 -0
- package/dist/core/computer/motor/note.d.ts.map +1 -0
- package/dist/core/computer/motor/note.js +162 -0
- package/dist/core/computer/motor/note.js.map +1 -0
- package/dist/core/computer/motor/outline.d.ts +155 -0
- package/dist/core/computer/motor/outline.d.ts.map +1 -0
- package/dist/core/computer/motor/outline.js +590 -0
- package/dist/core/computer/motor/outline.js.map +1 -0
- package/dist/core/computer/motor/output.d.ts +18 -0
- package/dist/core/computer/motor/output.d.ts.map +1 -0
- package/dist/core/computer/motor/output.js +148 -0
- package/dist/core/computer/motor/output.js.map +1 -0
- package/dist/core/computer/motor/permissions.d.ts +41 -0
- package/dist/core/computer/motor/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/permissions.js +51 -0
- package/dist/core/computer/motor/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
- package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/architecture.js +21 -0
- package/dist/core/computer/motor/platform/architecture.js.map +1 -0
- package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
- package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/coerce.js +17 -0
- package/dist/core/computer/motor/platform/coerce.js.map +1 -0
- package/dist/core/computer/motor/platform/index.d.ts +4 -0
- package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/index.js +79 -0
- package/dist/core/computer/motor/platform/index.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.js +173 -0
- package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.js +261 -0
- package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.js +124 -0
- package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.js +101 -0
- package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper.js +277 -0
- package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
- package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/types.d.ts +263 -0
- package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/types.js +2 -0
- package/dist/core/computer/motor/platform/types.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.js +163 -0
- package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.js +174 -0
- package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
- package/dist/core/computer/motor/root-selection.d.ts +6 -0
- package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
- package/dist/core/computer/motor/root-selection.js +28 -0
- package/dist/core/computer/motor/root-selection.js.map +1 -0
- package/dist/core/computer/motor/runtime.d.ts +50 -0
- package/dist/core/computer/motor/runtime.d.ts.map +1 -0
- package/dist/core/computer/motor/runtime.js +119 -0
- package/dist/core/computer/motor/runtime.js.map +1 -0
- package/dist/core/computer/motor/state.d.ts +68 -0
- package/dist/core/computer/motor/state.d.ts.map +1 -0
- package/dist/core/computer/motor/state.js +100 -0
- package/dist/core/computer/motor/state.js.map +1 -0
- package/dist/core/computer/motor/view.d.ts +6 -0
- package/dist/core/computer/motor/view.d.ts.map +1 -0
- package/dist/core/computer/motor/view.js +185 -0
- package/dist/core/computer/motor/view.js.map +1 -0
- package/dist/core/computer/motor-ada.d.ts +159 -0
- package/dist/core/computer/motor-ada.d.ts.map +1 -0
- package/dist/core/computer/motor-ada.js +412 -0
- package/dist/core/computer/motor-ada.js.map +1 -0
- package/dist/core/computer/politica.d.ts +56 -0
- package/dist/core/computer/politica.d.ts.map +1 -0
- package/dist/core/computer/politica.js +163 -0
- package/dist/core/computer/politica.js.map +1 -0
- package/dist/core/computer/tools.d.ts +26 -0
- package/dist/core/computer/tools.d.ts.map +1 -0
- package/dist/core/computer/tools.js +399 -0
- package/dist/core/computer/tools.js.map +1 -0
- package/dist/core/context-breakdown.d.ts +80 -0
- package/dist/core/context-breakdown.d.ts.map +1 -0
- package/dist/core/context-breakdown.js +87 -0
- package/dist/core/context-breakdown.js.map +1 -0
- package/dist/core/credenciales/cliente.d.ts +60 -0
- package/dist/core/credenciales/cliente.d.ts.map +1 -0
- package/dist/core/credenciales/cliente.js +81 -0
- package/dist/core/credenciales/cliente.js.map +1 -0
- package/dist/core/credenciales/pool.d.ts +96 -0
- package/dist/core/credenciales/pool.d.ts.map +1 -0
- package/dist/core/credenciales/pool.js +128 -0
- package/dist/core/credenciales/pool.js.map +1 -0
- package/dist/core/credenciales/reposo.d.ts +93 -0
- package/dist/core/credenciales/reposo.d.ts.map +1 -0
- package/dist/core/credenciales/reposo.js +489 -0
- package/dist/core/credenciales/reposo.js.map +1 -0
- package/dist/core/credenciales/servidor.d.ts +55 -0
- package/dist/core/credenciales/servidor.d.ts.map +1 -0
- package/dist/core/credenciales/servidor.js +205 -0
- package/dist/core/credenciales/servidor.js.map +1 -0
- package/dist/core/descubrimiento/comandos.d.ts +30 -0
- package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
- package/dist/core/descubrimiento/comandos.js +76 -0
- package/dist/core/descubrimiento/comandos.js.map +1 -0
- package/dist/core/descubrimiento/mcp.d.ts +42 -0
- package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
- package/dist/core/descubrimiento/mcp.js +130 -0
- package/dist/core/descubrimiento/mcp.js.map +1 -0
- package/dist/core/descubrimiento/reglas.d.ts +61 -0
- package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
- package/dist/core/descubrimiento/reglas.js +134 -0
- package/dist/core/descubrimiento/reglas.js.map +1 -0
- package/dist/core/descubrimiento/skills.d.ts +57 -0
- package/dist/core/descubrimiento/skills.d.ts.map +1 -0
- package/dist/core/descubrimiento/skills.js +113 -0
- package/dist/core/descubrimiento/skills.js.map +1 -0
- package/dist/core/dificultad/clasificador.d.ts +133 -0
- package/dist/core/dificultad/clasificador.d.ts.map +1 -0
- package/dist/core/dificultad/clasificador.js +288 -0
- package/dist/core/dificultad/clasificador.js.map +1 -0
- package/dist/core/edicion/diario.d.ts +37 -0
- package/dist/core/edicion/diario.d.ts.map +1 -0
- package/dist/core/edicion/diario.js +51 -0
- package/dist/core/edicion/diario.js.map +1 -0
- package/dist/core/edicion/hashline.d.ts +71 -0
- package/dist/core/edicion/hashline.d.ts.map +1 -0
- package/dist/core/edicion/hashline.js +111 -0
- package/dist/core/edicion/hashline.js.map +1 -0
- package/dist/core/edicion/hueco.d.ts +64 -0
- package/dist/core/edicion/hueco.d.ts.map +1 -0
- package/dist/core/edicion/hueco.js +162 -0
- package/dist/core/edicion/hueco.js.map +1 -0
- package/dist/core/edicion/limpiar-carga.d.ts +39 -0
- package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
- package/dist/core/edicion/limpiar-carga.js +121 -0
- package/dist/core/edicion/limpiar-carga.js.map +1 -0
- package/dist/core/edicion/observador.d.ts +80 -0
- package/dist/core/edicion/observador.d.ts.map +1 -0
- package/dist/core/edicion/observador.js +183 -0
- package/dist/core/edicion/observador.js.map +1 -0
- package/dist/core/edicion/parecido.d.ts +53 -0
- package/dist/core/edicion/parecido.d.ts.map +1 -0
- package/dist/core/edicion/parecido.js +145 -0
- package/dist/core/edicion/parecido.js.map +1 -0
- package/dist/core/edicion/parseo.d.ts +58 -0
- package/dist/core/edicion/parseo.d.ts.map +1 -0
- package/dist/core/edicion/parseo.js +124 -0
- package/dist/core/edicion/parseo.js.map +1 -0
- package/dist/core/edicion/reparacion.d.ts +67 -0
- package/dist/core/edicion/reparacion.d.ts.map +1 -0
- package/dist/core/edicion/reparacion.js +202 -0
- package/dist/core/edicion/reparacion.js.map +1 -0
- package/dist/core/edicion/sangria.d.ts +121 -0
- package/dist/core/edicion/sangria.d.ts.map +1 -0
- package/dist/core/edicion/sangria.js +341 -0
- package/dist/core/edicion/sangria.js.map +1 -0
- package/dist/core/edicion/tipos.d.ts +58 -0
- package/dist/core/edicion/tipos.d.ts.map +1 -0
- package/dist/core/edicion/tipos.js +160 -0
- package/dist/core/edicion/tipos.js.map +1 -0
- package/dist/core/errores/proveedor.d.ts +53 -0
- package/dist/core/errores/proveedor.d.ts.map +1 -0
- package/dist/core/errores/proveedor.js +191 -0
- package/dist/core/errores/proveedor.js.map +1 -0
- package/dist/core/estructural/buscar.d.ts +61 -0
- package/dist/core/estructural/buscar.d.ts.map +1 -0
- package/dist/core/estructural/buscar.js +261 -0
- package/dist/core/estructural/buscar.js.map +1 -0
- package/dist/core/estructural/editar.d.ts +36 -0
- package/dist/core/estructural/editar.d.ts.map +1 -0
- package/dist/core/estructural/editar.js +123 -0
- package/dist/core/estructural/editar.js.map +1 -0
- package/dist/core/estructural/tools.d.ts +11 -0
- package/dist/core/estructural/tools.d.ts.map +1 -0
- package/dist/core/estructural/tools.js +100 -0
- package/dist/core/estructural/tools.js.map +1 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +10 -1
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensiones/suplantacion.d.ts +49 -0
- package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
- package/dist/core/extensiones/suplantacion.js +61 -0
- package/dist/core/extensiones/suplantacion.js.map +1 -0
- package/dist/core/extensiones/vigilancia.d.ts +54 -0
- package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
- package/dist/core/extensiones/vigilancia.js +217 -0
- package/dist/core/extensiones/vigilancia.js.map +1 -0
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +11 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
- package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
- package/dist/core/harness/fuentes-de-contexto.js +44 -0
- package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
- package/dist/core/harness/refine.d.ts +40 -0
- package/dist/core/harness/refine.d.ts.map +1 -0
- package/dist/core/harness/refine.js +109 -0
- package/dist/core/harness/refine.js.map +1 -0
- package/dist/core/harness/store.d.ts +75 -0
- package/dist/core/harness/store.d.ts.map +1 -0
- package/dist/core/harness/store.js +149 -0
- package/dist/core/harness/store.js.map +1 -0
- package/dist/core/hooks/contract.d.ts +85 -0
- package/dist/core/hooks/contract.d.ts.map +1 -0
- package/dist/core/hooks/contract.js +140 -0
- package/dist/core/hooks/contract.js.map +1 -0
- package/dist/core/hooks/runner.d.ts +42 -0
- package/dist/core/hooks/runner.d.ts.map +1 -0
- package/dist/core/hooks/runner.js +85 -0
- package/dist/core/hooks/runner.js.map +1 -0
- package/dist/core/hooks/session-hooks.d.ts +62 -0
- package/dist/core/hooks/session-hooks.d.ts.map +1 -0
- package/dist/core/hooks/session-hooks.js +84 -0
- package/dist/core/hooks/session-hooks.js.map +1 -0
- package/dist/core/importar/formatos.d.ts +69 -0
- package/dist/core/importar/formatos.d.ts.map +1 -0
- package/dist/core/importar/formatos.js +235 -0
- package/dist/core/importar/formatos.js.map +1 -0
- package/dist/core/interactivo/deteccion.d.ts +44 -0
- package/dist/core/interactivo/deteccion.d.ts.map +1 -0
- package/dist/core/interactivo/deteccion.js +82 -0
- package/dist/core/interactivo/deteccion.js.map +1 -0
- package/dist/core/interactivo/sesion.d.ts +50 -0
- package/dist/core/interactivo/sesion.d.ts.map +1 -0
- package/dist/core/interactivo/sesion.js +156 -0
- package/dist/core/interactivo/sesion.js.map +1 -0
- package/dist/core/interactivo/tools.d.ts +21 -0
- package/dist/core/interactivo/tools.d.ts.map +1 -0
- package/dist/core/interactivo/tools.js +122 -0
- package/dist/core/interactivo/tools.js.map +1 -0
- package/dist/core/lectura/mapa.d.ts +70 -0
- package/dist/core/lectura/mapa.d.ts.map +1 -0
- package/dist/core/lectura/mapa.js +177 -0
- package/dist/core/lectura/mapa.js.map +1 -0
- package/dist/core/lectura/pdf.d.ts +49 -0
- package/dist/core/lectura/pdf.d.ts.map +1 -0
- package/dist/core/lectura/pdf.js +337 -0
- package/dist/core/lectura/pdf.js.map +1 -0
- package/dist/core/limpieza/comprobadores.d.ts +28 -0
- package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
- package/dist/core/limpieza/comprobadores.js +311 -0
- package/dist/core/limpieza/comprobadores.js.map +1 -0
- package/dist/core/limpieza/parseo.d.ts +19 -0
- package/dist/core/limpieza/parseo.d.ts.map +1 -0
- package/dist/core/limpieza/parseo.js +124 -0
- package/dist/core/limpieza/parseo.js.map +1 -0
- package/dist/core/limpieza/reparacion.d.ts +77 -0
- package/dist/core/limpieza/reparacion.d.ts.map +1 -0
- package/dist/core/limpieza/reparacion.js +254 -0
- package/dist/core/limpieza/reparacion.js.map +1 -0
- package/dist/core/limpieza/tipos.d.ts +56 -0
- package/dist/core/limpieza/tipos.d.ts.map +1 -0
- package/dist/core/limpieza/tipos.js +9 -0
- package/dist/core/limpieza/tipos.js.map +1 -0
- package/dist/core/lsp/cliente.d.ts +52 -0
- package/dist/core/lsp/cliente.d.ts.map +1 -0
- package/dist/core/lsp/cliente.js +232 -0
- package/dist/core/lsp/cliente.js.map +1 -0
- package/dist/core/lsp/descubrimiento.d.ts +62 -0
- package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
- package/dist/core/lsp/descubrimiento.js +152 -0
- package/dist/core/lsp/descubrimiento.js.map +1 -0
- package/dist/core/lsp/ediciones.d.ts +59 -0
- package/dist/core/lsp/ediciones.d.ts.map +1 -0
- package/dist/core/lsp/ediciones.js +89 -0
- package/dist/core/lsp/ediciones.js.map +1 -0
- package/dist/core/lsp/extension.d.ts +28 -0
- package/dist/core/lsp/extension.d.ts.map +1 -0
- package/dist/core/lsp/extension.js +34 -0
- package/dist/core/lsp/extension.js.map +1 -0
- package/dist/core/lsp/tools.d.ts +45 -0
- package/dist/core/lsp/tools.d.ts.map +1 -0
- package/dist/core/lsp/tools.js +265 -0
- package/dist/core/lsp/tools.js.map +1 -0
- package/dist/core/mcp/client.d.ts +60 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +139 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/manager.d.ts +86 -0
- package/dist/core/mcp/manager.d.ts.map +1 -0
- package/dist/core/mcp/manager.js +124 -0
- package/dist/core/mcp/manager.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +15 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +84 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/memory-engine/audit-export.d.ts +12 -10
- package/dist/core/memory-engine/audit-export.d.ts.map +1 -1
- package/dist/core/memory-engine/audit-export.js +15 -0
- package/dist/core/memory-engine/audit-export.js.map +1 -1
- package/dist/core/memory-engine/audit-indice.d.ts +153 -0
- package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
- package/dist/core/memory-engine/audit-indice.js +271 -0
- package/dist/core/memory-engine/audit-indice.js.map +1 -0
- package/dist/core/memory-engine/audit.d.ts +18 -6
- package/dist/core/memory-engine/audit.d.ts.map +1 -1
- package/dist/core/memory-engine/audit.js +25 -42
- package/dist/core/memory-engine/audit.js.map +1 -1
- package/dist/core/memory-engine/engine.d.ts +19 -1
- package/dist/core/memory-engine/engine.d.ts.map +1 -1
- package/dist/core/memory-engine/engine.js +71 -5
- package/dist/core/memory-engine/engine.js.map +1 -1
- package/dist/core/memory-engine/observation-store.d.ts +0 -2
- package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
- package/dist/core/memory-engine/observation-store.js +4 -5
- package/dist/core/memory-engine/observation-store.js.map +1 -1
- package/dist/core/memory-engine/refinements.d.ts +51 -0
- package/dist/core/memory-engine/refinements.d.ts.map +1 -0
- package/dist/core/memory-engine/refinements.js +99 -0
- package/dist/core/memory-engine/refinements.js.map +1 -0
- package/dist/core/memory-engine/tools.d.ts.map +1 -1
- package/dist/core/memory-engine/tools.js +27 -1
- package/dist/core/memory-engine/tools.js.map +1 -1
- package/dist/core/memory-engine/types.d.ts +2 -0
- package/dist/core/memory-engine/types.d.ts.map +1 -1
- package/dist/core/memory-engine/types.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +7 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/muestreo-restringido.d.ts +49 -0
- package/dist/core/muestreo-restringido.d.ts.map +1 -0
- package/dist/core/muestreo-restringido.js +65 -0
- package/dist/core/muestreo-restringido.js.map +1 -0
- package/dist/core/orphan-process-journal.d.ts +48 -0
- package/dist/core/orphan-process-journal.d.ts.map +1 -0
- package/dist/core/orphan-process-journal.js +116 -0
- package/dist/core/orphan-process-journal.js.map +1 -0
- package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
- package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
- package/dist/core/privacidad/categorias-especiales.js +745 -0
- package/dist/core/privacidad/categorias-especiales.js.map +1 -0
- package/dist/core/privacidad/tapar.d.ts +48 -0
- package/dist/core/privacidad/tapar.d.ts.map +1 -0
- package/dist/core/privacidad/tapar.js +66 -0
- package/dist/core/privacidad/tapar.js.map +1 -0
- package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
- package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
- package/dist/core/prompt-cache/diagnostics.js +100 -0
- package/dist/core/prompt-cache/diagnostics.js.map +1 -0
- package/dist/core/prompt-cache/index.d.ts +33 -0
- package/dist/core/prompt-cache/index.d.ts.map +1 -0
- package/dist/core/prompt-cache/index.js +189 -0
- package/dist/core/prompt-cache/index.js.map +1 -0
- package/dist/core/prompt-cache/payload.d.ts +58 -0
- package/dist/core/prompt-cache/payload.d.ts.map +1 -0
- package/dist/core/prompt-cache/payload.js +122 -0
- package/dist/core/prompt-cache/payload.js.map +1 -0
- package/dist/core/prompt-cache/stabilize.d.ts +65 -0
- package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
- package/dist/core/prompt-cache/stabilize.js +137 -0
- package/dist/core/prompt-cache/stabilize.js.map +1 -0
- package/dist/core/prompt-cache/stats.d.ts +55 -0
- package/dist/core/prompt-cache/stats.d.ts.map +1 -0
- package/dist/core/prompt-cache/stats.js +158 -0
- package/dist/core/prompt-cache/stats.js.map +1 -0
- package/dist/core/prompt-eleccion.d.ts +38 -0
- package/dist/core/prompt-eleccion.d.ts.map +1 -0
- package/dist/core/prompt-eleccion.js +46 -0
- package/dist/core/prompt-eleccion.js.map +1 -0
- package/dist/core/prompts/montar.d.ts +75 -0
- package/dist/core/prompts/montar.d.ts.map +1 -0
- package/dist/core/prompts/montar.js +146 -0
- package/dist/core/prompts/montar.js.map +1 -0
- package/dist/core/prompts/plantilla.d.ts +54 -0
- package/dist/core/prompts/plantilla.d.ts.map +1 -0
- package/dist/core/prompts/plantilla.js +153 -0
- package/dist/core/prompts/plantilla.js.map +1 -0
- package/dist/core/prompts/sistema.md +134 -0
- package/dist/core/provider-attribution.d.ts +24 -2
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js +24 -42
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/remoto/destino.d.ts +38 -0
- package/dist/core/remoto/destino.d.ts.map +1 -0
- package/dist/core/remoto/destino.js +105 -0
- package/dist/core/remoto/destino.js.map +1 -0
- package/dist/core/remoto/ejecutor.d.ts +59 -0
- package/dist/core/remoto/ejecutor.d.ts.map +1 -0
- package/dist/core/remoto/ejecutor.js +225 -0
- package/dist/core/remoto/ejecutor.js.map +1 -0
- package/dist/core/remoto/ficheros.d.ts +29 -0
- package/dist/core/remoto/ficheros.d.ts.map +1 -0
- package/dist/core/remoto/ficheros.js +90 -0
- package/dist/core/remoto/ficheros.js.map +1 -0
- package/dist/core/remoto/registro-extension.d.ts +15 -0
- package/dist/core/remoto/registro-extension.d.ts.map +1 -0
- package/dist/core/remoto/registro-extension.js +17 -0
- package/dist/core/remoto/registro-extension.js.map +1 -0
- package/dist/core/remoto/tools.d.ts +28 -0
- package/dist/core/remoto/tools.d.ts.map +1 -0
- package/dist/core/remoto/tools.js +31 -0
- package/dist/core/remoto/tools.js.map +1 -0
- package/dist/core/resource-loader.d.ts +8 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +93 -1
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/revision/hallazgo.d.ts +51 -0
- package/dist/core/revision/hallazgo.d.ts.map +1 -0
- package/dist/core/revision/hallazgo.js +73 -0
- package/dist/core/revision/hallazgo.js.map +1 -0
- package/dist/core/revision/revisor.d.ts +81 -0
- package/dist/core/revision/revisor.d.ts.map +1 -0
- package/dist/core/revision/revisor.js +132 -0
- package/dist/core/revision/revisor.js.map +1 -0
- package/dist/core/revision/sarif.d.ts +30 -0
- package/dist/core/revision/sarif.d.ts.map +1 -0
- package/dist/core/revision/sarif.js +83 -0
- package/dist/core/revision/sarif.js.map +1 -0
- package/dist/core/scheduler/scheduler.d.ts +87 -0
- package/dist/core/scheduler/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler/scheduler.js +178 -0
- package/dist/core/scheduler/scheduler.js.map +1 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
- package/dist/core/settings-manager.d.ts +110 -6
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +53 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +3 -3
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts +17 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +13 -5
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetria/otlp.d.ts +122 -0
- package/dist/core/telemetria/otlp.d.ts.map +1 -0
- package/dist/core/telemetria/otlp.js +373 -0
- package/dist/core/telemetria/otlp.js.map +1 -0
- package/dist/core/tools/coercion-argumentos.d.ts +48 -0
- package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
- package/dist/core/tools/coercion-argumentos.js +99 -0
- package/dist/core/tools/coercion-argumentos.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +0 -7
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +232 -7
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +8 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +5 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/json-tolerante.d.ts +30 -0
- package/dist/core/tools/json-tolerante.d.ts.map +1 -0
- package/dist/core/tools/json-tolerante.js +70 -0
- package/dist/core/tools/json-tolerante.js.map +1 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +17 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +17 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/turno-vacio/detectar.d.ts +38 -0
- package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
- package/dist/core/turno-vacio/detectar.js +66 -0
- package/dist/core/turno-vacio/detectar.js.map +1 -0
- package/dist/core/undo/journal.d.ts +57 -0
- package/dist/core/undo/journal.d.ts.map +1 -0
- package/dist/core/undo/journal.js +178 -0
- package/dist/core/undo/journal.js.map +1 -0
- package/dist/core/urls-internas/auditoria.d.ts +10 -0
- package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
- package/dist/core/urls-internas/auditoria.js +42 -0
- package/dist/core/urls-internas/auditoria.js.map +1 -0
- package/dist/core/urls-internas/boveda.d.ts +13 -0
- package/dist/core/urls-internas/boveda.d.ts.map +1 -0
- package/dist/core/urls-internas/boveda.js +40 -0
- package/dist/core/urls-internas/boveda.js.map +1 -0
- package/dist/core/urls-internas/lector.d.ts +30 -0
- package/dist/core/urls-internas/lector.d.ts.map +1 -0
- package/dist/core/urls-internas/lector.js +56 -0
- package/dist/core/urls-internas/lector.js.map +1 -0
- package/dist/core/urls-internas/memoria.d.ts +11 -0
- package/dist/core/urls-internas/memoria.d.ts.map +1 -0
- package/dist/core/urls-internas/memoria.js +25 -0
- package/dist/core/urls-internas/memoria.js.map +1 -0
- package/dist/core/urls-internas/parse.d.ts +28 -0
- package/dist/core/urls-internas/parse.d.ts.map +1 -0
- package/dist/core/urls-internas/parse.js +32 -0
- package/dist/core/urls-internas/parse.js.map +1 -0
- package/dist/core/urls-internas/reglas.d.ts +10 -0
- package/dist/core/urls-internas/reglas.d.ts.map +1 -0
- package/dist/core/urls-internas/reglas.js +31 -0
- package/dist/core/urls-internas/reglas.js.map +1 -0
- package/dist/core/usage/aggregate.d.ts +68 -0
- package/dist/core/usage/aggregate.d.ts.map +1 -0
- package/dist/core/usage/aggregate.js +93 -0
- package/dist/core/usage/aggregate.js.map +1 -0
- package/dist/core/usage/cuota/anthropic.d.ts +10 -0
- package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
- package/dist/core/usage/cuota/anthropic.js +63 -0
- package/dist/core/usage/cuota/anthropic.js.map +1 -0
- package/dist/core/usage/cuota/cache.d.ts +20 -0
- package/dist/core/usage/cuota/cache.d.ts.map +1 -0
- package/dist/core/usage/cuota/cache.js +36 -0
- package/dist/core/usage/cuota/cache.js.map +1 -0
- package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
- package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
- package/dist/core/usage/cuota/github-copilot.js +67 -0
- package/dist/core/usage/cuota/github-copilot.js.map +1 -0
- package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
- package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
- package/dist/core/usage/cuota/google-gemini.js +72 -0
- package/dist/core/usage/cuota/google-gemini.js.map +1 -0
- package/dist/core/usage/cuota/index.d.ts +25 -0
- package/dist/core/usage/cuota/index.d.ts.map +1 -0
- package/dist/core/usage/cuota/index.js +50 -0
- package/dist/core/usage/cuota/index.js.map +1 -0
- package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
- package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
- package/dist/core/usage/cuota/openai-codex.js +59 -0
- package/dist/core/usage/cuota/openai-codex.js.map +1 -0
- package/dist/core/usage/cuota/openrouter.d.ts +10 -0
- package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
- package/dist/core/usage/cuota/openrouter.js +47 -0
- package/dist/core/usage/cuota/openrouter.js.map +1 -0
- package/dist/core/usage/cuota/tipos.d.ts +50 -0
- package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
- package/dist/core/usage/cuota/tipos.js +25 -0
- package/dist/core/usage/cuota/tipos.js.map +1 -0
- package/dist/core/web/busqueda-nativa.d.ts +82 -0
- package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
- package/dist/core/web/busqueda-nativa.js +163 -0
- package/dist/core/web/busqueda-nativa.js.map +1 -0
- package/dist/core/web/destino.d.ts +58 -0
- package/dist/core/web/destino.d.ts.map +1 -0
- package/dist/core/web/destino.js +127 -0
- package/dist/core/web/destino.js.map +1 -0
- package/dist/core/web/proveedores/brave.d.ts +6 -0
- package/dist/core/web/proveedores/brave.d.ts.map +1 -0
- package/dist/core/web/proveedores/brave.js +20 -0
- package/dist/core/web/proveedores/brave.js.map +1 -0
- package/dist/core/web/proveedores/claves.d.ts +19 -0
- package/dist/core/web/proveedores/claves.d.ts.map +1 -0
- package/dist/core/web/proveedores/claves.js +36 -0
- package/dist/core/web/proveedores/claves.js.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.js +109 -0
- package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
- package/dist/core/web/proveedores/ecosia.d.ts +3 -0
- package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
- package/dist/core/web/proveedores/ecosia.js +72 -0
- package/dist/core/web/proveedores/ecosia.js.map +1 -0
- package/dist/core/web/proveedores/exa.d.ts +6 -0
- package/dist/core/web/proveedores/exa.d.ts.map +1 -0
- package/dist/core/web/proveedores/exa.js +24 -0
- package/dist/core/web/proveedores/exa.js.map +1 -0
- package/dist/core/web/proveedores/mojeek.d.ts +3 -0
- package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
- package/dist/core/web/proveedores/mojeek.js +65 -0
- package/dist/core/web/proveedores/mojeek.js.map +1 -0
- package/dist/core/web/proveedores/navegador.d.ts +10 -0
- package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
- package/dist/core/web/proveedores/navegador.js +13 -0
- package/dist/core/web/proveedores/navegador.js.map +1 -0
- package/dist/core/web/proveedores/registro.d.ts +43 -0
- package/dist/core/web/proveedores/registro.d.ts.map +1 -0
- package/dist/core/web/proveedores/registro.js +49 -0
- package/dist/core/web/proveedores/registro.js.map +1 -0
- package/dist/core/web/proveedores/searxng.d.ts +9 -0
- package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
- package/dist/core/web/proveedores/searxng.js +17 -0
- package/dist/core/web/proveedores/searxng.js.map +1 -0
- package/dist/core/web/proveedores/serper.d.ts +9 -0
- package/dist/core/web/proveedores/serper.d.ts.map +1 -0
- package/dist/core/web/proveedores/serper.js +19 -0
- package/dist/core/web/proveedores/serper.js.map +1 -0
- package/dist/core/web/proveedores/tavily.d.ts +6 -0
- package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
- package/dist/core/web/proveedores/tavily.js +19 -0
- package/dist/core/web/proveedores/tavily.js.map +1 -0
- package/dist/core/web/proveedores/tipos.d.ts +36 -0
- package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
- package/dist/core/web/proveedores/tipos.js +10 -0
- package/dist/core/web/proveedores/tipos.js.map +1 -0
- package/dist/core/web/registro-red.d.ts +43 -0
- package/dist/core/web/registro-red.d.ts.map +1 -0
- package/dist/core/web/registro-red.js +86 -0
- package/dist/core/web/registro-red.js.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.js +38 -0
- package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
- package/dist/core/web/scrapers/crates-io.d.ts +11 -0
- package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
- package/dist/core/web/scrapers/crates-io.js +29 -0
- package/dist/core/web/scrapers/crates-io.js.map +1 -0
- package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
- package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
- package/dist/core/web/scrapers/docs-rs.js +35 -0
- package/dist/core/web/scrapers/docs-rs.js.map +1 -0
- package/dist/core/web/scrapers/github.d.ts +3 -0
- package/dist/core/web/scrapers/github.d.ts.map +1 -0
- package/dist/core/web/scrapers/github.js +72 -0
- package/dist/core/web/scrapers/github.js.map +1 -0
- package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
- package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
- package/dist/core/web/scrapers/go-pkg.js +30 -0
- package/dist/core/web/scrapers/go-pkg.js.map +1 -0
- package/dist/core/web/scrapers/hex.d.ts +6 -0
- package/dist/core/web/scrapers/hex.d.ts.map +1 -0
- package/dist/core/web/scrapers/hex.js +27 -0
- package/dist/core/web/scrapers/hex.js.map +1 -0
- package/dist/core/web/scrapers/maven.d.ts +8 -0
- package/dist/core/web/scrapers/maven.d.ts.map +1 -0
- package/dist/core/web/scrapers/maven.js +41 -0
- package/dist/core/web/scrapers/maven.js.map +1 -0
- package/dist/core/web/scrapers/mdn.d.ts +6 -0
- package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
- package/dist/core/web/scrapers/mdn.js +28 -0
- package/dist/core/web/scrapers/mdn.js.map +1 -0
- package/dist/core/web/scrapers/npm.d.ts +11 -0
- package/dist/core/web/scrapers/npm.d.ts.map +1 -0
- package/dist/core/web/scrapers/npm.js +57 -0
- package/dist/core/web/scrapers/npm.js.map +1 -0
- package/dist/core/web/scrapers/nuget.d.ts +8 -0
- package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
- package/dist/core/web/scrapers/nuget.js +22 -0
- package/dist/core/web/scrapers/nuget.js.map +1 -0
- package/dist/core/web/scrapers/nvd.d.ts +7 -0
- package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
- package/dist/core/web/scrapers/nvd.js +37 -0
- package/dist/core/web/scrapers/nvd.js.map +1 -0
- package/dist/core/web/scrapers/pypi.d.ts +6 -0
- package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
- package/dist/core/web/scrapers/pypi.js +31 -0
- package/dist/core/web/scrapers/pypi.js.map +1 -0
- package/dist/core/web/scrapers/registro.d.ts +13 -0
- package/dist/core/web/scrapers/registro.d.ts.map +1 -0
- package/dist/core/web/scrapers/registro.js +65 -0
- package/dist/core/web/scrapers/registro.js.map +1 -0
- package/dist/core/web/scrapers/rubygems.d.ts +6 -0
- package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
- package/dist/core/web/scrapers/rubygems.js +23 -0
- package/dist/core/web/scrapers/rubygems.js.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.js +46 -0
- package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
- package/dist/core/web/scrapers/tipos.d.ts +42 -0
- package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
- package/dist/core/web/scrapers/tipos.js +23 -0
- package/dist/core/web/scrapers/tipos.js.map +1 -0
- package/dist/core/web/texto.d.ts +10 -0
- package/dist/core/web/texto.d.ts.map +1 -0
- package/dist/core/web/texto.js +26 -0
- package/dist/core/web/texto.js.map +1 -0
- package/dist/core/web/tools.d.ts +91 -0
- package/dist/core/web/tools.d.ts.map +1 -0
- package/dist/core/web/tools.js +304 -0
- package/dist/core/web/tools.js.map +1 -0
- package/dist/core/wiki/almacen.d.ts +33 -0
- package/dist/core/wiki/almacen.d.ts.map +1 -0
- package/dist/core/wiki/almacen.js +93 -0
- package/dist/core/wiki/almacen.js.map +1 -0
- package/dist/core/wiki/citas.d.ts +111 -0
- package/dist/core/wiki/citas.d.ts.map +1 -0
- package/dist/core/wiki/citas.js +146 -0
- package/dist/core/wiki/citas.js.map +1 -0
- package/dist/core/workflows/agent-runner.d.ts +2 -0
- package/dist/core/workflows/agent-runner.d.ts.map +1 -1
- package/dist/core/workflows/agent-runner.js +131 -44
- package/dist/core/workflows/agent-runner.js.map +1 -1
- package/dist/core/workflows/builtins.d.ts.map +1 -1
- package/dist/core/workflows/builtins.js +1 -0
- package/dist/core/workflows/builtins.js.map +1 -1
- package/dist/core/workflows/contrato/esquema.d.ts +32 -0
- package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
- package/dist/core/workflows/contrato/esquema.js +25 -0
- package/dist/core/workflows/contrato/esquema.js.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
- package/dist/core/workflows/contrato/validador.d.ts +30 -0
- package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
- package/dist/core/workflows/contrato/validador.js +56 -0
- package/dist/core/workflows/contrato/validador.js.map +1 -0
- package/dist/core/workflows/contrato/yield.d.ts +65 -0
- package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
- package/dist/core/workflows/contrato/yield.js +80 -0
- package/dist/core/workflows/contrato/yield.js.map +1 -0
- package/dist/core/workflows/goal-engine/engine.d.ts +17 -0
- package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -1
- package/dist/core/workflows/goal-engine/engine.js +41 -0
- package/dist/core/workflows/goal-engine/engine.js.map +1 -1
- package/dist/core/workflows/index.d.ts +8 -0
- package/dist/core/workflows/index.d.ts.map +1 -1
- package/dist/core/workflows/index.js +4 -0
- package/dist/core/workflows/index.js.map +1 -1
- package/dist/core/workflows/manager.d.ts +10 -0
- package/dist/core/workflows/manager.d.ts.map +1 -1
- package/dist/core/workflows/manager.js +35 -11
- package/dist/core/workflows/manager.js.map +1 -1
- package/dist/core/workflows/runtime.d.ts +13 -0
- package/dist/core/workflows/runtime.d.ts.map +1 -1
- package/dist/core/workflows/runtime.js +80 -1
- package/dist/core/workflows/runtime.js.map +1 -1
- package/dist/core/workflows/save-as-skill.d.ts +27 -0
- package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
- package/dist/core/workflows/save-as-skill.js +54 -0
- package/dist/core/workflows/save-as-skill.js.map +1 -0
- package/dist/core/workflows/types.d.ts +49 -0
- package/dist/core/workflows/types.d.ts.map +1 -1
- package/dist/core/workflows/types.js.map +1 -1
- package/dist/extensions/remoto/index.d.ts +22 -0
- package/dist/extensions/remoto/index.d.ts.map +1 -0
- package/dist/extensions/remoto/index.js +54 -0
- package/dist/extensions/remoto/index.js.map +1 -0
- package/dist/index.d.ts +1 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -16
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +6 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts +42 -0
- package/dist/modes/acp/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp/acp-mode.js +190 -0
- package/dist/modes/acp/acp-mode.js.map +1 -0
- package/dist/modes/acp/events.d.ts +74 -0
- package/dist/modes/acp/events.d.ts.map +1 -0
- package/dist/modes/acp/events.js +116 -0
- package/dist/modes/acp/events.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +8 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +41 -7
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +1 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +9 -86
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +8 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +48 -17
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -7
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +137 -146
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +11 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +27 -5
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/server/attach.d.ts +56 -0
- package/dist/server/attach.d.ts.map +1 -0
- package/dist/server/attach.js +130 -0
- package/dist/server/attach.js.map +1 -0
- package/dist/server/extension-ops.d.ts +40 -0
- package/dist/server/extension-ops.d.ts.map +1 -0
- package/dist/server/extension-ops.js +146 -0
- package/dist/server/extension-ops.js.map +1 -0
- package/dist/server/pi-server-service.d.ts +85 -0
- package/dist/server/pi-server-service.d.ts.map +1 -0
- package/dist/server/pi-server-service.js +213 -0
- package/dist/server/pi-server-service.js.map +1 -0
- package/dist/server/scheduler-tick.d.ts +32 -0
- package/dist/server/scheduler-tick.d.ts.map +1 -0
- package/dist/server/scheduler-tick.js +47 -0
- package/dist/server/scheduler-tick.js.map +1 -0
- package/dist/server/serve.d.ts +25 -0
- package/dist/server/serve.d.ts.map +1 -0
- package/dist/server/serve.js +83 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/server/transcript.d.ts +38 -0
- package/dist/server/transcript.d.ts.map +1 -0
- package/dist/server/transcript.js +176 -0
- package/dist/server/transcript.js.map +1 -0
- package/dist/skills/skill-creator/SKILL.md +90 -0
- package/dist/telegram/api.d.ts +75 -0
- package/dist/telegram/api.d.ts.map +1 -0
- package/dist/telegram/api.js +104 -0
- package/dist/telegram/api.js.map +1 -0
- package/dist/telegram/bridge.d.ts +85 -0
- package/dist/telegram/bridge.d.ts.map +1 -0
- package/dist/telegram/bridge.js +182 -0
- package/dist/telegram/bridge.js.map +1 -0
- package/dist/telegram/journal.d.ts +67 -0
- package/dist/telegram/journal.d.ts.map +1 -0
- package/dist/telegram/journal.js +119 -0
- package/dist/telegram/journal.js.map +1 -0
- package/dist/telegram/servidor.d.ts +15 -0
- package/dist/telegram/servidor.d.ts.map +1 -0
- package/dist/telegram/servidor.js +74 -0
- package/dist/telegram/servidor.js.map +1 -0
- package/dist/utils/shell.d.ts +11 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +11 -0
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +29 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +10 -10
- package/docs/compliance.md +241 -0
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +10 -10
- package/docs/development.md +47 -10
- package/docs/docs.json +14 -2
- package/docs/environment-variables.md +20 -17
- package/docs/extensions.md +51 -49
- package/docs/index.md +15 -21
- package/docs/json.md +3 -3
- package/docs/keybindings.md +5 -5
- package/docs/llama-cpp.md +7 -7
- package/docs/models.md +12 -12
- package/docs/packages.md +45 -45
- package/docs/prompt-templates.md +5 -5
- package/docs/providers.md +12 -12
- package/docs/quickstart.md +39 -39
- package/docs/rpc.md +12 -12
- package/docs/sdk.md +38 -38
- package/docs/security.md +26 -21
- package/docs/session-format.md +7 -7
- package/docs/sessions.md +14 -14
- package/docs/settings.md +45 -20
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +11 -11
- package/docs/terminal-setup.md +14 -14
- package/docs/termux.md +7 -7
- package/docs/themes.md +11 -11
- package/docs/tmux.md +4 -4
- package/docs/tui.md +3 -3
- package/docs/usage.md +54 -54
- package/docs/windows.md +2 -2
- package/examples/sdk/12-full-control.ts +9 -0
- package/npm-shrinkwrap.json +35 -251
- package/package.json +10 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"citas.d.ts","sourceRoot":"","sources":["../../../src/core/wiki/citas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,MAAM,WAAW,IAAI;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,kEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GACnB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAGtD;AAOD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM1F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CA2B9E;AAED,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,oEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GACtC,gBAAgB,CAGlB;AAED,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,WAAW,CAiB/G;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,CAOhE;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEhD;AAID;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAQ1E","sourcesContent":["/**\n * Citas verificables para la wiki del repositorio.\n *\n * Una wiki generada por un modelo envejece mal: describe un código que ya no\n * existe y nadie se entera hasta que alguien la sigue y pierde una tarde. La\n * diferencia que buscamos no es generar mejor prosa, es que **cada afirmación\n * lleve su cita a `fichero:línea` y se sepa cuándo deja de ser cierta**.\n *\n * Aquí vive esa parte. Es pura: recibe texto y contenidos de fichero, no toca\n * disco ni llama a ningún modelo.\n *\n * La decisión que la hace útil en vez de molesta: si las líneas citadas\n * **cambiaron**, la afirmación queda obsoleta; pero si solo se **movieron** —el\n * mismo texto está más arriba o más abajo— la cita se reubica y la afirmación\n * sigue viva. Sin eso, insertar un import al principio de un fichero invalidaría\n * cada cita del fichero entero, la wiki daría cientos de falsos positivos y en\n * dos días nadie volvería a mirarla.\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport interface Cita {\n\tfichero: string;\n\t/** 1-indexado e inclusivo, como lo escribe la gente. */\n\tdesde: number;\n\thasta: number;\n\t/** Huella del texto citado cuando se escribió la afirmación. */\n\thuella: string;\n}\n\nexport interface Afirmacion {\n\tid: string;\n\ttexto: string;\n\tcitas: Cita[];\n}\n\nexport type EstadoCita =\n\t| { estado: \"vigente\"; cita: Cita }\n\t| { estado: \"movida\"; cita: Cita; desde: number; hasta: number }\n\t| { estado: \"obsoleta\"; cita: Cita; motivo: string };\n\n/**\n * Huella del texto citado.\n *\n * Se normaliza el final de línea y los espacios al final de cada línea: un\n * formateador que quita un espacio sobrante no cambia lo que el código dice, y\n * marcar eso como obsoleto entrenaría a todo el mundo a ignorar los avisos.\n * La indentación de la izquierda SÍ cuenta: en un lenguaje con bloques, mover\n * algo de nivel sí cambia lo que hace.\n */\nexport function huellaDeTexto(lineas: string[]): string {\n\tconst normalizado = lineas.map((l) => l.replace(/\\s+$/, \"\")).join(\"\\n\");\n\treturn createHash(\"sha256\").update(normalizado).digest(\"hex\").slice(0, 16);\n}\n\nfunction extraer(lineas: string[], desde: number, hasta: number): string[] | null {\n\tif (desde < 1 || hasta < desde || hasta > lineas.length) return null;\n\treturn lineas.slice(desde - 1, hasta);\n}\n\n/**\n * Busca el texto citado en otro sitio del fichero.\n *\n * Devuelve la primera línea (1-indexada) donde encaja el bloque entero, o\n * `null`. Es una búsqueda literal por bloques, no difusa: reubicar una cita\n * sobre un parecido sería peor que declararla obsoleta, porque la afirmación\n * pasaría a apuntar a un código que no es el suyo.\n */\nexport function buscarBloque(lineas: string[], huella: string, alto: number): number | null {\n\tif (alto <= 0 || alto > lineas.length) return null;\n\tfor (let inicio = 0; inicio + alto <= lineas.length; inicio++) {\n\t\tif (huellaDeTexto(lineas.slice(inicio, inicio + alto)) === huella) return inicio + 1;\n\t}\n\treturn null;\n}\n\n/**\n * Comprueba una cita contra el contenido actual del fichero.\n *\n * `contenido` es `null` si el fichero ya no existe.\n */\nexport function verificarCita(cita: Cita, contenido: string | null): EstadoCita {\n\tif (contenido === null) {\n\t\treturn { estado: \"obsoleta\", cita, motivo: `el fichero ${cita.fichero} ya no existe` };\n\t}\n\tconst lineas = contenido.split(\"\\n\");\n\tconst alto = cita.hasta - cita.desde + 1;\n\n\tconst enSuSitio = extraer(lineas, cita.desde, cita.hasta);\n\tif (enSuSitio && huellaDeTexto(enSuSitio) === cita.huella) {\n\t\treturn { estado: \"vigente\", cita };\n\t}\n\n\t// Puede que solo se haya movido. Ver la cabecera: sin esto, un import nuevo\n\t// al principio invalidaría todas las citas del fichero.\n\tconst nuevoInicio = buscarBloque(lineas, cita.huella, alto);\n\tif (nuevoInicio !== null) {\n\t\treturn { estado: \"movida\", cita, desde: nuevoInicio, hasta: nuevoInicio + alto - 1 };\n\t}\n\n\treturn {\n\t\testado: \"obsoleta\",\n\t\tcita,\n\t\tmotivo:\n\t\t\tenSuSitio === null\n\t\t\t\t? `${cita.fichero} ya no llega a la línea ${cita.hasta}`\n\t\t\t\t: `las líneas ${cita.desde}-${cita.hasta} de ${cita.fichero} han cambiado`,\n\t};\n}\n\nexport interface EstadoAfirmacion {\n\tafirmacion: Afirmacion;\n\tcitas: EstadoCita[];\n\t/** Obsoleta si CUALQUIERA de sus citas lo está. Ver más abajo. */\n\tobsoleta: boolean;\n}\n\n/**\n * Comprueba una afirmación entera.\n *\n * Basta una cita obsoleta para marcarla: una afirmación apoyada en tres trozos\n * de código de los que uno ya no dice lo que decía es, como mínimo,\n * sospechosa. Exigir que fallen todas dejaría pasar justo el caso peligroso —\n * la media verdad.\n */\nexport function verificarAfirmacion(\n\tafirmacion: Afirmacion,\n\tleer: (fichero: string) => string | null,\n): EstadoAfirmacion {\n\tconst citas = afirmacion.citas.map((c) => verificarCita(c, leer(c.fichero)));\n\treturn { afirmacion, citas, obsoleta: citas.some((c) => c.estado === \"obsoleta\") };\n}\n\nexport interface ResumenWiki {\n\ttotal: number;\n\tvigentes: number;\n\tmovidas: number;\n\tobsoletas: number;\n\tsinCitas: number;\n\tdetalles: EstadoAfirmacion[];\n}\n\nexport function verificarWiki(afirmaciones: Afirmacion[], leer: (fichero: string) => string | null): ResumenWiki {\n\tconst detalles = afirmaciones.map((a) => verificarAfirmacion(a, leer));\n\treturn {\n\t\ttotal: detalles.length,\n\t\t// Exige al menos una cita: `[].every()` es true, así que sin este filtro\n\t\t// una afirmación sin respaldo se contaba como verificada — que es\n\t\t// exactamente la mentira que esta wiki existe para evitar.\n\t\tvigentes: detalles.filter(\n\t\t\t(d) => d.afirmacion.citas.length > 0 && !d.obsoleta && d.citas.every((c) => c.estado === \"vigente\"),\n\t\t).length,\n\t\tmovidas: detalles.filter((d) => !d.obsoleta && d.citas.some((c) => c.estado === \"movida\")).length,\n\t\tobsoletas: detalles.filter((d) => d.obsoleta).length,\n\t\t// Una afirmación sin cita no es documentación, es una opinión. Se cuenta\n\t\t// aparte para que se vea cuánta wiki no está respaldada por nada.\n\t\tsinCitas: detalles.filter((d) => d.afirmacion.citas.length === 0).length,\n\t\tdetalles,\n\t};\n}\n\n/**\n * Reescribe las citas que solo se movieron.\n *\n * Devuelve las afirmaciones con las líneas actualizadas; las obsoletas se\n * dejan intactas a propósito: arreglarlas requiere leer el código nuevo y\n * decidir si la frase sigue siendo cierta, y eso no lo hace un `replace`.\n */\nexport function reubicarCitas(resumen: ResumenWiki): Afirmacion[] {\n\treturn resumen.detalles.map(({ afirmacion, citas }) => ({\n\t\t...afirmacion,\n\t\tcitas: citas.map((estado) =>\n\t\t\testado.estado === \"movida\" ? { ...estado.cita, desde: estado.desde, hasta: estado.hasta } : estado.cita,\n\t\t),\n\t}));\n}\n\n/** `fichero:12-30` o `fichero:12`. Es lo que la gente escribe a mano. */\nexport function formatearCita(cita: Cita): string {\n\treturn cita.desde === cita.hasta ? `${cita.fichero}:${cita.desde}` : `${cita.fichero}:${cita.desde}-${cita.hasta}`;\n}\n\nconst PATRON_CITA = /([\\w./@-]+\\.\\w+):(\\d+)(?:-(\\d+))?/g;\n\n/**\n * Saca las citas de un texto en Markdown.\n *\n * Sin huella: quien escribe a mano no la conoce. La calcula quien indexa, que\n * es el que tiene el fichero delante.\n */\nexport function extraerCitas(markdown: string): Array<Omit<Cita, \"huella\">> {\n\tconst encontradas: Array<Omit<Cita, \"huella\">> = [];\n\tfor (const m of markdown.matchAll(PATRON_CITA)) {\n\t\tconst desde = Number(m[2]);\n\t\tconst hasta = m[3] ? Number(m[3]) : desde;\n\t\tif (desde >= 1 && hasta >= desde) encontradas.push({ fichero: m[1], desde, hasta });\n\t}\n\treturn encontradas;\n}\n"]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Citas verificables para la wiki del repositorio.
|
|
3
|
+
*
|
|
4
|
+
* Una wiki generada por un modelo envejece mal: describe un código que ya no
|
|
5
|
+
* existe y nadie se entera hasta que alguien la sigue y pierde una tarde. La
|
|
6
|
+
* diferencia que buscamos no es generar mejor prosa, es que **cada afirmación
|
|
7
|
+
* lleve su cita a `fichero:línea` y se sepa cuándo deja de ser cierta**.
|
|
8
|
+
*
|
|
9
|
+
* Aquí vive esa parte. Es pura: recibe texto y contenidos de fichero, no toca
|
|
10
|
+
* disco ni llama a ningún modelo.
|
|
11
|
+
*
|
|
12
|
+
* La decisión que la hace útil en vez de molesta: si las líneas citadas
|
|
13
|
+
* **cambiaron**, la afirmación queda obsoleta; pero si solo se **movieron** —el
|
|
14
|
+
* mismo texto está más arriba o más abajo— la cita se reubica y la afirmación
|
|
15
|
+
* sigue viva. Sin eso, insertar un import al principio de un fichero invalidaría
|
|
16
|
+
* cada cita del fichero entero, la wiki daría cientos de falsos positivos y en
|
|
17
|
+
* dos días nadie volvería a mirarla.
|
|
18
|
+
*/
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
/**
|
|
21
|
+
* Huella del texto citado.
|
|
22
|
+
*
|
|
23
|
+
* Se normaliza el final de línea y los espacios al final de cada línea: un
|
|
24
|
+
* formateador que quita un espacio sobrante no cambia lo que el código dice, y
|
|
25
|
+
* marcar eso como obsoleto entrenaría a todo el mundo a ignorar los avisos.
|
|
26
|
+
* La indentación de la izquierda SÍ cuenta: en un lenguaje con bloques, mover
|
|
27
|
+
* algo de nivel sí cambia lo que hace.
|
|
28
|
+
*/
|
|
29
|
+
export function huellaDeTexto(lineas) {
|
|
30
|
+
const normalizado = lineas.map((l) => l.replace(/\s+$/, "")).join("\n");
|
|
31
|
+
return createHash("sha256").update(normalizado).digest("hex").slice(0, 16);
|
|
32
|
+
}
|
|
33
|
+
function extraer(lineas, desde, hasta) {
|
|
34
|
+
if (desde < 1 || hasta < desde || hasta > lineas.length)
|
|
35
|
+
return null;
|
|
36
|
+
return lineas.slice(desde - 1, hasta);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Busca el texto citado en otro sitio del fichero.
|
|
40
|
+
*
|
|
41
|
+
* Devuelve la primera línea (1-indexada) donde encaja el bloque entero, o
|
|
42
|
+
* `null`. Es una búsqueda literal por bloques, no difusa: reubicar una cita
|
|
43
|
+
* sobre un parecido sería peor que declararla obsoleta, porque la afirmación
|
|
44
|
+
* pasaría a apuntar a un código que no es el suyo.
|
|
45
|
+
*/
|
|
46
|
+
export function buscarBloque(lineas, huella, alto) {
|
|
47
|
+
if (alto <= 0 || alto > lineas.length)
|
|
48
|
+
return null;
|
|
49
|
+
for (let inicio = 0; inicio + alto <= lineas.length; inicio++) {
|
|
50
|
+
if (huellaDeTexto(lineas.slice(inicio, inicio + alto)) === huella)
|
|
51
|
+
return inicio + 1;
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Comprueba una cita contra el contenido actual del fichero.
|
|
57
|
+
*
|
|
58
|
+
* `contenido` es `null` si el fichero ya no existe.
|
|
59
|
+
*/
|
|
60
|
+
export function verificarCita(cita, contenido) {
|
|
61
|
+
if (contenido === null) {
|
|
62
|
+
return { estado: "obsoleta", cita, motivo: `el fichero ${cita.fichero} ya no existe` };
|
|
63
|
+
}
|
|
64
|
+
const lineas = contenido.split("\n");
|
|
65
|
+
const alto = cita.hasta - cita.desde + 1;
|
|
66
|
+
const enSuSitio = extraer(lineas, cita.desde, cita.hasta);
|
|
67
|
+
if (enSuSitio && huellaDeTexto(enSuSitio) === cita.huella) {
|
|
68
|
+
return { estado: "vigente", cita };
|
|
69
|
+
}
|
|
70
|
+
// Puede que solo se haya movido. Ver la cabecera: sin esto, un import nuevo
|
|
71
|
+
// al principio invalidaría todas las citas del fichero.
|
|
72
|
+
const nuevoInicio = buscarBloque(lineas, cita.huella, alto);
|
|
73
|
+
if (nuevoInicio !== null) {
|
|
74
|
+
return { estado: "movida", cita, desde: nuevoInicio, hasta: nuevoInicio + alto - 1 };
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
estado: "obsoleta",
|
|
78
|
+
cita,
|
|
79
|
+
motivo: enSuSitio === null
|
|
80
|
+
? `${cita.fichero} ya no llega a la línea ${cita.hasta}`
|
|
81
|
+
: `las líneas ${cita.desde}-${cita.hasta} de ${cita.fichero} han cambiado`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Comprueba una afirmación entera.
|
|
86
|
+
*
|
|
87
|
+
* Basta una cita obsoleta para marcarla: una afirmación apoyada en tres trozos
|
|
88
|
+
* de código de los que uno ya no dice lo que decía es, como mínimo,
|
|
89
|
+
* sospechosa. Exigir que fallen todas dejaría pasar justo el caso peligroso —
|
|
90
|
+
* la media verdad.
|
|
91
|
+
*/
|
|
92
|
+
export function verificarAfirmacion(afirmacion, leer) {
|
|
93
|
+
const citas = afirmacion.citas.map((c) => verificarCita(c, leer(c.fichero)));
|
|
94
|
+
return { afirmacion, citas, obsoleta: citas.some((c) => c.estado === "obsoleta") };
|
|
95
|
+
}
|
|
96
|
+
export function verificarWiki(afirmaciones, leer) {
|
|
97
|
+
const detalles = afirmaciones.map((a) => verificarAfirmacion(a, leer));
|
|
98
|
+
return {
|
|
99
|
+
total: detalles.length,
|
|
100
|
+
// Exige al menos una cita: `[].every()` es true, así que sin este filtro
|
|
101
|
+
// una afirmación sin respaldo se contaba como verificada — que es
|
|
102
|
+
// exactamente la mentira que esta wiki existe para evitar.
|
|
103
|
+
vigentes: detalles.filter((d) => d.afirmacion.citas.length > 0 && !d.obsoleta && d.citas.every((c) => c.estado === "vigente")).length,
|
|
104
|
+
movidas: detalles.filter((d) => !d.obsoleta && d.citas.some((c) => c.estado === "movida")).length,
|
|
105
|
+
obsoletas: detalles.filter((d) => d.obsoleta).length,
|
|
106
|
+
// Una afirmación sin cita no es documentación, es una opinión. Se cuenta
|
|
107
|
+
// aparte para que se vea cuánta wiki no está respaldada por nada.
|
|
108
|
+
sinCitas: detalles.filter((d) => d.afirmacion.citas.length === 0).length,
|
|
109
|
+
detalles,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Reescribe las citas que solo se movieron.
|
|
114
|
+
*
|
|
115
|
+
* Devuelve las afirmaciones con las líneas actualizadas; las obsoletas se
|
|
116
|
+
* dejan intactas a propósito: arreglarlas requiere leer el código nuevo y
|
|
117
|
+
* decidir si la frase sigue siendo cierta, y eso no lo hace un `replace`.
|
|
118
|
+
*/
|
|
119
|
+
export function reubicarCitas(resumen) {
|
|
120
|
+
return resumen.detalles.map(({ afirmacion, citas }) => ({
|
|
121
|
+
...afirmacion,
|
|
122
|
+
citas: citas.map((estado) => estado.estado === "movida" ? { ...estado.cita, desde: estado.desde, hasta: estado.hasta } : estado.cita),
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
/** `fichero:12-30` o `fichero:12`. Es lo que la gente escribe a mano. */
|
|
126
|
+
export function formatearCita(cita) {
|
|
127
|
+
return cita.desde === cita.hasta ? `${cita.fichero}:${cita.desde}` : `${cita.fichero}:${cita.desde}-${cita.hasta}`;
|
|
128
|
+
}
|
|
129
|
+
const PATRON_CITA = /([\w./@-]+\.\w+):(\d+)(?:-(\d+))?/g;
|
|
130
|
+
/**
|
|
131
|
+
* Saca las citas de un texto en Markdown.
|
|
132
|
+
*
|
|
133
|
+
* Sin huella: quien escribe a mano no la conoce. La calcula quien indexa, que
|
|
134
|
+
* es el que tiene el fichero delante.
|
|
135
|
+
*/
|
|
136
|
+
export function extraerCitas(markdown) {
|
|
137
|
+
const encontradas = [];
|
|
138
|
+
for (const m of markdown.matchAll(PATRON_CITA)) {
|
|
139
|
+
const desde = Number(m[2]);
|
|
140
|
+
const hasta = m[3] ? Number(m[3]) : desde;
|
|
141
|
+
if (desde >= 1 && hasta >= desde)
|
|
142
|
+
encontradas.push({ fichero: m[1], desde, hasta });
|
|
143
|
+
}
|
|
144
|
+
return encontradas;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=citas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"citas.js","sourceRoot":"","sources":["../../../src/core/wiki/citas.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Citas verificables para la wiki del repositorio.\n *\n * Una wiki generada por un modelo envejece mal: describe un código que ya no\n * existe y nadie se entera hasta que alguien la sigue y pierde una tarde. La\n * diferencia que buscamos no es generar mejor prosa, es que **cada afirmación\n * lleve su cita a `fichero:línea` y se sepa cuándo deja de ser cierta**.\n *\n * Aquí vive esa parte. Es pura: recibe texto y contenidos de fichero, no toca\n * disco ni llama a ningún modelo.\n *\n * La decisión que la hace útil en vez de molesta: si las líneas citadas\n * **cambiaron**, la afirmación queda obsoleta; pero si solo se **movieron** —el\n * mismo texto está más arriba o más abajo— la cita se reubica y la afirmación\n * sigue viva. Sin eso, insertar un import al principio de un fichero invalidaría\n * cada cita del fichero entero, la wiki daría cientos de falsos positivos y en\n * dos días nadie volvería a mirarla.\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport interface Cita {\n\tfichero: string;\n\t/** 1-indexado e inclusivo, como lo escribe la gente. */\n\tdesde: number;\n\thasta: number;\n\t/** Huella del texto citado cuando se escribió la afirmación. */\n\thuella: string;\n}\n\nexport interface Afirmacion {\n\tid: string;\n\ttexto: string;\n\tcitas: Cita[];\n}\n\nexport type EstadoCita =\n\t| { estado: \"vigente\"; cita: Cita }\n\t| { estado: \"movida\"; cita: Cita; desde: number; hasta: number }\n\t| { estado: \"obsoleta\"; cita: Cita; motivo: string };\n\n/**\n * Huella del texto citado.\n *\n * Se normaliza el final de línea y los espacios al final de cada línea: un\n * formateador que quita un espacio sobrante no cambia lo que el código dice, y\n * marcar eso como obsoleto entrenaría a todo el mundo a ignorar los avisos.\n * La indentación de la izquierda SÍ cuenta: en un lenguaje con bloques, mover\n * algo de nivel sí cambia lo que hace.\n */\nexport function huellaDeTexto(lineas: string[]): string {\n\tconst normalizado = lineas.map((l) => l.replace(/\\s+$/, \"\")).join(\"\\n\");\n\treturn createHash(\"sha256\").update(normalizado).digest(\"hex\").slice(0, 16);\n}\n\nfunction extraer(lineas: string[], desde: number, hasta: number): string[] | null {\n\tif (desde < 1 || hasta < desde || hasta > lineas.length) return null;\n\treturn lineas.slice(desde - 1, hasta);\n}\n\n/**\n * Busca el texto citado en otro sitio del fichero.\n *\n * Devuelve la primera línea (1-indexada) donde encaja el bloque entero, o\n * `null`. Es una búsqueda literal por bloques, no difusa: reubicar una cita\n * sobre un parecido sería peor que declararla obsoleta, porque la afirmación\n * pasaría a apuntar a un código que no es el suyo.\n */\nexport function buscarBloque(lineas: string[], huella: string, alto: number): number | null {\n\tif (alto <= 0 || alto > lineas.length) return null;\n\tfor (let inicio = 0; inicio + alto <= lineas.length; inicio++) {\n\t\tif (huellaDeTexto(lineas.slice(inicio, inicio + alto)) === huella) return inicio + 1;\n\t}\n\treturn null;\n}\n\n/**\n * Comprueba una cita contra el contenido actual del fichero.\n *\n * `contenido` es `null` si el fichero ya no existe.\n */\nexport function verificarCita(cita: Cita, contenido: string | null): EstadoCita {\n\tif (contenido === null) {\n\t\treturn { estado: \"obsoleta\", cita, motivo: `el fichero ${cita.fichero} ya no existe` };\n\t}\n\tconst lineas = contenido.split(\"\\n\");\n\tconst alto = cita.hasta - cita.desde + 1;\n\n\tconst enSuSitio = extraer(lineas, cita.desde, cita.hasta);\n\tif (enSuSitio && huellaDeTexto(enSuSitio) === cita.huella) {\n\t\treturn { estado: \"vigente\", cita };\n\t}\n\n\t// Puede que solo se haya movido. Ver la cabecera: sin esto, un import nuevo\n\t// al principio invalidaría todas las citas del fichero.\n\tconst nuevoInicio = buscarBloque(lineas, cita.huella, alto);\n\tif (nuevoInicio !== null) {\n\t\treturn { estado: \"movida\", cita, desde: nuevoInicio, hasta: nuevoInicio + alto - 1 };\n\t}\n\n\treturn {\n\t\testado: \"obsoleta\",\n\t\tcita,\n\t\tmotivo:\n\t\t\tenSuSitio === null\n\t\t\t\t? `${cita.fichero} ya no llega a la línea ${cita.hasta}`\n\t\t\t\t: `las líneas ${cita.desde}-${cita.hasta} de ${cita.fichero} han cambiado`,\n\t};\n}\n\nexport interface EstadoAfirmacion {\n\tafirmacion: Afirmacion;\n\tcitas: EstadoCita[];\n\t/** Obsoleta si CUALQUIERA de sus citas lo está. Ver más abajo. */\n\tobsoleta: boolean;\n}\n\n/**\n * Comprueba una afirmación entera.\n *\n * Basta una cita obsoleta para marcarla: una afirmación apoyada en tres trozos\n * de código de los que uno ya no dice lo que decía es, como mínimo,\n * sospechosa. Exigir que fallen todas dejaría pasar justo el caso peligroso —\n * la media verdad.\n */\nexport function verificarAfirmacion(\n\tafirmacion: Afirmacion,\n\tleer: (fichero: string) => string | null,\n): EstadoAfirmacion {\n\tconst citas = afirmacion.citas.map((c) => verificarCita(c, leer(c.fichero)));\n\treturn { afirmacion, citas, obsoleta: citas.some((c) => c.estado === \"obsoleta\") };\n}\n\nexport interface ResumenWiki {\n\ttotal: number;\n\tvigentes: number;\n\tmovidas: number;\n\tobsoletas: number;\n\tsinCitas: number;\n\tdetalles: EstadoAfirmacion[];\n}\n\nexport function verificarWiki(afirmaciones: Afirmacion[], leer: (fichero: string) => string | null): ResumenWiki {\n\tconst detalles = afirmaciones.map((a) => verificarAfirmacion(a, leer));\n\treturn {\n\t\ttotal: detalles.length,\n\t\t// Exige al menos una cita: `[].every()` es true, así que sin este filtro\n\t\t// una afirmación sin respaldo se contaba como verificada — que es\n\t\t// exactamente la mentira que esta wiki existe para evitar.\n\t\tvigentes: detalles.filter(\n\t\t\t(d) => d.afirmacion.citas.length > 0 && !d.obsoleta && d.citas.every((c) => c.estado === \"vigente\"),\n\t\t).length,\n\t\tmovidas: detalles.filter((d) => !d.obsoleta && d.citas.some((c) => c.estado === \"movida\")).length,\n\t\tobsoletas: detalles.filter((d) => d.obsoleta).length,\n\t\t// Una afirmación sin cita no es documentación, es una opinión. Se cuenta\n\t\t// aparte para que se vea cuánta wiki no está respaldada por nada.\n\t\tsinCitas: detalles.filter((d) => d.afirmacion.citas.length === 0).length,\n\t\tdetalles,\n\t};\n}\n\n/**\n * Reescribe las citas que solo se movieron.\n *\n * Devuelve las afirmaciones con las líneas actualizadas; las obsoletas se\n * dejan intactas a propósito: arreglarlas requiere leer el código nuevo y\n * decidir si la frase sigue siendo cierta, y eso no lo hace un `replace`.\n */\nexport function reubicarCitas(resumen: ResumenWiki): Afirmacion[] {\n\treturn resumen.detalles.map(({ afirmacion, citas }) => ({\n\t\t...afirmacion,\n\t\tcitas: citas.map((estado) =>\n\t\t\testado.estado === \"movida\" ? { ...estado.cita, desde: estado.desde, hasta: estado.hasta } : estado.cita,\n\t\t),\n\t}));\n}\n\n/** `fichero:12-30` o `fichero:12`. Es lo que la gente escribe a mano. */\nexport function formatearCita(cita: Cita): string {\n\treturn cita.desde === cita.hasta ? `${cita.fichero}:${cita.desde}` : `${cita.fichero}:${cita.desde}-${cita.hasta}`;\n}\n\nconst PATRON_CITA = /([\\w./@-]+\\.\\w+):(\\d+)(?:-(\\d+))?/g;\n\n/**\n * Saca las citas de un texto en Markdown.\n *\n * Sin huella: quien escribe a mano no la conoce. La calcula quien indexa, que\n * es el que tiene el fichero delante.\n */\nexport function extraerCitas(markdown: string): Array<Omit<Cita, \"huella\">> {\n\tconst encontradas: Array<Omit<Cita, \"huella\">> = [];\n\tfor (const m of markdown.matchAll(PATRON_CITA)) {\n\t\tconst desde = Number(m[2]);\n\t\tconst hasta = m[3] ? Number(m[3]) : desde;\n\t\tif (desde >= 1 && hasta >= desde) encontradas.push({ fichero: m[1], desde, hasta });\n\t}\n\treturn encontradas;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../../src/core/workflows/agent-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIjG,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,IAAI,UAAU,CAAC;CACvB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAE/B,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,qBAAqB,CAAC;IACrC,gDAAgD;IAChD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACjD,sDAAsD;IACtD,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B,GAAG,MAAM,CAUT;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAQpD;AAED,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAa7D;AAOD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,MAAM,EAAE,CAI9G;AAED,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAgB;IAEtC,YAAY,OAAO,EAAE,kBAAkB,EAQtC;IAEK,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CA4BlF;YAEa,OAAO;CAsGrB;AAUD,yCAAyC;AACzC,YAAY,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["/**\n * AgentRunner — subagente del Ada Intelligence Engine.\n *\n * Un subagente es una sesión del SDK (AgentSessionRuntime via createAgentSession)\n * con: modelo resuelto (spec/tier/fallback), tools configuradas, cwd (base o\n * worktree), instructions opcionales y límites (timeout, retries). El runner\n * captura la respuesta final, el structured output (schema typebox con fallback\n * a extracción de prosa) y el usage real (tokens/coste).\n *\n * La creación de la sesión es inyectable (createSession) para tests con fakes.\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { TextContent } from \"@earendil-works/pi-ai\";\nimport type { TSchema } from \"typebox\";\nimport type { AgentSession, AgentSessionEvent } from \"../agent-session.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport type { AgentRunOptions, AgentRunResult, AgentUsage, WorkflowErrorCode } from \"./types.ts\";\nimport { WorkflowError } from \"./types.ts\";\nimport { createWorktree, finalizeWorktree, type Worktree } from \"./worktree.ts\";\n\nexport interface SubagentSession {\n\tsession: AgentSession;\n\tdispose(): void;\n\tgetUsage(): AgentUsage;\n}\n\nexport type CreateSubagentSession = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tmodelSpec?: string;\n\ttools?: string[];\n\tcustomTools?: ToolDefinition[];\n\tsessionName?: string;\n\tinstructions?: string;\n}) => Promise<SubagentSession>;\n\nexport interface AgentRunnerOptions {\n\tagentDir: string;\n\tcreateSession: CreateSubagentSession;\n\t/** Limiter compartido del run (concurrency). */\n\tlimiter: <T>(fn: () => Promise<T>) => Promise<T>;\n\t/** Contador global de agentes del run (maxAgents). */\n\tagentCounter: { count: number };\n\t/** Techo de agentes por run (`workflows.maxAgentsPerRun`). */\n\tmaxAgents: number;\n\tretries?: number;\n\tagentTimeoutMs?: number | null;\n}\n\n/** Hash de identidad del agente para el journal (prompt+model+phase+schema+stableKey). */\nexport function agentIdentityHash(options: {\n\tprompt: string;\n\tmodel?: string;\n\ttier?: string;\n\tphase?: string;\n\tstableKey?: string;\n\tschema?: TSchema | undefined;\n}): string {\n\tconst canonical = JSON.stringify({\n\t\tprompt: options.prompt,\n\t\tmodel: options.model ?? null,\n\t\ttier: options.tier ?? null,\n\t\tphase: options.phase ?? null,\n\t\tstableKey: options.stableKey ?? null,\n\t\tschema: options.schema ? JSON.stringify(options.schema) : null,\n\t});\n\treturn createHash(\"sha256\").update(canonical).digest(\"hex\");\n}\n\n/** Extraer el texto de una respuesta (string o content array). */\nexport function messageText(content: unknown): string {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.filter((b): b is TextContent => typeof b === \"object\" && b !== null && (b as { type?: string }).type === \"text\")\n\t\t.map((b) => b.text ?? \"\")\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\n/** Extraer JSON del texto (para structured output fallback). */\nexport function extractJson(text: string): unknown | undefined {\n\tconst cleaned = text\n\t\t.replace(/```json\\s*/g, \"\")\n\t\t.replace(/```/g, \"\")\n\t\t.trim();\n\tconst start = cleaned.indexOf(\"{\");\n\tconst end = cleaned.lastIndexOf(\"}\");\n\tif (start === -1 || end === -1) return undefined;\n\ttry {\n\t\treturn JSON.parse(cleaned.slice(start, end + 1));\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Tools por defecto de un subagente (espejo de sdk.ts:263). */\nconst SUBAGENT_DEFAULT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\"];\n/** Mínimo privilegio: leer y buscar, nada de escribir ni ejecutar. */\nconst SUBAGENT_READONLY_TOOLS = [\"read\", \"grep\", \"find\", \"ls\"];\n\n/**\n * Allowlist de tools del subagente.\n *\n * Desenreda un bug latente: `options.tools` son tools EXTRA (web_search…) y se\n * pasaban a la vez como `customTools` y como allowlist, de modo que pedir una\n * tool extra ESTRECHABA el permiso en silencio a solo esa — un agente que pedía\n * `web_search` perdía `read`/`bash`/`edit`/`write` sin que nadie lo notara.\n * Ahora las extra se SUMAN a la base, que es lo que el nombre siempre prometió.\n */\nexport function resolveAllowedTools(options: { readOnly?: boolean; tools?: Array<{ name: string }> }): string[] {\n\tconst base = options.readOnly ? SUBAGENT_READONLY_TOOLS : SUBAGENT_DEFAULT_TOOLS;\n\tconst extras = (options.tools ?? []).map((t) => t.name);\n\treturn [...new Set([...base, ...extras])];\n}\n\nexport class AgentRunner {\n\tprivate agentDir: string;\n\tprivate createSession: CreateSubagentSession;\n\tprivate limiter: AgentRunnerOptions[\"limiter\"];\n\tprivate agentCounter: AgentRunnerOptions[\"agentCounter\"];\n\tprivate maxAgents: number;\n\tprivate retries: number;\n\tprivate agentTimeoutMs: number | null;\n\n\tconstructor(options: AgentRunnerOptions) {\n\t\tthis.agentDir = options.agentDir;\n\t\tthis.createSession = options.createSession;\n\t\tthis.limiter = options.limiter;\n\t\tthis.agentCounter = options.agentCounter;\n\t\tthis.maxAgents = options.maxAgents;\n\t\tthis.retries = options.retries ?? 3;\n\t\tthis.agentTimeoutMs = options.agentTimeoutMs ?? null;\n\t}\n\n\tasync run<T = unknown>(options: AgentRunOptions): Promise<AgentRunResult<T> | null> {\n\t\treturn this.limiter(async () => {\n\t\t\tif (this.agentCounter.count >= this.maxAgents) {\n\t\t\t\tthrow new WorkflowError(\n\t\t\t\t\t\"WORKFLOW_MAX_AGENTS\",\n\t\t\t\t\t`Límite de agentes del run alcanzado (${this.maxAgents}). Súbelo con el ajuste workflows.maxAgentsPerRun.`,\n\t\t\t\t\t{ recoverable: false },\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.agentCounter.count++;\n\n\t\t\tlet attempt = 0;\n\t\t\tlet lastError: Error | undefined;\n\t\t\tfor (; attempt <= this.retries; attempt++) {\n\t\t\t\tconst signal = options.signal;\n\t\t\t\tif (signal?.aborted) return null;\n\t\t\t\ttry {\n\t\t\t\t\treturn await this.runOnce<T>(options, signal);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (signal?.aborted) return null;\n\t\t\t\t\tif (isAbortError(error) || isTimeoutError(error)) throw error;\n\t\t\t\t\tlastError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\tif (attempt >= this.retries) break;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (lastError) throw lastError;\n\t\t\treturn null;\n\t\t});\n\t}\n\n\tprivate async runOnce<T>(options: AgentRunOptions, signal?: AbortSignal): Promise<AgentRunResult<T> | null> {\n\t\t// Timeout combinado: el del agente + el del run.\n\t\tconst timeoutMs = options.timeoutMs ?? this.agentTimeoutMs;\n\t\tlet timeoutTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst timeout = new Promise<never>((_resolve, reject) => {\n\t\t\tif (timeoutMs === null) return;\n\t\t\ttimeoutTimer = setTimeout(() => {\n\t\t\t\treject(\n\t\t\t\t\tnew WorkflowError(\"WORKFLOW_AGENT_TIMEOUT\", `Agent timed out after ${timeoutMs}ms`, {\n\t\t\t\t\t\trecoverable: false,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}, timeoutMs);\n\t\t});\n\n\t\tconst baseCwd = options.cwd ?? process.cwd();\n\t\t// Aislamiento git: los agentes con escritura que corren en paralelo\n\t\t// editaban el MISMO checkout y se pisaban en silencio. El nombre es\n\t\t// determinista (isolationKey = runId:callIndex) para que un resume\n\t\t// reencuentre el mismo worktree. Fuera de un repo git hace no-op.\n\t\tlet worktree: Worktree | null = null;\n\t\tlet finalized: { branch?: string; kept: boolean } | undefined;\n\t\tconst worktreeMessage = `ada: ${options.label ?? options.isolationKey ?? \"agent\"}`;\n\t\tif (options.isolation === \"worktree\") {\n\t\t\tworktree = await createWorktree(baseCwd, options.isolationKey ?? options.label ?? \"agent\");\n\t\t}\n\n\t\tlet subagent: SubagentSession | null = null;\n\t\ttry {\n\t\t\tsubagent = await this.createSession({\n\t\t\t\tcwd: worktree?.cwd ?? baseCwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tmodelSpec: options.model ?? (options.tier ? `tier:${options.tier}` : undefined),\n\t\t\t\ttools: resolveAllowedTools(options),\n\t\t\t\tcustomTools: options.tools,\n\t\t\t\tsessionName: options.label ? `workflow:${options.label}` : undefined,\n\t\t\t\tinstructions: options.instructions,\n\t\t\t});\n\t\t\tconst session = subagent.session;\n\n\t\t\tconst lastAssistantText: string[] = [];\n\t\t\tconst unsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\t\tconst text = messageText(event.message.content);\n\t\t\t\t\tif (text) lastAssistantText.push(text);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tawait Promise.race([session.sendUserMessage(options.prompt), timeout]);\n\t\t\t\tawait Promise.race([session.waitForIdle(), timeout]);\n\t\t\t} finally {\n\t\t\t\tunsubscribe();\n\t\t\t}\n\n\t\t\tif (signal?.aborted) return null;\n\n\t\t\tconst text = lastAssistantText.length > 0 ? lastAssistantText[lastAssistantText.length - 1] : \"\";\n\t\t\tlet result: T | null = null;\n\t\t\tlet _origin: \"structured\" | \"recovered\" = \"structured\";\n\n\t\t\tif (options.schema) {\n\t\t\t\tconst parsed = extractJson(text);\n\t\t\t\tif (parsed !== undefined) {\n\t\t\t\t\tresult = parsed as T;\n\t\t\t\t} else {\n\t\t\t\t\t_origin = \"recovered\";\n\t\t\t\t\t// Fallback: devolver la prosa (el caller decide si sirve).\n\t\t\t\t\tresult = text as unknown as T;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult = (text.length > 0 ? text : null) as unknown as T;\n\t\t\t}\n\n\t\t\t// Consolidar el worktree ANTES de devolver: si solo lo retirásemos, los\n\t\t\t// cambios sin commitear del agente se perderían y el aislamiento no\n\t\t\t// habría servido de nada. La rama sobrevive para que un humano la\n\t\t\t// mergee; no hay auto-merge a propósito.\n\t\t\tif (worktree && !finalized) {\n\t\t\t\tfinalized = await finalizeWorktree(worktree, worktreeMessage);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tresult,\n\t\t\t\ttext,\n\t\t\t\tusage: subagent.getUsage(),\n\t\t\t\tsessionId: (\n\t\t\t\t\tsession as { sessionManager?: { getSessionId?: () => string } }\n\t\t\t\t).sessionManager?.getSessionId?.(),\n\t\t\t\tworktreeBranch: finalized?.branch,\n\t\t\t} as AgentRunResult<T>;\n\t\t} finally {\n\t\t\tif (timeoutTimer) clearTimeout(timeoutTimer);\n\t\t\tsubagent?.dispose();\n\t\t\t// Camino de error/abort/timeout: el return no llegó a consolidar, pero\n\t\t\t// el trabajo parcial del agente también merece sobrevivir para poder\n\t\t\t// inspeccionarlo — y hay que soltar el worktree igualmente.\n\t\t\tif (worktree && !finalized) {\n\t\t\t\tfinalized = await finalizeWorktree(worktree, worktreeMessage);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction isTimeoutError(error: unknown): boolean {\n\treturn error instanceof WorkflowError && error.code === \"WORKFLOW_AGENT_TIMEOUT\";\n}\n\n/** Tipos re-exportados para el index. */\nexport type { WorkflowErrorCode };\n"]}
|
|
1
|
+
{"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../../src/core/workflows/agent-runner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentRunner — subagente del Ada Intelligence Engine.\n *\n * Un subagente es una sesión del SDK (AgentSessionRuntime via createAgentSession)\n * con: modelo resuelto (spec/tier/fallback), tools configuradas, cwd (base o\n * worktree), instructions opcionales y límites (timeout, retries). El runner\n * captura la respuesta final, el structured output (schema typebox con fallback\n * a extracción de prosa) y el usage real (tokens/coste).\n *\n * La creación de la sesión es inyectable (createSession) para tests con fakes.\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { TextContent } from \"@earendil-works/pi-ai\";\nimport type { TSchema } from \"typebox\";\nimport type { AgentSession, AgentSessionEvent } from \"../agent-session.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { validarConReintentos } from \"./contrato/validador.ts\";\nimport { BufferDeHallazgos, crearHerramientaYield, ensamblarResultadoIncremental } from \"./contrato/yield.ts\";\nimport type { AgentRunOptions, AgentRunResult, AgentUsage, WorkflowErrorCode } from \"./types.ts\";\nimport { WorkflowError } from \"./types.ts\";\nimport { createWorktree, finalizeWorktree, type Worktree } from \"./worktree.ts\";\n\nexport interface SubagentSession {\n\tsession: AgentSession;\n\tdispose(): void;\n\tgetUsage(): AgentUsage;\n}\n\nexport type CreateSubagentSession = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tmodelSpec?: string;\n\ttools?: string[];\n\tcustomTools?: ToolDefinition[];\n\tsessionName?: string;\n\tinstructions?: string;\n}) => Promise<SubagentSession>;\n\nexport interface AgentRunnerOptions {\n\tagentDir: string;\n\tcreateSession: CreateSubagentSession;\n\t/** Limiter compartido del run (concurrency). */\n\tlimiter: <T>(fn: () => Promise<T>) => Promise<T>;\n\t/** Contador global de agentes del run (maxAgents). */\n\tagentCounter: { count: number };\n\t/** Techo de agentes por run (`workflows.maxAgentsPerRun`). */\n\tmaxAgents: number;\n\tretries?: number;\n\tagentTimeoutMs?: number | null;\n}\n\n/** Hash de identidad del agente para el journal (prompt+model+phase+schema+stableKey). */\nexport function agentIdentityHash(options: {\n\tprompt: string;\n\tmodel?: string;\n\ttier?: string;\n\tphase?: string;\n\tstableKey?: string;\n\tschema?: TSchema | undefined;\n}): string {\n\tconst canonical = JSON.stringify({\n\t\tprompt: options.prompt,\n\t\tmodel: options.model ?? null,\n\t\ttier: options.tier ?? null,\n\t\tphase: options.phase ?? null,\n\t\tstableKey: options.stableKey ?? null,\n\t\tschema: options.schema ? JSON.stringify(options.schema) : null,\n\t});\n\treturn createHash(\"sha256\").update(canonical).digest(\"hex\");\n}\n\n/** Extraer el texto de una respuesta (string o content array). */\nexport function messageText(content: unknown): string {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.filter((b): b is TextContent => typeof b === \"object\" && b !== null && (b as { type?: string }).type === \"text\")\n\t\t.map((b) => b.text ?? \"\")\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\n/** Extraer JSON del texto (para structured output fallback). */\nexport function extractJson(text: string): unknown | undefined {\n\tconst cleaned = text\n\t\t.replace(/```json\\s*/g, \"\")\n\t\t.replace(/```/g, \"\")\n\t\t.trim();\n\tconst start = cleaned.indexOf(\"{\");\n\tconst end = cleaned.lastIndexOf(\"}\");\n\tif (start === -1 || end === -1) return undefined;\n\ttry {\n\t\treturn JSON.parse(cleaned.slice(start, end + 1));\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Tools por defecto de un subagente (espejo de sdk.ts:263), MÁS `yield`\n * siempre — es la tool de entrega incremental (ver contrato/yield.ts) y no es\n * un permiso adicional: reportar un hallazgo no lee ni escribe nada que las\n * tools base ya no autoricen. Un subagente que nunca la llama se comporta\n * exactamente como antes.\n */\nconst SUBAGENT_DEFAULT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\", \"yield\"];\n/**\n * Mínimo privilegio: leer y buscar, nada de escribir ni ejecutar. `yield`\n * también aquí — un agente de solo lectura cuyo trabajo ES encontrar cosas\n * necesita poder reportarlas.\n */\nconst SUBAGENT_READONLY_TOOLS = [\"read\", \"grep\", \"find\", \"ls\", \"yield\"];\n/** Red: nunca implícitas, ni siquiera bajo `readOnly`. Ver resolveAllowedTools. */\nconst WEB_TOOL_NAMES = [\"web_search\", \"web_fetch\"];\n/** Navegador: opt-in aparte de `web`. Conducir un navegador no es leer una URL. */\nconst BROWSER_TOOL_NAMES = [\n\t\"browser_open\",\n\t\"browser_navigate\",\n\t\"browser_read\",\n\t\"browser_click\",\n\t\"browser_type\",\n\t\"browser_screenshot\",\n\t\"browser_viewport\",\n\t\"browser_close\",\n];\n\n/**\n * Allowlist de tools del subagente.\n *\n * Desenreda un bug latente: `options.tools` son tools EXTRA (web_search…) y se\n * pasaban a la vez como `customTools` y como allowlist, de modo que pedir una\n * tool extra ESTRECHABA el permiso en silencio a solo esa — un agente que pedía\n * `web_search` perdía `read`/`bash`/`edit`/`write` sin que nadie lo notara.\n * Ahora las extra se SUMAN a la base, que es lo que el nombre siempre prometió.\n */\nexport function resolveAllowedTools(options: {\n\treadOnly?: boolean;\n\tweb?: boolean;\n\tbrowser?: boolean;\n\ttools?: Array<{ name: string }>;\n}): string[] {\n\tconst base = options.readOnly ? SUBAGENT_READONLY_TOOLS : SUBAGENT_DEFAULT_TOOLS;\n\tconst extras = (options.tools ?? []).map((t) => t.name);\n\t// El acceso a red es opt-in aunque `web_fetch` sea \"de lectura\": leer la web\n\t// no es leer el disco. Un subagente con red es una vía de salida para lo que\n\t// haya leído, así que el script tiene que pedirlo por su nombre.\n\tconst web = options.web ? WEB_TOOL_NAMES : [];\n\t// `browser` no se hereda de `web`: descargar una URL y conducir un navegador\n\t// con sesión, formularios y capturas no son el mismo permiso.\n\tconst navegador = options.browser ? BROWSER_TOOL_NAMES : [];\n\treturn [...new Set([...base, ...web, ...navegador, ...extras])];\n}\n\nexport class AgentRunner {\n\tprivate agentDir: string;\n\tprivate createSession: CreateSubagentSession;\n\tprivate limiter: AgentRunnerOptions[\"limiter\"];\n\tprivate agentCounter: AgentRunnerOptions[\"agentCounter\"];\n\tprivate maxAgents: number;\n\tprivate retries: number;\n\tprivate agentTimeoutMs: number | null;\n\n\tconstructor(options: AgentRunnerOptions) {\n\t\tthis.agentDir = options.agentDir;\n\t\tthis.createSession = options.createSession;\n\t\tthis.limiter = options.limiter;\n\t\tthis.agentCounter = options.agentCounter;\n\t\tthis.maxAgents = options.maxAgents;\n\t\tthis.retries = options.retries ?? 3;\n\t\tthis.agentTimeoutMs = options.agentTimeoutMs ?? null;\n\t}\n\n\tasync run<T = unknown>(options: AgentRunOptions): Promise<AgentRunResult<T> | null> {\n\t\treturn this.limiter(async () => {\n\t\t\tif (this.agentCounter.count >= this.maxAgents) {\n\t\t\t\tthrow new WorkflowError(\n\t\t\t\t\t\"WORKFLOW_MAX_AGENTS\",\n\t\t\t\t\t`Límite de agentes del run alcanzado (${this.maxAgents}). Súbelo con el ajuste workflows.maxAgentsPerRun.`,\n\t\t\t\t\t{ recoverable: false },\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.agentCounter.count++;\n\n\t\t\tlet attempt = 0;\n\t\t\tlet lastError: Error | undefined;\n\t\t\tfor (; attempt <= this.retries; attempt++) {\n\t\t\t\tconst signal = options.signal;\n\t\t\t\tif (signal?.aborted) return null;\n\t\t\t\ttry {\n\t\t\t\t\treturn await this.runOnce<T>(options, signal);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (signal?.aborted) return null;\n\t\t\t\t\tif (isAbortError(error) || isTimeoutError(error)) throw error;\n\t\t\t\t\tlastError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\tif (attempt >= this.retries) break;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (lastError) throw lastError;\n\t\t\treturn null;\n\t\t});\n\t}\n\n\tprivate async runOnce<T>(options: AgentRunOptions, signal?: AbortSignal): Promise<AgentRunResult<T> | null> {\n\t\t// Timeout combinado: el del agente + el del run.\n\t\tconst timeoutMs = options.timeoutMs ?? this.agentTimeoutMs;\n\t\tlet timeoutTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst timeout = new Promise<never>((_resolve, reject) => {\n\t\t\tif (timeoutMs === null) return;\n\t\t\ttimeoutTimer = setTimeout(() => {\n\t\t\t\treject(\n\t\t\t\t\tnew WorkflowError(\"WORKFLOW_AGENT_TIMEOUT\", `Agent timed out after ${timeoutMs}ms`, {\n\t\t\t\t\t\trecoverable: false,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}, timeoutMs);\n\t\t});\n\n\t\tconst baseCwd = options.cwd ?? process.cwd();\n\t\t// Aislamiento git: los agentes con escritura que corren en paralelo\n\t\t// editaban el MISMO checkout y se pisaban en silencio. El nombre es\n\t\t// determinista (isolationKey = runId:callIndex) para que un resume\n\t\t// reencuentre el mismo worktree. Fuera de un repo git hace no-op.\n\t\tlet worktree: Worktree | null = null;\n\t\tlet finalized: { branch?: string; kept: boolean } | undefined;\n\t\tconst worktreeMessage = `ada: ${options.label ?? options.isolationKey ?? \"agent\"}`;\n\t\tif (options.isolation === \"worktree\") {\n\t\t\tworktree = await createWorktree(baseCwd, options.isolationKey ?? options.label ?? \"agent\");\n\t\t}\n\n\t\tlet subagent: SubagentSession | null = null;\n\t\t// Hallazgos entregados por `yield` durante ESTE intento. Sobreviven aunque\n\t\t// el subagente se descarrile más abajo — ese es el motivo de que exista.\n\t\tconst buffer = new BufferDeHallazgos();\n\t\ttry {\n\t\t\tsubagent = await this.createSession({\n\t\t\t\tcwd: worktree?.cwd ?? baseCwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tmodelSpec: options.model ?? (options.tier ? `tier:${options.tier}` : undefined),\n\t\t\t\ttools: resolveAllowedTools(options),\n\t\t\t\tcustomTools: [...(options.tools ?? []), crearHerramientaYield({ buffer, onEntrega: options.onYield })],\n\t\t\t\tsessionName: options.label ? `workflow:${options.label}` : undefined,\n\t\t\t\tinstructions: options.instructions,\n\t\t\t});\n\t\t\tconst session = subagent.session;\n\n\t\t\tconst lastAssistantText: string[] = [];\n\t\t\tconst unsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\t\tconst text = messageText(event.message.content);\n\t\t\t\t\tif (text) lastAssistantText.push(text);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst sessionId = () =>\n\t\t\t\t(session as { sessionManager?: { getSessionId?: () => string } }).sessionManager?.getSessionId?.();\n\t\t\tlet textoFinal = \"\";\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tawait Promise.race([session.sendUserMessage(options.prompt), timeout]);\n\t\t\t\t\tawait Promise.race([session.waitForIdle(), timeout]);\n\t\t\t\t\tif (signal?.aborted) return null;\n\n\t\t\t\t\ttextoFinal = lastAssistantText.length > 0 ? lastAssistantText[lastAssistantText.length - 1] : \"\";\n\t\t\t\t\tlet result: T | null = null;\n\t\t\t\t\tlet validacion: AgentRunResult<T>[\"validacion\"];\n\n\t\t\t\t\tif (options.schema) {\n\t\t\t\t\t\tconst resultado = await validarConReintentos<T>({\n\t\t\t\t\t\t\tesquema: options.schema,\n\t\t\t\t\t\t\ttextoInicial: textoFinal,\n\t\t\t\t\t\t\tmaxReintentos: options.maxReintentosValidacion ?? 2,\n\t\t\t\t\t\t\textraer: extractJson,\n\t\t\t\t\t\t\tpedirCorreccion: async (mensaje) => {\n\t\t\t\t\t\t\t\tawait Promise.race([session.sendUserMessage(mensaje), timeout]);\n\t\t\t\t\t\t\t\tawait Promise.race([session.waitForIdle(), timeout]);\n\t\t\t\t\t\t\t\tif (lastAssistantText.length > 0) textoFinal = lastAssistantText[lastAssistantText.length - 1];\n\t\t\t\t\t\t\t\treturn textoFinal;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\tresult = resultado.datos;\n\t\t\t\t\t\tvalidacion = {\n\t\t\t\t\t\t\tvalido: resultado.valido,\n\t\t\t\t\t\t\tintentos: resultado.intentos,\n\t\t\t\t\t\t\treparado: resultado.reparado,\n\t\t\t\t\t\t\terrores: resultado.errores,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = (textoFinal.length > 0 ? textoFinal : null) as unknown as T;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Consolidar el worktree ANTES de devolver: si solo lo retirásemos, los\n\t\t\t\t\t// cambios sin commitear del agente se perderían y el aislamiento no\n\t\t\t\t\t// habría servido de nada. La rama sobrevive para que un humano la\n\t\t\t\t\t// mergee; no hay auto-merge a propósito.\n\t\t\t\t\tif (worktree && !finalized) {\n\t\t\t\t\t\tfinalized = await finalizeWorktree(worktree, worktreeMessage);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\ttext: textoFinal,\n\t\t\t\t\t\tusage: subagent.getUsage(),\n\t\t\t\t\t\tsessionId: sessionId(),\n\t\t\t\t\t\tworktreeBranch: finalized?.branch,\n\t\t\t\t\t\t...(validacion ? { validacion } : {}),\n\t\t\t\t\t\t...(buffer.longitud > 0 ? { hallazgos: buffer.todos() } : {}),\n\t\t\t\t\t} as AgentRunResult<T>;\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// YIELD FINAL FORZADO. El subagente se descarriló (timeout, error del\n\t\t\t\t\t// SDK, lo que sea) EN CUALQUIER PUNTO del intercambio — incluida la\n\t\t\t\t\t// ronda de corrección de esquema. Si ya había entregado hallazgos con\n\t\t\t\t\t// `yield`, eso NO se pierde: es justo lo que este contrato existe para\n\t\t\t\t\t// evitar (\"lo más importante\", según la tarea).\n\t\t\t\t\t//\n\t\t\t\t\t// Sin hallazgos que salvar esto es un fallo real (\"no pude\", no \"no\n\t\t\t\t\t// hay\") y se propaga tal cual — mismo comportamiento que antes de este\n\t\t\t\t\t// cambio, para no enmascarar errores genuinos con un resultado vacío.\n\t\t\t\t\t//\n\t\t\t\t\t// Un abort (`signal.aborted`) NUNCA entra en el yield final forzado,\n\t\t\t\t\t// aunque haya hallazgos: cancelar significa \"para del todo\", igual que\n\t\t\t\t\t// ya hacía el camino de éxito (línea de arriba, `if (signal?.aborted)\n\t\t\t\t\t// return null`) con un resultado completo y válido. Si esto cambiara,\n\t\t\t\t\t// el workflow trataría una cancelación como un resultado parcial\n\t\t\t\t\t// utilizable y seguiría a la siguiente fase con datos a medias.\n\t\t\t\t\tif (signal?.aborted || buffer.longitud === 0) throw error;\n\t\t\t\t\tconst motivo = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tif (worktree && !finalized) {\n\t\t\t\t\t\tfinalized = await finalizeWorktree(worktree, worktreeMessage);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tresult: ensamblarResultadoIncremental(buffer) as unknown as T,\n\t\t\t\t\t\ttext: textoFinal,\n\t\t\t\t\t\tusage: subagent.getUsage(),\n\t\t\t\t\t\tsessionId: sessionId(),\n\t\t\t\t\t\tworktreeBranch: finalized?.branch,\n\t\t\t\t\t\tdescarrilado: true,\n\t\t\t\t\t\tmotivoDescarrile: motivo,\n\t\t\t\t\t\thallazgos: buffer.todos(),\n\t\t\t\t\t} as AgentRunResult<T>;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tunsubscribe();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (timeoutTimer) clearTimeout(timeoutTimer);\n\t\t\tsubagent?.dispose();\n\t\t\t// Camino de error/abort sin hallazgos que salvar: el return no llegó a\n\t\t\t// consolidar, pero el trabajo parcial del agente también merece\n\t\t\t// sobrevivir para poder inspeccionarlo — y hay que soltar el worktree\n\t\t\t// igualmente.\n\t\t\tif (worktree && !finalized) {\n\t\t\t\tfinalized = await finalizeWorktree(worktree, worktreeMessage);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction isTimeoutError(error: unknown): boolean {\n\treturn error instanceof WorkflowError && error.code === \"WORKFLOW_AGENT_TIMEOUT\";\n}\n\n/** Tipos re-exportados para el index. */\nexport type { WorkflowErrorCode };\n"]}
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* La creación de la sesión es inyectable (createSession) para tests con fakes.
|
|
11
11
|
*/
|
|
12
12
|
import { createHash } from "node:crypto";
|
|
13
|
+
import { validarConReintentos } from "./contrato/validador.js";
|
|
14
|
+
import { BufferDeHallazgos, crearHerramientaYield, ensamblarResultadoIncremental } from "./contrato/yield.js";
|
|
13
15
|
import { WorkflowError } from "./types.js";
|
|
14
16
|
import { createWorktree, finalizeWorktree } from "./worktree.js";
|
|
15
17
|
/** Hash de identidad del agente para el journal (prompt+model+phase+schema+stableKey). */
|
|
@@ -53,10 +55,33 @@ export function extractJson(text) {
|
|
|
53
55
|
return undefined;
|
|
54
56
|
}
|
|
55
57
|
}
|
|
56
|
-
/**
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Tools por defecto de un subagente (espejo de sdk.ts:263), MÁS `yield`
|
|
60
|
+
* siempre — es la tool de entrega incremental (ver contrato/yield.ts) y no es
|
|
61
|
+
* un permiso adicional: reportar un hallazgo no lee ni escribe nada que las
|
|
62
|
+
* tools base ya no autoricen. Un subagente que nunca la llama se comporta
|
|
63
|
+
* exactamente como antes.
|
|
64
|
+
*/
|
|
65
|
+
const SUBAGENT_DEFAULT_TOOLS = ["read", "bash", "edit", "write", "yield"];
|
|
66
|
+
/**
|
|
67
|
+
* Mínimo privilegio: leer y buscar, nada de escribir ni ejecutar. `yield`
|
|
68
|
+
* también aquí — un agente de solo lectura cuyo trabajo ES encontrar cosas
|
|
69
|
+
* necesita poder reportarlas.
|
|
70
|
+
*/
|
|
71
|
+
const SUBAGENT_READONLY_TOOLS = ["read", "grep", "find", "ls", "yield"];
|
|
72
|
+
/** Red: nunca implícitas, ni siquiera bajo `readOnly`. Ver resolveAllowedTools. */
|
|
73
|
+
const WEB_TOOL_NAMES = ["web_search", "web_fetch"];
|
|
74
|
+
/** Navegador: opt-in aparte de `web`. Conducir un navegador no es leer una URL. */
|
|
75
|
+
const BROWSER_TOOL_NAMES = [
|
|
76
|
+
"browser_open",
|
|
77
|
+
"browser_navigate",
|
|
78
|
+
"browser_read",
|
|
79
|
+
"browser_click",
|
|
80
|
+
"browser_type",
|
|
81
|
+
"browser_screenshot",
|
|
82
|
+
"browser_viewport",
|
|
83
|
+
"browser_close",
|
|
84
|
+
];
|
|
60
85
|
/**
|
|
61
86
|
* Allowlist de tools del subagente.
|
|
62
87
|
*
|
|
@@ -69,7 +94,14 @@ const SUBAGENT_READONLY_TOOLS = ["read", "grep", "find", "ls"];
|
|
|
69
94
|
export function resolveAllowedTools(options) {
|
|
70
95
|
const base = options.readOnly ? SUBAGENT_READONLY_TOOLS : SUBAGENT_DEFAULT_TOOLS;
|
|
71
96
|
const extras = (options.tools ?? []).map((t) => t.name);
|
|
72
|
-
|
|
97
|
+
// El acceso a red es opt-in aunque `web_fetch` sea "de lectura": leer la web
|
|
98
|
+
// no es leer el disco. Un subagente con red es una vía de salida para lo que
|
|
99
|
+
// haya leído, así que el script tiene que pedirlo por su nombre.
|
|
100
|
+
const web = options.web ? WEB_TOOL_NAMES : [];
|
|
101
|
+
// `browser` no se hereda de `web`: descargar una URL y conducir un navegador
|
|
102
|
+
// con sesión, formularios y capturas no son el mismo permiso.
|
|
103
|
+
const navegador = options.browser ? BROWSER_TOOL_NAMES : [];
|
|
104
|
+
return [...new Set([...base, ...web, ...navegador, ...extras])];
|
|
73
105
|
}
|
|
74
106
|
export class AgentRunner {
|
|
75
107
|
agentDir;
|
|
@@ -143,13 +175,16 @@ export class AgentRunner {
|
|
|
143
175
|
worktree = await createWorktree(baseCwd, options.isolationKey ?? options.label ?? "agent");
|
|
144
176
|
}
|
|
145
177
|
let subagent = null;
|
|
178
|
+
// Hallazgos entregados por `yield` durante ESTE intento. Sobreviven aunque
|
|
179
|
+
// el subagente se descarrile más abajo — ese es el motivo de que exista.
|
|
180
|
+
const buffer = new BufferDeHallazgos();
|
|
146
181
|
try {
|
|
147
182
|
subagent = await this.createSession({
|
|
148
183
|
cwd: worktree?.cwd ?? baseCwd,
|
|
149
184
|
agentDir: this.agentDir,
|
|
150
185
|
modelSpec: options.model ?? (options.tier ? `tier:${options.tier}` : undefined),
|
|
151
186
|
tools: resolveAllowedTools(options),
|
|
152
|
-
customTools: options.tools,
|
|
187
|
+
customTools: [...(options.tools ?? []), crearHerramientaYield({ buffer, onEntrega: options.onYield })],
|
|
153
188
|
sessionName: options.label ? `workflow:${options.label}` : undefined,
|
|
154
189
|
instructions: options.instructions,
|
|
155
190
|
});
|
|
@@ -162,54 +197,106 @@ export class AgentRunner {
|
|
|
162
197
|
lastAssistantText.push(text);
|
|
163
198
|
}
|
|
164
199
|
});
|
|
200
|
+
const sessionId = () => session.sessionManager?.getSessionId?.();
|
|
201
|
+
let textoFinal = "";
|
|
165
202
|
try {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
203
|
+
try {
|
|
204
|
+
await Promise.race([session.sendUserMessage(options.prompt), timeout]);
|
|
205
|
+
await Promise.race([session.waitForIdle(), timeout]);
|
|
206
|
+
if (signal?.aborted)
|
|
207
|
+
return null;
|
|
208
|
+
textoFinal = lastAssistantText.length > 0 ? lastAssistantText[lastAssistantText.length - 1] : "";
|
|
209
|
+
let result = null;
|
|
210
|
+
let validacion;
|
|
211
|
+
if (options.schema) {
|
|
212
|
+
const resultado = await validarConReintentos({
|
|
213
|
+
esquema: options.schema,
|
|
214
|
+
textoInicial: textoFinal,
|
|
215
|
+
maxReintentos: options.maxReintentosValidacion ?? 2,
|
|
216
|
+
extraer: extractJson,
|
|
217
|
+
pedirCorreccion: async (mensaje) => {
|
|
218
|
+
await Promise.race([session.sendUserMessage(mensaje), timeout]);
|
|
219
|
+
await Promise.race([session.waitForIdle(), timeout]);
|
|
220
|
+
if (lastAssistantText.length > 0)
|
|
221
|
+
textoFinal = lastAssistantText[lastAssistantText.length - 1];
|
|
222
|
+
return textoFinal;
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
result = resultado.datos;
|
|
226
|
+
validacion = {
|
|
227
|
+
valido: resultado.valido,
|
|
228
|
+
intentos: resultado.intentos,
|
|
229
|
+
reparado: resultado.reparado,
|
|
230
|
+
errores: resultado.errores,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
result = (textoFinal.length > 0 ? textoFinal : null);
|
|
235
|
+
}
|
|
236
|
+
// Consolidar el worktree ANTES de devolver: si solo lo retirásemos, los
|
|
237
|
+
// cambios sin commitear del agente se perderían y el aislamiento no
|
|
238
|
+
// habría servido de nada. La rama sobrevive para que un humano la
|
|
239
|
+
// mergee; no hay auto-merge a propósito.
|
|
240
|
+
if (worktree && !finalized) {
|
|
241
|
+
finalized = await finalizeWorktree(worktree, worktreeMessage);
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
result,
|
|
245
|
+
text: textoFinal,
|
|
246
|
+
usage: subagent.getUsage(),
|
|
247
|
+
sessionId: sessionId(),
|
|
248
|
+
worktreeBranch: finalized?.branch,
|
|
249
|
+
...(validacion ? { validacion } : {}),
|
|
250
|
+
...(buffer.longitud > 0 ? { hallazgos: buffer.todos() } : {}),
|
|
251
|
+
};
|
|
181
252
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
//
|
|
185
|
-
|
|
253
|
+
catch (error) {
|
|
254
|
+
// YIELD FINAL FORZADO. El subagente se descarriló (timeout, error del
|
|
255
|
+
// SDK, lo que sea) EN CUALQUIER PUNTO del intercambio — incluida la
|
|
256
|
+
// ronda de corrección de esquema. Si ya había entregado hallazgos con
|
|
257
|
+
// `yield`, eso NO se pierde: es justo lo que este contrato existe para
|
|
258
|
+
// evitar ("lo más importante", según la tarea).
|
|
259
|
+
//
|
|
260
|
+
// Sin hallazgos que salvar esto es un fallo real ("no pude", no "no
|
|
261
|
+
// hay") y se propaga tal cual — mismo comportamiento que antes de este
|
|
262
|
+
// cambio, para no enmascarar errores genuinos con un resultado vacío.
|
|
263
|
+
//
|
|
264
|
+
// Un abort (`signal.aborted`) NUNCA entra en el yield final forzado,
|
|
265
|
+
// aunque haya hallazgos: cancelar significa "para del todo", igual que
|
|
266
|
+
// ya hacía el camino de éxito (línea de arriba, `if (signal?.aborted)
|
|
267
|
+
// return null`) con un resultado completo y válido. Si esto cambiara,
|
|
268
|
+
// el workflow trataría una cancelación como un resultado parcial
|
|
269
|
+
// utilizable y seguiría a la siguiente fase con datos a medias.
|
|
270
|
+
if (signal?.aborted || buffer.longitud === 0)
|
|
271
|
+
throw error;
|
|
272
|
+
const motivo = error instanceof Error ? error.message : String(error);
|
|
273
|
+
if (worktree && !finalized) {
|
|
274
|
+
finalized = await finalizeWorktree(worktree, worktreeMessage);
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
result: ensamblarResultadoIncremental(buffer),
|
|
278
|
+
text: textoFinal,
|
|
279
|
+
usage: subagent.getUsage(),
|
|
280
|
+
sessionId: sessionId(),
|
|
281
|
+
worktreeBranch: finalized?.branch,
|
|
282
|
+
descarrilado: true,
|
|
283
|
+
motivoDescarrile: motivo,
|
|
284
|
+
hallazgos: buffer.todos(),
|
|
285
|
+
};
|
|
186
286
|
}
|
|
187
287
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
// Consolidar el worktree ANTES de devolver: si solo lo retirásemos, los
|
|
192
|
-
// cambios sin commitear del agente se perderían y el aislamiento no
|
|
193
|
-
// habría servido de nada. La rama sobrevive para que un humano la
|
|
194
|
-
// mergee; no hay auto-merge a propósito.
|
|
195
|
-
if (worktree && !finalized) {
|
|
196
|
-
finalized = await finalizeWorktree(worktree, worktreeMessage);
|
|
288
|
+
finally {
|
|
289
|
+
unsubscribe();
|
|
197
290
|
}
|
|
198
|
-
return {
|
|
199
|
-
result,
|
|
200
|
-
text,
|
|
201
|
-
usage: subagent.getUsage(),
|
|
202
|
-
sessionId: session.sessionManager?.getSessionId?.(),
|
|
203
|
-
worktreeBranch: finalized?.branch,
|
|
204
|
-
};
|
|
205
291
|
}
|
|
206
292
|
finally {
|
|
207
293
|
if (timeoutTimer)
|
|
208
294
|
clearTimeout(timeoutTimer);
|
|
209
295
|
subagent?.dispose();
|
|
210
|
-
// Camino de error/abort
|
|
211
|
-
// el trabajo parcial del agente también merece
|
|
212
|
-
// inspeccionarlo — y hay que soltar el worktree
|
|
296
|
+
// Camino de error/abort sin hallazgos que salvar: el return no llegó a
|
|
297
|
+
// consolidar, pero el trabajo parcial del agente también merece
|
|
298
|
+
// sobrevivir para poder inspeccionarlo — y hay que soltar el worktree
|
|
299
|
+
// igualmente.
|
|
213
300
|
if (worktree && !finalized) {
|
|
214
301
|
finalized = await finalizeWorktree(worktree, worktreeMessage);
|
|
215
302
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../src/core/workflows/agent-runner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentRunner — subagente del Ada Intelligence Engine.\n *\n * Un subagente es una sesión del SDK (AgentSessionRuntime via createAgentSession)\n * con: modelo resuelto (spec/tier/fallback), tools configuradas, cwd (base o\n * worktree), instructions opcionales y límites (timeout, retries). El runner\n * captura la respuesta final, el structured output (schema typebox con fallback\n * a extracción de prosa) y el usage real (tokens/coste).\n *\n * La creación de la sesión es inyectable (createSession) para tests con fakes.\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { TextContent } from \"@earendil-works/pi-ai\";\nimport type { TSchema } from \"typebox\";\nimport type { AgentSession, AgentSessionEvent } from \"../agent-session.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport type { AgentRunOptions, AgentRunResult, AgentUsage, WorkflowErrorCode } from \"./types.ts\";\nimport { WorkflowError } from \"./types.ts\";\nimport { createWorktree, finalizeWorktree, type Worktree } from \"./worktree.ts\";\n\nexport interface SubagentSession {\n\tsession: AgentSession;\n\tdispose(): void;\n\tgetUsage(): AgentUsage;\n}\n\nexport type CreateSubagentSession = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tmodelSpec?: string;\n\ttools?: string[];\n\tcustomTools?: ToolDefinition[];\n\tsessionName?: string;\n\tinstructions?: string;\n}) => Promise<SubagentSession>;\n\nexport interface AgentRunnerOptions {\n\tagentDir: string;\n\tcreateSession: CreateSubagentSession;\n\t/** Limiter compartido del run (concurrency). */\n\tlimiter: <T>(fn: () => Promise<T>) => Promise<T>;\n\t/** Contador global de agentes del run (maxAgents). */\n\tagentCounter: { count: number };\n\t/** Techo de agentes por run (`workflows.maxAgentsPerRun`). */\n\tmaxAgents: number;\n\tretries?: number;\n\tagentTimeoutMs?: number | null;\n}\n\n/** Hash de identidad del agente para el journal (prompt+model+phase+schema+stableKey). */\nexport function agentIdentityHash(options: {\n\tprompt: string;\n\tmodel?: string;\n\ttier?: string;\n\tphase?: string;\n\tstableKey?: string;\n\tschema?: TSchema | undefined;\n}): string {\n\tconst canonical = JSON.stringify({\n\t\tprompt: options.prompt,\n\t\tmodel: options.model ?? null,\n\t\ttier: options.tier ?? null,\n\t\tphase: options.phase ?? null,\n\t\tstableKey: options.stableKey ?? null,\n\t\tschema: options.schema ? JSON.stringify(options.schema) : null,\n\t});\n\treturn createHash(\"sha256\").update(canonical).digest(\"hex\");\n}\n\n/** Extraer el texto de una respuesta (string o content array). */\nexport function messageText(content: unknown): string {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.filter((b): b is TextContent => typeof b === \"object\" && b !== null && (b as { type?: string }).type === \"text\")\n\t\t.map((b) => b.text ?? \"\")\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\n/** Extraer JSON del texto (para structured output fallback). */\nexport function extractJson(text: string): unknown | undefined {\n\tconst cleaned = text\n\t\t.replace(/```json\\s*/g, \"\")\n\t\t.replace(/```/g, \"\")\n\t\t.trim();\n\tconst start = cleaned.indexOf(\"{\");\n\tconst end = cleaned.lastIndexOf(\"}\");\n\tif (start === -1 || end === -1) return undefined;\n\ttry {\n\t\treturn JSON.parse(cleaned.slice(start, end + 1));\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Tools por defecto de un subagente (espejo de sdk.ts:263). */\nconst SUBAGENT_DEFAULT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\"];\n/** Mínimo privilegio: leer y buscar, nada de escribir ni ejecutar. */\nconst SUBAGENT_READONLY_TOOLS = [\"read\", \"grep\", \"find\", \"ls\"];\n\n/**\n * Allowlist de tools del subagente.\n *\n * Desenreda un bug latente: `options.tools` son tools EXTRA (web_search…) y se\n * pasaban a la vez como `customTools` y como allowlist, de modo que pedir una\n * tool extra ESTRECHABA el permiso en silencio a solo esa — un agente que pedía\n * `web_search` perdía `read`/`bash`/`edit`/`write` sin que nadie lo notara.\n * Ahora las extra se SUMAN a la base, que es lo que el nombre siempre prometió.\n */\nexport function resolveAllowedTools(options: { readOnly?: boolean; tools?: Array<{ name: string }> }): string[] {\n\tconst base = options.readOnly ? SUBAGENT_READONLY_TOOLS : SUBAGENT_DEFAULT_TOOLS;\n\tconst extras = (options.tools ?? []).map((t) => t.name);\n\treturn [...new Set([...base, ...extras])];\n}\n\nexport class AgentRunner {\n\tprivate agentDir: string;\n\tprivate createSession: CreateSubagentSession;\n\tprivate limiter: AgentRunnerOptions[\"limiter\"];\n\tprivate agentCounter: AgentRunnerOptions[\"agentCounter\"];\n\tprivate maxAgents: number;\n\tprivate retries: number;\n\tprivate agentTimeoutMs: number | null;\n\n\tconstructor(options: AgentRunnerOptions) {\n\t\tthis.agentDir = options.agentDir;\n\t\tthis.createSession = options.createSession;\n\t\tthis.limiter = options.limiter;\n\t\tthis.agentCounter = options.agentCounter;\n\t\tthis.maxAgents = options.maxAgents;\n\t\tthis.retries = options.retries ?? 3;\n\t\tthis.agentTimeoutMs = options.agentTimeoutMs ?? null;\n\t}\n\n\tasync run<T = unknown>(options: AgentRunOptions): Promise<AgentRunResult<T> | null> {\n\t\treturn this.limiter(async () => {\n\t\t\tif (this.agentCounter.count >= this.maxAgents) {\n\t\t\t\tthrow new WorkflowError(\n\t\t\t\t\t\"WORKFLOW_MAX_AGENTS\",\n\t\t\t\t\t`Límite de agentes del run alcanzado (${this.maxAgents}). Súbelo con el ajuste workflows.maxAgentsPerRun.`,\n\t\t\t\t\t{ recoverable: false },\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.agentCounter.count++;\n\n\t\t\tlet attempt = 0;\n\t\t\tlet lastError: Error | undefined;\n\t\t\tfor (; attempt <= this.retries; attempt++) {\n\t\t\t\tconst signal = options.signal;\n\t\t\t\tif (signal?.aborted) return null;\n\t\t\t\ttry {\n\t\t\t\t\treturn await this.runOnce<T>(options, signal);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (signal?.aborted) return null;\n\t\t\t\t\tif (isAbortError(error) || isTimeoutError(error)) throw error;\n\t\t\t\t\tlastError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\tif (attempt >= this.retries) break;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (lastError) throw lastError;\n\t\t\treturn null;\n\t\t});\n\t}\n\n\tprivate async runOnce<T>(options: AgentRunOptions, signal?: AbortSignal): Promise<AgentRunResult<T> | null> {\n\t\t// Timeout combinado: el del agente + el del run.\n\t\tconst timeoutMs = options.timeoutMs ?? this.agentTimeoutMs;\n\t\tlet timeoutTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst timeout = new Promise<never>((_resolve, reject) => {\n\t\t\tif (timeoutMs === null) return;\n\t\t\ttimeoutTimer = setTimeout(() => {\n\t\t\t\treject(\n\t\t\t\t\tnew WorkflowError(\"WORKFLOW_AGENT_TIMEOUT\", `Agent timed out after ${timeoutMs}ms`, {\n\t\t\t\t\t\trecoverable: false,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}, timeoutMs);\n\t\t});\n\n\t\tconst baseCwd = options.cwd ?? process.cwd();\n\t\t// Aislamiento git: los agentes con escritura que corren en paralelo\n\t\t// editaban el MISMO checkout y se pisaban en silencio. El nombre es\n\t\t// determinista (isolationKey = runId:callIndex) para que un resume\n\t\t// reencuentre el mismo worktree. Fuera de un repo git hace no-op.\n\t\tlet worktree: Worktree | null = null;\n\t\tlet finalized: { branch?: string; kept: boolean } | undefined;\n\t\tconst worktreeMessage = `ada: ${options.label ?? options.isolationKey ?? \"agent\"}`;\n\t\tif (options.isolation === \"worktree\") {\n\t\t\tworktree = await createWorktree(baseCwd, options.isolationKey ?? options.label ?? \"agent\");\n\t\t}\n\n\t\tlet subagent: SubagentSession | null = null;\n\t\ttry {\n\t\t\tsubagent = await this.createSession({\n\t\t\t\tcwd: worktree?.cwd ?? baseCwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tmodelSpec: options.model ?? (options.tier ? `tier:${options.tier}` : undefined),\n\t\t\t\ttools: resolveAllowedTools(options),\n\t\t\t\tcustomTools: options.tools,\n\t\t\t\tsessionName: options.label ? `workflow:${options.label}` : undefined,\n\t\t\t\tinstructions: options.instructions,\n\t\t\t});\n\t\t\tconst session = subagent.session;\n\n\t\t\tconst lastAssistantText: string[] = [];\n\t\t\tconst unsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\t\tconst text = messageText(event.message.content);\n\t\t\t\t\tif (text) lastAssistantText.push(text);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tawait Promise.race([session.sendUserMessage(options.prompt), timeout]);\n\t\t\t\tawait Promise.race([session.waitForIdle(), timeout]);\n\t\t\t} finally {\n\t\t\t\tunsubscribe();\n\t\t\t}\n\n\t\t\tif (signal?.aborted) return null;\n\n\t\t\tconst text = lastAssistantText.length > 0 ? lastAssistantText[lastAssistantText.length - 1] : \"\";\n\t\t\tlet result: T | null = null;\n\t\t\tlet _origin: \"structured\" | \"recovered\" = \"structured\";\n\n\t\t\tif (options.schema) {\n\t\t\t\tconst parsed = extractJson(text);\n\t\t\t\tif (parsed !== undefined) {\n\t\t\t\t\tresult = parsed as T;\n\t\t\t\t} else {\n\t\t\t\t\t_origin = \"recovered\";\n\t\t\t\t\t// Fallback: devolver la prosa (el caller decide si sirve).\n\t\t\t\t\tresult = text as unknown as T;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult = (text.length > 0 ? text : null) as unknown as T;\n\t\t\t}\n\n\t\t\t// Consolidar el worktree ANTES de devolver: si solo lo retirásemos, los\n\t\t\t// cambios sin commitear del agente se perderían y el aislamiento no\n\t\t\t// habría servido de nada. La rama sobrevive para que un humano la\n\t\t\t// mergee; no hay auto-merge a propósito.\n\t\t\tif (worktree && !finalized) {\n\t\t\t\tfinalized = await finalizeWorktree(worktree, worktreeMessage);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tresult,\n\t\t\t\ttext,\n\t\t\t\tusage: subagent.getUsage(),\n\t\t\t\tsessionId: (\n\t\t\t\t\tsession as { sessionManager?: { getSessionId?: () => string } }\n\t\t\t\t).sessionManager?.getSessionId?.(),\n\t\t\t\tworktreeBranch: finalized?.branch,\n\t\t\t} as AgentRunResult<T>;\n\t\t} finally {\n\t\t\tif (timeoutTimer) clearTimeout(timeoutTimer);\n\t\t\tsubagent?.dispose();\n\t\t\t// Camino de error/abort/timeout: el return no llegó a consolidar, pero\n\t\t\t// el trabajo parcial del agente también merece sobrevivir para poder\n\t\t\t// inspeccionarlo — y hay que soltar el worktree igualmente.\n\t\t\tif (worktree && !finalized) {\n\t\t\t\tfinalized = await finalizeWorktree(worktree, worktreeMessage);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction isTimeoutError(error: unknown): boolean {\n\treturn error instanceof WorkflowError && error.code === \"WORKFLOW_AGENT_TIMEOUT\";\n}\n\n/** Tipos re-exportados para el index. */\nexport type { WorkflowErrorCode };\n"]}
|
|
1
|
+
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../src/core/workflows/agent-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAE9G,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAiB,MAAM,eAAe,CAAC;AA+BhF,0FAA0F;AAC1F,MAAM,UAAU,iBAAiB,CAAC,OAOjC,EAAU;IACV,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;QAC5B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;KAC9D,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAAA,CAC5D;AAED,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAU;IACrD,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAAuB,CAAC,IAAI,KAAK,MAAM,CAAC;SAChH,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;SACxB,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;AAAA,CACT;AAED,gEAAgE;AAChE,MAAM,UAAU,WAAW,CAAC,IAAY,EAAuB;IAC9D,MAAM,OAAO,GAAG,IAAI;SAClB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,IAAI,EAAE,CAAC;IACT,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AAAA,CACD;AAED;;;;;;GAMG;AACH,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1E;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACxE,oFAAmF;AACnF,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AACnD,mFAAmF;AACnF,MAAM,kBAAkB,GAAG;IAC1B,cAAc;IACd,kBAAkB;IAClB,cAAc;IACd,eAAe;IACf,cAAc;IACd,oBAAoB;IACpB,kBAAkB;IAClB,eAAe;CACf,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAKnC,EAAY;IACZ,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IACjF,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxD,6EAA6E;IAC7E,8EAA6E;IAC7E,mEAAiE;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,6EAA6E;IAC7E,+DAA8D;IAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAAA,CAChE;AAED,MAAM,OAAO,WAAW;IACf,QAAQ,CAAS;IACjB,aAAa,CAAwB;IACrC,OAAO,CAAgC;IACvC,YAAY,CAAqC;IACjD,SAAS,CAAS;IAClB,OAAO,CAAS;IAChB,cAAc,CAAgB;IAEtC,YAAY,OAA2B,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;IAAA,CACrD;IAED,KAAK,CAAC,GAAG,CAAc,OAAwB,EAAqC;QACnF,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC/C,MAAM,IAAI,aAAa,CACtB,qBAAqB,EACrB,yCAAwC,IAAI,CAAC,SAAS,qDAAoD,EAC1G,EAAE,WAAW,EAAE,KAAK,EAAE,CACtB,CAAC;YACH,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAE1B,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,SAA4B,CAAC;YACjC,OAAO,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC9B,IAAI,MAAM,EAAE,OAAO;oBAAE,OAAO,IAAI,CAAC;gBACjC,IAAI,CAAC;oBACJ,OAAO,MAAM,IAAI,CAAC,OAAO,CAAI,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC/C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,IAAI,MAAM,EAAE,OAAO;wBAAE,OAAO,IAAI,CAAC;oBACjC,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC;wBAAE,MAAM,KAAK,CAAC;oBAC9D,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBACtE,IAAI,OAAO,IAAI,IAAI,CAAC,OAAO;wBAAE,MAAM;gBACpC,CAAC;YACF,CAAC;YACD,IAAI,SAAS;gBAAE,MAAM,SAAS,CAAC;YAC/B,OAAO,IAAI,CAAC;QAAA,CACZ,CAAC,CAAC;IAAA,CACH;IAEO,KAAK,CAAC,OAAO,CAAI,OAAwB,EAAE,MAAoB,EAAqC;QAC3G,iDAAiD;QACjD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC;QAC3D,IAAI,YAAuD,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC;YACxD,IAAI,SAAS,KAAK,IAAI;gBAAE,OAAO;YAC/B,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;gBAC/B,MAAM,CACL,IAAI,aAAa,CAAC,wBAAwB,EAAE,yBAAyB,SAAS,IAAI,EAAE;oBACnF,WAAW,EAAE,KAAK;iBAClB,CAAC,CACF,CAAC;YAAA,CACF,EAAE,SAAS,CAAC,CAAC;QAAA,CACd,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAC7C,oEAAoE;QACpE,oEAAoE;QACpE,mEAAmE;QACnE,kEAAkE;QAClE,IAAI,QAAQ,GAAoB,IAAI,CAAC;QACrC,IAAI,SAAyD,CAAC;QAC9D,MAAM,eAAe,GAAG,QAAQ,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,EAAE,CAAC;QACnF,IAAI,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YACtC,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,QAAQ,GAA2B,IAAI,CAAC;QAC5C,2EAA2E;QAC3E,4EAAyE;QACzE,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACvC,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC;gBACnC,GAAG,EAAE,QAAQ,EAAE,GAAG,IAAI,OAAO;gBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/E,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC;gBACnC,WAAW,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtG,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;gBACpE,YAAY,EAAE,OAAO,CAAC,YAAY;aAClC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YAEjC,MAAM,iBAAiB,GAAa,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAwB,EAAE,EAAE,CAAC;gBACnE,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACxE,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAChD,IAAI,IAAI;wBAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxC,CAAC;YAAA,CACD,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,GAAG,EAAE,CACrB,OAAgE,CAAC,cAAc,EAAE,YAAY,EAAE,EAAE,CAAC;YACpG,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC;gBACJ,IAAI,CAAC;oBACJ,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;oBACvE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;oBACrD,IAAI,MAAM,EAAE,OAAO;wBAAE,OAAO,IAAI,CAAC;oBAEjC,UAAU,GAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjG,IAAI,MAAM,GAAa,IAAI,CAAC;oBAC5B,IAAI,UAA2C,CAAC;oBAEhD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;wBACpB,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAI;4BAC/C,OAAO,EAAE,OAAO,CAAC,MAAM;4BACvB,YAAY,EAAE,UAAU;4BACxB,aAAa,EAAE,OAAO,CAAC,uBAAuB,IAAI,CAAC;4BACnD,OAAO,EAAE,WAAW;4BACpB,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;gCACnC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gCAChE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;gCACrD,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC;oCAAE,UAAU,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gCAC/F,OAAO,UAAU,CAAC;4BAAA,CAClB;yBACD,CAAC,CAAC;wBACH,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;wBACzB,UAAU,GAAG;4BACZ,MAAM,EAAE,SAAS,CAAC,MAAM;4BACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ;4BAC5B,QAAQ,EAAE,SAAS,CAAC,QAAQ;4BAC5B,OAAO,EAAE,SAAS,CAAC,OAAO;yBAC1B,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACP,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAiB,CAAC;oBACtE,CAAC;oBAED,yEAAwE;oBACxE,qEAAoE;oBACpE,mEAAkE;oBAClE,0CAAyC;oBACzC,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;wBAC5B,SAAS,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;oBAC/D,CAAC;oBAED,OAAO;wBACN,MAAM;wBACN,IAAI,EAAE,UAAU;wBAChB,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE;wBAC1B,SAAS,EAAE,SAAS,EAAE;wBACtB,cAAc,EAAE,SAAS,EAAE,MAAM;wBACjC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrC,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACxC,CAAC;gBACxB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,uEAAsE;oBACtE,sEAAoE;oBACpE,wEAAsE;oBACtE,uEAAuE;oBACvE,kDAAgD;oBAChD,EAAE;oBACF,oEAAoE;oBACpE,yEAAuE;oBACvE,uEAAsE;oBACtE,EAAE;oBACF,qEAAqE;oBACrE,uEAAuE;oBACvE,yEAAsE;oBACtE,uEAAsE;oBACtE,mEAAiE;oBACjE,iEAAgE;oBAChE,IAAI,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;wBAAE,MAAM,KAAK,CAAC;oBAC1D,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACtE,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;wBAC5B,SAAS,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;oBAC/D,CAAC;oBACD,OAAO;wBACN,MAAM,EAAE,6BAA6B,CAAC,MAAM,CAAiB;wBAC7D,IAAI,EAAE,UAAU;wBAChB,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE;wBAC1B,SAAS,EAAE,SAAS,EAAE;wBACtB,cAAc,EAAE,SAAS,EAAE,MAAM;wBACjC,YAAY,EAAE,IAAI;wBAClB,gBAAgB,EAAE,MAAM;wBACxB,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE;qBACJ,CAAC;gBACxB,CAAC;YACF,CAAC;oBAAS,CAAC;gBACV,WAAW,EAAE,CAAC;YACf,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,IAAI,YAAY;gBAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YAC7C,QAAQ,EAAE,OAAO,EAAE,CAAC;YACpB,wEAAuE;YACvE,iEAAgE;YAChE,wEAAsE;YACtE,cAAc;YACd,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC5B,SAAS,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;YAC/D,CAAC;QACF,CAAC;IAAA,CACD;CACD;AAED,SAAS,YAAY,CAAC,KAAc,EAAW;IAC9C,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;AAAA,CAC7D;AAED,SAAS,cAAc,CAAC,KAAc,EAAW;IAChD,OAAO,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB,CAAC;AAAA,CACjF","sourcesContent":["/**\n * AgentRunner — subagente del Ada Intelligence Engine.\n *\n * Un subagente es una sesión del SDK (AgentSessionRuntime via createAgentSession)\n * con: modelo resuelto (spec/tier/fallback), tools configuradas, cwd (base o\n * worktree), instructions opcionales y límites (timeout, retries). El runner\n * captura la respuesta final, el structured output (schema typebox con fallback\n * a extracción de prosa) y el usage real (tokens/coste).\n *\n * La creación de la sesión es inyectable (createSession) para tests con fakes.\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { TextContent } from \"@earendil-works/pi-ai\";\nimport type { TSchema } from \"typebox\";\nimport type { AgentSession, AgentSessionEvent } from \"../agent-session.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { validarConReintentos } from \"./contrato/validador.ts\";\nimport { BufferDeHallazgos, crearHerramientaYield, ensamblarResultadoIncremental } from \"./contrato/yield.ts\";\nimport type { AgentRunOptions, AgentRunResult, AgentUsage, WorkflowErrorCode } from \"./types.ts\";\nimport { WorkflowError } from \"./types.ts\";\nimport { createWorktree, finalizeWorktree, type Worktree } from \"./worktree.ts\";\n\nexport interface SubagentSession {\n\tsession: AgentSession;\n\tdispose(): void;\n\tgetUsage(): AgentUsage;\n}\n\nexport type CreateSubagentSession = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tmodelSpec?: string;\n\ttools?: string[];\n\tcustomTools?: ToolDefinition[];\n\tsessionName?: string;\n\tinstructions?: string;\n}) => Promise<SubagentSession>;\n\nexport interface AgentRunnerOptions {\n\tagentDir: string;\n\tcreateSession: CreateSubagentSession;\n\t/** Limiter compartido del run (concurrency). */\n\tlimiter: <T>(fn: () => Promise<T>) => Promise<T>;\n\t/** Contador global de agentes del run (maxAgents). */\n\tagentCounter: { count: number };\n\t/** Techo de agentes por run (`workflows.maxAgentsPerRun`). */\n\tmaxAgents: number;\n\tretries?: number;\n\tagentTimeoutMs?: number | null;\n}\n\n/** Hash de identidad del agente para el journal (prompt+model+phase+schema+stableKey). */\nexport function agentIdentityHash(options: {\n\tprompt: string;\n\tmodel?: string;\n\ttier?: string;\n\tphase?: string;\n\tstableKey?: string;\n\tschema?: TSchema | undefined;\n}): string {\n\tconst canonical = JSON.stringify({\n\t\tprompt: options.prompt,\n\t\tmodel: options.model ?? null,\n\t\ttier: options.tier ?? null,\n\t\tphase: options.phase ?? null,\n\t\tstableKey: options.stableKey ?? null,\n\t\tschema: options.schema ? JSON.stringify(options.schema) : null,\n\t});\n\treturn createHash(\"sha256\").update(canonical).digest(\"hex\");\n}\n\n/** Extraer el texto de una respuesta (string o content array). */\nexport function messageText(content: unknown): string {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.filter((b): b is TextContent => typeof b === \"object\" && b !== null && (b as { type?: string }).type === \"text\")\n\t\t.map((b) => b.text ?? \"\")\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\n/** Extraer JSON del texto (para structured output fallback). */\nexport function extractJson(text: string): unknown | undefined {\n\tconst cleaned = text\n\t\t.replace(/```json\\s*/g, \"\")\n\t\t.replace(/```/g, \"\")\n\t\t.trim();\n\tconst start = cleaned.indexOf(\"{\");\n\tconst end = cleaned.lastIndexOf(\"}\");\n\tif (start === -1 || end === -1) return undefined;\n\ttry {\n\t\treturn JSON.parse(cleaned.slice(start, end + 1));\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Tools por defecto de un subagente (espejo de sdk.ts:263), MÁS `yield`\n * siempre — es la tool de entrega incremental (ver contrato/yield.ts) y no es\n * un permiso adicional: reportar un hallazgo no lee ni escribe nada que las\n * tools base ya no autoricen. Un subagente que nunca la llama se comporta\n * exactamente como antes.\n */\nconst SUBAGENT_DEFAULT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\", \"yield\"];\n/**\n * Mínimo privilegio: leer y buscar, nada de escribir ni ejecutar. `yield`\n * también aquí — un agente de solo lectura cuyo trabajo ES encontrar cosas\n * necesita poder reportarlas.\n */\nconst SUBAGENT_READONLY_TOOLS = [\"read\", \"grep\", \"find\", \"ls\", \"yield\"];\n/** Red: nunca implícitas, ni siquiera bajo `readOnly`. Ver resolveAllowedTools. */\nconst WEB_TOOL_NAMES = [\"web_search\", \"web_fetch\"];\n/** Navegador: opt-in aparte de `web`. Conducir un navegador no es leer una URL. */\nconst BROWSER_TOOL_NAMES = [\n\t\"browser_open\",\n\t\"browser_navigate\",\n\t\"browser_read\",\n\t\"browser_click\",\n\t\"browser_type\",\n\t\"browser_screenshot\",\n\t\"browser_viewport\",\n\t\"browser_close\",\n];\n\n/**\n * Allowlist de tools del subagente.\n *\n * Desenreda un bug latente: `options.tools` son tools EXTRA (web_search…) y se\n * pasaban a la vez como `customTools` y como allowlist, de modo que pedir una\n * tool extra ESTRECHABA el permiso en silencio a solo esa — un agente que pedía\n * `web_search` perdía `read`/`bash`/`edit`/`write` sin que nadie lo notara.\n * Ahora las extra se SUMAN a la base, que es lo que el nombre siempre prometió.\n */\nexport function resolveAllowedTools(options: {\n\treadOnly?: boolean;\n\tweb?: boolean;\n\tbrowser?: boolean;\n\ttools?: Array<{ name: string }>;\n}): string[] {\n\tconst base = options.readOnly ? SUBAGENT_READONLY_TOOLS : SUBAGENT_DEFAULT_TOOLS;\n\tconst extras = (options.tools ?? []).map((t) => t.name);\n\t// El acceso a red es opt-in aunque `web_fetch` sea \"de lectura\": leer la web\n\t// no es leer el disco. Un subagente con red es una vía de salida para lo que\n\t// haya leído, así que el script tiene que pedirlo por su nombre.\n\tconst web = options.web ? WEB_TOOL_NAMES : [];\n\t// `browser` no se hereda de `web`: descargar una URL y conducir un navegador\n\t// con sesión, formularios y capturas no son el mismo permiso.\n\tconst navegador = options.browser ? BROWSER_TOOL_NAMES : [];\n\treturn [...new Set([...base, ...web, ...navegador, ...extras])];\n}\n\nexport class AgentRunner {\n\tprivate agentDir: string;\n\tprivate createSession: CreateSubagentSession;\n\tprivate limiter: AgentRunnerOptions[\"limiter\"];\n\tprivate agentCounter: AgentRunnerOptions[\"agentCounter\"];\n\tprivate maxAgents: number;\n\tprivate retries: number;\n\tprivate agentTimeoutMs: number | null;\n\n\tconstructor(options: AgentRunnerOptions) {\n\t\tthis.agentDir = options.agentDir;\n\t\tthis.createSession = options.createSession;\n\t\tthis.limiter = options.limiter;\n\t\tthis.agentCounter = options.agentCounter;\n\t\tthis.maxAgents = options.maxAgents;\n\t\tthis.retries = options.retries ?? 3;\n\t\tthis.agentTimeoutMs = options.agentTimeoutMs ?? null;\n\t}\n\n\tasync run<T = unknown>(options: AgentRunOptions): Promise<AgentRunResult<T> | null> {\n\t\treturn this.limiter(async () => {\n\t\t\tif (this.agentCounter.count >= this.maxAgents) {\n\t\t\t\tthrow new WorkflowError(\n\t\t\t\t\t\"WORKFLOW_MAX_AGENTS\",\n\t\t\t\t\t`Límite de agentes del run alcanzado (${this.maxAgents}). Súbelo con el ajuste workflows.maxAgentsPerRun.`,\n\t\t\t\t\t{ recoverable: false },\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.agentCounter.count++;\n\n\t\t\tlet attempt = 0;\n\t\t\tlet lastError: Error | undefined;\n\t\t\tfor (; attempt <= this.retries; attempt++) {\n\t\t\t\tconst signal = options.signal;\n\t\t\t\tif (signal?.aborted) return null;\n\t\t\t\ttry {\n\t\t\t\t\treturn await this.runOnce<T>(options, signal);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (signal?.aborted) return null;\n\t\t\t\t\tif (isAbortError(error) || isTimeoutError(error)) throw error;\n\t\t\t\t\tlastError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\tif (attempt >= this.retries) break;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (lastError) throw lastError;\n\t\t\treturn null;\n\t\t});\n\t}\n\n\tprivate async runOnce<T>(options: AgentRunOptions, signal?: AbortSignal): Promise<AgentRunResult<T> | null> {\n\t\t// Timeout combinado: el del agente + el del run.\n\t\tconst timeoutMs = options.timeoutMs ?? this.agentTimeoutMs;\n\t\tlet timeoutTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst timeout = new Promise<never>((_resolve, reject) => {\n\t\t\tif (timeoutMs === null) return;\n\t\t\ttimeoutTimer = setTimeout(() => {\n\t\t\t\treject(\n\t\t\t\t\tnew WorkflowError(\"WORKFLOW_AGENT_TIMEOUT\", `Agent timed out after ${timeoutMs}ms`, {\n\t\t\t\t\t\trecoverable: false,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}, timeoutMs);\n\t\t});\n\n\t\tconst baseCwd = options.cwd ?? process.cwd();\n\t\t// Aislamiento git: los agentes con escritura que corren en paralelo\n\t\t// editaban el MISMO checkout y se pisaban en silencio. El nombre es\n\t\t// determinista (isolationKey = runId:callIndex) para que un resume\n\t\t// reencuentre el mismo worktree. Fuera de un repo git hace no-op.\n\t\tlet worktree: Worktree | null = null;\n\t\tlet finalized: { branch?: string; kept: boolean } | undefined;\n\t\tconst worktreeMessage = `ada: ${options.label ?? options.isolationKey ?? \"agent\"}`;\n\t\tif (options.isolation === \"worktree\") {\n\t\t\tworktree = await createWorktree(baseCwd, options.isolationKey ?? options.label ?? \"agent\");\n\t\t}\n\n\t\tlet subagent: SubagentSession | null = null;\n\t\t// Hallazgos entregados por `yield` durante ESTE intento. Sobreviven aunque\n\t\t// el subagente se descarrile más abajo — ese es el motivo de que exista.\n\t\tconst buffer = new BufferDeHallazgos();\n\t\ttry {\n\t\t\tsubagent = await this.createSession({\n\t\t\t\tcwd: worktree?.cwd ?? baseCwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tmodelSpec: options.model ?? (options.tier ? `tier:${options.tier}` : undefined),\n\t\t\t\ttools: resolveAllowedTools(options),\n\t\t\t\tcustomTools: [...(options.tools ?? []), crearHerramientaYield({ buffer, onEntrega: options.onYield })],\n\t\t\t\tsessionName: options.label ? `workflow:${options.label}` : undefined,\n\t\t\t\tinstructions: options.instructions,\n\t\t\t});\n\t\t\tconst session = subagent.session;\n\n\t\t\tconst lastAssistantText: string[] = [];\n\t\t\tconst unsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\t\tconst text = messageText(event.message.content);\n\t\t\t\t\tif (text) lastAssistantText.push(text);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst sessionId = () =>\n\t\t\t\t(session as { sessionManager?: { getSessionId?: () => string } }).sessionManager?.getSessionId?.();\n\t\t\tlet textoFinal = \"\";\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tawait Promise.race([session.sendUserMessage(options.prompt), timeout]);\n\t\t\t\t\tawait Promise.race([session.waitForIdle(), timeout]);\n\t\t\t\t\tif (signal?.aborted) return null;\n\n\t\t\t\t\ttextoFinal = lastAssistantText.length > 0 ? lastAssistantText[lastAssistantText.length - 1] : \"\";\n\t\t\t\t\tlet result: T | null = null;\n\t\t\t\t\tlet validacion: AgentRunResult<T>[\"validacion\"];\n\n\t\t\t\t\tif (options.schema) {\n\t\t\t\t\t\tconst resultado = await validarConReintentos<T>({\n\t\t\t\t\t\t\tesquema: options.schema,\n\t\t\t\t\t\t\ttextoInicial: textoFinal,\n\t\t\t\t\t\t\tmaxReintentos: options.maxReintentosValidacion ?? 2,\n\t\t\t\t\t\t\textraer: extractJson,\n\t\t\t\t\t\t\tpedirCorreccion: async (mensaje) => {\n\t\t\t\t\t\t\t\tawait Promise.race([session.sendUserMessage(mensaje), timeout]);\n\t\t\t\t\t\t\t\tawait Promise.race([session.waitForIdle(), timeout]);\n\t\t\t\t\t\t\t\tif (lastAssistantText.length > 0) textoFinal = lastAssistantText[lastAssistantText.length - 1];\n\t\t\t\t\t\t\t\treturn textoFinal;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\tresult = resultado.datos;\n\t\t\t\t\t\tvalidacion = {\n\t\t\t\t\t\t\tvalido: resultado.valido,\n\t\t\t\t\t\t\tintentos: resultado.intentos,\n\t\t\t\t\t\t\treparado: resultado.reparado,\n\t\t\t\t\t\t\terrores: resultado.errores,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = (textoFinal.length > 0 ? textoFinal : null) as unknown as T;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Consolidar el worktree ANTES de devolver: si solo lo retirásemos, los\n\t\t\t\t\t// cambios sin commitear del agente se perderían y el aislamiento no\n\t\t\t\t\t// habría servido de nada. La rama sobrevive para que un humano la\n\t\t\t\t\t// mergee; no hay auto-merge a propósito.\n\t\t\t\t\tif (worktree && !finalized) {\n\t\t\t\t\t\tfinalized = await finalizeWorktree(worktree, worktreeMessage);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\ttext: textoFinal,\n\t\t\t\t\t\tusage: subagent.getUsage(),\n\t\t\t\t\t\tsessionId: sessionId(),\n\t\t\t\t\t\tworktreeBranch: finalized?.branch,\n\t\t\t\t\t\t...(validacion ? { validacion } : {}),\n\t\t\t\t\t\t...(buffer.longitud > 0 ? { hallazgos: buffer.todos() } : {}),\n\t\t\t\t\t} as AgentRunResult<T>;\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// YIELD FINAL FORZADO. El subagente se descarriló (timeout, error del\n\t\t\t\t\t// SDK, lo que sea) EN CUALQUIER PUNTO del intercambio — incluida la\n\t\t\t\t\t// ronda de corrección de esquema. Si ya había entregado hallazgos con\n\t\t\t\t\t// `yield`, eso NO se pierde: es justo lo que este contrato existe para\n\t\t\t\t\t// evitar (\"lo más importante\", según la tarea).\n\t\t\t\t\t//\n\t\t\t\t\t// Sin hallazgos que salvar esto es un fallo real (\"no pude\", no \"no\n\t\t\t\t\t// hay\") y se propaga tal cual — mismo comportamiento que antes de este\n\t\t\t\t\t// cambio, para no enmascarar errores genuinos con un resultado vacío.\n\t\t\t\t\t//\n\t\t\t\t\t// Un abort (`signal.aborted`) NUNCA entra en el yield final forzado,\n\t\t\t\t\t// aunque haya hallazgos: cancelar significa \"para del todo\", igual que\n\t\t\t\t\t// ya hacía el camino de éxito (línea de arriba, `if (signal?.aborted)\n\t\t\t\t\t// return null`) con un resultado completo y válido. Si esto cambiara,\n\t\t\t\t\t// el workflow trataría una cancelación como un resultado parcial\n\t\t\t\t\t// utilizable y seguiría a la siguiente fase con datos a medias.\n\t\t\t\t\tif (signal?.aborted || buffer.longitud === 0) throw error;\n\t\t\t\t\tconst motivo = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tif (worktree && !finalized) {\n\t\t\t\t\t\tfinalized = await finalizeWorktree(worktree, worktreeMessage);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tresult: ensamblarResultadoIncremental(buffer) as unknown as T,\n\t\t\t\t\t\ttext: textoFinal,\n\t\t\t\t\t\tusage: subagent.getUsage(),\n\t\t\t\t\t\tsessionId: sessionId(),\n\t\t\t\t\t\tworktreeBranch: finalized?.branch,\n\t\t\t\t\t\tdescarrilado: true,\n\t\t\t\t\t\tmotivoDescarrile: motivo,\n\t\t\t\t\t\thallazgos: buffer.todos(),\n\t\t\t\t\t} as AgentRunResult<T>;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tunsubscribe();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (timeoutTimer) clearTimeout(timeoutTimer);\n\t\t\tsubagent?.dispose();\n\t\t\t// Camino de error/abort sin hallazgos que salvar: el return no llegó a\n\t\t\t// consolidar, pero el trabajo parcial del agente también merece\n\t\t\t// sobrevivir para poder inspeccionarlo — y hay que soltar el worktree\n\t\t\t// igualmente.\n\t\t\tif (worktree && !finalized) {\n\t\t\t\tfinalized = await finalizeWorktree(worktree, worktreeMessage);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction isTimeoutError(error: unknown): boolean {\n\treturn error instanceof WorkflowError && error.code === \"WORKFLOW_AGENT_TIMEOUT\";\n}\n\n/** Tipos re-exportados para el index. */\nexport type { WorkflowErrorCode };\n"]}
|