xonecode 0.38.44 → 0.39.4
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/apps/web/dist/assets/{EditorDeFichero-BeWDctgN.js → EditorDeFichero-4HFwLke_.js} +1 -1
- package/apps/web/dist/assets/index-C57A_ylS.css +1 -0
- package/apps/web/dist/assets/index-CYZEmLsX.js +506 -0
- package/apps/web/dist/assets/{php-D3QdOnb8.js → php-CdQiFsq1.js} +1 -1
- package/apps/web/dist/assets/{ruby-DDAcW-Z2.js → ruby-3JrCXo0h.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/cloudstudio/cloudstudioClient.d.ts +29 -0
- package/dist/agent/cloudstudio/cloudstudioMcp.d.ts +414 -0
- package/dist/agent/cloudstudio/conexionDeServidor.d.ts +37 -0
- package/dist/agent/cloudstudio/conexionDeServidor.js +63 -0
- package/dist/agent/cloudstudio/conexionDeServidor.js.map +1 -0
- package/dist/agent/cloudstudio/crearRama.d.ts +15 -0
- package/dist/agent/cloudstudio/crearRama.js +16 -0
- package/dist/agent/cloudstudio/crearRama.js.map +1 -0
- package/dist/agent/cloudstudio/descarga.d.ts +44 -0
- package/dist/agent/cloudstudio/manifiesto.d.ts +25 -0
- package/dist/agent/cloudstudio/ramaActiva.d.ts +24 -0
- package/dist/agent/cloudstudio/subida.d.ts +61 -0
- package/dist/agent/cloudstudio/subida.js +7 -1
- package/dist/agent/cloudstudio/subida.js.map +1 -1
- package/dist/agent/cloudstudio/validarTrasDescarga.d.ts +13 -0
- package/dist/agent/cloudstudio/zip.d.ts +13 -0
- package/dist/agent/conectores/conectoresEnDisco.d.ts +47 -0
- package/dist/agent/conectores/gestorJira.d.ts +50 -0
- package/dist/agent/conectores/gestorNotion.d.ts +45 -0
- package/dist/agent/conectores/proveedorDeConector.d.ts +43 -0
- package/dist/agent/conectores/servicioDeConectores.d.ts +112 -0
- package/dist/agent/config/authEnDisco.d.ts +43 -0
- package/dist/agent/config/catalogoModelos.d.ts +79 -0
- package/dist/agent/config/configEnDisco.d.ts +235 -0
- package/dist/agent/config/crearProyecto.d.ts +20 -0
- package/dist/agent/config/diagnosticoDeNodeEnMaquina.d.ts +44 -0
- package/dist/agent/config/ecoDeRazonamiento.d.ts +104 -0
- package/dist/agent/config/entorno.d.ts +83 -0
- package/dist/agent/config/fuentesEnRed.d.ts +12 -0
- package/dist/agent/config/gemini.d.ts +5 -0
- package/dist/agent/config/iconosEnRed.d.ts +10 -0
- package/dist/agent/config/identidadEnDisco.d.ts +27 -0
- package/dist/agent/config/modelos.d.ts +77 -0
- package/dist/agent/config/modelosDeMotor.d.ts +52 -0
- package/dist/agent/config/mudanzaEnDisco.d.ts +99 -0
- package/dist/agent/config/persona.d.ts +1 -0
- package/dist/agent/config/selectorEnMaquina.d.ts +35 -0
- package/dist/agent/config/settingsEnDisco.d.ts +206 -0
- package/dist/agent/config/versionEnDisco.d.ts +17 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.d.ts +60 -0
- package/dist/agent/dispositivos/cajasDeMaqueta.d.ts +61 -0
- package/dist/agent/dispositivos/decodificarImagen.d.ts +21 -0
- package/dist/agent/dispositivos/descargaDeHerramientas.d.ts +44 -0
- package/dist/agent/dispositivos/dispositivosEnMaquina.d.ts +161 -0
- package/dist/agent/dispositivos/geometriaEnDisco.d.ts +17 -0
- package/dist/agent/dispositivos/hotswap.d.ts +194 -0
- package/dist/agent/dispositivos/instalacionEnMaquina.d.ts +156 -0
- package/dist/agent/dispositivos/juezVisual.d.ts +144 -0
- package/dist/agent/dispositivos/lanzamientoEnMaquina.d.ts +197 -0
- package/dist/agent/dispositivos/paqueteDelProyecto.d.ts +28 -0
- package/dist/agent/dispositivos/procesosEnMaquina.d.ts +154 -0
- package/dist/agent/dispositivos/recargaEnAparato.d.ts +30 -0
- package/dist/agent/dispositivos/sensorDeArranque.d.ts +42 -0
- package/dist/agent/exportarPdf.d.ts +72 -0
- package/dist/agent/grafo/aprendido.d.ts +28 -0
- package/dist/agent/grafo/arbolDeProyecto.d.ts +205 -0
- package/dist/agent/grafo/artefactosEnDisco.d.ts +35 -0
- package/dist/agent/grafo/atributosXone.d.ts +31 -0
- package/dist/agent/grafo/buscarIcono.d.ts +32 -0
- package/dist/agent/grafo/busquedaRegex.d.ts +56 -0
- package/dist/agent/grafo/codificacionDelProyecto.d.ts +7 -0
- package/dist/agent/grafo/compararCapturas.d.ts +22 -0
- package/dist/agent/grafo/copiarArtefacto.d.ts +64 -0
- package/dist/agent/grafo/criticaVisual.d.ts +60 -0
- package/dist/agent/grafo/describirImagen.d.ts +79 -0
- package/dist/agent/grafo/diferenciaDeCapturas.d.ts +33 -0
- package/dist/agent/grafo/ejecucionCancelable.d.ts +45 -0
- package/dist/agent/grafo/escriturasEnSerie.d.ts +31 -0
- package/dist/agent/grafo/excluirTools.d.ts +37 -0
- package/dist/agent/grafo/fuentesDeGoogle.d.ts +37 -0
- package/dist/agent/grafo/generarFondoSvg.d.ts +52 -0
- package/dist/agent/grafo/incorporarAdjunto.d.ts +98 -0
- package/dist/agent/grafo/lectorDeReferencias.d.ts +28 -0
- package/dist/agent/grafo/marcarCriteriosDelPlan.d.ts +47 -0
- package/dist/agent/grafo/memoriaDeProyecto.d.ts +15 -0
- package/dist/agent/grafo/navegacionXone.d.ts +60 -0
- package/dist/agent/grafo/opcionesDeFicheros.d.ts +23 -0
- package/dist/agent/grafo/perfiles.d.ts +225 -0
- package/dist/agent/grafo/proyecto.d.ts +450 -0
- package/dist/agent/grafo/skills.d.ts +181 -0
- package/dist/agent/grafo/traerDeLaMaquina.d.ts +60 -0
- package/dist/agent/grafo/unirSecciones.d.ts +20 -0
- package/dist/agent/grafo/validacionXone.d.ts +35 -0
- package/dist/agent/grafo/validarFicheroXone.d.ts +33 -0
- package/dist/agent/grafo/xoneAgent.d.ts +166 -0
- package/dist/agent/motores/motoresLocales.d.ts +87 -0
- package/dist/agent/motores/trueforge/capacidades.d.ts +183 -0
- package/dist/agent/motores/trueforge/convertirAP.d.ts +38 -0
- package/dist/agent/motores/trueforge/detencion.d.ts +70 -0
- package/dist/agent/motores/trueforge/esperas.d.ts +38 -0
- package/dist/agent/motores/trueforge/eventosTrueforge.d.ts +56 -0
- package/dist/agent/motores/trueforge/informesDeHijos.d.ts +48 -0
- package/dist/agent/motores/trueforge/medidaAutomatica.d.ts +37 -0
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.d.ts +60 -0
- package/dist/agent/motores/trueforge/memoriaTrueforge.d.ts +131 -0
- package/dist/agent/motores/trueforge/metricasTrueforge.d.ts +45 -0
- package/dist/agent/motores/trueforge/modeloExterno.d.ts +9 -0
- package/dist/agent/motores/trueforge/modeloLangchain.d.ts +69 -0
- package/dist/agent/motores/trueforge/notas.d.ts +48 -0
- package/dist/agent/motores/trueforge/proponerTareas.d.ts +30 -0
- package/dist/agent/motores/trueforge/recortes.d.ts +47 -0
- package/dist/agent/motores/trueforge/resumenSeguro.d.ts +33 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.d.ts +273 -0
- package/dist/agent/motores/trueforge/skillsTrueforge.d.ts +16 -0
- package/dist/agent/motores/trueforge/toolsDeConectores.d.ts +36 -0
- package/dist/agent/motores/trueforge/toolsDeFichero.d.ts +146 -0
- package/dist/agent/motores/trueforge/toolsPropias.d.ts +38 -0
- package/dist/agent/motores/trueforge/traerDeStitch.d.ts +63 -0
- package/dist/agent/motores/trueforge/trueforge.d.ts +35 -0
- package/dist/agent/navegacion/estilosEnDisco.d.ts +41 -0
- package/dist/agent/navegacion/hechosEnDisco.d.ts +19 -0
- package/dist/agent/navegacion/indiceEnDisco.d.ts +50 -0
- package/dist/agent/navegacion/modeloDeProyecto.d.ts +86 -0
- package/dist/agent/planesEnDisco.d.ts +18 -0
- package/dist/agent/publicarPlan.d.ts +20 -0
- package/dist/agent/raizDelPaquete.d.ts +9 -0
- package/dist/agent/remoto/ngrokEnMaquina.d.ts +44 -0
- package/dist/agent/remoto/puenteWebSocket.d.ts +59 -0
- package/dist/agent/remoto/tunelNgrok.d.ts +31 -0
- package/dist/agent/renombrarSobre.d.ts +14 -0
- package/dist/agent/sesiones/adjuntosDeSesion.d.ts +64 -0
- package/dist/agent/sesiones/baseDeFichero.d.ts +9 -0
- package/dist/agent/sesiones/checkpointer.d.ts +146 -0
- package/dist/agent/sesiones/git.d.ts +66 -0
- package/dist/agent/sesiones/gitSync.d.ts +264 -0
- package/dist/agent/sesiones/memoriaDeHilo.d.ts +4 -0
- package/dist/agent/sesiones/modeloDelCambio.d.ts +7 -0
- package/dist/agent/sesiones/parcheEnTexto.d.ts +9 -0
- package/dist/agent/sesiones/sesionGit.d.ts +155 -0
- package/dist/agent/subagentes/actividadDeCodex.d.ts +8 -0
- package/dist/agent/subagentes/agentesEnDisco.d.ts +198 -0
- package/dist/agent/subagentes/consumoExterno.d.ts +83 -0
- package/dist/agent/subagentes/ejecutableEnWindows.d.ts +53 -0
- package/dist/agent/subagentes/escrituraDeCodex.d.ts +94 -0
- package/dist/agent/subagentes/escrituraDeOpencode.d.ts +67 -0
- package/dist/agent/subagentes/escrituraExterna.d.ts +419 -0
- package/dist/agent/subagentes/pluginDeSkills.d.ts +84 -0
- package/dist/agent/subagentes/subagenteCodex.d.ts +76 -0
- package/dist/agent/subagentes/subagenteExterno.d.ts +169 -0
- package/dist/agent/subagentes/subagenteOpencode.d.ts +126 -0
- package/dist/agent/tareas/aumentador.d.ts +99 -0
- package/dist/agent/tareas/juezDeTarea.d.ts +64 -0
- package/dist/agent/tareas/reflejoEnElGestor.d.ts +38 -0
- package/dist/agent/tareas/sondeoDelGestor.d.ts +49 -0
- package/dist/agent/tareas/tareasEnDisco.d.ts +148 -0
- package/dist/agent/tareas/tareasEnDisco.js +17 -0
- package/dist/agent/tareas/tareasEnDisco.js.map +1 -1
- package/dist/agent/trazaDeErroresEnDisco.d.ts +10 -0
- package/dist/agent/turno/depuracion.d.ts +1 -0
- package/dist/agent/turno/diagnosticoDeTools.d.ts +124 -0
- package/dist/agent/turno/ficherosDelProyecto.d.ts +10 -0
- package/dist/agent/turno/guionizado.d.ts +18 -0
- package/dist/agent/turno/informeDeTraza.d.ts +220 -0
- package/dist/agent/turno/inspectorDePrompt.d.ts +150 -0
- package/dist/agent/turno/instantanea.d.ts +16 -0
- package/dist/agent/turno/interrupts.d.ts +54 -0
- package/dist/agent/turno/juezDelTurnoConModelo.d.ts +26 -0
- package/dist/agent/turno/mensajes.d.ts +23 -0
- package/dist/agent/turno/normalizar.d.ts +15 -0
- package/dist/agent/turno/puente.d.ts +196 -0
- package/dist/agent/turno/registroDeFallos.d.ts +39 -0
- package/dist/agent/turno/resumenDeContexto.d.ts +269 -0
- package/dist/agent/turno/resumenDeTool.d.ts +33 -0
- package/dist/agent/turno/rubrica.d.ts +35 -0
- package/dist/agent/turno/sesionReal.d.ts +89 -0
- package/dist/agent/turno/textoDeTool.d.ts +19 -0
- package/dist/agent/turno/turnoReal.d.ts +210 -0
- package/dist/agent/turno/verificacion.d.ts +85 -0
- package/dist/agent/turno/verificador.d.ts +66 -0
- package/dist/bin.d.ts +2 -0
- package/dist/cli/acuseDeModelo.d.ts +18 -0
- package/dist/cli/aprobar.d.ts +162 -0
- package/dist/cli/config.d.ts +17 -0
- package/dist/cli/consola.d.ts +473 -0
- package/dist/cli/describe.d.ts +7 -0
- package/dist/cli/doctor.d.ts +8 -0
- package/dist/cli/fuentesDeDisco.d.ts +25 -0
- package/dist/cli/main.d.ts +291 -0
- package/dist/cli/markdown.d.ts +126 -0
- package/dist/cli/panel.d.ts +38 -0
- package/dist/cli/podar.d.ts +38 -0
- package/dist/cli/run.d.ts +30 -0
- package/dist/cli/spinner.d.ts +37 -0
- package/dist/cli/stdio.d.ts +94 -0
- package/dist/cli/tema.d.ts +68 -0
- package/dist/cli/tokens.d.ts +16 -0
- package/dist/cli/traza.d.ts +19 -0
- package/dist/cli/tui/app.d.ts +23 -0
- package/dist/cli/tui/aprobarTui.d.ts +46 -0
- package/dist/cli/tui/barra.d.ts +43 -0
- package/dist/cli/tui/correrTui.d.ts +119 -0
- package/dist/cli/tui/entrada.d.ts +14 -0
- package/dist/cli/tui/filas.d.ts +13 -0
- package/dist/cli/tui/logo.d.ts +20 -0
- package/dist/cli/tui/pielTui.d.ts +15 -0
- package/dist/cli/tui/raton.d.ts +68 -0
- package/dist/cli/tui/sidebar.d.ts +63 -0
- package/dist/cli/tui/store.d.ts +102 -0
- package/dist/cli/tui/tarjeta.d.ts +8 -0
- package/dist/cli/tui/temaInk.d.ts +67 -0
- package/dist/cli/tui/transcript.d.ts +32 -0
- package/dist/cli/verify.d.ts +9 -0
- package/dist/cli/wizardInicial.d.ts +59 -0
- package/dist/core/actos.d.ts +437 -0
- package/dist/core/adjuntos.d.ts +77 -0
- package/dist/core/agentes.d.ts +353 -0
- package/dist/core/analisisDeSesion.d.ts +63 -0
- package/dist/core/aprendido.d.ts +41 -0
- package/dist/core/artefactos.d.ts +74 -0
- package/dist/core/atributosXone.d.ts +53 -0
- package/dist/core/bitacora.d.ts +21 -0
- package/dist/core/cloudstudio.d.ts +168 -0
- package/dist/core/codificacion.d.ts +81 -0
- package/dist/core/comandoExterno.d.ts +49 -0
- package/dist/core/compararCapturas.d.ts +136 -0
- package/dist/core/conectores.d.ts +296 -0
- package/dist/core/config.d.ts +148 -0
- package/dist/core/contextos.d.ts +54 -0
- package/dist/core/convertirAP.d.ts +56 -0
- package/dist/core/copiaDeAvd.d.ts +44 -0
- package/dist/core/cssBienFormado.d.ts +22 -0
- package/dist/core/deps.d.ts +28 -0
- package/dist/core/descargas.d.ts +61 -0
- package/dist/core/descripcionDePantalla.d.ts +121 -0
- package/dist/core/descriptoresDeApp.d.ts +108 -0
- package/dist/core/diagnosticoDeNode.d.ts +51 -0
- package/dist/core/diff.d.ts +26 -0
- package/dist/core/diffDeColecciones.d.ts +54 -0
- package/dist/core/disenoVinculado.d.ts +17 -0
- package/dist/core/dispositivoDeSesion.d.ts +22 -0
- package/dist/core/dispositivoElegido.d.ts +17 -0
- package/dist/core/dispositivos.d.ts +469 -0
- package/dist/core/entrega.d.ts +341 -0
- package/dist/core/entrelazar.d.ts +48 -0
- package/dist/core/esfuerzo.d.ts +120 -0
- package/dist/core/esqueleto.d.ts +38 -0
- package/dist/core/estiloMedido.d.ts +70 -0
- package/dist/core/estilos.d.ts +76 -0
- package/dist/core/events.d.ts +218 -0
- package/dist/core/exportacion.d.ts +88 -0
- package/dist/core/fallos.d.ts +79 -0
- package/dist/core/fondosSvg.d.ts +115 -0
- package/dist/core/fotoDeColecciones.d.ts +45 -0
- package/dist/core/fuentes.d.ts +96 -0
- package/dist/core/geometriaDePantalla.d.ts +171 -0
- package/dist/core/gestorDeTareas.d.ts +295 -0
- package/dist/core/hechosDelProyecto.d.ts +70 -0
- package/dist/core/hotswap.d.ts +30 -0
- package/dist/core/iconos.d.ts +86 -0
- package/dist/core/identidadDeProveedor.d.ts +20 -0
- package/dist/core/idiomaDeLaRespuesta.d.ts +26 -0
- package/dist/core/imagenesDeDocumento.d.ts +40 -0
- package/dist/core/jsParaRhino.d.ts +3 -0
- package/dist/core/juezDelTurno.d.ts +95 -0
- package/dist/core/logDeDispositivo.d.ts +67 -0
- package/dist/core/memoria.d.ts +18 -0
- package/dist/core/metodoDeComparacionVisual.d.ts +20 -0
- package/dist/core/modelos.d.ts +198 -0
- package/dist/core/modoDeEscritura.d.ts +155 -0
- package/dist/core/motor.d.ts +43 -0
- package/dist/core/motoresLocales.d.ts +113 -0
- package/dist/core/mudanzaDeWorkspace.d.ts +112 -0
- package/dist/core/navegacion.d.ts +172 -0
- package/dist/core/notify.d.ts +77 -0
- package/dist/core/nucleoXone.d.ts +28 -0
- package/dist/core/panorama.d.ts +68 -0
- package/dist/core/paqueteDeSoporte.d.ts +100 -0
- package/dist/core/planDeSubida.d.ts +56 -0
- package/dist/core/planes.d.ts +53 -0
- package/dist/core/podaDeCheckpoint.d.ts +75 -0
- package/dist/core/ports.d.ts +1034 -0
- package/dist/core/puedeLanzarse.d.ts +181 -0
- package/dist/core/puertosDeAvd.d.ts +59 -0
- package/dist/core/recargaEnCaliente.d.ts +52 -0
- package/dist/core/referenciasDeImagen.d.ts +36 -0
- package/dist/core/remoto.d.ts +76 -0
- package/dist/core/repartoDeEncargo.d.ts +80 -0
- package/dist/core/rubrica.d.ts +78 -0
- package/dist/core/rutaVirtual.d.ts +29 -0
- package/dist/core/selectorDeCarpeta.d.ts +59 -0
- package/dist/core/serieDeEscrituras.d.ts +58 -0
- package/dist/core/settings.d.ts +421 -0
- package/dist/core/shellDeAgente.d.ts +177 -0
- package/dist/core/skills.d.ts +129 -0
- package/dist/core/stitch.d.ts +114 -0
- package/dist/core/tareas.d.ts +412 -0
- package/dist/core/tareasDelPlan.d.ts +123 -0
- package/dist/core/tareasEnElGestor.d.ts +117 -0
- package/dist/core/textos.d.ts +8 -0
- package/dist/core/topeAgotado.d.ts +55 -0
- package/dist/core/traerDeLaMaquina.d.ts +33 -0
- package/dist/core/trazaDeErrores.d.ts +83 -0
- package/dist/core/tunel.d.ts +45 -0
- package/dist/core/turno.d.ts +154 -0
- package/dist/core/validacionDeEscritura.d.ts +95 -0
- package/dist/core/verificacionDeSubida.d.ts +14 -0
- package/dist/core/version.d.ts +35 -0
- package/dist/core/xmlBienFormado.d.ts +23 -0
- package/dist/core/zipDeAdjunto.d.ts +28 -0
- package/dist/core/zipDeSkill.d.ts +74 -0
- package/dist/lib/tareaAutonoma.d.ts +36 -0
- package/dist/lib/tareaAutonoma.js +259 -0
- package/dist/lib/tareaAutonoma.js.map +1 -0
- package/dist/lib.d.ts +31 -0
- package/dist/lib.js +28 -0
- package/dist/lib.js.map +1 -0
- package/dist/vendor/hitl.d.ts +69 -0
- package/dist/vendor/skillLoaders/catalog.d.ts +27 -0
- package/dist/vendor/sqliteSaver.d.ts +22 -0
- package/dist/vendor/tokenTracking.d.ts +22 -0
- package/dist/web/servidor/arranque.d.ts +1372 -0
- package/dist/web/servidor/arranque.js +39 -0
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/consolaDeTarea.d.ts +166 -0
- package/dist/web/servidor/consolaWeb.d.ts +142 -0
- package/dist/web/servidor/corredorDeTareas.d.ts +395 -0
- package/dist/web/servidor/datosDeCierre.d.ts +4 -0
- package/dist/web/servidor/interrupcion.d.ts +39 -0
- package/dist/web/servidor/pielWeb.d.ts +32 -0
- package/dist/web/servidor/puenteRemoto.d.ts +80 -0
- package/dist/web/servidor/servidor.d.ts +53 -0
- package/dist/web/servidor/sesiones.d.ts +342 -0
- package/dist/web/servidor/soporte.d.ts +65 -0
- package/dist/web/servidor/transporte.d.ts +2751 -0
- package/dist/web/servidor/vestibulo.d.ts +952 -0
- package/dist/web/servidor/visorOpenui.d.ts +33 -0
- package/package.json +9 -1
- package/apps/web/dist/assets/index-B-6cDRAV.js +0 -506
- package/apps/web/dist/assets/index-BQdHnRbo.css +0 -1
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El adaptador que lanza un agente de OTRO producto sobre la carpeta del proyecto.
|
|
3
|
+
*
|
|
4
|
+
* Dos motores, y cada uno por su camino porque no se parecen en nada. **Claude Code** va
|
|
5
|
+
* por su SDK oficial (`@anthropic-ai/claude-agent-sdk`) y se le deniegan las escrituras con
|
|
6
|
+
* `canUseTool`, un callback nuestro. **Codex** va por su `app-server --stdio`
|
|
7
|
+
* (`subagenteCodex.ts`), y ahí la denegación la hace el SANDBOX del sistema operativo
|
|
8
|
+
* (`sandbox: "read-only"`) — que es más fuerte, porque no depende de que el modelo colabore.
|
|
9
|
+
* En los dos casos entra una tarea autocontenida y sale la respuesta final, y el hijo es una
|
|
10
|
+
* sesión del producto de verdad: su autenticación, sus ajustes y su modelo.
|
|
11
|
+
*
|
|
12
|
+
* **La escritura se CONCEDE por escritura, una por una.** El SDK trae `canUseTool`, un
|
|
13
|
+
* callback que recibe cada tool con su entrada entera y contesta permitir o denegar. Es
|
|
14
|
+
* asíncrono y corre en NUESTRO proceso, así que se puede esperar ahí a que alguien decida
|
|
15
|
+
* mientras el hijo sigue vivo — y eso es lo que hace innecesario el `interrupt()` de
|
|
16
|
+
* LangGraph, cuyo reanudado reejecuta el nodo y relanzaría el proceso hijo.
|
|
17
|
+
*
|
|
18
|
+
* Tres listas y no dos (`escrituraExterna.ts`): lectura, escritura y denegadas, con lo que
|
|
19
|
+
* no se reconoce denegado igual. Antes era `permitirEscritura || esDeLectura(nombre)`, o sea
|
|
20
|
+
* que el día que se concediera la escritura se concedía TODO — y `Bash` sola basta para
|
|
21
|
+
* escribir el proyecto entero saltándose la política, el diff y las guardas de ruta.
|
|
22
|
+
*
|
|
23
|
+
* El import del SDK es DINÁMICO a propósito: así `npm test` no lo carga nunca —los tests
|
|
24
|
+
* usan el doble del puerto— y una instalación sin el paquete sigue arrancando, con
|
|
25
|
+
* `disponible` contestando que no en vez de reventar al importar.
|
|
26
|
+
*/
|
|
27
|
+
import type { ConsumoExterno, MotorExterno, PeticionExterna, PoliticaDeEscrituraExterna, SubagenteExternoPort, ToolDeUnHijo } from "../../core/ports.js";
|
|
28
|
+
/**
|
|
29
|
+
* La decisión sobre una tool del hijo. **Exportada para poder probarla**: es la regla de
|
|
30
|
+
* seguridad de toda esta integración, y probarla llamando al SDK exigiría lanzar un Claude
|
|
31
|
+
* Code de verdad en `npm test` — que es justo lo que este repo no consiente. Lo único que no
|
|
32
|
+
* es puro son el `realpath` y la lectura del disco, y los dos entran por parámetro.
|
|
33
|
+
*
|
|
34
|
+
* El orden importa y es el conservador:
|
|
35
|
+
* 1. **La clase de la tool** (`claseDeToolExterna`). Lo que no está en las dos listas
|
|
36
|
+
* blancas se deniega, `Bash` y `WebFetch` incluidos y con escritura concedida.
|
|
37
|
+
* 2. **El papel.** Un agente de solo lectura no llega a la política: no hay nada que
|
|
38
|
+
* preguntar sobre una escritura que su `.md` no autoriza.
|
|
39
|
+
* 3. **Las guardas de RUTA del proyecto** (`veredictoDeRuta`), y van ANTES de preguntar:
|
|
40
|
+
* un modal cuyo único final posible es un rechazo enseña a aprobar sin mirar, que es la
|
|
41
|
+
* misma razón por la que `seDetieneEn` no pregunta por un artefacto mal puesto.
|
|
42
|
+
* 4. **La política**, con el diff delante. Y sin política no hay escritura: fail-closed por
|
|
43
|
+
* tipo, el patrón de `core/cloudstudio.ts#PoliticaDeAprobacion`.
|
|
44
|
+
*
|
|
45
|
+
* **Nada de aquí puede lanzar hacia el SDK.** El envoltorio de `correr` atrapa lo que
|
|
46
|
+
* escape y deniega: el comportamiento del SDK ante un `canUseTool` que revienta no está
|
|
47
|
+
* medido, y «no medido» no es una barrera.
|
|
48
|
+
*/
|
|
49
|
+
export declare function decisionDeTool(opciones: {
|
|
50
|
+
nombre: string;
|
|
51
|
+
entrada: Record<string, unknown>;
|
|
52
|
+
peticion: PeticionExterna;
|
|
53
|
+
/** Las del proyecto, para reconocer una vista aplanada. Vacío = ninguna conocida. */
|
|
54
|
+
ficheros: ReadonlySet<string>;
|
|
55
|
+
politica?: PoliticaDeEscrituraExterna;
|
|
56
|
+
/**
|
|
57
|
+
* El del SDK. Si aborta mientras se espera una decisión —el hijo se muere, su propio
|
|
58
|
+
* tope— la respuesta es DENEGAR en el acto en vez de seguir esperando el plazo entero.
|
|
59
|
+
*
|
|
60
|
+
* Sin esto había un «aprobé y no pasó nada»: el hijo ya no está, `pedirAprobacion` sigue
|
|
61
|
+
* esperando hasta diez minutos con el modal delante, la persona aprueba, y lo que resuelve
|
|
62
|
+
* es una promesa que ya nadie lee. Peor que un rechazo, porque se cree que se escribió.
|
|
63
|
+
*/
|
|
64
|
+
signal?: AbortSignal;
|
|
65
|
+
real?: (ruta: string) => string;
|
|
66
|
+
leer?: (ruta: string) => string;
|
|
67
|
+
/** Las carpetas de las skills montadas: la MISMA lista que recibe el hook (`decisionDePreToolUse`). */
|
|
68
|
+
lecturasDeSkills?: readonly string[];
|
|
69
|
+
}): Promise<PermisoDeTool>;
|
|
70
|
+
type Trazar = PeticionExterna["trazar"];
|
|
71
|
+
/** La salida de un `Bash` del hijo, a la traza: el tamaño y el error, si lo hay. Nunca lanza. */
|
|
72
|
+
export declare function trazarSalidaDeBash(entrada: Record<string, unknown>, trazar: Trazar): void;
|
|
73
|
+
/** Una tool del hijo que FALLÓ (`PostToolUseFailure`), a la traza, con su `error`. Nunca lanza. */
|
|
74
|
+
export declare function trazarFalloDeTool(entrada: Record<string, unknown>, trazar: Trazar): void;
|
|
75
|
+
/** Lo que `canUseTool` puede contestar. La forma la pone el SDK; se redeclara para no importarlo. */
|
|
76
|
+
export type PermisoDeTool = {
|
|
77
|
+
behavior: "allow";
|
|
78
|
+
updatedInput?: Record<string, unknown>;
|
|
79
|
+
} | {
|
|
80
|
+
behavior: "deny";
|
|
81
|
+
message: string;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* El adaptador real, con quien autoriza dentro.
|
|
85
|
+
*
|
|
86
|
+
* **Las opciones son obligatorias aunque sus campos no lo sean**, y eso es deliberado: pedir
|
|
87
|
+
* el objeto obliga a pasar por cada llamador el día que esto cambie, y un campo ausente
|
|
88
|
+
* falla CERRADO —sin política no se escribe— en vez de abrir una puerta en silencio. Es la
|
|
89
|
+
* única dirección aceptable para el patrón de fallo que este repo ya ha medido siete veces:
|
|
90
|
+
* una composición que vive en un cierre que los tests doblan.
|
|
91
|
+
*/
|
|
92
|
+
export declare function crearSubagenteExterno(opciones: {
|
|
93
|
+
/**
|
|
94
|
+
* Quién autoriza cada escritura del hijo. Ausente = ninguna escritura, con su motivo.
|
|
95
|
+
*
|
|
96
|
+
* Lo pone quien monta la sesión porque es quien sabe QUIÉN está detrás: una consola de
|
|
97
|
+
* persona pasa su `pedirAprobacion` (el diff y la espera) y una tarea de fondo pasa el
|
|
98
|
+
* suyo, que concede porque la autorización fue crear la tarea. La traducción de uno al
|
|
99
|
+
* otro es `escrituraExterna.ts#politicaDeAprobacionExterna`.
|
|
100
|
+
*/
|
|
101
|
+
aprobarEscritura?: PoliticaDeEscrituraExterna;
|
|
102
|
+
/**
|
|
103
|
+
* Los ficheros del proyecto, para reconocer una vista aplanada (`X.xml` con su `X.xne`).
|
|
104
|
+
*
|
|
105
|
+
* Es una FUNCIÓN y no una lista: el hijo escribe durante el turno, así que una lista
|
|
106
|
+
* congelada al construir la sesión no vería el `.xne` que se acaba de crear — y entonces
|
|
107
|
+
* su `.xml` aplanado dejaría de reconocerse como tal.
|
|
108
|
+
*/
|
|
109
|
+
ficherosDelProyecto?: () => ReadonlySet<string>;
|
|
110
|
+
/**
|
|
111
|
+
* Qué está haciendo el hijo, MIENTRAS lo hace.
|
|
112
|
+
*
|
|
113
|
+
* Existe por un silencio medido en la pantalla del usuario: el hijo corre en otro proceso
|
|
114
|
+
* y ni una de sus tools cruza el stream del grafo, así que entre la línea de delegación y
|
|
115
|
+
* su respuesta final hay minutos sin nada que mirar — y una pantalla quieta se lee como
|
|
116
|
+
* que se ha colgado. Quien lo recibe lo mete en el MISMO flujo de eventos
|
|
117
|
+
* (`core/entrelazar.ts`), para que el colapsador lo agrupe como cualquier otra tool.
|
|
118
|
+
*
|
|
119
|
+
* Se llama desde el hook `PreToolUse`, que es el único punto por el que pasan TODAS: a
|
|
120
|
+
* `canUseTool` no llegan las lecturas, porque un `allow` del hook es una pre-aprobación y
|
|
121
|
+
* el callback ya no se consulta (medido).
|
|
122
|
+
*/
|
|
123
|
+
alUsarTool?: (tool: ToolDeUnHijo) => void;
|
|
124
|
+
/**
|
|
125
|
+
* Lo que el hijo va CONTANDO mientras trabaja, para que se vea que trabaja.
|
|
126
|
+
*
|
|
127
|
+
* Hermano de `alUsarTool` y por el mismo motivo medido, que aquél solo resolvió a medias:
|
|
128
|
+
* entre una tool y la siguiente pueden pasar minutos, y en ese hueco no cruzaba NADA. La
|
|
129
|
+
* narración del hijo es continua y es la única señal de vida que hay.
|
|
130
|
+
*/
|
|
131
|
+
alRazonar?: (texto: string) => void;
|
|
132
|
+
/**
|
|
133
|
+
* Lo que el hijo consumió, al terminar. Los TRES productos lo reportan y hasta ahora se
|
|
134
|
+
* tiraba entero (`agent/subagentes/consumoExterno.ts` explica de dónde sale cada uno).
|
|
135
|
+
*
|
|
136
|
+
* Va por su propio callback y no dentro de la respuesta porque son dos cosas distintas:
|
|
137
|
+
* la respuesta es lo que el especialista contesta, y esto es contabilidad.
|
|
138
|
+
*/
|
|
139
|
+
alConsumir?: (consumo: ConsumoExterno) => void;
|
|
140
|
+
}): SubagenteExternoPort;
|
|
141
|
+
/**
|
|
142
|
+
* Lo que el especialista externo contesta cuando su motor FALLA —no arranca, se agota su tope—.
|
|
143
|
+
*
|
|
144
|
+
* Se devuelve como su respuesta y no se lanza, en los DOS motores que delegan en este puerto: en
|
|
145
|
+
* TrueForge una excepción en el modelo de un hijo se llevaría el turno entero (es la regla de las guardas: un rechazo se DEVUELVE), y el orquestador, que es
|
|
146
|
+
* quien decide qué hacer después, se quedaría sin saber qué pasó. Con esto lee que falló y por qué.
|
|
147
|
+
*
|
|
148
|
+
* **El motivo va SANEADO** (`mensajeSeguro`): el error de un producto que no arranca lleva la ruta
|
|
149
|
+
* de la máquina —«spawn /Users/…/codex ENOENT»—, y este texto lo lee el modelo, sale en el chat y se
|
|
150
|
+
* guarda en el `.jsonl`. Ninguna ruta de la máquina viaja por el cable.
|
|
151
|
+
*/
|
|
152
|
+
export declare function textoDeFalloExterno(motor: MotorExterno, error: unknown): string;
|
|
153
|
+
/**
|
|
154
|
+
* Envuelve `correr` para que los hijos que ESCRIBEN pasen de uno en uno (ver `correr`, arriba);
|
|
155
|
+
* los de solo lectura no esperan a nadie. La cola sigue aunque uno falle: un hijo que revienta no
|
|
156
|
+
* bloquea al siguiente. Extraída y pura para poder probarla sin lanzar ningún producto.
|
|
157
|
+
*/
|
|
158
|
+
export declare function escritoresEnSerie(correr: (peticion: PeticionExterna) => Promise<string>): (peticion: PeticionExterna) => Promise<string>;
|
|
159
|
+
/** Los que están cableados de verdad. Los tres, desde que OpenCode habla por ACP. */
|
|
160
|
+
export declare const MOTORES_CABLEADOS: ReadonlySet<MotorExterno>;
|
|
161
|
+
/**
|
|
162
|
+
* Las vistas aplanadas del proyecto: cada `X.xml` que tiene un `X.xne` al lado.
|
|
163
|
+
*
|
|
164
|
+
* Existe porque OpenCode guarda la LECTURA por PATRÓN y no por código —su permiso de lectura
|
|
165
|
+
* llega sin ruta—, y «un `.xml` con un `.xne` al lado» no es un patrón que se pueda escribir:
|
|
166
|
+
* hay que enumerarlas. En los otros dos motores esto lo decide `esVistaAplanada` en el momento.
|
|
167
|
+
*/
|
|
168
|
+
export declare function vistasAplanadasDe(ficheros: ReadonlySet<string>): string[];
|
|
169
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode como subagente: un turno contra `opencode acp`.
|
|
3
|
+
*
|
|
4
|
+
* **Todo lo de aquí está MEDIDO contra el binario real (opencode 1.18.27, 11-09-2026), no
|
|
5
|
+
* deducido.** De las tres superficies que ofrece —`run --format json`, el servidor HTTP de
|
|
6
|
+
* `serve`, y ACP— se usa **ACP** (Agent Client Protocol): es JSON-RPC 2.0 por línea sobre
|
|
7
|
+
* stdio, o sea el mismo molde que `subagenteCodex.ts`, y es la única de las tres que da un
|
|
8
|
+
* portón de permiso por stdio. `run` no lo tiene y `serve` es otro transporte entero.
|
|
9
|
+
*
|
|
10
|
+
* El baile: `initialize` → `session/new {cwd, mcpServers}` → `session/prompt {sessionId,
|
|
11
|
+
* prompt:[{type:"text"}]}`. Por el camino llegan `session/update` con el razonamiento, el
|
|
12
|
+
* texto, las tools y el consumo, y el agente nos hace peticiones —`session/request_permission`
|
|
13
|
+
* y las `fs/*`—.
|
|
14
|
+
*
|
|
15
|
+
* **Y da MÁS que los otros dos motores**: su petición de permiso trae la ruta y el antes y el
|
|
16
|
+
* después en el MISMO mensaje, así que no hace falta ni registro de items (Codex manda solo un
|
|
17
|
+
* `itemId`) ni parser de hunks. La traducción vive en `escrituraDeOpencode.ts`.
|
|
18
|
+
*
|
|
19
|
+
* ## Las TRES puertas por las que el proyecto podía mandar, y cómo se cierran
|
|
20
|
+
*
|
|
21
|
+
* Esto es lo que decide si esta integración se puede tener, y las tres están medidas contra un
|
|
22
|
+
* proyecto que las llevaba a la vez:
|
|
23
|
+
*
|
|
24
|
+
* 1. **Un `opencode.json` DEL PROYECTO pisa nuestra configuración.** Medido: leyó el `.env` y
|
|
25
|
+
* soltó el secreto, corrió shell y escribió con CERO peticiones de permiso. Ese fichero
|
|
26
|
+
* puede venir de CloudStudio — es la misma amenaza que `settingSources: ["user"]` cierra
|
|
27
|
+
* para Claude Code.
|
|
28
|
+
* 2. **Un PLUGIN del proyecto** (`.opencode/plugin/*.ts`) **ejecuta código arbitrario** dentro
|
|
29
|
+
* del proceso de opencode, y desde ahí engancha sus hooks. Medido con su control: sin la
|
|
30
|
+
* variable corre; con ella, no.
|
|
31
|
+
* 3. **La configuración GLOBAL del usuario también nos pisa**, así que `OPENCODE_CONFIG` es el
|
|
32
|
+
* eslabón débil y no se puede sostener nada encima: alguien con `edit: "allow"` en su
|
|
33
|
+
* `~/.config` mataría la aprobación en silencio.
|
|
34
|
+
*
|
|
35
|
+
* Las tres se cierran con `OPENCODE_CONFIG_DIR` apuntando a una carpeta NUESTRA (que pasa a
|
|
36
|
+
* ser «la global», y por eso gana) más `OPENCODE_DISABLE_PROJECT_CONFIG=1`. Las credenciales
|
|
37
|
+
* del usuario siguen resolviendo: su `auth.json` vive en el directorio de DATOS y no en el de
|
|
38
|
+
* configuración, así que mudar éste no le desautentica. **`OPENCODE_CONFIG` no se usa**, a
|
|
39
|
+
* propósito: es el que pierde.
|
|
40
|
+
*
|
|
41
|
+
* ## Lo que NO se puede guardar, y está declarado
|
|
42
|
+
*
|
|
43
|
+
* **La LECTURA se guarda por PATRÓN y no por código**, que es más flojo que en Claude Code. El
|
|
44
|
+
* motivo está medido: la petición de permiso de un `kind: "read"` llega con `locations: []` y
|
|
45
|
+
* `rawInput: {}` —sin ruta—, así que no hay nada que pasarle a una guarda; la ruta solo aparece
|
|
46
|
+
* en el `tool_call_update` posterior, cuando el permiso ya se concedió. Con `edit` no pasa: ése
|
|
47
|
+
* sí trae ruta y diff. Así que queda entre los otros dos: mejor que Codex, que no puede guardar
|
|
48
|
+
* la lectura de ninguna forma, y peor que Claude Code, donde la decide `veredictoDeLectura`.
|
|
49
|
+
*/
|
|
50
|
+
import type { PeticionExterna, PoliticaDeEscrituraExterna, ToolDeUnHijo } from "../../core/ports.js";
|
|
51
|
+
/**
|
|
52
|
+
* El binario. `OPENCODE_BIN` gana, igual que `CODEX_BIN` en el otro motor. En Windows se resuelve
|
|
53
|
+
* al `.exe` de verdad (`ejecutableParaLanzar`): el `opencode.cmd` de npm no se lanza sin shell.
|
|
54
|
+
*/
|
|
55
|
+
export declare function binarioDeOpencode(): string;
|
|
56
|
+
/** La carpeta de configuración que gobernamos. Fuera del proyecto, a propósito. */
|
|
57
|
+
export declare function carpetaDeConfigDeOpencode(base?: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* La configuración con la que corre el hijo. **Es pura y por eso se puede probar entera.**
|
|
60
|
+
*
|
|
61
|
+
* Lo que deniega, y por qué cada uno:
|
|
62
|
+
* - `bash`: medido, no lo deniega — **le quita la tool**: «No tengo un tool de shell en este
|
|
63
|
+
* entorno». Es el análogo de la lista de tools denegadas del otro motor, y hace falta porque
|
|
64
|
+
* un comando escribe el proyecto entero sin diff que mirar.
|
|
65
|
+
* - `webfetch` y `websearch`: sacan el proyecto de la máquina.
|
|
66
|
+
* - `external_directory`: escribir o leer fuera de la carpeta. Medido contra `/tmp`.
|
|
67
|
+
* - `task`: un hijo suyo sería una segunda superficie de permisos sin medir. Se abrirá cuando
|
|
68
|
+
* se mida, no antes.
|
|
69
|
+
* - `question`: pregunta a una persona que aquí no hay.
|
|
70
|
+
* - `read`: una lista de patrones, porque su permiso no trae la ruta (ver la cabecera). Las
|
|
71
|
+
* **vistas aplanadas entran una a una**, con su ruta, porque «es un `.xml` que tiene un
|
|
72
|
+
* `.xne` al lado» no se puede escribir como un patrón — y si el agente las ve, edita el
|
|
73
|
+
* fichero equivocado y el cambio se pierde en la siguiente compilación.
|
|
74
|
+
* - `edit`: `ask`, que es lo que hace que cada escritura pase por `pedirAprobacion`.
|
|
75
|
+
*/
|
|
76
|
+
export declare function configuracionDeOpencode(opciones: {
|
|
77
|
+
vistasAplanadas?: readonly string[];
|
|
78
|
+
modelo?: string;
|
|
79
|
+
/**
|
|
80
|
+
* Las CARPETAS que contienen skills —la del paquete y la global del usuario—, no una
|
|
81
|
+
* skill suelta. Vacío o ausente = no se emite la clave: una lista vacía en el fichero
|
|
82
|
+
* diría «ninguna», que es lo mismo pero deja escrito un ajuste que nadie puso.
|
|
83
|
+
*/
|
|
84
|
+
skills?: readonly string[];
|
|
85
|
+
}): string;
|
|
86
|
+
/**
|
|
87
|
+
* El mensaje de error del motor, con el SIGUIENTE PASO detrás cuando se sabe cuál es.
|
|
88
|
+
*
|
|
89
|
+
* Medido en la pantalla del usuario: un subagente configurado con un modelo del **tier
|
|
90
|
+
* gratuito** de opencode fallaba dos veces seguidas con «OpenCode's free tier can only be
|
|
91
|
+
* used from within OpenCode», que es exacto y no dice qué hacer — y lo que hay que hacer no
|
|
92
|
+
* se adivina, porque el problema no está en el prompt ni en el proyecto sino en un campo del
|
|
93
|
+
* `.md` del subagente. Es la misma disciplina que `porQueNo` en la tool de navegación: a
|
|
94
|
+
* quien se le dice qué está mal sin decirle cómo se arregla, se lo inventa.
|
|
95
|
+
*
|
|
96
|
+
* **Se reconoce el texto del proveedor y no se traduce ni se sustituye**: el mensaje
|
|
97
|
+
* original se conserva entero, y lo nuestro se AÑADE. Si opencode cambia esa frase, lo que
|
|
98
|
+
* se pierde es el consejo, no el error — que es la dirección segura.
|
|
99
|
+
*
|
|
100
|
+
* Y el remedio **no nombra un modelo concreto**: cuál vale depende de qué credenciales tenga
|
|
101
|
+
* quien lo corre, y proponer uno que él no tiene sería mandarlo a otro callejón.
|
|
102
|
+
*/
|
|
103
|
+
export declare function conRemedio(mensaje: string): string;
|
|
104
|
+
/** ¿Está el binario? Se pregunta lanzándolo, que es la única respuesta que no miente. */
|
|
105
|
+
export declare function opencodeDisponible(): Promise<boolean>;
|
|
106
|
+
export declare function correrOpencode(peticion: PeticionExterna, opciones?: {
|
|
107
|
+
alConsumir?: (consumo: {
|
|
108
|
+
entrada: number;
|
|
109
|
+
salida: number;
|
|
110
|
+
cache: number;
|
|
111
|
+
}) => void;
|
|
112
|
+
aprobar?: PoliticaDeEscrituraExterna;
|
|
113
|
+
ficheros?: () => ReadonlySet<string>;
|
|
114
|
+
/** Las vistas aplanadas del proyecto, con su ruta VIRTUAL, para denegarles la lectura. */
|
|
115
|
+
vistasAplanadas?: () => readonly string[];
|
|
116
|
+
real?: (ruta: string) => string;
|
|
117
|
+
alUsarTool?: (tool: ToolDeUnHijo) => void;
|
|
118
|
+
/** La casa de xonecode. Entra por parámetro porque esto escribe en disco. */
|
|
119
|
+
casa?: string;
|
|
120
|
+
/**
|
|
121
|
+
* El modelo cuando el `.md` no dice ninguno: el de Ajustes → Motores locales, leído en cada
|
|
122
|
+
* encargo. Sin ninguno de los dos, OpenCode elige solo uno de su tier gratuito, que no
|
|
123
|
+
* contesta fuera de su consola (medido). La prueba de Ajustes pasa por aquí igual.
|
|
124
|
+
*/
|
|
125
|
+
modeloPorOmision?: () => string | undefined;
|
|
126
|
+
}): Promise<string>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El AUMENTADOR: convierte la frase de una persona en un encargo que una tarea autónoma
|
|
3
|
+
* pueda ejecutar sola.
|
|
4
|
+
*
|
|
5
|
+
* **Por qué existe, y no es cosmético** (§7 del diseño): es lo que hace que
|
|
6
|
+
* «esperando feedback» sea raro en vez de constante. Una tarea autónoma que arranca de una
|
|
7
|
+
* frase ambigua se bloquea enseguida; una que arranca de un encargo revisado, no. Y en una
|
|
8
|
+
* tarea que va a escribir sin nadie delante, ejecutar algo que nadie ha leído es justo lo que
|
|
9
|
+
* la aprobación existía para evitar — así que el encargo **se le enseña a la persona para que
|
|
10
|
+
* lo edite antes de encolar**, y ese paso es el que ocupa el sitio del diff.
|
|
11
|
+
*
|
|
12
|
+
* Tres reglas, y la tercera es la que gobierna el prompt:
|
|
13
|
+
* - **Entra por PUERTO** (`core/ports.ts#AumentadorPort`) con un `invocar` inyectado, así
|
|
14
|
+
* que `npm test` no le pregunta a ningún modelo. La producción monta `invocarParaAumentar`.
|
|
15
|
+
* - **Usa el papel `trabajo`**, no `rapido`: es una tarea de REDACCIÓN con el proyecto
|
|
16
|
+
* delante, no una clasificación.
|
|
17
|
+
* - **El encargo describe un trabajo que se hace ENTERO sin volver a preguntar** — §0 del
|
|
18
|
+
* diseño: una tarea aplica sus escrituras y la autorización fue el acto de crearla. Un
|
|
19
|
+
* encargo redactado con un paso de aprobación humana por medio describe algo que no existe,
|
|
20
|
+
* y el agente se quedaría esperando a alguien que no está.
|
|
21
|
+
*
|
|
22
|
+
* Y **el fallo es recuperable por diseño**: `ErrorDelAumentador` es un fallo del ENTORNO, y
|
|
23
|
+
* quien lo recoge encola la tarea con el texto original y lo dice. Perder lo que una persona
|
|
24
|
+
* acaba de escribir porque un modelo no contestó sería lo peor que puede hacer esa ventana.
|
|
25
|
+
*/
|
|
26
|
+
import type { AumentadorPort, ModelosPort, Papel, PeticionDeTarea } from "../../core/ports.js";
|
|
27
|
+
/** El papel del aumentador. Redacción con el proyecto delante: `trabajo`. */
|
|
28
|
+
export declare const PAPEL_DEL_AUMENTADOR: Papel;
|
|
29
|
+
/**
|
|
30
|
+
* Cuánto encargo se guarda.
|
|
31
|
+
*
|
|
32
|
+
* De este texto salen tres cosas: el `<textarea>` que una persona edita, el `encargo` que se
|
|
33
|
+
* escribe en el índice de la cola (que lleva ya el encargo entero de cada tarea) y la
|
|
34
|
+
* petición del turno. Un modelo que se venga arriba puede contestar veinte kilobytes de
|
|
35
|
+
* prosa; el tope es generoso porque esto ES un documento con apartados —al contrario que el
|
|
36
|
+
* resumen del juez, que es una frase— pero existe, y cuando muerde se DICE en el propio
|
|
37
|
+
* texto: un encargo cortado en seco parecería que la persona lo dejó a medias.
|
|
38
|
+
*/
|
|
39
|
+
export declare const TOPE_DE_ENCARGO = 8000;
|
|
40
|
+
/**
|
|
41
|
+
* No se pudo PREGUNTAR, o lo que contestó no es un encargo.
|
|
42
|
+
*
|
|
43
|
+
* Es fallo del ENTORNO y no del proyecto —la misma familia que `ErrorDelSimulador` y
|
|
44
|
+
* `ErrorDelJuezDeTarea`—, y es un tipo propio por lo mismo: quien lo recoge tiene que poder
|
|
45
|
+
* distinguirlo para encolar la tarea con el texto original en vez de dar el fallo por un
|
|
46
|
+
* encargo.
|
|
47
|
+
*/
|
|
48
|
+
export declare class ErrorDelAumentador extends Error {
|
|
49
|
+
constructor(motivo: string);
|
|
50
|
+
}
|
|
51
|
+
/** Cómo se le habla al modelo: un papel, un prompt y la RAÍZ con la que resolver el papel. */
|
|
52
|
+
export type InvocarParaAumentar = (papel: Papel, prompt: string, raiz: string) => Promise<string>;
|
|
53
|
+
/**
|
|
54
|
+
* El `invocar` de PRODUCCIÓN, sobre `ModelosPort`.
|
|
55
|
+
*
|
|
56
|
+
* Es hermano de `invocarConModelos` (`agent/tareas/juezDeTarea.ts`) y **no se reutiliza aquél a
|
|
57
|
+
* propósito**: su error dice «no se pudo consultar al juez de QA», que aquí sería falso — y
|
|
58
|
+
* ese mensaje es lo que la ventana de crear le enseña a una persona. Dos frases distintas
|
|
59
|
+
* para dos operaciones distintas; lo que sí es idéntico, porque es la regla del repo, es el
|
|
60
|
+
* reparto entre los dos sitios de envoltura:
|
|
61
|
+
*
|
|
62
|
+
* - **Construir** el modelo del papel falla ANTES de tocar la red y con un mensaje escrito
|
|
63
|
+
* para leerse («falta la credencial para nvidia (NVIDIA_API_KEY); usa /provider nvidia»).
|
|
64
|
+
* Ese mensaje SÍ se conserva: es la única línea que dice qué hacer.
|
|
65
|
+
* - **Llamar** es otra cosa: ahí los SDK devuelven el cuerpo remoto, y ahí van claves
|
|
66
|
+
* redactadas y cabeceras. De esa solo se conserva el NOMBRE del error — la misma regla que
|
|
67
|
+
* `ErrorCatalogoModelos`: nunca la clave ni el cuerpo remoto. No es ser opaco, es no
|
|
68
|
+
* filtrar secretos.
|
|
69
|
+
*/
|
|
70
|
+
export declare function invocarParaAumentar(modelos: ModelosPort): InvocarParaAumentar;
|
|
71
|
+
/**
|
|
72
|
+
* El prompt del aumentador.
|
|
73
|
+
*
|
|
74
|
+
* Lleva la petición, el proyecto y su rama, los adjuntos POR NOMBRE y la memoria del proyecto
|
|
75
|
+
* si existe. **No lleva la raíz** —es una ruta de la máquina, y está en la petición para
|
|
76
|
+
* resolver el papel `trabajo` contra el `config.json` del proyecto, no para el prompt— ni el
|
|
77
|
+
* árbol del proyecto, que sería contexto por gastar en una llamada cuyo trabajo es redactar.
|
|
78
|
+
*
|
|
79
|
+
* Y lo que le PROHÍBE es lo que este repo prohíbe en todas partes: inventarse nada de XOne
|
|
80
|
+
* (lo desconocido no da error, da un bug mudo) y dar por hecho un paso de aprobación humana
|
|
81
|
+
* que ya no existe.
|
|
82
|
+
*/
|
|
83
|
+
export declare function promptDelAumentador(peticion: PeticionDeTarea): string;
|
|
84
|
+
/**
|
|
85
|
+
* El encargo tal como se guarda: sin caracteres de control, acotado, y nunca vacío.
|
|
86
|
+
*
|
|
87
|
+
* **Los saltos de línea y los tabuladores se conservan**, al contrario que en el resumen del
|
|
88
|
+
* juez (`unaFrase`): esto es un documento con apartados que se pinta en un `<textarea>`, no
|
|
89
|
+
* un rótulo de una tarjeta. Lo que se va es el resto de los controles, por lo mismo de
|
|
90
|
+
* siempre — acaban en el cable y en el índice.
|
|
91
|
+
*
|
|
92
|
+
* **Una respuesta vacía es un FALLO y no un encargo.** Encolar con el encargo en blanco
|
|
93
|
+
* mandaría al agente a trabajar sin nada que hacer; y el camino de reserva ya existe y es
|
|
94
|
+
* mejor: el texto original de la persona.
|
|
95
|
+
*/
|
|
96
|
+
export declare function encargoDeTexto(texto: string): string;
|
|
97
|
+
export declare function crearAumentador(opciones: {
|
|
98
|
+
invocar: InvocarParaAumentar;
|
|
99
|
+
}): AumentadorPort;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { JuezDeTareaPort, ModelosPort, Papel } from "../../core/ports.js";
|
|
2
|
+
import type { VeredictoDeTarea } from "../../core/entrega.js";
|
|
3
|
+
/** El papel del juez, y solo del juez. Ver `core/modelos.ts`. */
|
|
4
|
+
export declare const PAPEL_DEL_JUEZ: Papel;
|
|
5
|
+
/**
|
|
6
|
+
* Cuánto resumen se guarda. De aquí sale el `motivo` de la tarea, que se pinta en una
|
|
7
|
+
* tarjeta del kanban y viaja por el cable: 4 KB de prosa de un modelo llenan la columna
|
|
8
|
+
* entera, y este número es del mismo orden que el de `servidorDeImplementacion`, que acota
|
|
9
|
+
* a 60 el nombre que manda un servidor MCP. Aquí se admite más porque es una frase y no un
|
|
10
|
+
* rótulo.
|
|
11
|
+
*/
|
|
12
|
+
export declare const TOPE_DE_RESUMEN = 400;
|
|
13
|
+
/** Cuántos hallazgos del juez se guardan, y cuánto cada uno. Por lo mismo de arriba. */
|
|
14
|
+
export declare const TOPE_DE_HALLAZGOS = 10;
|
|
15
|
+
/**
|
|
16
|
+
* No se pudo PREGUNTAR: no hay modelo, no hay clave, no hay red.
|
|
17
|
+
*
|
|
18
|
+
* Es fallo del entorno y no del proyecto, la misma familia que `ErrorDelSimulador`
|
|
19
|
+
* (`agent/turno/verificador.ts`), y por eso es un tipo propio: quien lo recoge tiene que poder
|
|
20
|
+
* distinguirlo de un veredicto para aparcar la tarea con el motivo correcto.
|
|
21
|
+
*/
|
|
22
|
+
export declare class ErrorDelJuezDeTarea extends Error {
|
|
23
|
+
constructor(motivo: string);
|
|
24
|
+
}
|
|
25
|
+
/** Cómo se le habla al modelo. Un papel y un prompt entran, su texto sale. */
|
|
26
|
+
/**
|
|
27
|
+
* El tercer parámetro es la RAÍZ del proyecto de la tarea, y existe para que el papel
|
|
28
|
+
* `afilado` se resuelva con la precedencia de siempre —proyecto sobre global—. En la consola
|
|
29
|
+
* web nadie rellena `FuentesDeEleccion.proyecto`, así que sin esto un `config.json` de
|
|
30
|
+
* proyecto que apuntara el juez a otro modelo se ignoraba en silencio: un ajuste escrito que
|
|
31
|
+
* no hace nada, que en este repo es peor que no poder ponerlo.
|
|
32
|
+
*/
|
|
33
|
+
export type InvocarModelo = (papel: Papel, prompt: string, raiz: string) => Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* El `invocar` de PRODUCCIÓN, sobre `ModelosPort`.
|
|
36
|
+
*
|
|
37
|
+
* **Dos sitios de envoltura, y la diferencia entre ellos está medida.** Construir el modelo
|
|
38
|
+
* del papel falla ANTES de tocar la red y con un mensaje escrito para leerse: medido contra
|
|
39
|
+
* `agent/config/modelos.ts`, un `afilado` apuntado a un proveedor sin clave lanza «falta la
|
|
40
|
+
* credencial para nvidia (NVIDIA_API_KEY); usa /provider nvidia» —el nuestro— o «Anthropic
|
|
41
|
+
* API key not found» —el del SDK—, y ninguno de los dos lleva nada que no se pueda leer. Ese
|
|
42
|
+
* mensaje SÍ se conserva: es la única línea que dice qué hacer.
|
|
43
|
+
*
|
|
44
|
+
* La LLAMADA es otra cosa: ahí los SDK devuelven el cuerpo remoto, y ahí van claves
|
|
45
|
+
* redactadas y cabeceras («401 Incorrect API key provided: sk-…»). De esa solo se conserva
|
|
46
|
+
* el NOMBRE del error, que es la misma regla que `ErrorCatalogoModelos`: «nunca lleva la
|
|
47
|
+
* clave ni el cuerpo remoto». No es ser opaco, es no filtrar secretos.
|
|
48
|
+
*/
|
|
49
|
+
export declare function invocarConModelos(modelos: ModelosPort): InvocarModelo;
|
|
50
|
+
/**
|
|
51
|
+
* El JSON de la respuesta, tolerando la valla de código.
|
|
52
|
+
*
|
|
53
|
+
* Los modelos contestan «Aquí va: ```json … ```» aunque se les pida solo el JSON, así que
|
|
54
|
+
* se busca el primer `{` y el último `}`. Lo que no parsee no es un error: es un veredicto
|
|
55
|
+
* `indeterminado`, que no es verde.
|
|
56
|
+
*/
|
|
57
|
+
export declare function objetoDe(texto: string): Record<string, unknown> | undefined;
|
|
58
|
+
/** El veredicto tal como se guarda, o `indeterminado` diciendo por qué. */
|
|
59
|
+
export declare function veredictoDeTexto(texto: string): VeredictoDeTarea;
|
|
60
|
+
export declare function crearJuezDeTarea(opciones: {
|
|
61
|
+
invocar: InvocarModelo;
|
|
62
|
+
}): JuezDeTareaPort;
|
|
63
|
+
/** Cuánto de una respuesta del juez sin JSON se apunta: lo justo para ver qué hizo en vez de contestar. */
|
|
64
|
+
export declare const TOPE_DE_RESPUESTA_APUNTADA = 600;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El REFLEJO de una tarea en background en su gestor (Jira, Notion…): cuando cambia de estado, el harness escribe en
|
|
3
|
+
* su ticket —EN CURSO al empezar; comentario de cierre y PROBAR al terminar—. Ver
|
|
4
|
+
* `docs/superpowers/specs/2026-10-15-tareas-desde-el-gestor-design.md`.
|
|
5
|
+
*
|
|
6
|
+
* **Un solo punto de entrada: el `guardar` del almacén.** Hay al menos cinco escritores de estado (el corredor al
|
|
7
|
+
* empezar y al aparcar, la reconciliación del arranque, terminar a mano, parar): engancharse a cada uno se olvida en el
|
|
8
|
+
* sexto. `conReflejoAlGuardar` envuelve el almacén, compara la cola de antes y la de después, y la regla PURA de
|
|
9
|
+
* `core/tareasEnElGestor.ts` dice qué escribir.
|
|
10
|
+
*
|
|
11
|
+
* **Fire-and-forget, con su propio `try`**: quien guarda (el corredor, una ruta) no espera a Jira ni se entera de un
|
|
12
|
+
* fallo. Lo que falla se APUNTA en el ticket de la tarea (`ticket.aviso`) y se pinta en su fila; lo que sale bien
|
|
13
|
+
* borra el aviso anterior. Los reflejos de un MISMO ticket van en cola: «empezar» y «cerrar» no se adelantan.
|
|
14
|
+
*/
|
|
15
|
+
import type { DatosDeCierre, GestorDeTareasPort } from "../../core/gestorDeTareas.js";
|
|
16
|
+
import type { Tarea } from "../../core/tareas.js";
|
|
17
|
+
import { type ReflejoPendiente } from "../../core/tareasEnElGestor.js";
|
|
18
|
+
import type { TareasEnDisco } from "./tareasEnDisco.js";
|
|
19
|
+
/** El almacén con el `guardar` vigilado: lo demás pasa tal cual. */
|
|
20
|
+
export declare function conReflejoAlGuardar(disco: TareasEnDisco, reflejar: (pendientes: ReflejoPendiente[]) => void): TareasEnDisco;
|
|
21
|
+
export interface OpcionesDelReflejo {
|
|
22
|
+
/** El gestor de un conector (la misma fábrica memoizada que usa el panel). */
|
|
23
|
+
gestorDe: (conector: string) => GestorDeTareasPort | undefined;
|
|
24
|
+
/** Lo que lleva el comentario de cierre de ESA tarea (ficheros, commits, verificador, última respuesta). */
|
|
25
|
+
datosDeCierre: (tarea: Tarea) => Promise<DatosDeCierre>;
|
|
26
|
+
/** Apunta (o borra, con `undefined`) el aviso del ticket de una tarea, sin tocar nada más. */
|
|
27
|
+
anotarAviso: (id: string, aviso: string | undefined) => void;
|
|
28
|
+
/** Un error del gestor como texto que puede cruzar el cable (sin correos, sin rutas, recortado). */
|
|
29
|
+
motivoDe: (error: unknown) => string;
|
|
30
|
+
informar?: (texto: string) => void;
|
|
31
|
+
}
|
|
32
|
+
/** La función que recibe `conReflejoAlGuardar`: lanza cada reflejo y devuelve el control en el acto. */
|
|
33
|
+
export declare function crearReflejoEnElGestor(o: OpcionesDelReflejo): ((pendientes: ReflejoPendiente[]) => void) & {
|
|
34
|
+
enCurso: () => Promise<void>;
|
|
35
|
+
};
|
|
36
|
+
/** `anotarAviso` sobre el almacén: relee la cola y cambia SOLO `ticket.aviso` de esa tarea (el estado no se toca, así
|
|
37
|
+
* que no vuelve a disparar ningún reflejo). Una tarea que ya no está (descartada) no se resucita. */
|
|
38
|
+
export declare function anotarAvisoEnElDisco(disco: Pick<TareasEnDisco, "listar" | "guardar">): (id: string, aviso: string | undefined) => void;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { GestorDeTareasPort, VinculoGuardado } from "../../core/gestorDeTareas.js";
|
|
2
|
+
import type { PeticionDeTarea } from "../../core/ports.js";
|
|
3
|
+
import type { TareasEnDisco } from "./tareasEnDisco.js";
|
|
4
|
+
/** Una copia local con su identidad y su vínculo (lo que sale de su `config.json`). */
|
|
5
|
+
export interface CopiaConGestor {
|
|
6
|
+
proyecto: {
|
|
7
|
+
id: string;
|
|
8
|
+
raiz: string;
|
|
9
|
+
nombre: string;
|
|
10
|
+
};
|
|
11
|
+
vinculo: VinculoGuardado;
|
|
12
|
+
}
|
|
13
|
+
/** Lo que pasó en una pasada: lo que se hizo y lo que falló, por ticket. Para «Mirar ahora» y para la traza. */
|
|
14
|
+
export interface ResultadoDelSondeo {
|
|
15
|
+
preparadas: string[];
|
|
16
|
+
lanzadas: string[];
|
|
17
|
+
fallos: {
|
|
18
|
+
clave?: string;
|
|
19
|
+
proyecto: string;
|
|
20
|
+
motivo: string;
|
|
21
|
+
}[];
|
|
22
|
+
}
|
|
23
|
+
export interface OpcionesDelSondeo {
|
|
24
|
+
/** Las copias locales con gestor vinculado. Se relee en cada pasada: el interruptor se cambia con todo en marcha. */
|
|
25
|
+
copias: () => CopiaConGestor[];
|
|
26
|
+
gestorDe: (conector: string) => GestorDeTareasPort | undefined;
|
|
27
|
+
/** El aumentador de «Nueva tarea»: amplía el encargo con el proyecto delante. Sin él, preparar no se hace. */
|
|
28
|
+
augmentar?: (p: {
|
|
29
|
+
texto: string;
|
|
30
|
+
proyecto: CopiaConGestor["proyecto"];
|
|
31
|
+
adjuntos: PeticionDeTarea["adjuntos"];
|
|
32
|
+
}) => Promise<string>;
|
|
33
|
+
/** La cola (la ENVUELTA: lo que se guarda aquí también se refleja en el gestor). */
|
|
34
|
+
cola: Pick<TareasEnDisco, "listar" | "guardar">;
|
|
35
|
+
/** Que el corredor mire la cola: una tarea lanzada arranca en el acto si puede. */
|
|
36
|
+
revisar: () => void;
|
|
37
|
+
/** Si este proceso es el que ejecuta las tareas. Sin cerrojo no se crea nada. */
|
|
38
|
+
esDueño: () => boolean;
|
|
39
|
+
motivoDe: (error: unknown) => string;
|
|
40
|
+
informar?: (texto: string) => void;
|
|
41
|
+
ahora?: () => Date;
|
|
42
|
+
}
|
|
43
|
+
export interface SondeoDelGestor {
|
|
44
|
+
/** Una pasada ya. Si hay otra en marcha, espera a esa y devuelve su resultado. */
|
|
45
|
+
mirar(): Promise<ResultadoDelSondeo>;
|
|
46
|
+
arrancar(): void;
|
|
47
|
+
parar(): void;
|
|
48
|
+
}
|
|
49
|
+
export declare function crearSondeoDelGestor(o: OpcionesDelSondeo): SondeoDelGestor;
|