@hoilab/ada-cli 0.84.21 → 0.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -2
- package/README.es.md +174 -0
- package/README.md +203 -658
- package/dist/ada-publico.d.ts +35 -0
- package/dist/ada-publico.d.ts.map +1 -0
- package/dist/ada-publico.js +40 -0
- package/dist/ada-publico.js.map +1 -0
- package/dist/cli/args.d.ts +3 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +11 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/audit-command.d.ts +15 -0
- package/dist/cli/audit-command.d.ts.map +1 -0
- package/dist/cli/audit-command.js +280 -0
- package/dist/cli/audit-command.js.map +1 -0
- package/dist/cli/banco-command.d.ts +15 -0
- package/dist/cli/banco-command.d.ts.map +1 -0
- package/dist/cli/banco-command.js +213 -0
- package/dist/cli/banco-command.js.map +1 -0
- package/dist/cli/cleanse-command.d.ts +11 -0
- package/dist/cli/cleanse-command.d.ts.map +1 -0
- package/dist/cli/cleanse-command.js +101 -0
- package/dist/cli/cleanse-command.js.map +1 -0
- package/dist/cli/commit-command.d.ts +31 -0
- package/dist/cli/commit-command.d.ts.map +1 -0
- package/dist/cli/commit-command.js +158 -0
- package/dist/cli/commit-command.js.map +1 -0
- package/dist/cli/computer-command.d.ts +12 -0
- package/dist/cli/computer-command.d.ts.map +1 -0
- package/dist/cli/computer-command.js +141 -0
- package/dist/cli/computer-command.js.map +1 -0
- package/dist/cli/discover-command.d.ts +18 -0
- package/dist/cli/discover-command.d.ts.map +1 -0
- package/dist/cli/discover-command.js +108 -0
- package/dist/cli/discover-command.js.map +1 -0
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +2 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/hashline-command.d.ts +11 -0
- package/dist/cli/hashline-command.d.ts.map +1 -0
- package/dist/cli/hashline-command.js +106 -0
- package/dist/cli/hashline-command.js.map +1 -0
- package/dist/cli/home-screen.d.ts.map +1 -1
- package/dist/cli/home-screen.js +2 -2
- package/dist/cli/home-screen.js.map +1 -1
- package/dist/cli/import-command.d.ts +35 -0
- package/dist/cli/import-command.d.ts.map +1 -0
- package/dist/cli/import-command.js +164 -0
- package/dist/cli/import-command.js.map +1 -0
- package/dist/cli/politica-command.d.ts +20 -0
- package/dist/cli/politica-command.d.ts.map +1 -0
- package/dist/cli/politica-command.js +93 -0
- package/dist/cli/politica-command.js.map +1 -0
- package/dist/cli/refine-command.d.ts +18 -0
- package/dist/cli/refine-command.d.ts.map +1 -0
- package/dist/cli/refine-command.js +101 -0
- package/dist/cli/refine-command.js.map +1 -0
- package/dist/cli/review-command.d.ts +24 -0
- package/dist/cli/review-command.d.ts.map +1 -0
- package/dist/cli/review-command.js +168 -0
- package/dist/cli/review-command.js.map +1 -0
- package/dist/cli/schedule-command.d.ts +17 -0
- package/dist/cli/schedule-command.d.ts.map +1 -0
- package/dist/cli/schedule-command.js +117 -0
- package/dist/cli/schedule-command.js.map +1 -0
- package/dist/cli/serve-command.d.ts +72 -0
- package/dist/cli/serve-command.d.ts.map +1 -0
- package/dist/cli/serve-command.js +568 -0
- package/dist/cli/serve-command.js.map +1 -0
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +9 -3
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/cli/telegram-command.d.ts +18 -0
- package/dist/cli/telegram-command.d.ts.map +1 -0
- package/dist/cli/telegram-command.js +137 -0
- package/dist/cli/telegram-command.js.map +1 -0
- package/dist/cli/telemetria-command.d.ts +22 -0
- package/dist/cli/telemetria-command.d.ts.map +1 -0
- package/dist/cli/telemetria-command.js +127 -0
- package/dist/cli/telemetria-command.js.map +1 -0
- package/dist/cli/undo-command.d.ts +9 -0
- package/dist/cli/undo-command.d.ts.map +1 -0
- package/dist/cli/undo-command.js +56 -0
- package/dist/cli/undo-command.js.map +1 -0
- package/dist/cli/usage-command.d.ts +10 -0
- package/dist/cli/usage-command.d.ts.map +1 -0
- package/dist/cli/usage-command.js +209 -0
- package/dist/cli/usage-command.js.map +1 -0
- package/dist/cli/wiki-command.d.ts +9 -0
- package/dist/cli/wiki-command.d.ts.map +1 -0
- package/dist/cli/wiki-command.js +76 -0
- package/dist/cli/wiki-command.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -11
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -2
- package/dist/config.js.map +1 -1
- package/dist/core/ada.d.ts +58 -0
- package/dist/core/ada.d.ts.map +1 -0
- package/dist/core/ada.js +61 -0
- package/dist/core/ada.js.map +1 -0
- package/dist/core/advisor/guarda.d.ts +66 -0
- package/dist/core/advisor/guarda.d.ts.map +1 -0
- package/dist/core/advisor/guarda.js +191 -0
- package/dist/core/advisor/guarda.js.map +1 -0
- package/dist/core/advisor/runtime.d.ts +66 -0
- package/dist/core/advisor/runtime.d.ts.map +1 -0
- package/dist/core/advisor/runtime.js +121 -0
- package/dist/core/advisor/runtime.js.map +1 -0
- package/dist/core/advisor/sesion.d.ts +109 -0
- package/dist/core/advisor/sesion.d.ts.map +1 -0
- package/dist/core/advisor/sesion.js +139 -0
- package/dist/core/advisor/sesion.js.map +1 -0
- package/dist/core/agent-session.d.ts +85 -7
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +862 -78
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents/loader.d.ts +77 -0
- package/dist/core/agents/loader.d.ts.map +1 -0
- package/dist/core/agents/loader.js +154 -0
- package/dist/core/agents/loader.js.map +1 -0
- package/dist/core/aprobacion/generados.d.ts +37 -0
- package/dist/core/aprobacion/generados.d.ts.map +1 -0
- package/dist/core/aprobacion/generados.js +85 -0
- package/dist/core/aprobacion/generados.js.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
- package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
- package/dist/core/aprobacion/politica-de-maquina.js +212 -0
- package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
- package/dist/core/aprobacion/politica.d.ts +90 -0
- package/dist/core/aprobacion/politica.d.ts.map +1 -0
- package/dist/core/aprobacion/politica.js +375 -0
- package/dist/core/aprobacion/politica.js.map +1 -0
- package/dist/core/arranque/atajos.d.ts +46 -0
- package/dist/core/arranque/atajos.d.ts.map +1 -0
- package/dist/core/arranque/atajos.js +113 -0
- package/dist/core/arranque/atajos.js.map +1 -0
- package/dist/core/audit/exportacion.d.ts +54 -0
- package/dist/core/audit/exportacion.d.ts.map +1 -0
- package/dist/core/audit/exportacion.js +265 -0
- package/dist/core/audit/exportacion.js.map +1 -0
- package/dist/core/audit/libro.d.ts +318 -0
- package/dist/core/audit/libro.d.ts.map +1 -0
- package/dist/core/audit/libro.js +508 -0
- package/dist/core/audit/libro.js.map +1 -0
- package/dist/core/audit/registro-sesion.d.ts +78 -0
- package/dist/core/audit/registro-sesion.d.ts.map +1 -0
- package/dist/core/audit/registro-sesion.js +202 -0
- package/dist/core/audit/registro-sesion.js.map +1 -0
- package/dist/core/audit/retencion.d.ts +82 -0
- package/dist/core/audit/retencion.d.ts.map +1 -0
- package/dist/core/audit/retencion.js +152 -0
- package/dist/core/audit/retencion.js.map +1 -0
- package/dist/core/audit/rutas.d.ts +23 -0
- package/dist/core/audit/rutas.d.ts.map +1 -0
- package/dist/core/audit/rutas.js +23 -0
- package/dist/core/audit/rutas.js.map +1 -0
- package/dist/core/auth-storage.d.ts +0 -3
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +21 -8
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/banco/almacenamiento.d.ts +18 -0
- package/dist/core/banco/almacenamiento.d.ts.map +1 -0
- package/dist/core/banco/almacenamiento.js +50 -0
- package/dist/core/banco/almacenamiento.js.map +1 -0
- package/dist/core/banco/analisis.d.ts +37 -0
- package/dist/core/banco/analisis.d.ts.map +1 -0
- package/dist/core/banco/analisis.js +164 -0
- package/dist/core/banco/analisis.js.map +1 -0
- package/dist/core/banco/bloques.d.ts +39 -0
- package/dist/core/banco/bloques.d.ts.map +1 -0
- package/dist/core/banco/bloques.js +84 -0
- package/dist/core/banco/bloques.js.map +1 -0
- package/dist/core/banco/cargas.d.ts +84 -0
- package/dist/core/banco/cargas.d.ts.map +1 -0
- package/dist/core/banco/cargas.js +520 -0
- package/dist/core/banco/cargas.js.map +1 -0
- package/dist/core/banco/comparar.d.ts +29 -0
- package/dist/core/banco/comparar.d.ts.map +1 -0
- package/dist/core/banco/comparar.js +28 -0
- package/dist/core/banco/comparar.js.map +1 -0
- package/dist/core/banco/ejecutar.d.ts +44 -0
- package/dist/core/banco/ejecutar.d.ts.map +1 -0
- package/dist/core/banco/ejecutar.js +183 -0
- package/dist/core/banco/ejecutar.js.map +1 -0
- package/dist/core/banco/generar.d.ts +24 -0
- package/dist/core/banco/generar.d.ts.map +1 -0
- package/dist/core/banco/generar.js +159 -0
- package/dist/core/banco/generar.js.map +1 -0
- package/dist/core/banco/mutaciones.d.ts +25 -0
- package/dist/core/banco/mutaciones.d.ts.map +1 -0
- package/dist/core/banco/mutaciones.js +215 -0
- package/dist/core/banco/mutaciones.js.map +1 -0
- package/dist/core/banco/tipos.d.ts +121 -0
- package/dist/core/banco/tipos.d.ts.map +1 -0
- package/dist/core/banco/tipos.js +16 -0
- package/dist/core/banco/tipos.js.map +1 -0
- package/dist/core/blobs/almacen.d.ts +81 -0
- package/dist/core/blobs/almacen.d.ts.map +1 -0
- package/dist/core/blobs/almacen.js +198 -0
- package/dist/core/blobs/almacen.js.map +1 -0
- package/dist/core/blobs/broker.d.ts +103 -0
- package/dist/core/blobs/broker.d.ts.map +1 -0
- package/dist/core/blobs/broker.js +204 -0
- package/dist/core/blobs/broker.js.map +1 -0
- package/dist/core/blobs/index.d.ts +70 -0
- package/dist/core/blobs/index.d.ts.map +1 -0
- package/dist/core/blobs/index.js +232 -0
- package/dist/core/blobs/index.js.map +1 -0
- package/dist/core/blobs/payload.d.ts +55 -0
- package/dist/core/blobs/payload.d.ts.map +1 -0
- package/dist/core/blobs/payload.js +255 -0
- package/dist/core/blobs/payload.js.map +1 -0
- package/dist/core/blobs/proveedor.d.ts +85 -0
- package/dist/core/blobs/proveedor.d.ts.map +1 -0
- package/dist/core/blobs/proveedor.js +196 -0
- package/dist/core/blobs/proveedor.js.map +1 -0
- package/dist/core/browser/cdp.d.ts +41 -0
- package/dist/core/browser/cdp.d.ts.map +1 -0
- package/dist/core/browser/cdp.js +119 -0
- package/dist/core/browser/cdp.js.map +1 -0
- package/dist/core/browser/politica.d.ts +51 -0
- package/dist/core/browser/politica.d.ts.map +1 -0
- package/dist/core/browser/politica.js +123 -0
- package/dist/core/browser/politica.js.map +1 -0
- package/dist/core/browser/sesion.d.ts +52 -0
- package/dist/core/browser/sesion.d.ts.map +1 -0
- package/dist/core/browser/sesion.js +176 -0
- package/dist/core/browser/sesion.js.map +1 -0
- package/dist/core/browser/tools.d.ts +16 -0
- package/dist/core/browser/tools.d.ts.map +1 -0
- package/dist/core/browser/tools.js +279 -0
- package/dist/core/browser/tools.js.map +1 -0
- package/dist/core/commit/diff.d.ts +56 -0
- package/dist/core/commit/diff.d.ts.map +1 -0
- package/dist/core/commit/diff.js +145 -0
- package/dist/core/commit/diff.js.map +1 -0
- package/dist/core/commit/mensaje.d.ts +80 -0
- package/dist/core/commit/mensaje.d.ts.map +1 -0
- package/dist/core/commit/mensaje.js +207 -0
- package/dist/core/commit/mensaje.js.map +1 -0
- package/dist/core/compactar/index.d.ts +52 -0
- package/dist/core/compactar/index.d.ts.map +1 -0
- package/dist/core/compactar/index.js +91 -0
- package/dist/core/compactar/index.js.map +1 -0
- package/dist/core/compactar/registro-denso.d.ts +160 -0
- package/dist/core/compactar/registro-denso.d.ts.map +1 -0
- package/dist/core/compactar/registro-denso.js +620 -0
- package/dist/core/compactar/registro-denso.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +3 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +4 -3
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +41 -32
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/computer/captura.d.ts +35 -0
- package/dist/core/computer/captura.d.ts.map +1 -0
- package/dist/core/computer/captura.js +140 -0
- package/dist/core/computer/captura.js.map +1 -0
- package/dist/core/computer/driver.d.ts +130 -0
- package/dist/core/computer/driver.d.ts.map +1 -0
- package/dist/core/computer/driver.js +206 -0
- package/dist/core/computer/driver.js.map +1 -0
- package/dist/core/computer/motor/actions.d.ts +109 -0
- package/dist/core/computer/motor/actions.d.ts.map +1 -0
- package/dist/core/computer/motor/actions.js +157 -0
- package/dist/core/computer/motor/actions.js.map +1 -0
- package/dist/core/computer/motor/bridge.d.ts +232 -0
- package/dist/core/computer/motor/bridge.d.ts.map +1 -0
- package/dist/core/computer/motor/bridge.js +2335 -0
- package/dist/core/computer/motor/bridge.js.map +1 -0
- package/dist/core/computer/motor/cdp.d.ts +107 -0
- package/dist/core/computer/motor/cdp.d.ts.map +1 -0
- package/dist/core/computer/motor/cdp.js +659 -0
- package/dist/core/computer/motor/cdp.js.map +1 -0
- package/dist/core/computer/motor/config.d.ts +23 -0
- package/dist/core/computer/motor/config.d.ts.map +1 -0
- package/dist/core/computer/motor/config.js +100 -0
- package/dist/core/computer/motor/config.js.map +1 -0
- package/dist/core/computer/motor/contract.d.ts +81 -0
- package/dist/core/computer/motor/contract.d.ts.map +1 -0
- package/dist/core/computer/motor/contract.js +14 -0
- package/dist/core/computer/motor/contract.js.map +1 -0
- package/dist/core/computer/motor/note.d.ts +37 -0
- package/dist/core/computer/motor/note.d.ts.map +1 -0
- package/dist/core/computer/motor/note.js +162 -0
- package/dist/core/computer/motor/note.js.map +1 -0
- package/dist/core/computer/motor/outline.d.ts +155 -0
- package/dist/core/computer/motor/outline.d.ts.map +1 -0
- package/dist/core/computer/motor/outline.js +590 -0
- package/dist/core/computer/motor/outline.js.map +1 -0
- package/dist/core/computer/motor/output.d.ts +18 -0
- package/dist/core/computer/motor/output.d.ts.map +1 -0
- package/dist/core/computer/motor/output.js +148 -0
- package/dist/core/computer/motor/output.js.map +1 -0
- package/dist/core/computer/motor/permissions.d.ts +41 -0
- package/dist/core/computer/motor/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/permissions.js +51 -0
- package/dist/core/computer/motor/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
- package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/architecture.js +21 -0
- package/dist/core/computer/motor/platform/architecture.js.map +1 -0
- package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
- package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/coerce.js +17 -0
- package/dist/core/computer/motor/platform/coerce.js.map +1 -0
- package/dist/core/computer/motor/platform/index.d.ts +4 -0
- package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/index.js +79 -0
- package/dist/core/computer/motor/platform/index.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/backend.js +173 -0
- package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
- package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/linux/helper.js +261 -0
- package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/backend.js +124 -0
- package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
- package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/browser.js +101 -0
- package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
- package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/helper.js +277 -0
- package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
- package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
- package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
- package/dist/core/computer/motor/platform/types.d.ts +263 -0
- package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/types.js +2 -0
- package/dist/core/computer/motor/platform/types.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
- package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/backend.js +163 -0
- package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
- package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
- package/dist/core/computer/motor/platform/windows/helper.js +174 -0
- package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
- package/dist/core/computer/motor/root-selection.d.ts +6 -0
- package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
- package/dist/core/computer/motor/root-selection.js +28 -0
- package/dist/core/computer/motor/root-selection.js.map +1 -0
- package/dist/core/computer/motor/runtime.d.ts +50 -0
- package/dist/core/computer/motor/runtime.d.ts.map +1 -0
- package/dist/core/computer/motor/runtime.js +119 -0
- package/dist/core/computer/motor/runtime.js.map +1 -0
- package/dist/core/computer/motor/state.d.ts +68 -0
- package/dist/core/computer/motor/state.d.ts.map +1 -0
- package/dist/core/computer/motor/state.js +100 -0
- package/dist/core/computer/motor/state.js.map +1 -0
- package/dist/core/computer/motor/view.d.ts +6 -0
- package/dist/core/computer/motor/view.d.ts.map +1 -0
- package/dist/core/computer/motor/view.js +185 -0
- package/dist/core/computer/motor/view.js.map +1 -0
- package/dist/core/computer/motor-ada.d.ts +159 -0
- package/dist/core/computer/motor-ada.d.ts.map +1 -0
- package/dist/core/computer/motor-ada.js +412 -0
- package/dist/core/computer/motor-ada.js.map +1 -0
- package/dist/core/computer/politica.d.ts +56 -0
- package/dist/core/computer/politica.d.ts.map +1 -0
- package/dist/core/computer/politica.js +163 -0
- package/dist/core/computer/politica.js.map +1 -0
- package/dist/core/computer/tools.d.ts +26 -0
- package/dist/core/computer/tools.d.ts.map +1 -0
- package/dist/core/computer/tools.js +399 -0
- package/dist/core/computer/tools.js.map +1 -0
- package/dist/core/context-breakdown.d.ts +80 -0
- package/dist/core/context-breakdown.d.ts.map +1 -0
- package/dist/core/context-breakdown.js +87 -0
- package/dist/core/context-breakdown.js.map +1 -0
- package/dist/core/credenciales/cliente.d.ts +60 -0
- package/dist/core/credenciales/cliente.d.ts.map +1 -0
- package/dist/core/credenciales/cliente.js +81 -0
- package/dist/core/credenciales/cliente.js.map +1 -0
- package/dist/core/credenciales/pool.d.ts +96 -0
- package/dist/core/credenciales/pool.d.ts.map +1 -0
- package/dist/core/credenciales/pool.js +128 -0
- package/dist/core/credenciales/pool.js.map +1 -0
- package/dist/core/credenciales/reposo.d.ts +93 -0
- package/dist/core/credenciales/reposo.d.ts.map +1 -0
- package/dist/core/credenciales/reposo.js +489 -0
- package/dist/core/credenciales/reposo.js.map +1 -0
- package/dist/core/credenciales/servidor.d.ts +55 -0
- package/dist/core/credenciales/servidor.d.ts.map +1 -0
- package/dist/core/credenciales/servidor.js +205 -0
- package/dist/core/credenciales/servidor.js.map +1 -0
- package/dist/core/defaults.d.ts +1 -0
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/defaults.js +9 -0
- package/dist/core/defaults.js.map +1 -1
- package/dist/core/descubrimiento/comandos.d.ts +30 -0
- package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
- package/dist/core/descubrimiento/comandos.js +76 -0
- package/dist/core/descubrimiento/comandos.js.map +1 -0
- package/dist/core/descubrimiento/mcp.d.ts +42 -0
- package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
- package/dist/core/descubrimiento/mcp.js +130 -0
- package/dist/core/descubrimiento/mcp.js.map +1 -0
- package/dist/core/descubrimiento/reglas.d.ts +61 -0
- package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
- package/dist/core/descubrimiento/reglas.js +134 -0
- package/dist/core/descubrimiento/reglas.js.map +1 -0
- package/dist/core/descubrimiento/skills.d.ts +57 -0
- package/dist/core/descubrimiento/skills.d.ts.map +1 -0
- package/dist/core/descubrimiento/skills.js +113 -0
- package/dist/core/descubrimiento/skills.js.map +1 -0
- package/dist/core/dificultad/clasificador.d.ts +133 -0
- package/dist/core/dificultad/clasificador.d.ts.map +1 -0
- package/dist/core/dificultad/clasificador.js +288 -0
- package/dist/core/dificultad/clasificador.js.map +1 -0
- package/dist/core/edicion/diario.d.ts +37 -0
- package/dist/core/edicion/diario.d.ts.map +1 -0
- package/dist/core/edicion/diario.js +51 -0
- package/dist/core/edicion/diario.js.map +1 -0
- package/dist/core/edicion/hashline.d.ts +71 -0
- package/dist/core/edicion/hashline.d.ts.map +1 -0
- package/dist/core/edicion/hashline.js +111 -0
- package/dist/core/edicion/hashline.js.map +1 -0
- package/dist/core/edicion/hueco.d.ts +64 -0
- package/dist/core/edicion/hueco.d.ts.map +1 -0
- package/dist/core/edicion/hueco.js +162 -0
- package/dist/core/edicion/hueco.js.map +1 -0
- package/dist/core/edicion/limpiar-carga.d.ts +39 -0
- package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
- package/dist/core/edicion/limpiar-carga.js +121 -0
- package/dist/core/edicion/limpiar-carga.js.map +1 -0
- package/dist/core/edicion/observador.d.ts +80 -0
- package/dist/core/edicion/observador.d.ts.map +1 -0
- package/dist/core/edicion/observador.js +183 -0
- package/dist/core/edicion/observador.js.map +1 -0
- package/dist/core/edicion/parecido.d.ts +53 -0
- package/dist/core/edicion/parecido.d.ts.map +1 -0
- package/dist/core/edicion/parecido.js +145 -0
- package/dist/core/edicion/parecido.js.map +1 -0
- package/dist/core/edicion/parseo.d.ts +58 -0
- package/dist/core/edicion/parseo.d.ts.map +1 -0
- package/dist/core/edicion/parseo.js +124 -0
- package/dist/core/edicion/parseo.js.map +1 -0
- package/dist/core/edicion/reparacion.d.ts +67 -0
- package/dist/core/edicion/reparacion.d.ts.map +1 -0
- package/dist/core/edicion/reparacion.js +202 -0
- package/dist/core/edicion/reparacion.js.map +1 -0
- package/dist/core/edicion/sangria.d.ts +121 -0
- package/dist/core/edicion/sangria.d.ts.map +1 -0
- package/dist/core/edicion/sangria.js +341 -0
- package/dist/core/edicion/sangria.js.map +1 -0
- package/dist/core/edicion/tipos.d.ts +58 -0
- package/dist/core/edicion/tipos.d.ts.map +1 -0
- package/dist/core/edicion/tipos.js +160 -0
- package/dist/core/edicion/tipos.js.map +1 -0
- package/dist/core/engine-personality.d.ts +12 -0
- package/dist/core/engine-personality.d.ts.map +1 -0
- package/dist/core/engine-personality.js +53 -0
- package/dist/core/engine-personality.js.map +1 -0
- package/dist/core/errores/proveedor.d.ts +53 -0
- package/dist/core/errores/proveedor.d.ts.map +1 -0
- package/dist/core/errores/proveedor.js +191 -0
- package/dist/core/errores/proveedor.js.map +1 -0
- package/dist/core/estructural/buscar.d.ts +61 -0
- package/dist/core/estructural/buscar.d.ts.map +1 -0
- package/dist/core/estructural/buscar.js +261 -0
- package/dist/core/estructural/buscar.js.map +1 -0
- package/dist/core/estructural/editar.d.ts +36 -0
- package/dist/core/estructural/editar.d.ts.map +1 -0
- package/dist/core/estructural/editar.js +123 -0
- package/dist/core/estructural/editar.js.map +1 -0
- package/dist/core/estructural/tools.d.ts +11 -0
- package/dist/core/estructural/tools.d.ts.map +1 -0
- package/dist/core/estructural/tools.js +100 -0
- package/dist/core/estructural/tools.js.map +1 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +10 -1
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensiones/suplantacion.d.ts +49 -0
- package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
- package/dist/core/extensiones/suplantacion.js +61 -0
- package/dist/core/extensiones/suplantacion.js.map +1 -0
- package/dist/core/extensiones/vigilancia.d.ts +54 -0
- package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
- package/dist/core/extensiones/vigilancia.js +217 -0
- package/dist/core/extensiones/vigilancia.js.map +1 -0
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +21 -6
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +23 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
- package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
- package/dist/core/harness/fuentes-de-contexto.js +44 -0
- package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
- package/dist/core/harness/refine.d.ts +40 -0
- package/dist/core/harness/refine.d.ts.map +1 -0
- package/dist/core/harness/refine.js +109 -0
- package/dist/core/harness/refine.js.map +1 -0
- package/dist/core/harness/store.d.ts +75 -0
- package/dist/core/harness/store.d.ts.map +1 -0
- package/dist/core/harness/store.js +149 -0
- package/dist/core/harness/store.js.map +1 -0
- package/dist/core/hooks/contract.d.ts +85 -0
- package/dist/core/hooks/contract.d.ts.map +1 -0
- package/dist/core/hooks/contract.js +140 -0
- package/dist/core/hooks/contract.js.map +1 -0
- package/dist/core/hooks/runner.d.ts +42 -0
- package/dist/core/hooks/runner.d.ts.map +1 -0
- package/dist/core/hooks/runner.js +85 -0
- package/dist/core/hooks/runner.js.map +1 -0
- package/dist/core/hooks/session-hooks.d.ts +62 -0
- package/dist/core/hooks/session-hooks.d.ts.map +1 -0
- package/dist/core/hooks/session-hooks.js +84 -0
- package/dist/core/hooks/session-hooks.js.map +1 -0
- package/dist/core/importar/formatos.d.ts +69 -0
- package/dist/core/importar/formatos.d.ts.map +1 -0
- package/dist/core/importar/formatos.js +235 -0
- package/dist/core/importar/formatos.js.map +1 -0
- package/dist/core/interactivo/deteccion.d.ts +44 -0
- package/dist/core/interactivo/deteccion.d.ts.map +1 -0
- package/dist/core/interactivo/deteccion.js +82 -0
- package/dist/core/interactivo/deteccion.js.map +1 -0
- package/dist/core/interactivo/sesion.d.ts +50 -0
- package/dist/core/interactivo/sesion.d.ts.map +1 -0
- package/dist/core/interactivo/sesion.js +156 -0
- package/dist/core/interactivo/sesion.js.map +1 -0
- package/dist/core/interactivo/tools.d.ts +21 -0
- package/dist/core/interactivo/tools.d.ts.map +1 -0
- package/dist/core/interactivo/tools.js +122 -0
- package/dist/core/interactivo/tools.js.map +1 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/lectura/mapa.d.ts +70 -0
- package/dist/core/lectura/mapa.d.ts.map +1 -0
- package/dist/core/lectura/mapa.js +177 -0
- package/dist/core/lectura/mapa.js.map +1 -0
- package/dist/core/lectura/pdf.d.ts +49 -0
- package/dist/core/lectura/pdf.d.ts.map +1 -0
- package/dist/core/lectura/pdf.js +337 -0
- package/dist/core/lectura/pdf.js.map +1 -0
- package/dist/core/limpieza/comprobadores.d.ts +28 -0
- package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
- package/dist/core/limpieza/comprobadores.js +311 -0
- package/dist/core/limpieza/comprobadores.js.map +1 -0
- package/dist/core/limpieza/parseo.d.ts +19 -0
- package/dist/core/limpieza/parseo.d.ts.map +1 -0
- package/dist/core/limpieza/parseo.js +124 -0
- package/dist/core/limpieza/parseo.js.map +1 -0
- package/dist/core/limpieza/reparacion.d.ts +77 -0
- package/dist/core/limpieza/reparacion.d.ts.map +1 -0
- package/dist/core/limpieza/reparacion.js +254 -0
- package/dist/core/limpieza/reparacion.js.map +1 -0
- package/dist/core/limpieza/tipos.d.ts +56 -0
- package/dist/core/limpieza/tipos.d.ts.map +1 -0
- package/dist/core/limpieza/tipos.js +9 -0
- package/dist/core/limpieza/tipos.js.map +1 -0
- package/dist/core/lsp/cliente.d.ts +52 -0
- package/dist/core/lsp/cliente.d.ts.map +1 -0
- package/dist/core/lsp/cliente.js +232 -0
- package/dist/core/lsp/cliente.js.map +1 -0
- package/dist/core/lsp/descubrimiento.d.ts +62 -0
- package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
- package/dist/core/lsp/descubrimiento.js +152 -0
- package/dist/core/lsp/descubrimiento.js.map +1 -0
- package/dist/core/lsp/ediciones.d.ts +59 -0
- package/dist/core/lsp/ediciones.d.ts.map +1 -0
- package/dist/core/lsp/ediciones.js +89 -0
- package/dist/core/lsp/ediciones.js.map +1 -0
- package/dist/core/lsp/extension.d.ts +28 -0
- package/dist/core/lsp/extension.d.ts.map +1 -0
- package/dist/core/lsp/extension.js +34 -0
- package/dist/core/lsp/extension.js.map +1 -0
- package/dist/core/lsp/tools.d.ts +45 -0
- package/dist/core/lsp/tools.d.ts.map +1 -0
- package/dist/core/lsp/tools.js +265 -0
- package/dist/core/lsp/tools.js.map +1 -0
- package/dist/core/mcp/client.d.ts +60 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +139 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/manager.d.ts +86 -0
- package/dist/core/mcp/manager.d.ts.map +1 -0
- package/dist/core/mcp/manager.js +124 -0
- package/dist/core/mcp/manager.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +15 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +84 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/memory-engine/audit-export.d.ts +56 -0
- package/dist/core/memory-engine/audit-export.d.ts.map +1 -0
- package/dist/core/memory-engine/audit-export.js +100 -0
- package/dist/core/memory-engine/audit-export.js.map +1 -0
- package/dist/core/memory-engine/audit-indice.d.ts +153 -0
- package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
- package/dist/core/memory-engine/audit-indice.js +271 -0
- package/dist/core/memory-engine/audit-indice.js.map +1 -0
- package/dist/core/memory-engine/audit.d.ts +18 -6
- package/dist/core/memory-engine/audit.d.ts.map +1 -1
- package/dist/core/memory-engine/audit.js +32 -50
- package/dist/core/memory-engine/audit.js.map +1 -1
- package/dist/core/memory-engine/engine.d.ts +21 -4
- package/dist/core/memory-engine/engine.d.ts.map +1 -1
- package/dist/core/memory-engine/engine.js +219 -55
- package/dist/core/memory-engine/engine.js.map +1 -1
- package/dist/core/memory-engine/inverted-index.d.ts.map +1 -1
- package/dist/core/memory-engine/inverted-index.js +67 -10
- package/dist/core/memory-engine/inverted-index.js.map +1 -1
- package/dist/core/memory-engine/keychain.d.ts.map +1 -1
- package/dist/core/memory-engine/keychain.js +1 -6
- package/dist/core/memory-engine/keychain.js.map +1 -1
- package/dist/core/memory-engine/observation-store.d.ts +0 -1
- package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
- package/dist/core/memory-engine/observation-store.js +40 -12
- package/dist/core/memory-engine/observation-store.js.map +1 -1
- package/dist/core/memory-engine/refinements.d.ts +51 -0
- package/dist/core/memory-engine/refinements.d.ts.map +1 -0
- package/dist/core/memory-engine/refinements.js +99 -0
- package/dist/core/memory-engine/refinements.js.map +1 -0
- package/dist/core/memory-engine/scanner.d.ts.map +1 -1
- package/dist/core/memory-engine/scanner.js +25 -5
- package/dist/core/memory-engine/scanner.js.map +1 -1
- package/dist/core/memory-engine/security.d.ts.map +1 -1
- package/dist/core/memory-engine/security.js +131 -23
- package/dist/core/memory-engine/security.js.map +1 -1
- package/dist/core/memory-engine/session-indexer.d.ts.map +1 -1
- package/dist/core/memory-engine/session-indexer.js +8 -2
- package/dist/core/memory-engine/session-indexer.js.map +1 -1
- package/dist/core/memory-engine/tools.d.ts +2 -2
- package/dist/core/memory-engine/tools.d.ts.map +1 -1
- package/dist/core/memory-engine/tools.js +41 -8
- package/dist/core/memory-engine/tools.js.map +1 -1
- package/dist/core/memory-engine/types.d.ts +2 -0
- package/dist/core/memory-engine/types.d.ts.map +1 -1
- package/dist/core/memory-engine/types.js.map +1 -1
- package/dist/core/memory-engine/vault.d.ts.map +1 -1
- package/dist/core/memory-engine/vault.js +2 -2
- package/dist/core/memory-engine/vault.js.map +1 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +2 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +19 -7
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js +2 -1
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/muestreo-restringido.d.ts +49 -0
- package/dist/core/muestreo-restringido.d.ts.map +1 -0
- package/dist/core/muestreo-restringido.js +65 -0
- package/dist/core/muestreo-restringido.js.map +1 -0
- package/dist/core/orphan-process-journal.d.ts +48 -0
- package/dist/core/orphan-process-journal.d.ts.map +1 -0
- package/dist/core/orphan-process-journal.js +116 -0
- package/dist/core/orphan-process-journal.js.map +1 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +11 -6
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-manifest.d.ts.map +1 -1
- package/dist/core/pi-manifest.js +2 -1
- package/dist/core/pi-manifest.js.map +1 -1
- package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
- package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
- package/dist/core/privacidad/categorias-especiales.js +745 -0
- package/dist/core/privacidad/categorias-especiales.js.map +1 -0
- package/dist/core/privacidad/tapar.d.ts +48 -0
- package/dist/core/privacidad/tapar.d.ts.map +1 -0
- package/dist/core/privacidad/tapar.js +66 -0
- package/dist/core/privacidad/tapar.js.map +1 -0
- package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
- package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
- package/dist/core/prompt-cache/diagnostics.js +100 -0
- package/dist/core/prompt-cache/diagnostics.js.map +1 -0
- package/dist/core/prompt-cache/index.d.ts +33 -0
- package/dist/core/prompt-cache/index.d.ts.map +1 -0
- package/dist/core/prompt-cache/index.js +189 -0
- package/dist/core/prompt-cache/index.js.map +1 -0
- package/dist/core/prompt-cache/payload.d.ts +58 -0
- package/dist/core/prompt-cache/payload.d.ts.map +1 -0
- package/dist/core/prompt-cache/payload.js +122 -0
- package/dist/core/prompt-cache/payload.js.map +1 -0
- package/dist/core/prompt-cache/stabilize.d.ts +65 -0
- package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
- package/dist/core/prompt-cache/stabilize.js +137 -0
- package/dist/core/prompt-cache/stabilize.js.map +1 -0
- package/dist/core/prompt-cache/stats.d.ts +55 -0
- package/dist/core/prompt-cache/stats.d.ts.map +1 -0
- package/dist/core/prompt-cache/stats.js +158 -0
- package/dist/core/prompt-cache/stats.js.map +1 -0
- package/dist/core/prompt-eleccion.d.ts +38 -0
- package/dist/core/prompt-eleccion.d.ts.map +1 -0
- package/dist/core/prompt-eleccion.js +46 -0
- package/dist/core/prompt-eleccion.js.map +1 -0
- package/dist/core/prompt-optimizer.d.ts +53 -0
- package/dist/core/prompt-optimizer.d.ts.map +1 -0
- package/dist/core/prompt-optimizer.js +138 -0
- package/dist/core/prompt-optimizer.js.map +1 -0
- package/dist/core/prompts/montar.d.ts +75 -0
- package/dist/core/prompts/montar.d.ts.map +1 -0
- package/dist/core/prompts/montar.js +146 -0
- package/dist/core/prompts/montar.js.map +1 -0
- package/dist/core/prompts/plantilla.d.ts +54 -0
- package/dist/core/prompts/plantilla.d.ts.map +1 -0
- package/dist/core/prompts/plantilla.js +153 -0
- package/dist/core/prompts/plantilla.js.map +1 -0
- package/dist/core/prompts/sistema.md +134 -0
- package/dist/core/provider-attribution.d.ts +24 -2
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js +24 -42
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +2 -1
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/remoto/destino.d.ts +38 -0
- package/dist/core/remoto/destino.d.ts.map +1 -0
- package/dist/core/remoto/destino.js +105 -0
- package/dist/core/remoto/destino.js.map +1 -0
- package/dist/core/remoto/ejecutor.d.ts +59 -0
- package/dist/core/remoto/ejecutor.d.ts.map +1 -0
- package/dist/core/remoto/ejecutor.js +225 -0
- package/dist/core/remoto/ejecutor.js.map +1 -0
- package/dist/core/remoto/ficheros.d.ts +29 -0
- package/dist/core/remoto/ficheros.d.ts.map +1 -0
- package/dist/core/remoto/ficheros.js +90 -0
- package/dist/core/remoto/ficheros.js.map +1 -0
- package/dist/core/remoto/registro-extension.d.ts +15 -0
- package/dist/core/remoto/registro-extension.d.ts.map +1 -0
- package/dist/core/remoto/registro-extension.js +17 -0
- package/dist/core/remoto/registro-extension.js.map +1 -0
- package/dist/core/remoto/tools.d.ts +28 -0
- package/dist/core/remoto/tools.d.ts.map +1 -0
- package/dist/core/remoto/tools.js +31 -0
- package/dist/core/remoto/tools.js.map +1 -0
- package/dist/core/resource-loader.d.ts +58 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +326 -8
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/revision/hallazgo.d.ts +51 -0
- package/dist/core/revision/hallazgo.d.ts.map +1 -0
- package/dist/core/revision/hallazgo.js +73 -0
- package/dist/core/revision/hallazgo.js.map +1 -0
- package/dist/core/revision/revisor.d.ts +81 -0
- package/dist/core/revision/revisor.d.ts.map +1 -0
- package/dist/core/revision/revisor.js +132 -0
- package/dist/core/revision/revisor.js.map +1 -0
- package/dist/core/revision/sarif.d.ts +30 -0
- package/dist/core/revision/sarif.d.ts.map +1 -0
- package/dist/core/revision/sarif.js +83 -0
- package/dist/core/revision/sarif.js.map +1 -0
- package/dist/core/scheduler/scheduler.d.ts +87 -0
- package/dist/core/scheduler/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler/scheduler.js +178 -0
- package/dist/core/scheduler/scheduler.js.map +1 -0
- package/dist/core/sdk.d.ts +8 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +11 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
- package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +2 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-diagnostics.d.ts +9 -0
- package/dist/core/settings-diagnostics.d.ts.map +1 -0
- package/dist/core/settings-diagnostics.js +21 -0
- package/dist/core/settings-diagnostics.js.map +1 -0
- package/dist/core/settings-manager.d.ts +156 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +255 -10
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +51 -33
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +2 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts +17 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +13 -5
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetria/otlp.d.ts +122 -0
- package/dist/core/telemetria/otlp.d.ts.map +1 -0
- package/dist/core/telemetria/otlp.js +373 -0
- package/dist/core/telemetria/otlp.js.map +1 -0
- package/dist/core/tools/coercion-argumentos.d.ts +48 -0
- package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
- package/dist/core/tools/coercion-argumentos.js +99 -0
- package/dist/core/tools/coercion-argumentos.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +0 -12
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +234 -12
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +28 -5
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +5 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +2 -2
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/json-tolerante.d.ts +30 -0
- package/dist/core/tools/json-tolerante.d.ts.map +1 -0
- package/dist/core/tools/json-tolerante.js +70 -0
- package/dist/core/tools/json-tolerante.js.map +1 -0
- package/dist/core/tools/project-memory-tool.d.ts.map +1 -1
- package/dist/core/tools/project-memory-tool.js +4 -1
- package/dist/core/tools/project-memory-tool.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +17 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +17 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +2 -1
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/turno-vacio/detectar.d.ts +38 -0
- package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
- package/dist/core/turno-vacio/detectar.js +66 -0
- package/dist/core/turno-vacio/detectar.js.map +1 -0
- package/dist/core/undo/journal.d.ts +57 -0
- package/dist/core/undo/journal.d.ts.map +1 -0
- package/dist/core/undo/journal.js +178 -0
- package/dist/core/undo/journal.js.map +1 -0
- package/dist/core/urls-internas/auditoria.d.ts +10 -0
- package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
- package/dist/core/urls-internas/auditoria.js +42 -0
- package/dist/core/urls-internas/auditoria.js.map +1 -0
- package/dist/core/urls-internas/boveda.d.ts +13 -0
- package/dist/core/urls-internas/boveda.d.ts.map +1 -0
- package/dist/core/urls-internas/boveda.js +40 -0
- package/dist/core/urls-internas/boveda.js.map +1 -0
- package/dist/core/urls-internas/lector.d.ts +30 -0
- package/dist/core/urls-internas/lector.d.ts.map +1 -0
- package/dist/core/urls-internas/lector.js +56 -0
- package/dist/core/urls-internas/lector.js.map +1 -0
- package/dist/core/urls-internas/memoria.d.ts +11 -0
- package/dist/core/urls-internas/memoria.d.ts.map +1 -0
- package/dist/core/urls-internas/memoria.js +25 -0
- package/dist/core/urls-internas/memoria.js.map +1 -0
- package/dist/core/urls-internas/parse.d.ts +28 -0
- package/dist/core/urls-internas/parse.d.ts.map +1 -0
- package/dist/core/urls-internas/parse.js +32 -0
- package/dist/core/urls-internas/parse.js.map +1 -0
- package/dist/core/urls-internas/reglas.d.ts +10 -0
- package/dist/core/urls-internas/reglas.d.ts.map +1 -0
- package/dist/core/urls-internas/reglas.js +31 -0
- package/dist/core/urls-internas/reglas.js.map +1 -0
- package/dist/core/usage/aggregate.d.ts +68 -0
- package/dist/core/usage/aggregate.d.ts.map +1 -0
- package/dist/core/usage/aggregate.js +93 -0
- package/dist/core/usage/aggregate.js.map +1 -0
- package/dist/core/usage/cuota/anthropic.d.ts +10 -0
- package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
- package/dist/core/usage/cuota/anthropic.js +63 -0
- package/dist/core/usage/cuota/anthropic.js.map +1 -0
- package/dist/core/usage/cuota/cache.d.ts +20 -0
- package/dist/core/usage/cuota/cache.d.ts.map +1 -0
- package/dist/core/usage/cuota/cache.js +36 -0
- package/dist/core/usage/cuota/cache.js.map +1 -0
- package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
- package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
- package/dist/core/usage/cuota/github-copilot.js +67 -0
- package/dist/core/usage/cuota/github-copilot.js.map +1 -0
- package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
- package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
- package/dist/core/usage/cuota/google-gemini.js +72 -0
- package/dist/core/usage/cuota/google-gemini.js.map +1 -0
- package/dist/core/usage/cuota/index.d.ts +25 -0
- package/dist/core/usage/cuota/index.d.ts.map +1 -0
- package/dist/core/usage/cuota/index.js +50 -0
- package/dist/core/usage/cuota/index.js.map +1 -0
- package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
- package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
- package/dist/core/usage/cuota/openai-codex.js +59 -0
- package/dist/core/usage/cuota/openai-codex.js.map +1 -0
- package/dist/core/usage/cuota/openrouter.d.ts +10 -0
- package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
- package/dist/core/usage/cuota/openrouter.js +47 -0
- package/dist/core/usage/cuota/openrouter.js.map +1 -0
- package/dist/core/usage/cuota/tipos.d.ts +50 -0
- package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
- package/dist/core/usage/cuota/tipos.js +25 -0
- package/dist/core/usage/cuota/tipos.js.map +1 -0
- package/dist/core/web/busqueda-nativa.d.ts +82 -0
- package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
- package/dist/core/web/busqueda-nativa.js +163 -0
- package/dist/core/web/busqueda-nativa.js.map +1 -0
- package/dist/core/web/destino.d.ts +58 -0
- package/dist/core/web/destino.d.ts.map +1 -0
- package/dist/core/web/destino.js +127 -0
- package/dist/core/web/destino.js.map +1 -0
- package/dist/core/web/proveedores/brave.d.ts +6 -0
- package/dist/core/web/proveedores/brave.d.ts.map +1 -0
- package/dist/core/web/proveedores/brave.js +20 -0
- package/dist/core/web/proveedores/brave.js.map +1 -0
- package/dist/core/web/proveedores/claves.d.ts +19 -0
- package/dist/core/web/proveedores/claves.d.ts.map +1 -0
- package/dist/core/web/proveedores/claves.js +36 -0
- package/dist/core/web/proveedores/claves.js.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
- package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
- package/dist/core/web/proveedores/duckduckgo.js +109 -0
- package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
- package/dist/core/web/proveedores/ecosia.d.ts +3 -0
- package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
- package/dist/core/web/proveedores/ecosia.js +72 -0
- package/dist/core/web/proveedores/ecosia.js.map +1 -0
- package/dist/core/web/proveedores/exa.d.ts +6 -0
- package/dist/core/web/proveedores/exa.d.ts.map +1 -0
- package/dist/core/web/proveedores/exa.js +24 -0
- package/dist/core/web/proveedores/exa.js.map +1 -0
- package/dist/core/web/proveedores/mojeek.d.ts +3 -0
- package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
- package/dist/core/web/proveedores/mojeek.js +65 -0
- package/dist/core/web/proveedores/mojeek.js.map +1 -0
- package/dist/core/web/proveedores/navegador.d.ts +10 -0
- package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
- package/dist/core/web/proveedores/navegador.js +13 -0
- package/dist/core/web/proveedores/navegador.js.map +1 -0
- package/dist/core/web/proveedores/registro.d.ts +43 -0
- package/dist/core/web/proveedores/registro.d.ts.map +1 -0
- package/dist/core/web/proveedores/registro.js +49 -0
- package/dist/core/web/proveedores/registro.js.map +1 -0
- package/dist/core/web/proveedores/searxng.d.ts +9 -0
- package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
- package/dist/core/web/proveedores/searxng.js +17 -0
- package/dist/core/web/proveedores/searxng.js.map +1 -0
- package/dist/core/web/proveedores/serper.d.ts +9 -0
- package/dist/core/web/proveedores/serper.d.ts.map +1 -0
- package/dist/core/web/proveedores/serper.js +19 -0
- package/dist/core/web/proveedores/serper.js.map +1 -0
- package/dist/core/web/proveedores/tavily.d.ts +6 -0
- package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
- package/dist/core/web/proveedores/tavily.js +19 -0
- package/dist/core/web/proveedores/tavily.js.map +1 -0
- package/dist/core/web/proveedores/tipos.d.ts +36 -0
- package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
- package/dist/core/web/proveedores/tipos.js +10 -0
- package/dist/core/web/proveedores/tipos.js.map +1 -0
- package/dist/core/web/registro-red.d.ts +43 -0
- package/dist/core/web/registro-red.d.ts.map +1 -0
- package/dist/core/web/registro-red.js +86 -0
- package/dist/core/web/registro-red.js.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
- package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
- package/dist/core/web/scrapers/cisa-kev.js +38 -0
- package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
- package/dist/core/web/scrapers/crates-io.d.ts +11 -0
- package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
- package/dist/core/web/scrapers/crates-io.js +29 -0
- package/dist/core/web/scrapers/crates-io.js.map +1 -0
- package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
- package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
- package/dist/core/web/scrapers/docs-rs.js +35 -0
- package/dist/core/web/scrapers/docs-rs.js.map +1 -0
- package/dist/core/web/scrapers/github.d.ts +3 -0
- package/dist/core/web/scrapers/github.d.ts.map +1 -0
- package/dist/core/web/scrapers/github.js +72 -0
- package/dist/core/web/scrapers/github.js.map +1 -0
- package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
- package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
- package/dist/core/web/scrapers/go-pkg.js +30 -0
- package/dist/core/web/scrapers/go-pkg.js.map +1 -0
- package/dist/core/web/scrapers/hex.d.ts +6 -0
- package/dist/core/web/scrapers/hex.d.ts.map +1 -0
- package/dist/core/web/scrapers/hex.js +27 -0
- package/dist/core/web/scrapers/hex.js.map +1 -0
- package/dist/core/web/scrapers/maven.d.ts +8 -0
- package/dist/core/web/scrapers/maven.d.ts.map +1 -0
- package/dist/core/web/scrapers/maven.js +41 -0
- package/dist/core/web/scrapers/maven.js.map +1 -0
- package/dist/core/web/scrapers/mdn.d.ts +6 -0
- package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
- package/dist/core/web/scrapers/mdn.js +28 -0
- package/dist/core/web/scrapers/mdn.js.map +1 -0
- package/dist/core/web/scrapers/npm.d.ts +11 -0
- package/dist/core/web/scrapers/npm.d.ts.map +1 -0
- package/dist/core/web/scrapers/npm.js +57 -0
- package/dist/core/web/scrapers/npm.js.map +1 -0
- package/dist/core/web/scrapers/nuget.d.ts +8 -0
- package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
- package/dist/core/web/scrapers/nuget.js +22 -0
- package/dist/core/web/scrapers/nuget.js.map +1 -0
- package/dist/core/web/scrapers/nvd.d.ts +7 -0
- package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
- package/dist/core/web/scrapers/nvd.js +37 -0
- package/dist/core/web/scrapers/nvd.js.map +1 -0
- package/dist/core/web/scrapers/pypi.d.ts +6 -0
- package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
- package/dist/core/web/scrapers/pypi.js +31 -0
- package/dist/core/web/scrapers/pypi.js.map +1 -0
- package/dist/core/web/scrapers/registro.d.ts +13 -0
- package/dist/core/web/scrapers/registro.d.ts.map +1 -0
- package/dist/core/web/scrapers/registro.js +65 -0
- package/dist/core/web/scrapers/registro.js.map +1 -0
- package/dist/core/web/scrapers/rubygems.d.ts +6 -0
- package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
- package/dist/core/web/scrapers/rubygems.js +23 -0
- package/dist/core/web/scrapers/rubygems.js.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
- package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
- package/dist/core/web/scrapers/stackoverflow.js +46 -0
- package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
- package/dist/core/web/scrapers/tipos.d.ts +42 -0
- package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
- package/dist/core/web/scrapers/tipos.js +23 -0
- package/dist/core/web/scrapers/tipos.js.map +1 -0
- package/dist/core/web/texto.d.ts +10 -0
- package/dist/core/web/texto.d.ts.map +1 -0
- package/dist/core/web/texto.js +26 -0
- package/dist/core/web/texto.js.map +1 -0
- package/dist/core/web/tools.d.ts +91 -0
- package/dist/core/web/tools.d.ts.map +1 -0
- package/dist/core/web/tools.js +304 -0
- package/dist/core/web/tools.js.map +1 -0
- package/dist/core/wiki/almacen.d.ts +33 -0
- package/dist/core/wiki/almacen.d.ts.map +1 -0
- package/dist/core/wiki/almacen.js +93 -0
- package/dist/core/wiki/almacen.js.map +1 -0
- package/dist/core/wiki/citas.d.ts +111 -0
- package/dist/core/wiki/citas.d.ts.map +1 -0
- package/dist/core/wiki/citas.js +146 -0
- package/dist/core/wiki/citas.js.map +1 -0
- package/dist/core/workflows/agent-runner.d.ts +88 -0
- package/dist/core/workflows/agent-runner.d.ts.map +1 -0
- package/dist/core/workflows/agent-runner.js +312 -0
- package/dist/core/workflows/agent-runner.js.map +1 -0
- package/dist/core/workflows/builtins.d.ts +41 -0
- package/dist/core/workflows/builtins.d.ts.map +1 -0
- package/dist/core/workflows/builtins.js +283 -0
- package/dist/core/workflows/builtins.js.map +1 -0
- package/dist/core/workflows/contrato/esquema.d.ts +32 -0
- package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
- package/dist/core/workflows/contrato/esquema.js +25 -0
- package/dist/core/workflows/contrato/esquema.js.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
- package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
- package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
- package/dist/core/workflows/contrato/validador.d.ts +30 -0
- package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
- package/dist/core/workflows/contrato/validador.js +56 -0
- package/dist/core/workflows/contrato/validador.js.map +1 -0
- package/dist/core/workflows/contrato/yield.d.ts +65 -0
- package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
- package/dist/core/workflows/contrato/yield.js +80 -0
- package/dist/core/workflows/contrato/yield.js.map +1 -0
- package/dist/core/workflows/goal-engine/engine.d.ts +151 -0
- package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/engine.js +503 -0
- package/dist/core/workflows/goal-engine/engine.js.map +1 -0
- package/dist/core/workflows/goal-engine/errors.d.ts +7 -0
- package/dist/core/workflows/goal-engine/errors.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/errors.js +9 -0
- package/dist/core/workflows/goal-engine/errors.js.map +1 -0
- package/dist/core/workflows/goal-engine/index.d.ts +13 -0
- package/dist/core/workflows/goal-engine/index.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/index.js +8 -0
- package/dist/core/workflows/goal-engine/index.js.map +1 -0
- package/dist/core/workflows/goal-engine/persistence.d.ts +31 -0
- package/dist/core/workflows/goal-engine/persistence.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/persistence.js +145 -0
- package/dist/core/workflows/goal-engine/persistence.js.map +1 -0
- package/dist/core/workflows/goal-engine/prompts.d.ts +37 -0
- package/dist/core/workflows/goal-engine/prompts.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/prompts.js +131 -0
- package/dist/core/workflows/goal-engine/prompts.js.map +1 -0
- package/dist/core/workflows/goal-engine/state.d.ts +41 -0
- package/dist/core/workflows/goal-engine/state.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/state.js +397 -0
- package/dist/core/workflows/goal-engine/state.js.map +1 -0
- package/dist/core/workflows/goal-engine/tools.d.ts +31 -0
- package/dist/core/workflows/goal-engine/tools.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/tools.js +211 -0
- package/dist/core/workflows/goal-engine/tools.js.map +1 -0
- package/dist/core/workflows/goal-engine/types.d.ts +286 -0
- package/dist/core/workflows/goal-engine/types.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/types.js +17 -0
- package/dist/core/workflows/goal-engine/types.js.map +1 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts +23 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts.map +1 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.js +72 -0
- package/dist/core/workflows/goal-engine/worktree-fingerprint.js.map +1 -0
- package/dist/core/workflows/graph-sync.d.ts +67 -0
- package/dist/core/workflows/graph-sync.d.ts.map +1 -0
- package/dist/core/workflows/graph-sync.js +188 -0
- package/dist/core/workflows/graph-sync.js.map +1 -0
- package/dist/core/workflows/graph.d.ts +143 -0
- package/dist/core/workflows/graph.d.ts.map +1 -0
- package/dist/core/workflows/graph.js +319 -0
- package/dist/core/workflows/graph.js.map +1 -0
- package/dist/core/workflows/index.d.ts +26 -0
- package/dist/core/workflows/index.d.ts.map +1 -0
- package/dist/core/workflows/index.js +18 -0
- package/dist/core/workflows/index.js.map +1 -0
- package/dist/core/workflows/journal.d.ts +68 -0
- package/dist/core/workflows/journal.d.ts.map +1 -0
- package/dist/core/workflows/journal.js +83 -0
- package/dist/core/workflows/journal.js.map +1 -0
- package/dist/core/workflows/manager.d.ts +122 -0
- package/dist/core/workflows/manager.d.ts.map +1 -0
- package/dist/core/workflows/manager.js +351 -0
- package/dist/core/workflows/manager.js.map +1 -0
- package/dist/core/workflows/resolve-script.d.ts +35 -0
- package/dist/core/workflows/resolve-script.d.ts.map +1 -0
- package/dist/core/workflows/resolve-script.js +66 -0
- package/dist/core/workflows/resolve-script.js.map +1 -0
- package/dist/core/workflows/runtime.d.ts +62 -0
- package/dist/core/workflows/runtime.d.ts.map +1 -0
- package/dist/core/workflows/runtime.js +380 -0
- package/dist/core/workflows/runtime.js.map +1 -0
- package/dist/core/workflows/save-as-skill.d.ts +27 -0
- package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
- package/dist/core/workflows/save-as-skill.js +54 -0
- package/dist/core/workflows/save-as-skill.js.map +1 -0
- package/dist/core/workflows/shared-store.d.ts +31 -0
- package/dist/core/workflows/shared-store.d.ts.map +1 -0
- package/dist/core/workflows/shared-store.js +80 -0
- package/dist/core/workflows/shared-store.js.map +1 -0
- package/dist/core/workflows/subagent-host.d.ts +50 -0
- package/dist/core/workflows/subagent-host.d.ts.map +1 -0
- package/dist/core/workflows/subagent-host.js +225 -0
- package/dist/core/workflows/subagent-host.js.map +1 -0
- package/dist/core/workflows/tool-workflow.d.ts +22 -0
- package/dist/core/workflows/tool-workflow.d.ts.map +1 -0
- package/dist/core/workflows/tool-workflow.js +120 -0
- package/dist/core/workflows/tool-workflow.js.map +1 -0
- package/dist/core/workflows/types.d.ts +191 -0
- package/dist/core/workflows/types.d.ts.map +1 -0
- package/dist/core/workflows/types.js +26 -0
- package/dist/core/workflows/types.js.map +1 -0
- package/dist/core/workflows/worktree.d.ts +42 -0
- package/dist/core/workflows/worktree.d.ts.map +1 -0
- package/dist/core/workflows/worktree.js +107 -0
- package/dist/core/workflows/worktree.js.map +1 -0
- package/dist/extensions/llama/index.d.ts.map +1 -1
- package/dist/extensions/llama/index.js +2 -0
- package/dist/extensions/llama/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +6 -2
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/remoto/index.d.ts +22 -0
- package/dist/extensions/remoto/index.d.ts.map +1 -0
- package/dist/extensions/remoto/index.js +54 -0
- package/dist/extensions/remoto/index.js.map +1 -0
- package/dist/index.d.ts +1 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -13
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +4 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +26 -15
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +4 -3
- package/dist/migrations.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts +42 -0
- package/dist/modes/acp/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp/acp-mode.js +190 -0
- package/dist/modes/acp/acp-mode.js.map +1 -0
- package/dist/modes/acp/events.d.ts +74 -0
- package/dist/modes/acp/events.d.ts.map +1 -0
- package/dist/modes/acp/events.js +116 -0
- package/dist/modes/acp/events.js.map +1 -0
- package/dist/modes/interactive/components/home-screen.d.ts.map +1 -1
- package/dist/modes/interactive/components/home-screen.js +2 -2
- package/dist/modes/interactive/components/home-screen.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +9 -3
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +56 -12
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/prompt-optimization.d.ts +16 -0
- package/dist/modes/interactive/components/prompt-optimization.d.ts.map +1 -0
- package/dist/modes/interactive/components/prompt-optimization.js +46 -0
- package/dist/modes/interactive/components/prompt-optimization.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +19 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +180 -56
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-submenu.js +165 -0
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +74 -17
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +2 -1
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +21 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +709 -75
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +4 -3
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +16 -13
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +20 -6
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +11 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +173 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +29 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +27 -5
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/server/attach.d.ts +56 -0
- package/dist/server/attach.d.ts.map +1 -0
- package/dist/server/attach.js +130 -0
- package/dist/server/attach.js.map +1 -0
- package/dist/server/extension-ops.d.ts +40 -0
- package/dist/server/extension-ops.d.ts.map +1 -0
- package/dist/server/extension-ops.js +146 -0
- package/dist/server/extension-ops.js.map +1 -0
- package/dist/server/pi-server-service.d.ts +85 -0
- package/dist/server/pi-server-service.d.ts.map +1 -0
- package/dist/server/pi-server-service.js +213 -0
- package/dist/server/pi-server-service.js.map +1 -0
- package/dist/server/scheduler-tick.d.ts +32 -0
- package/dist/server/scheduler-tick.d.ts.map +1 -0
- package/dist/server/scheduler-tick.js +47 -0
- package/dist/server/scheduler-tick.js.map +1 -0
- package/dist/server/serve.d.ts +25 -0
- package/dist/server/serve.d.ts.map +1 -0
- package/dist/server/serve.js +83 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/server/transcript.d.ts +38 -0
- package/dist/server/transcript.d.ts.map +1 -0
- package/dist/server/transcript.js +176 -0
- package/dist/server/transcript.js.map +1 -0
- package/dist/skills/ada-engine/SKILL.md +153 -0
- package/dist/skills/skill-creator/SKILL.md +90 -0
- package/dist/telegram/api.d.ts +75 -0
- package/dist/telegram/api.d.ts.map +1 -0
- package/dist/telegram/api.js +104 -0
- package/dist/telegram/api.js.map +1 -0
- package/dist/telegram/bridge.d.ts +85 -0
- package/dist/telegram/bridge.d.ts.map +1 -0
- package/dist/telegram/bridge.js +182 -0
- package/dist/telegram/bridge.js.map +1 -0
- package/dist/telegram/journal.d.ts +67 -0
- package/dist/telegram/journal.d.ts.map +1 -0
- package/dist/telegram/journal.js +119 -0
- package/dist/telegram/journal.js.map +1 -0
- package/dist/telegram/servidor.d.ts +15 -0
- package/dist/telegram/servidor.d.ts.map +1 -0
- package/dist/telegram/servidor.js +74 -0
- package/dist/telegram/servidor.js.map +1 -0
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +2 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/management-http.d.ts +5 -3
- package/dist/utils/management-http.d.ts.map +1 -1
- package/dist/utils/management-http.js +14 -10
- package/dist/utils/management-http.js.map +1 -1
- package/dist/utils/shell.d.ts +11 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +11 -0
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/text.d.ts +8 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +9 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +29 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +25 -10
- package/docs/compliance.md +241 -0
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +15 -12
- package/docs/development.md +47 -10
- package/docs/docs.json +14 -2
- package/docs/environment-variables.md +20 -17
- package/docs/extensions.md +62 -51
- package/docs/index.md +15 -21
- package/docs/json.md +10 -5
- package/docs/keybindings.md +5 -5
- package/docs/llama-cpp.md +9 -7
- package/docs/models.md +18 -12
- package/docs/packages.md +45 -45
- package/docs/prompt-templates.md +5 -5
- package/docs/providers.md +12 -12
- package/docs/quickstart.md +39 -39
- package/docs/rpc.md +21 -15
- package/docs/sdk.md +38 -38
- package/docs/security.md +26 -21
- package/docs/session-format.md +7 -7
- package/docs/sessions.md +14 -14
- package/docs/settings.md +47 -22
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +14 -13
- package/docs/terminal-setup.md +14 -14
- package/docs/termux.md +7 -7
- package/docs/themes.md +11 -11
- package/docs/tmux.md +4 -4
- package/docs/tui.md +3 -3
- package/docs/usage.md +54 -54
- package/docs/windows.md +2 -2
- package/examples/extensions/border-status-editor.ts +1 -1
- package/examples/extensions/git-checkpoint.ts +2 -2
- package/examples/extensions/notify.ts +3 -1
- package/examples/extensions/subagent/README.md +1 -1
- package/examples/extensions/subagent/index.ts +6 -1
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/rpc-extension-ui.ts +1 -1
- package/examples/sdk/06-extensions.ts +1 -1
- package/examples/sdk/12-full-control.ts +9 -0
- package/examples/sdk/README.md +1 -1
- package/npm-shrinkwrap.json +35 -261
- package/package.json +9 -3
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trocea un diff unificado por fichero y mide cuánta SUSTANCIA hay en cada uno.
|
|
3
|
+
*
|
|
4
|
+
* El motivo de que esto exista aparte del modelo: en un diff de 25 ficheros lo
|
|
5
|
+
* normal es que 24 sean ruido —un import movido, el lockfile, el número de
|
|
6
|
+
* versión— y uno solo contenga el cambio de verdad. Si los 25 resúmenes entran
|
|
7
|
+
* al reduce con el mismo peso y en orden alfabético, el mensaje que sale es
|
|
8
|
+
* «actualiza varios ficheros»: literalmente cierto y completamente inútil.
|
|
9
|
+
*
|
|
10
|
+
* Ordenar por sustancia ANTES de llamar al modelo es lo que hace que la primera
|
|
11
|
+
* puerta se pueda comprobar sin red: sobre un diff preparado donde solo un
|
|
12
|
+
* fichero cambia algo, ese fichero tiene que salir el primero.
|
|
13
|
+
*/
|
|
14
|
+
/** Un fichero del diff, ya separado del resto. */
|
|
15
|
+
export interface TrozoDeFichero {
|
|
16
|
+
/** Ruta destino (o la de origen si el fichero se borra). */
|
|
17
|
+
ruta: string;
|
|
18
|
+
/** El diff de ESE fichero, cabecera incluida. */
|
|
19
|
+
diff: string;
|
|
20
|
+
/** Líneas añadidas/borradas que dicen algo. Ver `puntuarSustancia`. */
|
|
21
|
+
sustancia: number;
|
|
22
|
+
/** Ficheros generados que nadie escribe a mano: lockfiles, minificados, dist. */
|
|
23
|
+
ruido: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function esRuido(ruta: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Cuántas líneas con contenido cambia este trozo.
|
|
28
|
+
*
|
|
29
|
+
* No pretende ser una métrica de complejidad: solo tiene que separar «aquí pasa
|
|
30
|
+
* algo» de «aquí se movió una coma», que es la única decisión que toma.
|
|
31
|
+
*/
|
|
32
|
+
export declare function puntuarSustancia(diff: string): number;
|
|
33
|
+
/**
|
|
34
|
+
* Parte `git diff` en un trozo por fichero.
|
|
35
|
+
*
|
|
36
|
+
* Devuelve `[]` solo cuando el diff está vacío de verdad. Quien llama tiene que
|
|
37
|
+
* distinguir eso de «no he podido leer el diff»; aquí no se puede inventar esa
|
|
38
|
+
* diferencia, así que la entrada vacía se devuelve vacía y el CLI decide.
|
|
39
|
+
*/
|
|
40
|
+
export declare function trocearPorFichero(diff: string): TrozoDeFichero[];
|
|
41
|
+
/**
|
|
42
|
+
* De más sustancia a menos; el ruido siempre al final.
|
|
43
|
+
*
|
|
44
|
+
* Empate deshecho por ruta para que dos ejecuciones sobre el mismo diff den el
|
|
45
|
+
* mismo orden: un mensaje de commit que cambia según el humor del `sort` no se
|
|
46
|
+
* puede depurar.
|
|
47
|
+
*/
|
|
48
|
+
export declare function ordenarPorSustancia(trozos: TrozoDeFichero[]): TrozoDeFichero[];
|
|
49
|
+
/**
|
|
50
|
+
* Recorta un trozo para que quepa en la llamada de map.
|
|
51
|
+
*
|
|
52
|
+
* Se recorta por el final y se dice que se ha recortado: un resumen hecho sobre
|
|
53
|
+
* medio fichero sin avisar es un resumen que miente sobre su cobertura.
|
|
54
|
+
*/
|
|
55
|
+
export declare function recortar(diff: string, maxCaracteres?: number): string;
|
|
56
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/core/commit/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,kDAAkD;AAClD,MAAM,WAAW,cAAc;IAC9B,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,yEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,KAAK,EAAE,OAAO,CAAC;CACf;AASD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7C;AAgBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQrD;AAuCD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAehE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAM9E;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,SAAS,GAAG,MAAM,CAGrE","sourcesContent":["/**\n * Trocea un diff unificado por fichero y mide cuánta SUSTANCIA hay en cada uno.\n *\n * El motivo de que esto exista aparte del modelo: en un diff de 25 ficheros lo\n * normal es que 24 sean ruido —un import movido, el lockfile, el número de\n * versión— y uno solo contenga el cambio de verdad. Si los 25 resúmenes entran\n * al reduce con el mismo peso y en orden alfabético, el mensaje que sale es\n * «actualiza varios ficheros»: literalmente cierto y completamente inútil.\n *\n * Ordenar por sustancia ANTES de llamar al modelo es lo que hace que la primera\n * puerta se pueda comprobar sin red: sobre un diff preparado donde solo un\n * fichero cambia algo, ese fichero tiene que salir el primero.\n */\n\n/** Un fichero del diff, ya separado del resto. */\nexport interface TrozoDeFichero {\n\t/** Ruta destino (o la de origen si el fichero se borra). */\n\truta: string;\n\t/** El diff de ESE fichero, cabecera incluida. */\n\tdiff: string;\n\t/** Líneas añadidas/borradas que dicen algo. Ver `puntuarSustancia`. */\n\tsustancia: number;\n\t/** Ficheros generados que nadie escribe a mano: lockfiles, minificados, dist. */\n\truido: boolean;\n}\n\n/**\n * Ficheros que se regeneran solos. Resumirlos con el modelo es pagar por leer\n * 4.000 líneas de hashes para acabar escribiendo «se actualizó el lockfile».\n */\nconst RUTAS_DE_RUIDO =\n\t/(^|\\/)(package-lock\\.json|npm-shrinkwrap\\.json|pnpm-lock\\.yaml|yarn\\.lock|bun\\.lockb?|Cargo\\.lock|go\\.sum|composer\\.lock|Gemfile\\.lock|poetry\\.lock|uv\\.lock)$|(^|\\/)(dist|build|vendor|node_modules)\\/|\\.min\\.(js|css)$|\\.(snap|lock)$/;\n\nexport function esRuido(ruta: string): boolean {\n\treturn RUTAS_DE_RUIDO.test(ruta);\n}\n\n/**\n * Líneas que cambian sin cambiar nada: en blanco, imports movidos, cierres de\n * bloque sueltos. Se excluyen del recuento porque son justo lo que un\n * reordenado masivo genera a puñados, y sin excluirlas 24 ficheros con un\n * import tocado le ganan por goleada al único que trae la función nueva.\n */\nfunction esLineaTrivial(cuerpo: string): boolean {\n\tconst t = cuerpo.trim();\n\tif (t === \"\") return true;\n\tif (/^(import|export\\s+\\*|export\\s+\\{|from|require|use|using|#include|package)\\b/.test(t)) return true;\n\tif (/^[{}()[\\];,]+$/.test(t)) return true;\n\treturn false;\n}\n\n/**\n * Cuántas líneas con contenido cambia este trozo.\n *\n * No pretende ser una métrica de complejidad: solo tiene que separar «aquí pasa\n * algo» de «aquí se movió una coma», que es la única decisión que toma.\n */\nexport function puntuarSustancia(diff: string): number {\n\tlet n = 0;\n\tfor (const linea of diff.split(\"\\n\")) {\n\t\tif (linea.startsWith(\"+++\") || linea.startsWith(\"---\")) continue;\n\t\tif (linea[0] !== \"+\" && linea[0] !== \"-\") continue;\n\t\tif (!esLineaTrivial(linea.slice(1))) n++;\n\t}\n\treturn n;\n}\n\n/**\n * La ruta que toca enseñar: la de destino, salvo que el fichero se borre.\n *\n * El `\\t?$` no es defensa contra un caso raro: es el formato NORMAL de git en\n * cuanto la ruta lleva un espacio. `git diff` termina las líneas `---`/`+++`\n * con un TABULADOR cuando el nombre tiene espacios, para que se pueda saber\n * dónde acaba:\n *\n * --- a/mi app/package-lock.json\\t\n * +++ b/mi app/package-lock.json\\t\n *\n * Sin quitarlo, la ruta se queda en `mi app/package-lock.json\\t` y `esRuido`\n * —que casa con `$`— deja de reconocerlo. Medido ejecutando `ada-cli commit\n * --detalle` por la ruta real sobre un índice con `mi app/package-lock.json`\n * (200 dependencias) y `mi app/codigo.ts`:\n *\n * • mi app/package-lock.json<TAB> (802): ...\n * • mi app/codigo.ts<TAB> (2): ...\n *\n * El lockfile con el punto (·) de generado convertido en bala (•): se le gastó\n * una llamada al modelo con 12.000 caracteres de hashes Y, por sus 802 líneas,\n * se ordenó DELANTE del único fichero con código. O sea, el ruido llegando el\n * primero al reduce, que es exactamente lo que este módulo existe para impedir.\n *\n * No lo cazó nadie porque el corpus de pruebas eran diffs escritos a mano, y a\n * mano nadie escribe el tabulador que pone git.\n */\nfunction rutaDelTrozo(diff: string): string {\n\tconst destino = diff.match(/^\\+\\+\\+ b\\/(.+?)\\t?$/m);\n\tif (destino && destino[1] !== \"/dev/null\") return destino[1];\n\tconst origen = diff.match(/^--- a\\/(.+?)\\t?$/m);\n\tif (origen && origen[1] !== \"/dev/null\") return origen[1];\n\t// Renombrados y cambios de modo no traen `---`/`+++`; la cabecera sí.\n\tconst cabecera = diff.match(/^diff --git a\\/(.+?) b\\/(.+)$/m);\n\treturn cabecera ? cabecera[2] : \"(desconocido)\";\n}\n\n/**\n * Parte `git diff` en un trozo por fichero.\n *\n * Devuelve `[]` solo cuando el diff está vacío de verdad. Quien llama tiene que\n * distinguir eso de «no he podido leer el diff»; aquí no se puede inventar esa\n * diferencia, así que la entrada vacía se devuelve vacía y el CLI decide.\n */\nexport function trocearPorFichero(diff: string): TrozoDeFichero[] {\n\tconst trozos: TrozoDeFichero[] = [];\n\t// El separador es la cabecera de git. Se parte con lookahead para no perderla.\n\tfor (const bruto of diff.split(/^(?=diff --git )/m)) {\n\t\tconst texto = bruto.trimEnd();\n\t\tif (!texto.startsWith(\"diff --git \")) continue;\n\t\tconst ruta = rutaDelTrozo(texto);\n\t\ttrozos.push({\n\t\t\truta,\n\t\t\tdiff: texto,\n\t\t\tsustancia: puntuarSustancia(texto),\n\t\t\truido: esRuido(ruta),\n\t\t});\n\t}\n\treturn trozos;\n}\n\n/**\n * De más sustancia a menos; el ruido siempre al final.\n *\n * Empate deshecho por ruta para que dos ejecuciones sobre el mismo diff den el\n * mismo orden: un mensaje de commit que cambia según el humor del `sort` no se\n * puede depurar.\n */\nexport function ordenarPorSustancia(trozos: TrozoDeFichero[]): TrozoDeFichero[] {\n\treturn [...trozos].sort((a, b) => {\n\t\tif (a.ruido !== b.ruido) return a.ruido ? 1 : -1;\n\t\tif (a.sustancia !== b.sustancia) return b.sustancia - a.sustancia;\n\t\treturn a.ruta.localeCompare(b.ruta);\n\t});\n}\n\n/**\n * Recorta un trozo para que quepa en la llamada de map.\n *\n * Se recorta por el final y se dice que se ha recortado: un resumen hecho sobre\n * medio fichero sin avisar es un resumen que miente sobre su cobertura.\n */\nexport function recortar(diff: string, maxCaracteres = 12_000): string {\n\tif (diff.length <= maxCaracteres) return diff;\n\treturn `${diff.slice(0, maxCaracteres)}\\n[...recortado: el fichero cambia ${diff.length} caracteres y solo se han leído los primeros ${maxCaracteres}]`;\n}\n"]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trocea un diff unificado por fichero y mide cuánta SUSTANCIA hay en cada uno.
|
|
3
|
+
*
|
|
4
|
+
* El motivo de que esto exista aparte del modelo: en un diff de 25 ficheros lo
|
|
5
|
+
* normal es que 24 sean ruido —un import movido, el lockfile, el número de
|
|
6
|
+
* versión— y uno solo contenga el cambio de verdad. Si los 25 resúmenes entran
|
|
7
|
+
* al reduce con el mismo peso y en orden alfabético, el mensaje que sale es
|
|
8
|
+
* «actualiza varios ficheros»: literalmente cierto y completamente inútil.
|
|
9
|
+
*
|
|
10
|
+
* Ordenar por sustancia ANTES de llamar al modelo es lo que hace que la primera
|
|
11
|
+
* puerta se pueda comprobar sin red: sobre un diff preparado donde solo un
|
|
12
|
+
* fichero cambia algo, ese fichero tiene que salir el primero.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Ficheros que se regeneran solos. Resumirlos con el modelo es pagar por leer
|
|
16
|
+
* 4.000 líneas de hashes para acabar escribiendo «se actualizó el lockfile».
|
|
17
|
+
*/
|
|
18
|
+
const RUTAS_DE_RUIDO = /(^|\/)(package-lock\.json|npm-shrinkwrap\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|Cargo\.lock|go\.sum|composer\.lock|Gemfile\.lock|poetry\.lock|uv\.lock)$|(^|\/)(dist|build|vendor|node_modules)\/|\.min\.(js|css)$|\.(snap|lock)$/;
|
|
19
|
+
export function esRuido(ruta) {
|
|
20
|
+
return RUTAS_DE_RUIDO.test(ruta);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Líneas que cambian sin cambiar nada: en blanco, imports movidos, cierres de
|
|
24
|
+
* bloque sueltos. Se excluyen del recuento porque son justo lo que un
|
|
25
|
+
* reordenado masivo genera a puñados, y sin excluirlas 24 ficheros con un
|
|
26
|
+
* import tocado le ganan por goleada al único que trae la función nueva.
|
|
27
|
+
*/
|
|
28
|
+
function esLineaTrivial(cuerpo) {
|
|
29
|
+
const t = cuerpo.trim();
|
|
30
|
+
if (t === "")
|
|
31
|
+
return true;
|
|
32
|
+
if (/^(import|export\s+\*|export\s+\{|from|require|use|using|#include|package)\b/.test(t))
|
|
33
|
+
return true;
|
|
34
|
+
if (/^[{}()[\];,]+$/.test(t))
|
|
35
|
+
return true;
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Cuántas líneas con contenido cambia este trozo.
|
|
40
|
+
*
|
|
41
|
+
* No pretende ser una métrica de complejidad: solo tiene que separar «aquí pasa
|
|
42
|
+
* algo» de «aquí se movió una coma», que es la única decisión que toma.
|
|
43
|
+
*/
|
|
44
|
+
export function puntuarSustancia(diff) {
|
|
45
|
+
let n = 0;
|
|
46
|
+
for (const linea of diff.split("\n")) {
|
|
47
|
+
if (linea.startsWith("+++") || linea.startsWith("---"))
|
|
48
|
+
continue;
|
|
49
|
+
if (linea[0] !== "+" && linea[0] !== "-")
|
|
50
|
+
continue;
|
|
51
|
+
if (!esLineaTrivial(linea.slice(1)))
|
|
52
|
+
n++;
|
|
53
|
+
}
|
|
54
|
+
return n;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* La ruta que toca enseñar: la de destino, salvo que el fichero se borre.
|
|
58
|
+
*
|
|
59
|
+
* El `\t?$` no es defensa contra un caso raro: es el formato NORMAL de git en
|
|
60
|
+
* cuanto la ruta lleva un espacio. `git diff` termina las líneas `---`/`+++`
|
|
61
|
+
* con un TABULADOR cuando el nombre tiene espacios, para que se pueda saber
|
|
62
|
+
* dónde acaba:
|
|
63
|
+
*
|
|
64
|
+
* --- a/mi app/package-lock.json\t
|
|
65
|
+
* +++ b/mi app/package-lock.json\t
|
|
66
|
+
*
|
|
67
|
+
* Sin quitarlo, la ruta se queda en `mi app/package-lock.json\t` y `esRuido`
|
|
68
|
+
* —que casa con `$`— deja de reconocerlo. Medido ejecutando `ada-cli commit
|
|
69
|
+
* --detalle` por la ruta real sobre un índice con `mi app/package-lock.json`
|
|
70
|
+
* (200 dependencias) y `mi app/codigo.ts`:
|
|
71
|
+
*
|
|
72
|
+
* • mi app/package-lock.json<TAB> (802): ...
|
|
73
|
+
* • mi app/codigo.ts<TAB> (2): ...
|
|
74
|
+
*
|
|
75
|
+
* El lockfile con el punto (·) de generado convertido en bala (•): se le gastó
|
|
76
|
+
* una llamada al modelo con 12.000 caracteres de hashes Y, por sus 802 líneas,
|
|
77
|
+
* se ordenó DELANTE del único fichero con código. O sea, el ruido llegando el
|
|
78
|
+
* primero al reduce, que es exactamente lo que este módulo existe para impedir.
|
|
79
|
+
*
|
|
80
|
+
* No lo cazó nadie porque el corpus de pruebas eran diffs escritos a mano, y a
|
|
81
|
+
* mano nadie escribe el tabulador que pone git.
|
|
82
|
+
*/
|
|
83
|
+
function rutaDelTrozo(diff) {
|
|
84
|
+
const destino = diff.match(/^\+\+\+ b\/(.+?)\t?$/m);
|
|
85
|
+
if (destino && destino[1] !== "/dev/null")
|
|
86
|
+
return destino[1];
|
|
87
|
+
const origen = diff.match(/^--- a\/(.+?)\t?$/m);
|
|
88
|
+
if (origen && origen[1] !== "/dev/null")
|
|
89
|
+
return origen[1];
|
|
90
|
+
// Renombrados y cambios de modo no traen `---`/`+++`; la cabecera sí.
|
|
91
|
+
const cabecera = diff.match(/^diff --git a\/(.+?) b\/(.+)$/m);
|
|
92
|
+
return cabecera ? cabecera[2] : "(desconocido)";
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Parte `git diff` en un trozo por fichero.
|
|
96
|
+
*
|
|
97
|
+
* Devuelve `[]` solo cuando el diff está vacío de verdad. Quien llama tiene que
|
|
98
|
+
* distinguir eso de «no he podido leer el diff»; aquí no se puede inventar esa
|
|
99
|
+
* diferencia, así que la entrada vacía se devuelve vacía y el CLI decide.
|
|
100
|
+
*/
|
|
101
|
+
export function trocearPorFichero(diff) {
|
|
102
|
+
const trozos = [];
|
|
103
|
+
// El separador es la cabecera de git. Se parte con lookahead para no perderla.
|
|
104
|
+
for (const bruto of diff.split(/^(?=diff --git )/m)) {
|
|
105
|
+
const texto = bruto.trimEnd();
|
|
106
|
+
if (!texto.startsWith("diff --git "))
|
|
107
|
+
continue;
|
|
108
|
+
const ruta = rutaDelTrozo(texto);
|
|
109
|
+
trozos.push({
|
|
110
|
+
ruta,
|
|
111
|
+
diff: texto,
|
|
112
|
+
sustancia: puntuarSustancia(texto),
|
|
113
|
+
ruido: esRuido(ruta),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return trozos;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* De más sustancia a menos; el ruido siempre al final.
|
|
120
|
+
*
|
|
121
|
+
* Empate deshecho por ruta para que dos ejecuciones sobre el mismo diff den el
|
|
122
|
+
* mismo orden: un mensaje de commit que cambia según el humor del `sort` no se
|
|
123
|
+
* puede depurar.
|
|
124
|
+
*/
|
|
125
|
+
export function ordenarPorSustancia(trozos) {
|
|
126
|
+
return [...trozos].sort((a, b) => {
|
|
127
|
+
if (a.ruido !== b.ruido)
|
|
128
|
+
return a.ruido ? 1 : -1;
|
|
129
|
+
if (a.sustancia !== b.sustancia)
|
|
130
|
+
return b.sustancia - a.sustancia;
|
|
131
|
+
return a.ruta.localeCompare(b.ruta);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Recorta un trozo para que quepa en la llamada de map.
|
|
136
|
+
*
|
|
137
|
+
* Se recorta por el final y se dice que se ha recortado: un resumen hecho sobre
|
|
138
|
+
* medio fichero sin avisar es un resumen que miente sobre su cobertura.
|
|
139
|
+
*/
|
|
140
|
+
export function recortar(diff, maxCaracteres = 12_000) {
|
|
141
|
+
if (diff.length <= maxCaracteres)
|
|
142
|
+
return diff;
|
|
143
|
+
return `${diff.slice(0, maxCaracteres)}\n[...recortado: el fichero cambia ${diff.length} caracteres y solo se han leído los primeros ${maxCaracteres}]`;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/core/commit/diff.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Trocea un diff unificado por fichero y mide cuánta SUSTANCIA hay en cada uno.\n *\n * El motivo de que esto exista aparte del modelo: en un diff de 25 ficheros lo\n * normal es que 24 sean ruido —un import movido, el lockfile, el número de\n * versión— y uno solo contenga el cambio de verdad. Si los 25 resúmenes entran\n * al reduce con el mismo peso y en orden alfabético, el mensaje que sale es\n * «actualiza varios ficheros»: literalmente cierto y completamente inútil.\n *\n * Ordenar por sustancia ANTES de llamar al modelo es lo que hace que la primera\n * puerta se pueda comprobar sin red: sobre un diff preparado donde solo un\n * fichero cambia algo, ese fichero tiene que salir el primero.\n */\n\n/** Un fichero del diff, ya separado del resto. */\nexport interface TrozoDeFichero {\n\t/** Ruta destino (o la de origen si el fichero se borra). */\n\truta: string;\n\t/** El diff de ESE fichero, cabecera incluida. */\n\tdiff: string;\n\t/** Líneas añadidas/borradas que dicen algo. Ver `puntuarSustancia`. */\n\tsustancia: number;\n\t/** Ficheros generados que nadie escribe a mano: lockfiles, minificados, dist. */\n\truido: boolean;\n}\n\n/**\n * Ficheros que se regeneran solos. Resumirlos con el modelo es pagar por leer\n * 4.000 líneas de hashes para acabar escribiendo «se actualizó el lockfile».\n */\nconst RUTAS_DE_RUIDO =\n\t/(^|\\/)(package-lock\\.json|npm-shrinkwrap\\.json|pnpm-lock\\.yaml|yarn\\.lock|bun\\.lockb?|Cargo\\.lock|go\\.sum|composer\\.lock|Gemfile\\.lock|poetry\\.lock|uv\\.lock)$|(^|\\/)(dist|build|vendor|node_modules)\\/|\\.min\\.(js|css)$|\\.(snap|lock)$/;\n\nexport function esRuido(ruta: string): boolean {\n\treturn RUTAS_DE_RUIDO.test(ruta);\n}\n\n/**\n * Líneas que cambian sin cambiar nada: en blanco, imports movidos, cierres de\n * bloque sueltos. Se excluyen del recuento porque son justo lo que un\n * reordenado masivo genera a puñados, y sin excluirlas 24 ficheros con un\n * import tocado le ganan por goleada al único que trae la función nueva.\n */\nfunction esLineaTrivial(cuerpo: string): boolean {\n\tconst t = cuerpo.trim();\n\tif (t === \"\") return true;\n\tif (/^(import|export\\s+\\*|export\\s+\\{|from|require|use|using|#include|package)\\b/.test(t)) return true;\n\tif (/^[{}()[\\];,]+$/.test(t)) return true;\n\treturn false;\n}\n\n/**\n * Cuántas líneas con contenido cambia este trozo.\n *\n * No pretende ser una métrica de complejidad: solo tiene que separar «aquí pasa\n * algo» de «aquí se movió una coma», que es la única decisión que toma.\n */\nexport function puntuarSustancia(diff: string): number {\n\tlet n = 0;\n\tfor (const linea of diff.split(\"\\n\")) {\n\t\tif (linea.startsWith(\"+++\") || linea.startsWith(\"---\")) continue;\n\t\tif (linea[0] !== \"+\" && linea[0] !== \"-\") continue;\n\t\tif (!esLineaTrivial(linea.slice(1))) n++;\n\t}\n\treturn n;\n}\n\n/**\n * La ruta que toca enseñar: la de destino, salvo que el fichero se borre.\n *\n * El `\\t?$` no es defensa contra un caso raro: es el formato NORMAL de git en\n * cuanto la ruta lleva un espacio. `git diff` termina las líneas `---`/`+++`\n * con un TABULADOR cuando el nombre tiene espacios, para que se pueda saber\n * dónde acaba:\n *\n * --- a/mi app/package-lock.json\\t\n * +++ b/mi app/package-lock.json\\t\n *\n * Sin quitarlo, la ruta se queda en `mi app/package-lock.json\\t` y `esRuido`\n * —que casa con `$`— deja de reconocerlo. Medido ejecutando `ada-cli commit\n * --detalle` por la ruta real sobre un índice con `mi app/package-lock.json`\n * (200 dependencias) y `mi app/codigo.ts`:\n *\n * • mi app/package-lock.json<TAB> (802): ...\n * • mi app/codigo.ts<TAB> (2): ...\n *\n * El lockfile con el punto (·) de generado convertido en bala (•): se le gastó\n * una llamada al modelo con 12.000 caracteres de hashes Y, por sus 802 líneas,\n * se ordenó DELANTE del único fichero con código. O sea, el ruido llegando el\n * primero al reduce, que es exactamente lo que este módulo existe para impedir.\n *\n * No lo cazó nadie porque el corpus de pruebas eran diffs escritos a mano, y a\n * mano nadie escribe el tabulador que pone git.\n */\nfunction rutaDelTrozo(diff: string): string {\n\tconst destino = diff.match(/^\\+\\+\\+ b\\/(.+?)\\t?$/m);\n\tif (destino && destino[1] !== \"/dev/null\") return destino[1];\n\tconst origen = diff.match(/^--- a\\/(.+?)\\t?$/m);\n\tif (origen && origen[1] !== \"/dev/null\") return origen[1];\n\t// Renombrados y cambios de modo no traen `---`/`+++`; la cabecera sí.\n\tconst cabecera = diff.match(/^diff --git a\\/(.+?) b\\/(.+)$/m);\n\treturn cabecera ? cabecera[2] : \"(desconocido)\";\n}\n\n/**\n * Parte `git diff` en un trozo por fichero.\n *\n * Devuelve `[]` solo cuando el diff está vacío de verdad. Quien llama tiene que\n * distinguir eso de «no he podido leer el diff»; aquí no se puede inventar esa\n * diferencia, así que la entrada vacía se devuelve vacía y el CLI decide.\n */\nexport function trocearPorFichero(diff: string): TrozoDeFichero[] {\n\tconst trozos: TrozoDeFichero[] = [];\n\t// El separador es la cabecera de git. Se parte con lookahead para no perderla.\n\tfor (const bruto of diff.split(/^(?=diff --git )/m)) {\n\t\tconst texto = bruto.trimEnd();\n\t\tif (!texto.startsWith(\"diff --git \")) continue;\n\t\tconst ruta = rutaDelTrozo(texto);\n\t\ttrozos.push({\n\t\t\truta,\n\t\t\tdiff: texto,\n\t\t\tsustancia: puntuarSustancia(texto),\n\t\t\truido: esRuido(ruta),\n\t\t});\n\t}\n\treturn trozos;\n}\n\n/**\n * De más sustancia a menos; el ruido siempre al final.\n *\n * Empate deshecho por ruta para que dos ejecuciones sobre el mismo diff den el\n * mismo orden: un mensaje de commit que cambia según el humor del `sort` no se\n * puede depurar.\n */\nexport function ordenarPorSustancia(trozos: TrozoDeFichero[]): TrozoDeFichero[] {\n\treturn [...trozos].sort((a, b) => {\n\t\tif (a.ruido !== b.ruido) return a.ruido ? 1 : -1;\n\t\tif (a.sustancia !== b.sustancia) return b.sustancia - a.sustancia;\n\t\treturn a.ruta.localeCompare(b.ruta);\n\t});\n}\n\n/**\n * Recorta un trozo para que quepa en la llamada de map.\n *\n * Se recorta por el final y se dice que se ha recortado: un resumen hecho sobre\n * medio fichero sin avisar es un resumen que miente sobre su cobertura.\n */\nexport function recortar(diff: string, maxCaracteres = 12_000): string {\n\tif (diff.length <= maxCaracteres) return diff;\n\treturn `${diff.slice(0, maxCaracteres)}\\n[...recortado: el fichero cambia ${diff.length} caracteres y solo se han leído los primeros ${maxCaracteres}]`;\n}\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mensaje de commit por map-reduce sobre el diff.
|
|
3
|
+
*
|
|
4
|
+
* El problema: un diff grande no cabe en contexto, y meterlo entero recortado
|
|
5
|
+
* da mensajes genéricos («actualiza varios ficheros»), que es exactamente el
|
|
6
|
+
* mensaje que nadie necesita leer porque `git show --stat` ya lo dice mejor.
|
|
7
|
+
*
|
|
8
|
+
* El reparto:
|
|
9
|
+
* - map → un resumen por fichero, en paralelo, cada uno con SU diff entero.
|
|
10
|
+
* - reduce → un mensaje del conjunto a partir de esos resúmenes, ordenados por
|
|
11
|
+
* sustancia para que el cambio de verdad llegue el primero.
|
|
12
|
+
*
|
|
13
|
+
* TRES ESTADOS, NO DOS. En cada paso se distingue «no hay» de «no puedo»:
|
|
14
|
+
* un resumen vacío o una respuesta vacía del modelo NO son «este fichero no
|
|
15
|
+
* cambia nada», son un fallo, y salen como error. Ya nos pasó en `review`:
|
|
16
|
+
* cuatro de cinco ejecuciones sobre un fallo sembrado decían «no ha encontrado
|
|
17
|
+
* nada» cuando lo que había detrás era un 429.
|
|
18
|
+
*/
|
|
19
|
+
export declare const PROMPT_MAP = "Resumes UN fichero de un diff de git.\n\nDevuelve UNA sola l\u00EDnea, en espa\u00F1ol, con el QU\u00C9 y el POR QU\u00C9 del cambio en ese\nfichero. Nombra lo concreto: la funci\u00F3n, la constante, el flag, el endpoint.\n\nProhibido: \"varios cambios\", \"actualizaciones\", \"mejoras\", \"refactor\" a secas,\nrepetir la ruta del fichero sin decir qu\u00E9 cambia dentro.\n\nSi el fichero solo cambia formato, imports o n\u00FAmeros de version, dilo tal cual\ny en corto: eso es informacion util para no ponerlo en el titular.\n\nSin markdown, sin comillas, sin prefijos. Solo la l\u00EDnea.";
|
|
20
|
+
export declare const PROMPT_REDUCE = "Escribes el mensaje de commit de un conjunto de cambios.\n\nRecibes un resumen por fichero, YA ORDENADOS de m\u00E1s a menos sustancia. El\nprimero es el cambio de verdad; el resto suele ser acompa\u00F1amiento.\n\nFormato exacto:\n - L\u00EDnea 1: titular imperativo, min\u00FAsculas, sin punto final, m\u00E1x. 72 caracteres.\n Tiene que nombrar EL cambio concreto del primer fichero, no el conjunto.\n - L\u00EDnea 2: en blanco.\n - Cuerpo: por qu\u00E9 se hace, y qu\u00E9 arrastra el resto de ficheros. L\u00EDneas de\n m\u00E1x. 80 caracteres.\n\nPROHIBIDO en el titular: \"actualiza varios ficheros\", \"varios cambios\",\n\"cambios varios\", \"mejoras varias\", \"actualiza el proyecto\", \"wip\", \"misc\",\no cualquier titular que valdr\u00EDa igual para otro commit distinto.\n\nSin markdown, sin bloques de c\u00F3digo, sin encabezados. Solo el mensaje.";
|
|
21
|
+
/** ¿El titular vale para cualquier commit? */
|
|
22
|
+
export declare function esGenerico(mensaje: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Quita lo que el modelo añade por costumbre: vallas de código y comillas.
|
|
25
|
+
*
|
|
26
|
+
* No toca el contenido. Un mensaje que llega envuelto en ``` sigue siendo el
|
|
27
|
+
* mensaje; rechazarlo por el envoltorio sería fallar por algo que se arregla
|
|
28
|
+
* con dos líneas.
|
|
29
|
+
*/
|
|
30
|
+
export declare function limpiarMensaje(bruto: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Lanza `tarea` sobre cada elemento con un tope de concurrencia.
|
|
33
|
+
*
|
|
34
|
+
* El tope no es decorativo: el map dispara una llamada por fichero, y sobre 40
|
|
35
|
+
* ficheros sin límite lo que se consigue es un 429 del proveedor — o sea,
|
|
36
|
+
* convertir un diff grande en un fallo garantizado justo cuando map-reduce es
|
|
37
|
+
* más necesario.
|
|
38
|
+
*/
|
|
39
|
+
export declare function enParalelo<T, R>(elementos: T[], tope: number, tarea: (e: T, i: number) => Promise<R>): Promise<R[]>;
|
|
40
|
+
/** Lo que el CLI inyecta para poder probar todo esto sin red. */
|
|
41
|
+
export interface DependenciasMensaje {
|
|
42
|
+
/** Una llamada al modelo. Debe LANZAR si falla; devolver "" es un fallo. */
|
|
43
|
+
llamar: (sistema: string, usuario: string) => Promise<string>;
|
|
44
|
+
/** Llamadas simultáneas del map. */
|
|
45
|
+
tope?: number;
|
|
46
|
+
/** Cuántos resúmenes entran al reduce. Los de más sustancia primero. */
|
|
47
|
+
maxResumenes?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface ResumenDeFichero {
|
|
50
|
+
ruta: string;
|
|
51
|
+
sustancia: number;
|
|
52
|
+
ruido: boolean;
|
|
53
|
+
resumen: string;
|
|
54
|
+
}
|
|
55
|
+
export interface MensajeGenerado {
|
|
56
|
+
mensaje: string;
|
|
57
|
+
resumenes: ResumenDeFichero[];
|
|
58
|
+
/** Ficheros que NO se le pasaron al modelo por ser generados. */
|
|
59
|
+
omitidos: string[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Fallo con nombre. El CLI necesita distinguir «el índice está vacío» de «el
|
|
63
|
+
* modelo se cayó» para elegir el código de salida y el texto, y una cadena
|
|
64
|
+
* dentro de un Error genérico obliga a leer prosa para tomar esa decisión.
|
|
65
|
+
*/
|
|
66
|
+
export type CausaDeFallo = "diff-vacio" | "diff-ilegible" | "modelo" | "generico";
|
|
67
|
+
export declare class ErrorDeMensaje extends Error {
|
|
68
|
+
readonly causa: CausaDeFallo;
|
|
69
|
+
constructor(causa: CausaDeFallo, mensaje: string);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Map sobre cada fichero, reduce sobre los resúmenes.
|
|
73
|
+
*
|
|
74
|
+
* `llamar` tiene que LANZAR cuando el proveedor falla. Si devolviera "" en vez
|
|
75
|
+
* de lanzar, aquí se leería como «este fichero no cambia nada» y el fallo se
|
|
76
|
+
* colaría hasta el mensaje final: es el patrón exacto que nos costó cuatro
|
|
77
|
+
* revisiones falsamente limpias.
|
|
78
|
+
*/
|
|
79
|
+
export declare function generarMensaje(diff: string, deps: DependenciasMensaje): Promise<MensajeGenerado>;
|
|
80
|
+
//# sourceMappingURL=mensaje.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mensaje.d.ts","sourceRoot":"","sources":["../../../src/core/commit/mensaje.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,eAAO,MAAM,UAAU,wlBAWkC,CAAC;AAE1D,eAAO,MAAM,aAAa,+2BAgB6C,CAAC;AAmBxE,+CAA8C;AAC9C,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAInD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,gBAW1G;AAED,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IACnC,4EAA4E;IAC5E,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,qCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,iEAAiE;IACjE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,eAAe,GAAG,QAAQ,GAAG,UAAU,CAAC;AAElF,qBAAa,cAAe,SAAQ,KAAK;IACxC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,YAAY,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAI/C;CACD;AAOD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CA6FtG","sourcesContent":["/**\n * Mensaje de commit por map-reduce sobre el diff.\n *\n * El problema: un diff grande no cabe en contexto, y meterlo entero recortado\n * da mensajes genéricos («actualiza varios ficheros»), que es exactamente el\n * mensaje que nadie necesita leer porque `git show --stat` ya lo dice mejor.\n *\n * El reparto:\n * - map → un resumen por fichero, en paralelo, cada uno con SU diff entero.\n * - reduce → un mensaje del conjunto a partir de esos resúmenes, ordenados por\n * sustancia para que el cambio de verdad llegue el primero.\n *\n * TRES ESTADOS, NO DOS. En cada paso se distingue «no hay» de «no puedo»:\n * un resumen vacío o una respuesta vacía del modelo NO son «este fichero no\n * cambia nada», son un fallo, y salen como error. Ya nos pasó en `review`:\n * cuatro de cinco ejecuciones sobre un fallo sembrado decían «no ha encontrado\n * nada» cuando lo que había detrás era un 429.\n */\n\nimport { ordenarPorSustancia, recortar, type TrozoDeFichero, trocearPorFichero } from \"./diff.ts\";\n\nexport const PROMPT_MAP = `Resumes UN fichero de un diff de git.\n\nDevuelve UNA sola línea, en español, con el QUÉ y el POR QUÉ del cambio en ese\nfichero. Nombra lo concreto: la función, la constante, el flag, el endpoint.\n\nProhibido: \"varios cambios\", \"actualizaciones\", \"mejoras\", \"refactor\" a secas,\nrepetir la ruta del fichero sin decir qué cambia dentro.\n\nSi el fichero solo cambia formato, imports o números de version, dilo tal cual\ny en corto: eso es informacion util para no ponerlo en el titular.\n\nSin markdown, sin comillas, sin prefijos. Solo la línea.`;\n\nexport const PROMPT_REDUCE = `Escribes el mensaje de commit de un conjunto de cambios.\n\nRecibes un resumen por fichero, YA ORDENADOS de más a menos sustancia. El\nprimero es el cambio de verdad; el resto suele ser acompañamiento.\n\nFormato exacto:\n - Línea 1: titular imperativo, minúsculas, sin punto final, máx. 72 caracteres.\n Tiene que nombrar EL cambio concreto del primer fichero, no el conjunto.\n - Línea 2: en blanco.\n - Cuerpo: por qué se hace, y qué arrastra el resto de ficheros. Líneas de\n máx. 80 caracteres.\n\nPROHIBIDO en el titular: \"actualiza varios ficheros\", \"varios cambios\",\n\"cambios varios\", \"mejoras varias\", \"actualiza el proyecto\", \"wip\", \"misc\",\no cualquier titular que valdría igual para otro commit distinto.\n\nSin markdown, sin bloques de código, sin encabezados. Solo el mensaje.`;\n\n/**\n * Titulares que valdrían para cualquier commit.\n *\n * Existe porque la primera puerta de este trabajo es justo esa: sobre un diff\n * de 25 ficheros donde solo uno cambia algo, el mensaje tiene que nombrar el\n * cambio. Sin este detector, «lo nombra» es una opinión sobre la salida del\n * modelo; con él es una comprobación que se ejecuta.\n */\nconst TITULARES_VACIOS = [\n\t/\\bvarios?\\s+(ficheros?|archivos?|cambios?|m[oó]dulos?|arreglos?)\\b/i,\n\t/\\bcambios?\\s+varios\\b/i,\n\t/\\bmejoras?\\s+varias\\b/i,\n\t/\\bactualiza(?:ci[oó]n(?:es)?)?\\s+(?:el\\s+|del\\s+|de\\s+)?(?:proyecto|repositorio|c[oó]digo|ficheros?)\\b/i,\n\t/^\\s*(wip|misc|varios|updates?|update|fixes|fix|chore|cambios)\\s*[:.!]?\\s*$/i,\n\t/\\bupdate\\s+(several|various|multiple)\\b/i,\n];\n\n/** ¿El titular vale para cualquier commit? */\nexport function esGenerico(mensaje: string): boolean {\n\tconst titular = mensaje.split(\"\\n\")[0]?.trim() ?? \"\";\n\tif (titular === \"\") return true;\n\treturn TITULARES_VACIOS.some((r) => r.test(titular));\n}\n\n/**\n * Quita lo que el modelo añade por costumbre: vallas de código y comillas.\n *\n * No toca el contenido. Un mensaje que llega envuelto en ``` sigue siendo el\n * mensaje; rechazarlo por el envoltorio sería fallar por algo que se arregla\n * con dos líneas.\n */\nexport function limpiarMensaje(bruto: string): string {\n\tlet t = bruto.trim();\n\tconst valla = t.match(/^```[a-z]*\\n([\\s\\S]*?)\\n?```$/i);\n\tif (valla) t = valla[1].trim();\n\t// Los dos puntos de \"Mensaje de commit:\" que a veces se cuela delante.\n\tt = t.replace(/^(mensaje de commit|commit message)\\s*:\\s*\\n+/i, \"\");\n\treturn t.trim();\n}\n\n/**\n * Lanza `tarea` sobre cada elemento con un tope de concurrencia.\n *\n * El tope no es decorativo: el map dispara una llamada por fichero, y sobre 40\n * ficheros sin límite lo que se consigue es un 429 del proveedor — o sea,\n * convertir un diff grande en un fallo garantizado justo cuando map-reduce es\n * más necesario.\n */\nexport async function enParalelo<T, R>(elementos: T[], tope: number, tarea: (e: T, i: number) => Promise<R>) {\n\tconst resultados = new Array<R>(elementos.length);\n\tlet siguiente = 0;\n\tconst obreros = Array.from({ length: Math.min(tope, elementos.length) }, async () => {\n\t\twhile (siguiente < elementos.length) {\n\t\t\tconst i = siguiente++;\n\t\t\tresultados[i] = await tarea(elementos[i], i);\n\t\t}\n\t});\n\tawait Promise.all(obreros);\n\treturn resultados;\n}\n\n/** Lo que el CLI inyecta para poder probar todo esto sin red. */\nexport interface DependenciasMensaje {\n\t/** Una llamada al modelo. Debe LANZAR si falla; devolver \"\" es un fallo. */\n\tllamar: (sistema: string, usuario: string) => Promise<string>;\n\t/** Llamadas simultáneas del map. */\n\ttope?: number;\n\t/** Cuántos resúmenes entran al reduce. Los de más sustancia primero. */\n\tmaxResumenes?: number;\n}\n\nexport interface ResumenDeFichero {\n\truta: string;\n\tsustancia: number;\n\truido: boolean;\n\tresumen: string;\n}\n\nexport interface MensajeGenerado {\n\tmensaje: string;\n\tresumenes: ResumenDeFichero[];\n\t/** Ficheros que NO se le pasaron al modelo por ser generados. */\n\tomitidos: string[];\n}\n\n/**\n * Fallo con nombre. El CLI necesita distinguir «el índice está vacío» de «el\n * modelo se cayó» para elegir el código de salida y el texto, y una cadena\n * dentro de un Error genérico obliga a leer prosa para tomar esa decisión.\n */\nexport type CausaDeFallo = \"diff-vacio\" | \"diff-ilegible\" | \"modelo\" | \"generico\";\n\nexport class ErrorDeMensaje extends Error {\n\treadonly causa: CausaDeFallo;\n\tconstructor(causa: CausaDeFallo, mensaje: string) {\n\t\tsuper(mensaje);\n\t\tthis.name = \"ErrorDeMensaje\";\n\t\tthis.causa = causa;\n\t}\n}\n\n/** Resumen local de un fichero generado: no vale la pena gastar una llamada. */\nfunction resumirRuidoEnLocal(t: TrozoDeFichero): string {\n\treturn `fichero generado (${t.sustancia} líneas con contenido cambiadas); no se ha leído en detalle`;\n}\n\n/**\n * Map sobre cada fichero, reduce sobre los resúmenes.\n *\n * `llamar` tiene que LANZAR cuando el proveedor falla. Si devolviera \"\" en vez\n * de lanzar, aquí se leería como «este fichero no cambia nada» y el fallo se\n * colaría hasta el mensaje final: es el patrón exacto que nos costó cuatro\n * revisiones falsamente limpias.\n */\nexport async function generarMensaje(diff: string, deps: DependenciasMensaje): Promise<MensajeGenerado> {\n\tconst trozos = ordenarPorSustancia(trocearPorFichero(diff));\n\tif (trozos.length === 0) {\n\t\t// Cero trozos tiene DOS causas, y decirlas igual es el fallo de siempre.\n\t\t//\n\t\t// Sin texto no hay nada que describir. Pero si han llegado 3 KB y aun así\n\t\t// no sale ni una cabecera `diff --git `, lo que pasa es que no sabemos leer\n\t\t// ese formato, y decir «el diff no contiene ningún fichero» sobre un índice\n\t\t// LLENO es «no puedo» disfrazado de «no hay». Comprobado ejecutando: con\n\t\t// `color.ui=always` puesto, `ada-cli commit` sobre dos ficheros staged\n\t\t// contestaba exactamente eso. Los cuatro ajustes que lo provocaban los\n\t\t// apaga ya `diffDelIndice`; esto es la red por si aparece un quinto.\n\t\tif (diff.trim() === \"\") {\n\t\t\tthrow new ErrorDeMensaje(\"diff-vacio\", \"El diff no contiene ningún fichero.\");\n\t\t}\n\t\tthrow new ErrorDeMensaje(\n\t\t\t\"diff-ilegible\",\n\t\t\t`Hay diff (${diff.length} caracteres) pero no se ha reconocido ninguna cabecera 'diff --git'. ` +\n\t\t\t\t\"Suele ser configuración de git que cambia el formato: color.ui, GIT_EXTERNAL_DIFF o un diff.external.\",\n\t\t);\n\t}\n\n\tconst tope = deps.maxResumenes ?? 40;\n\tconst conSustancia = trozos.filter((t) => !t.ruido);\n\t// El corte va ANTES del map, no después.\n\t//\n\t// Estaba después: sobre 200 ficheros se pedían 200 resúmenes y se tiraban\n\t// 160 sin mirarlos. Además de pagarlos, cada uno era una oportunidad de matar\n\t// el comando entero —un resumen vacío lanza— justo en el caso para el que\n\t// existe map-reduce. Como `trozos` ya viene ordenado por sustancia, los que\n\t// se quedan fuera son los que menos cambian.\n\tconst aResumir = conSustancia.slice(0, tope);\n\tconst sinMirar = conSustancia.slice(tope);\n\tconst omitidos = trozos.filter((t) => t.ruido);\n\n\tconst resumidos = await enParalelo(aResumir, deps.tope ?? 6, async (t) => {\n\t\tconst salida = await deps.llamar(PROMPT_MAP, `Fichero: ${t.ruta}\\n\\n${recortar(t.diff)}`);\n\t\tconst resumen = salida.trim();\n\t\tif (resumen === \"\") {\n\t\t\t// Un resumen vacío NO es «este fichero no cambia nada»: el fichero está\n\t\t\t// en el diff, luego cambia. Es que no se ha podido resumir.\n\t\t\tthrow new ErrorDeMensaje(\"modelo\", `El modelo devolvió un resumen vacío para ${t.ruta}.`);\n\t\t}\n\t\treturn { ruta: t.ruta, sustancia: t.sustancia, ruido: false, resumen };\n\t});\n\n\tconst resumenes: ResumenDeFichero[] = [\n\t\t...resumidos,\n\t\t...omitidos.map((t) => ({\n\t\t\truta: t.ruta,\n\t\t\tsustancia: t.sustancia,\n\t\t\truido: true,\n\t\t\tresumen: resumirRuidoEnLocal(t),\n\t\t})),\n\t\t// Los que se quedaron fuera del tope se listan diciendo QUE NO SE HAN\n\t\t// MIRADO. Callarlos dejaría un `--detalle` que enseña 40 ficheros de un\n\t\t// commit de 200 y se lee como si fueran todos: «no lo he mirado» contado\n\t\t// como «no hay nada que contar».\n\t\t...sinMirar.map((t) => ({\n\t\t\truta: t.ruta,\n\t\t\tsustancia: t.sustancia,\n\t\t\truido: false,\n\t\t\tresumen: `no se ha resumido: por debajo del tope de ${tope} ficheros`,\n\t\t})),\n\t];\n\n\t// El corte se hace por la cola, que ya está ordenada por sustancia: si sobran\n\t// resúmenes, los que se caen son los que menos cambian. Cortar por delante o\n\t// alfabéticamente es como se pierde justo el fichero que importa.\n\tconst paraElReduce = resumenes.slice(0, tope);\n\tconst sobrantes = resumenes.length - paraElReduce.length;\n\tconst listado = paraElReduce.map((r) => `- ${r.ruta}: ${r.resumen}`).join(\"\\n\");\n\tconst cola = sobrantes > 0 ? `\\n(y ${sobrantes} fichero(s) más, todos con menos cambios)` : \"\";\n\n\tconst bruto = await deps.llamar(\n\t\tPROMPT_REDUCE,\n\t\t`${resumenes.length} fichero(s) cambiados, de más a menos sustancia:\\n\\n${listado}${cola}`,\n\t);\n\tconst mensaje = limpiarMensaje(bruto);\n\tif (mensaje === \"\") {\n\t\tthrow new ErrorDeMensaje(\"modelo\", \"El modelo devolvió un mensaje vacío.\");\n\t}\n\tif (esGenerico(mensaje)) {\n\t\t// Salir con error y no imprimirlo: un titular genérico impreso por stdout\n\t\t// se encadena a `git commit -F -` y queda en la historia para siempre. Es\n\t\t// preferible que el usuario lo escriba a mano sabiendo que lo escribe.\n\t\tthrow new ErrorDeMensaje(\n\t\t\t\"generico\",\n\t\t\t`El titular generado no nombra ningún cambio concreto: \"${mensaje.split(\"\\n\")[0]}\"`,\n\t\t);\n\t}\n\n\treturn { mensaje, resumenes, omitidos: omitidos.map((t) => t.ruta) };\n}\n"]}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mensaje de commit por map-reduce sobre el diff.
|
|
3
|
+
*
|
|
4
|
+
* El problema: un diff grande no cabe en contexto, y meterlo entero recortado
|
|
5
|
+
* da mensajes genéricos («actualiza varios ficheros»), que es exactamente el
|
|
6
|
+
* mensaje que nadie necesita leer porque `git show --stat` ya lo dice mejor.
|
|
7
|
+
*
|
|
8
|
+
* El reparto:
|
|
9
|
+
* - map → un resumen por fichero, en paralelo, cada uno con SU diff entero.
|
|
10
|
+
* - reduce → un mensaje del conjunto a partir de esos resúmenes, ordenados por
|
|
11
|
+
* sustancia para que el cambio de verdad llegue el primero.
|
|
12
|
+
*
|
|
13
|
+
* TRES ESTADOS, NO DOS. En cada paso se distingue «no hay» de «no puedo»:
|
|
14
|
+
* un resumen vacío o una respuesta vacía del modelo NO son «este fichero no
|
|
15
|
+
* cambia nada», son un fallo, y salen como error. Ya nos pasó en `review`:
|
|
16
|
+
* cuatro de cinco ejecuciones sobre un fallo sembrado decían «no ha encontrado
|
|
17
|
+
* nada» cuando lo que había detrás era un 429.
|
|
18
|
+
*/
|
|
19
|
+
import { ordenarPorSustancia, recortar, trocearPorFichero } from "./diff.js";
|
|
20
|
+
export const PROMPT_MAP = `Resumes UN fichero de un diff de git.
|
|
21
|
+
|
|
22
|
+
Devuelve UNA sola línea, en español, con el QUÉ y el POR QUÉ del cambio en ese
|
|
23
|
+
fichero. Nombra lo concreto: la función, la constante, el flag, el endpoint.
|
|
24
|
+
|
|
25
|
+
Prohibido: "varios cambios", "actualizaciones", "mejoras", "refactor" a secas,
|
|
26
|
+
repetir la ruta del fichero sin decir qué cambia dentro.
|
|
27
|
+
|
|
28
|
+
Si el fichero solo cambia formato, imports o números de version, dilo tal cual
|
|
29
|
+
y en corto: eso es informacion util para no ponerlo en el titular.
|
|
30
|
+
|
|
31
|
+
Sin markdown, sin comillas, sin prefijos. Solo la línea.`;
|
|
32
|
+
export const PROMPT_REDUCE = `Escribes el mensaje de commit de un conjunto de cambios.
|
|
33
|
+
|
|
34
|
+
Recibes un resumen por fichero, YA ORDENADOS de más a menos sustancia. El
|
|
35
|
+
primero es el cambio de verdad; el resto suele ser acompañamiento.
|
|
36
|
+
|
|
37
|
+
Formato exacto:
|
|
38
|
+
- Línea 1: titular imperativo, minúsculas, sin punto final, máx. 72 caracteres.
|
|
39
|
+
Tiene que nombrar EL cambio concreto del primer fichero, no el conjunto.
|
|
40
|
+
- Línea 2: en blanco.
|
|
41
|
+
- Cuerpo: por qué se hace, y qué arrastra el resto de ficheros. Líneas de
|
|
42
|
+
máx. 80 caracteres.
|
|
43
|
+
|
|
44
|
+
PROHIBIDO en el titular: "actualiza varios ficheros", "varios cambios",
|
|
45
|
+
"cambios varios", "mejoras varias", "actualiza el proyecto", "wip", "misc",
|
|
46
|
+
o cualquier titular que valdría igual para otro commit distinto.
|
|
47
|
+
|
|
48
|
+
Sin markdown, sin bloques de código, sin encabezados. Solo el mensaje.`;
|
|
49
|
+
/**
|
|
50
|
+
* Titulares que valdrían para cualquier commit.
|
|
51
|
+
*
|
|
52
|
+
* Existe porque la primera puerta de este trabajo es justo esa: sobre un diff
|
|
53
|
+
* de 25 ficheros donde solo uno cambia algo, el mensaje tiene que nombrar el
|
|
54
|
+
* cambio. Sin este detector, «lo nombra» es una opinión sobre la salida del
|
|
55
|
+
* modelo; con él es una comprobación que se ejecuta.
|
|
56
|
+
*/
|
|
57
|
+
const TITULARES_VACIOS = [
|
|
58
|
+
/\bvarios?\s+(ficheros?|archivos?|cambios?|m[oó]dulos?|arreglos?)\b/i,
|
|
59
|
+
/\bcambios?\s+varios\b/i,
|
|
60
|
+
/\bmejoras?\s+varias\b/i,
|
|
61
|
+
/\bactualiza(?:ci[oó]n(?:es)?)?\s+(?:el\s+|del\s+|de\s+)?(?:proyecto|repositorio|c[oó]digo|ficheros?)\b/i,
|
|
62
|
+
/^\s*(wip|misc|varios|updates?|update|fixes|fix|chore|cambios)\s*[:.!]?\s*$/i,
|
|
63
|
+
/\bupdate\s+(several|various|multiple)\b/i,
|
|
64
|
+
];
|
|
65
|
+
/** ¿El titular vale para cualquier commit? */
|
|
66
|
+
export function esGenerico(mensaje) {
|
|
67
|
+
const titular = mensaje.split("\n")[0]?.trim() ?? "";
|
|
68
|
+
if (titular === "")
|
|
69
|
+
return true;
|
|
70
|
+
return TITULARES_VACIOS.some((r) => r.test(titular));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Quita lo que el modelo añade por costumbre: vallas de código y comillas.
|
|
74
|
+
*
|
|
75
|
+
* No toca el contenido. Un mensaje que llega envuelto en ``` sigue siendo el
|
|
76
|
+
* mensaje; rechazarlo por el envoltorio sería fallar por algo que se arregla
|
|
77
|
+
* con dos líneas.
|
|
78
|
+
*/
|
|
79
|
+
export function limpiarMensaje(bruto) {
|
|
80
|
+
let t = bruto.trim();
|
|
81
|
+
const valla = t.match(/^```[a-z]*\n([\s\S]*?)\n?```$/i);
|
|
82
|
+
if (valla)
|
|
83
|
+
t = valla[1].trim();
|
|
84
|
+
// Los dos puntos de "Mensaje de commit:" que a veces se cuela delante.
|
|
85
|
+
t = t.replace(/^(mensaje de commit|commit message)\s*:\s*\n+/i, "");
|
|
86
|
+
return t.trim();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Lanza `tarea` sobre cada elemento con un tope de concurrencia.
|
|
90
|
+
*
|
|
91
|
+
* El tope no es decorativo: el map dispara una llamada por fichero, y sobre 40
|
|
92
|
+
* ficheros sin límite lo que se consigue es un 429 del proveedor — o sea,
|
|
93
|
+
* convertir un diff grande en un fallo garantizado justo cuando map-reduce es
|
|
94
|
+
* más necesario.
|
|
95
|
+
*/
|
|
96
|
+
export async function enParalelo(elementos, tope, tarea) {
|
|
97
|
+
const resultados = new Array(elementos.length);
|
|
98
|
+
let siguiente = 0;
|
|
99
|
+
const obreros = Array.from({ length: Math.min(tope, elementos.length) }, async () => {
|
|
100
|
+
while (siguiente < elementos.length) {
|
|
101
|
+
const i = siguiente++;
|
|
102
|
+
resultados[i] = await tarea(elementos[i], i);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
await Promise.all(obreros);
|
|
106
|
+
return resultados;
|
|
107
|
+
}
|
|
108
|
+
export class ErrorDeMensaje extends Error {
|
|
109
|
+
causa;
|
|
110
|
+
constructor(causa, mensaje) {
|
|
111
|
+
super(mensaje);
|
|
112
|
+
this.name = "ErrorDeMensaje";
|
|
113
|
+
this.causa = causa;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Resumen local de un fichero generado: no vale la pena gastar una llamada. */
|
|
117
|
+
function resumirRuidoEnLocal(t) {
|
|
118
|
+
return `fichero generado (${t.sustancia} líneas con contenido cambiadas); no se ha leído en detalle`;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Map sobre cada fichero, reduce sobre los resúmenes.
|
|
122
|
+
*
|
|
123
|
+
* `llamar` tiene que LANZAR cuando el proveedor falla. Si devolviera "" en vez
|
|
124
|
+
* de lanzar, aquí se leería como «este fichero no cambia nada» y el fallo se
|
|
125
|
+
* colaría hasta el mensaje final: es el patrón exacto que nos costó cuatro
|
|
126
|
+
* revisiones falsamente limpias.
|
|
127
|
+
*/
|
|
128
|
+
export async function generarMensaje(diff, deps) {
|
|
129
|
+
const trozos = ordenarPorSustancia(trocearPorFichero(diff));
|
|
130
|
+
if (trozos.length === 0) {
|
|
131
|
+
// Cero trozos tiene DOS causas, y decirlas igual es el fallo de siempre.
|
|
132
|
+
//
|
|
133
|
+
// Sin texto no hay nada que describir. Pero si han llegado 3 KB y aun así
|
|
134
|
+
// no sale ni una cabecera `diff --git `, lo que pasa es que no sabemos leer
|
|
135
|
+
// ese formato, y decir «el diff no contiene ningún fichero» sobre un índice
|
|
136
|
+
// LLENO es «no puedo» disfrazado de «no hay». Comprobado ejecutando: con
|
|
137
|
+
// `color.ui=always` puesto, `ada-cli commit` sobre dos ficheros staged
|
|
138
|
+
// contestaba exactamente eso. Los cuatro ajustes que lo provocaban los
|
|
139
|
+
// apaga ya `diffDelIndice`; esto es la red por si aparece un quinto.
|
|
140
|
+
if (diff.trim() === "") {
|
|
141
|
+
throw new ErrorDeMensaje("diff-vacio", "El diff no contiene ningún fichero.");
|
|
142
|
+
}
|
|
143
|
+
throw new ErrorDeMensaje("diff-ilegible", `Hay diff (${diff.length} caracteres) pero no se ha reconocido ninguna cabecera 'diff --git'. ` +
|
|
144
|
+
"Suele ser configuración de git que cambia el formato: color.ui, GIT_EXTERNAL_DIFF o un diff.external.");
|
|
145
|
+
}
|
|
146
|
+
const tope = deps.maxResumenes ?? 40;
|
|
147
|
+
const conSustancia = trozos.filter((t) => !t.ruido);
|
|
148
|
+
// El corte va ANTES del map, no después.
|
|
149
|
+
//
|
|
150
|
+
// Estaba después: sobre 200 ficheros se pedían 200 resúmenes y se tiraban
|
|
151
|
+
// 160 sin mirarlos. Además de pagarlos, cada uno era una oportunidad de matar
|
|
152
|
+
// el comando entero —un resumen vacío lanza— justo en el caso para el que
|
|
153
|
+
// existe map-reduce. Como `trozos` ya viene ordenado por sustancia, los que
|
|
154
|
+
// se quedan fuera son los que menos cambian.
|
|
155
|
+
const aResumir = conSustancia.slice(0, tope);
|
|
156
|
+
const sinMirar = conSustancia.slice(tope);
|
|
157
|
+
const omitidos = trozos.filter((t) => t.ruido);
|
|
158
|
+
const resumidos = await enParalelo(aResumir, deps.tope ?? 6, async (t) => {
|
|
159
|
+
const salida = await deps.llamar(PROMPT_MAP, `Fichero: ${t.ruta}\n\n${recortar(t.diff)}`);
|
|
160
|
+
const resumen = salida.trim();
|
|
161
|
+
if (resumen === "") {
|
|
162
|
+
// Un resumen vacío NO es «este fichero no cambia nada»: el fichero está
|
|
163
|
+
// en el diff, luego cambia. Es que no se ha podido resumir.
|
|
164
|
+
throw new ErrorDeMensaje("modelo", `El modelo devolvió un resumen vacío para ${t.ruta}.`);
|
|
165
|
+
}
|
|
166
|
+
return { ruta: t.ruta, sustancia: t.sustancia, ruido: false, resumen };
|
|
167
|
+
});
|
|
168
|
+
const resumenes = [
|
|
169
|
+
...resumidos,
|
|
170
|
+
...omitidos.map((t) => ({
|
|
171
|
+
ruta: t.ruta,
|
|
172
|
+
sustancia: t.sustancia,
|
|
173
|
+
ruido: true,
|
|
174
|
+
resumen: resumirRuidoEnLocal(t),
|
|
175
|
+
})),
|
|
176
|
+
// Los que se quedaron fuera del tope se listan diciendo QUE NO SE HAN
|
|
177
|
+
// MIRADO. Callarlos dejaría un `--detalle` que enseña 40 ficheros de un
|
|
178
|
+
// commit de 200 y se lee como si fueran todos: «no lo he mirado» contado
|
|
179
|
+
// como «no hay nada que contar».
|
|
180
|
+
...sinMirar.map((t) => ({
|
|
181
|
+
ruta: t.ruta,
|
|
182
|
+
sustancia: t.sustancia,
|
|
183
|
+
ruido: false,
|
|
184
|
+
resumen: `no se ha resumido: por debajo del tope de ${tope} ficheros`,
|
|
185
|
+
})),
|
|
186
|
+
];
|
|
187
|
+
// El corte se hace por la cola, que ya está ordenada por sustancia: si sobran
|
|
188
|
+
// resúmenes, los que se caen son los que menos cambian. Cortar por delante o
|
|
189
|
+
// alfabéticamente es como se pierde justo el fichero que importa.
|
|
190
|
+
const paraElReduce = resumenes.slice(0, tope);
|
|
191
|
+
const sobrantes = resumenes.length - paraElReduce.length;
|
|
192
|
+
const listado = paraElReduce.map((r) => `- ${r.ruta}: ${r.resumen}`).join("\n");
|
|
193
|
+
const cola = sobrantes > 0 ? `\n(y ${sobrantes} fichero(s) más, todos con menos cambios)` : "";
|
|
194
|
+
const bruto = await deps.llamar(PROMPT_REDUCE, `${resumenes.length} fichero(s) cambiados, de más a menos sustancia:\n\n${listado}${cola}`);
|
|
195
|
+
const mensaje = limpiarMensaje(bruto);
|
|
196
|
+
if (mensaje === "") {
|
|
197
|
+
throw new ErrorDeMensaje("modelo", "El modelo devolvió un mensaje vacío.");
|
|
198
|
+
}
|
|
199
|
+
if (esGenerico(mensaje)) {
|
|
200
|
+
// Salir con error y no imprimirlo: un titular genérico impreso por stdout
|
|
201
|
+
// se encadena a `git commit -F -` y queda en la historia para siempre. Es
|
|
202
|
+
// preferible que el usuario lo escriba a mano sabiendo que lo escribe.
|
|
203
|
+
throw new ErrorDeMensaje("generico", `El titular generado no nombra ningún cambio concreto: "${mensaje.split("\n")[0]}"`);
|
|
204
|
+
}
|
|
205
|
+
return { mensaje, resumenes, omitidos: omitidos.map((t) => t.ruta) };
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=mensaje.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mensaje.js","sourceRoot":"","sources":["../../../src/core/commit/mensaje.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Mensaje de commit por map-reduce sobre el diff.\n *\n * El problema: un diff grande no cabe en contexto, y meterlo entero recortado\n * da mensajes genéricos («actualiza varios ficheros»), que es exactamente el\n * mensaje que nadie necesita leer porque `git show --stat` ya lo dice mejor.\n *\n * El reparto:\n * - map → un resumen por fichero, en paralelo, cada uno con SU diff entero.\n * - reduce → un mensaje del conjunto a partir de esos resúmenes, ordenados por\n * sustancia para que el cambio de verdad llegue el primero.\n *\n * TRES ESTADOS, NO DOS. En cada paso se distingue «no hay» de «no puedo»:\n * un resumen vacío o una respuesta vacía del modelo NO son «este fichero no\n * cambia nada», son un fallo, y salen como error. Ya nos pasó en `review`:\n * cuatro de cinco ejecuciones sobre un fallo sembrado decían «no ha encontrado\n * nada» cuando lo que había detrás era un 429.\n */\n\nimport { ordenarPorSustancia, recortar, type TrozoDeFichero, trocearPorFichero } from \"./diff.ts\";\n\nexport const PROMPT_MAP = `Resumes UN fichero de un diff de git.\n\nDevuelve UNA sola línea, en español, con el QUÉ y el POR QUÉ del cambio en ese\nfichero. Nombra lo concreto: la función, la constante, el flag, el endpoint.\n\nProhibido: \"varios cambios\", \"actualizaciones\", \"mejoras\", \"refactor\" a secas,\nrepetir la ruta del fichero sin decir qué cambia dentro.\n\nSi el fichero solo cambia formato, imports o números de version, dilo tal cual\ny en corto: eso es informacion util para no ponerlo en el titular.\n\nSin markdown, sin comillas, sin prefijos. Solo la línea.`;\n\nexport const PROMPT_REDUCE = `Escribes el mensaje de commit de un conjunto de cambios.\n\nRecibes un resumen por fichero, YA ORDENADOS de más a menos sustancia. El\nprimero es el cambio de verdad; el resto suele ser acompañamiento.\n\nFormato exacto:\n - Línea 1: titular imperativo, minúsculas, sin punto final, máx. 72 caracteres.\n Tiene que nombrar EL cambio concreto del primer fichero, no el conjunto.\n - Línea 2: en blanco.\n - Cuerpo: por qué se hace, y qué arrastra el resto de ficheros. Líneas de\n máx. 80 caracteres.\n\nPROHIBIDO en el titular: \"actualiza varios ficheros\", \"varios cambios\",\n\"cambios varios\", \"mejoras varias\", \"actualiza el proyecto\", \"wip\", \"misc\",\no cualquier titular que valdría igual para otro commit distinto.\n\nSin markdown, sin bloques de código, sin encabezados. Solo el mensaje.`;\n\n/**\n * Titulares que valdrían para cualquier commit.\n *\n * Existe porque la primera puerta de este trabajo es justo esa: sobre un diff\n * de 25 ficheros donde solo uno cambia algo, el mensaje tiene que nombrar el\n * cambio. Sin este detector, «lo nombra» es una opinión sobre la salida del\n * modelo; con él es una comprobación que se ejecuta.\n */\nconst TITULARES_VACIOS = [\n\t/\\bvarios?\\s+(ficheros?|archivos?|cambios?|m[oó]dulos?|arreglos?)\\b/i,\n\t/\\bcambios?\\s+varios\\b/i,\n\t/\\bmejoras?\\s+varias\\b/i,\n\t/\\bactualiza(?:ci[oó]n(?:es)?)?\\s+(?:el\\s+|del\\s+|de\\s+)?(?:proyecto|repositorio|c[oó]digo|ficheros?)\\b/i,\n\t/^\\s*(wip|misc|varios|updates?|update|fixes|fix|chore|cambios)\\s*[:.!]?\\s*$/i,\n\t/\\bupdate\\s+(several|various|multiple)\\b/i,\n];\n\n/** ¿El titular vale para cualquier commit? */\nexport function esGenerico(mensaje: string): boolean {\n\tconst titular = mensaje.split(\"\\n\")[0]?.trim() ?? \"\";\n\tif (titular === \"\") return true;\n\treturn TITULARES_VACIOS.some((r) => r.test(titular));\n}\n\n/**\n * Quita lo que el modelo añade por costumbre: vallas de código y comillas.\n *\n * No toca el contenido. Un mensaje que llega envuelto en ``` sigue siendo el\n * mensaje; rechazarlo por el envoltorio sería fallar por algo que se arregla\n * con dos líneas.\n */\nexport function limpiarMensaje(bruto: string): string {\n\tlet t = bruto.trim();\n\tconst valla = t.match(/^```[a-z]*\\n([\\s\\S]*?)\\n?```$/i);\n\tif (valla) t = valla[1].trim();\n\t// Los dos puntos de \"Mensaje de commit:\" que a veces se cuela delante.\n\tt = t.replace(/^(mensaje de commit|commit message)\\s*:\\s*\\n+/i, \"\");\n\treturn t.trim();\n}\n\n/**\n * Lanza `tarea` sobre cada elemento con un tope de concurrencia.\n *\n * El tope no es decorativo: el map dispara una llamada por fichero, y sobre 40\n * ficheros sin límite lo que se consigue es un 429 del proveedor — o sea,\n * convertir un diff grande en un fallo garantizado justo cuando map-reduce es\n * más necesario.\n */\nexport async function enParalelo<T, R>(elementos: T[], tope: number, tarea: (e: T, i: number) => Promise<R>) {\n\tconst resultados = new Array<R>(elementos.length);\n\tlet siguiente = 0;\n\tconst obreros = Array.from({ length: Math.min(tope, elementos.length) }, async () => {\n\t\twhile (siguiente < elementos.length) {\n\t\t\tconst i = siguiente++;\n\t\t\tresultados[i] = await tarea(elementos[i], i);\n\t\t}\n\t});\n\tawait Promise.all(obreros);\n\treturn resultados;\n}\n\n/** Lo que el CLI inyecta para poder probar todo esto sin red. */\nexport interface DependenciasMensaje {\n\t/** Una llamada al modelo. Debe LANZAR si falla; devolver \"\" es un fallo. */\n\tllamar: (sistema: string, usuario: string) => Promise<string>;\n\t/** Llamadas simultáneas del map. */\n\ttope?: number;\n\t/** Cuántos resúmenes entran al reduce. Los de más sustancia primero. */\n\tmaxResumenes?: number;\n}\n\nexport interface ResumenDeFichero {\n\truta: string;\n\tsustancia: number;\n\truido: boolean;\n\tresumen: string;\n}\n\nexport interface MensajeGenerado {\n\tmensaje: string;\n\tresumenes: ResumenDeFichero[];\n\t/** Ficheros que NO se le pasaron al modelo por ser generados. */\n\tomitidos: string[];\n}\n\n/**\n * Fallo con nombre. El CLI necesita distinguir «el índice está vacío» de «el\n * modelo se cayó» para elegir el código de salida y el texto, y una cadena\n * dentro de un Error genérico obliga a leer prosa para tomar esa decisión.\n */\nexport type CausaDeFallo = \"diff-vacio\" | \"diff-ilegible\" | \"modelo\" | \"generico\";\n\nexport class ErrorDeMensaje extends Error {\n\treadonly causa: CausaDeFallo;\n\tconstructor(causa: CausaDeFallo, mensaje: string) {\n\t\tsuper(mensaje);\n\t\tthis.name = \"ErrorDeMensaje\";\n\t\tthis.causa = causa;\n\t}\n}\n\n/** Resumen local de un fichero generado: no vale la pena gastar una llamada. */\nfunction resumirRuidoEnLocal(t: TrozoDeFichero): string {\n\treturn `fichero generado (${t.sustancia} líneas con contenido cambiadas); no se ha leído en detalle`;\n}\n\n/**\n * Map sobre cada fichero, reduce sobre los resúmenes.\n *\n * `llamar` tiene que LANZAR cuando el proveedor falla. Si devolviera \"\" en vez\n * de lanzar, aquí se leería como «este fichero no cambia nada» y el fallo se\n * colaría hasta el mensaje final: es el patrón exacto que nos costó cuatro\n * revisiones falsamente limpias.\n */\nexport async function generarMensaje(diff: string, deps: DependenciasMensaje): Promise<MensajeGenerado> {\n\tconst trozos = ordenarPorSustancia(trocearPorFichero(diff));\n\tif (trozos.length === 0) {\n\t\t// Cero trozos tiene DOS causas, y decirlas igual es el fallo de siempre.\n\t\t//\n\t\t// Sin texto no hay nada que describir. Pero si han llegado 3 KB y aun así\n\t\t// no sale ni una cabecera `diff --git `, lo que pasa es que no sabemos leer\n\t\t// ese formato, y decir «el diff no contiene ningún fichero» sobre un índice\n\t\t// LLENO es «no puedo» disfrazado de «no hay». Comprobado ejecutando: con\n\t\t// `color.ui=always` puesto, `ada-cli commit` sobre dos ficheros staged\n\t\t// contestaba exactamente eso. Los cuatro ajustes que lo provocaban los\n\t\t// apaga ya `diffDelIndice`; esto es la red por si aparece un quinto.\n\t\tif (diff.trim() === \"\") {\n\t\t\tthrow new ErrorDeMensaje(\"diff-vacio\", \"El diff no contiene ningún fichero.\");\n\t\t}\n\t\tthrow new ErrorDeMensaje(\n\t\t\t\"diff-ilegible\",\n\t\t\t`Hay diff (${diff.length} caracteres) pero no se ha reconocido ninguna cabecera 'diff --git'. ` +\n\t\t\t\t\"Suele ser configuración de git que cambia el formato: color.ui, GIT_EXTERNAL_DIFF o un diff.external.\",\n\t\t);\n\t}\n\n\tconst tope = deps.maxResumenes ?? 40;\n\tconst conSustancia = trozos.filter((t) => !t.ruido);\n\t// El corte va ANTES del map, no después.\n\t//\n\t// Estaba después: sobre 200 ficheros se pedían 200 resúmenes y se tiraban\n\t// 160 sin mirarlos. Además de pagarlos, cada uno era una oportunidad de matar\n\t// el comando entero —un resumen vacío lanza— justo en el caso para el que\n\t// existe map-reduce. Como `trozos` ya viene ordenado por sustancia, los que\n\t// se quedan fuera son los que menos cambian.\n\tconst aResumir = conSustancia.slice(0, tope);\n\tconst sinMirar = conSustancia.slice(tope);\n\tconst omitidos = trozos.filter((t) => t.ruido);\n\n\tconst resumidos = await enParalelo(aResumir, deps.tope ?? 6, async (t) => {\n\t\tconst salida = await deps.llamar(PROMPT_MAP, `Fichero: ${t.ruta}\\n\\n${recortar(t.diff)}`);\n\t\tconst resumen = salida.trim();\n\t\tif (resumen === \"\") {\n\t\t\t// Un resumen vacío NO es «este fichero no cambia nada»: el fichero está\n\t\t\t// en el diff, luego cambia. Es que no se ha podido resumir.\n\t\t\tthrow new ErrorDeMensaje(\"modelo\", `El modelo devolvió un resumen vacío para ${t.ruta}.`);\n\t\t}\n\t\treturn { ruta: t.ruta, sustancia: t.sustancia, ruido: false, resumen };\n\t});\n\n\tconst resumenes: ResumenDeFichero[] = [\n\t\t...resumidos,\n\t\t...omitidos.map((t) => ({\n\t\t\truta: t.ruta,\n\t\t\tsustancia: t.sustancia,\n\t\t\truido: true,\n\t\t\tresumen: resumirRuidoEnLocal(t),\n\t\t})),\n\t\t// Los que se quedaron fuera del tope se listan diciendo QUE NO SE HAN\n\t\t// MIRADO. Callarlos dejaría un `--detalle` que enseña 40 ficheros de un\n\t\t// commit de 200 y se lee como si fueran todos: «no lo he mirado» contado\n\t\t// como «no hay nada que contar».\n\t\t...sinMirar.map((t) => ({\n\t\t\truta: t.ruta,\n\t\t\tsustancia: t.sustancia,\n\t\t\truido: false,\n\t\t\tresumen: `no se ha resumido: por debajo del tope de ${tope} ficheros`,\n\t\t})),\n\t];\n\n\t// El corte se hace por la cola, que ya está ordenada por sustancia: si sobran\n\t// resúmenes, los que se caen son los que menos cambian. Cortar por delante o\n\t// alfabéticamente es como se pierde justo el fichero que importa.\n\tconst paraElReduce = resumenes.slice(0, tope);\n\tconst sobrantes = resumenes.length - paraElReduce.length;\n\tconst listado = paraElReduce.map((r) => `- ${r.ruta}: ${r.resumen}`).join(\"\\n\");\n\tconst cola = sobrantes > 0 ? `\\n(y ${sobrantes} fichero(s) más, todos con menos cambios)` : \"\";\n\n\tconst bruto = await deps.llamar(\n\t\tPROMPT_REDUCE,\n\t\t`${resumenes.length} fichero(s) cambiados, de más a menos sustancia:\\n\\n${listado}${cola}`,\n\t);\n\tconst mensaje = limpiarMensaje(bruto);\n\tif (mensaje === \"\") {\n\t\tthrow new ErrorDeMensaje(\"modelo\", \"El modelo devolvió un mensaje vacío.\");\n\t}\n\tif (esGenerico(mensaje)) {\n\t\t// Salir con error y no imprimirlo: un titular genérico impreso por stdout\n\t\t// se encadena a `git commit -F -` y queda en la historia para siempre. Es\n\t\t// preferible que el usuario lo escriba a mano sabiendo que lo escribe.\n\t\tthrow new ErrorDeMensaje(\n\t\t\t\"generico\",\n\t\t\t`El titular generado no nombra ningún cambio concreto: \"${mensaje.split(\"\\n\")[0]}\"`,\n\t\t);\n\t}\n\n\treturn { mensaje, resumenes, omitidos: omitidos.map((t) => t.ruta) };\n}\n"]}
|