xonecode 0.38.44 → 0.39.2
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/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 +141 -0
- 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/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
|
@@ -0,0 +1,1034 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Los puertos: todo lo caro entra por aquí, con su doble determinista al lado.
|
|
3
|
+
*
|
|
4
|
+
* La regla dura: los puertos se PASAN al construir, nunca se importan dentro de quien
|
|
5
|
+
* los usa. Es lo que hace que el lazo completo se recorra sin API, sin red y sin
|
|
6
|
+
* CloudStudio — la propiedad que sostiene los tests offline del laboratorio.
|
|
7
|
+
*
|
|
8
|
+
* Este fichero es TypeScript puro: no importa langchain, langgraph, deepagents, MCP,
|
|
9
|
+
* Ink ni React. La frontera está probada en `core/imports.test.ts`.
|
|
10
|
+
*/
|
|
11
|
+
import type { Proveedor } from "./modelos.js";
|
|
12
|
+
import type { ClaseDeTrabajo, Esfuerzo, Pensamiento } from "./esfuerzo.js";
|
|
13
|
+
import type { ConsumoDeTurno, ConsumoPorModelo } from "./actos.js";
|
|
14
|
+
import type { EstadoDeVerificador, VeredictoDeTarea } from "./entrega.js";
|
|
15
|
+
import type { HallazgoDelTurno } from "./events.js";
|
|
16
|
+
import type { LineaDeDiff } from "./diff.js";
|
|
17
|
+
import type { ConectorParaElAgente, ToolConEsquema } from "./conectores.js";
|
|
18
|
+
import { type FamiliaDeFuente, type Peso } from "./fuentes.js";
|
|
19
|
+
import type { ContextoRemoto, EstructuraRemota } from "./cloudstudio.js";
|
|
20
|
+
import type { ComentarioDelGestor, DescripcionDelProyecto, EstadoDelGestor, FichaDelGestor, GestorDeTareasPort, NuevaTareaEnElGestor, OpcionesDePendientes, ProyectoEncontrado, TareaDelGestor, TransicionDelGestor, Vinculo } from "./gestorDeTareas.js";
|
|
21
|
+
/**
|
|
22
|
+
* La marca de «esto es un doble», y por qué es un Symbol y no un booleano.
|
|
23
|
+
*
|
|
24
|
+
* En el harness Python equivalente el flag `verifier_is_stub` no es un campo que alguien
|
|
25
|
+
* rellene: es una propiedad derivada de la CLASE del objeto. La diferencia importa —
|
|
26
|
+
* un booleano se puede olvidar, o poner a false sobre un doble, y entonces los tres
|
|
27
|
+
* avisos de honestidad callan justo cuando más falta hacen.
|
|
28
|
+
*
|
|
29
|
+
* Aquí la traducción fiel es una marca que solo los dobles llevan: un puerto real no
|
|
30
|
+
* puede fingir que no lo es porque no la tiene, y un doble no puede quitársela sin
|
|
31
|
+
* editar su propia definición.
|
|
32
|
+
*/
|
|
33
|
+
export declare const ES_DOBLE: unique symbol;
|
|
34
|
+
/**
|
|
35
|
+
* Acepta objeto O función: en JS una función también es un objeto en tiempo de ejecución
|
|
36
|
+
* y puede llevar una propiedad-symbol igual que cualquier otro. Hace falta para
|
|
37
|
+
* `cli/consola.ts#ejecutarTurnoGuionizado` — un `EjecutorDeTurno` es un tipo función, no
|
|
38
|
+
* una clase con instancia, y es SIEMPRE de pega (todo turno que pasa por ahí usa
|
|
39
|
+
* `new AgenteGuionizado()`), así que la marca vive en la función exportada y no en un
|
|
40
|
+
* booleano en quien la invoca (`web/servidor/vestibulo.ts#volcar`).
|
|
41
|
+
*/
|
|
42
|
+
export declare function esDoble(puerto: unknown): boolean;
|
|
43
|
+
/** Una tool publicada por un servidor MCP, reducida a lo que xonecode necesita. */
|
|
44
|
+
export interface ToolInfo {
|
|
45
|
+
nombre: string;
|
|
46
|
+
descripcion: string;
|
|
47
|
+
/** Coste aproximado en tokens de prompt. Se mide, no se estima. */
|
|
48
|
+
tokens: number;
|
|
49
|
+
}
|
|
50
|
+
export interface CatalogoMcp {
|
|
51
|
+
cloudstudio: ToolInfo[];
|
|
52
|
+
ide: ToolInfo[];
|
|
53
|
+
}
|
|
54
|
+
/** El acceso al proyecto del cliente, que vive en CloudStudio y se habla por MCP. */
|
|
55
|
+
export interface McpPort {
|
|
56
|
+
catalogo(): Promise<CatalogoMcp>;
|
|
57
|
+
invocar(tool: string, args: Record<string, unknown>): Promise<unknown>;
|
|
58
|
+
cerrar(): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
export interface SkillInfo {
|
|
61
|
+
nombre: string;
|
|
62
|
+
descripcion: string;
|
|
63
|
+
tokens: number;
|
|
64
|
+
}
|
|
65
|
+
/** Las skills de XOne: el catálogo y el contenido. */
|
|
66
|
+
export interface SkillsPort {
|
|
67
|
+
catalogo(): SkillInfo[];
|
|
68
|
+
cargar(nombre: string): string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Un agente de otro producto —Claude Code, Codex— corriendo sobre la carpeta del proyecto.
|
|
72
|
+
*
|
|
73
|
+
* Es un PUERTO por la razón de siempre y una más. La de siempre: `npm test` no puede
|
|
74
|
+
* necesitar una clave, una conexión ni un binario instalado, así que lo que lanza un proceso
|
|
75
|
+
* hijo entra por aquí y en los tests entra el doble. La otra: ni `xoneAgent.ts` ni
|
|
76
|
+
* `turnoReal.ts` pueden saber que Claude Code existe, exactamente igual que no saben que
|
|
77
|
+
* existe CloudStudio — las tools remotas no se inyectan en el agente, las ejecuta quien
|
|
78
|
+
* está fuera.
|
|
79
|
+
*
|
|
80
|
+
* **El hijo SÍ puede escribir, y cada escritura pasa por una autorización.** El gancho es
|
|
81
|
+
* `canUseTool` del SDK: recibe la tool con su entrada entera y contesta permitir o denegar,
|
|
82
|
+
* y es **asíncrono y en NUESTRO proceso**, así que se puede esperar ahí a que alguien decida
|
|
83
|
+
* sin que el hijo se entere — que es lo que durante meses pareció imposible. El obstáculo
|
|
84
|
+
* que se declaraba aquí era real pero de otra pieza: el HITL de xonecode son `interrupt()`
|
|
85
|
+
* de LangGraph, y reanudar uno reejecuta el nodo desde el principio, o sea relanzaría el
|
|
86
|
+
* proceso hijo. La salida es no usar `interrupt()` para esto: la decisión se pide por
|
|
87
|
+
* `PoliticaDeEscrituraExterna`, el proceso hijo sigue vivo esperando, y el nodo del grafo
|
|
88
|
+
* no se reejecuta nunca.
|
|
89
|
+
*
|
|
90
|
+
* Lo que NO cambia es la dirección del fallo. Sin política no hay escritura
|
|
91
|
+
* (`agent/subagentes/subagenteExterno.ts` deniega), lo que no se entiende se deniega, y las guardas de
|
|
92
|
+
* ruta del proyecto se vuelven a aplicar sobre la ruta absoluta del hijo
|
|
93
|
+
* (`agent/subagentes/escrituraExterna.ts`): sus `Write`/`Edit` van al disco directos, así que
|
|
94
|
+
* `permisosDe`, el `virtualMode` y las vistas aplanadas no los alcanzan.
|
|
95
|
+
*/
|
|
96
|
+
export interface SubagenteExternoPort {
|
|
97
|
+
/**
|
|
98
|
+
* Si el motor se puede usar de verdad: el paquete está instalado y su CLI existe.
|
|
99
|
+
* Se pregunta ANTES de montarlo para no ofrecerle al orquestador un especialista que va a
|
|
100
|
+
* fallar en cuanto lo elija — un botón muerto, pero en el grafo.
|
|
101
|
+
*/
|
|
102
|
+
disponible(motor: MotorExterno): Promise<boolean>;
|
|
103
|
+
/** Una tarea autocontenida entra, la respuesta final sale. Sin sesión ni continuidad. */
|
|
104
|
+
correr(peticion: PeticionExterna): Promise<string>;
|
|
105
|
+
}
|
|
106
|
+
export type MotorExterno = "claude-code" | "codex" | "opencode";
|
|
107
|
+
/**
|
|
108
|
+
* Lo que un agente EXTERNO consumió en una ejecución, tal y como ÉL lo reporta.
|
|
109
|
+
*
|
|
110
|
+
* Viaja por su propio callback y no dentro de la respuesta porque son dos cosas distintas:
|
|
111
|
+
* la respuesta es lo que el especialista contesta, y esto es contabilidad — la misma razón
|
|
112
|
+
* por la que un artefacto se anuncia por un evento y no dentro del texto.
|
|
113
|
+
*
|
|
114
|
+
* La CACHÉ va aparte de la entrada, igual que en `vendor/tokenTracking.ts`: meterla dentro
|
|
115
|
+
* inflaría la cifra que se enseña, y tenerlas separadas es lo que permite decir la verdad
|
|
116
|
+
* sin tener que elegir una de las dos.
|
|
117
|
+
*/
|
|
118
|
+
export interface ConsumoExterno extends ConsumoDeSesion {
|
|
119
|
+
motor: MotorExterno;
|
|
120
|
+
/**
|
|
121
|
+
* Por modelo, si el motor lo dice (Claude Code trae `modelUsage` por id). Ausente: todo es del
|
|
122
|
+
* modelo que se le PIDIÓ, o del motor si no se pidió ninguno.
|
|
123
|
+
*/
|
|
124
|
+
porModelo?: Record<string, ConsumoDeSesion>;
|
|
125
|
+
}
|
|
126
|
+
/** Tokens de entrada, de salida y de caché. La caché aparte, por lo de arriba. */
|
|
127
|
+
export interface ConsumoDeSesion {
|
|
128
|
+
entrada: number;
|
|
129
|
+
salida: number;
|
|
130
|
+
cache: number;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Lo consumido por una sesión, en DOS cuentas que no se suman entre ellas.
|
|
134
|
+
*
|
|
135
|
+
* `modelo` son los tokens del grafo —contra la clave de API del usuario— y `externo` los de
|
|
136
|
+
* un agente de otro producto —contra su suscripción—. Sumar TOKENS de las dos es defendible
|
|
137
|
+
* (un token es un token); sumar su COSTE no lo es, y tenerlas separadas deja que quien las
|
|
138
|
+
* pinte decida sin tener que mentir en ninguna dirección.
|
|
139
|
+
*/
|
|
140
|
+
export interface ConsumoDeSesionPorCuenta {
|
|
141
|
+
modelo: ConsumoDeSesion;
|
|
142
|
+
externo: ConsumoDeSesion;
|
|
143
|
+
/**
|
|
144
|
+
* Cuánto ocupa la ventana AHORA: la entrada de la ÚLTIMA llamada, no la suma.
|
|
145
|
+
*
|
|
146
|
+
* Va aquí porque viaja con lo demás y cambia en los mismos instantes, pero contesta otra
|
|
147
|
+
* pregunta: los acumulados dicen lo que la sesión HA costado y esto dice cuánto margen
|
|
148
|
+
* queda antes de que el historial desborde — la cifra que avisa de que toca resumir. Es
|
|
149
|
+
* la misma separación que `vendor/tokenTracking.ts` hace entre sus acumulados y
|
|
150
|
+
* `contexto`, y la que la barra del terminal ya pinta como dos cosas.
|
|
151
|
+
*/
|
|
152
|
+
contexto: number;
|
|
153
|
+
/** Lo mismo, por modelo (`core/actos.ts#ConsumoPorModelo`). Ausente = este motor no lo mide. */
|
|
154
|
+
porModelo?: ConsumoPorModelo;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* El consumo vivo de una sesión, en la forma que se PERSISTE (`ConsumoDeTurno`).
|
|
158
|
+
*
|
|
159
|
+
* Son las mismas cifras con otro nombre en la ventana: lo que aquí se llama `contexto` es un
|
|
160
|
+
* nivel que se mide al cerrar el turno, y allí se llama `ventana` porque es lo que ocupaba
|
|
161
|
+
* el historial. Se traduce en una función CON NOMBRE, y no con un literal donde se use, por
|
|
162
|
+
* la razón de siempre en este repo: una regla de producción compuesta dentro de un cierre
|
|
163
|
+
* que los tests doblan deja de estar probada y pasa a estar solo escrita.
|
|
164
|
+
*
|
|
165
|
+
* Copia las cuentas en vez de reenviarlas: lo que se guarda en el `.jsonl` no puede
|
|
166
|
+
* compartir objeto con el tracker vivo, o el siguiente turno lo movería por debajo.
|
|
167
|
+
*
|
|
168
|
+
* **Un `contexto` de cero sale SIN `ventana`**, y no es una comodidad: es la diferencia entre
|
|
169
|
+
* «no se midió» y «midió cero». El ejecutor declara `contexto: number`, así que un turno que no
|
|
170
|
+
* pudo leer la ventana llega con un cero, y estamparlo escribiría en el `.jsonl` una medición
|
|
171
|
+
* que nadie hizo — con una consecuencia concreta: `consumoDeLosActos` se queda con la última
|
|
172
|
+
* ventana que CONSTA, así que ese cero falso borraría el nivel que sí midió el turno anterior,
|
|
173
|
+
* que es justo lo que su regla dice que no puede pasar. Cero no es un nivel: un historial con
|
|
174
|
+
* turnos dentro nunca ocupa nada.
|
|
175
|
+
*/
|
|
176
|
+
export declare function consumoPersistible(c: ConsumoDeSesionPorCuenta): ConsumoDeTurno;
|
|
177
|
+
/**
|
|
178
|
+
* La vuelta: lo que se guardó en un `fin`, en la forma que el cable ya manda.
|
|
179
|
+
*
|
|
180
|
+
* `ventana` ausente —una sesión sin ninguna medición de contexto, o escrita por una versión
|
|
181
|
+
* anterior— vuelve como `contexto: 0`, que es «no consta» y no «cero tokens»: quien pinta ya
|
|
182
|
+
* distingue los dos casos por el `> 0` de siempre, y por eso el cero es la traducción
|
|
183
|
+
* honesta de una ausencia.
|
|
184
|
+
*/
|
|
185
|
+
export declare function consumoDeLaSesion(c: ConsumoDeTurno): ConsumoDeSesionPorCuenta;
|
|
186
|
+
/**
|
|
187
|
+
* Una tool que un agente EXTERNO ha usado, para contarla mientras trabaja
|
|
188
|
+
* (`core/entrelazar.ts`). `agente` es el nombre de su `.md` —el de `PeticionExterna.agente`— y es
|
|
189
|
+
* OBLIGATORIO a propósito: son tres motores los que lo rellenan, y con el campo opcional uno que
|
|
190
|
+
* se lo dejara saldría con todo en verde y sus tools sin dueño.
|
|
191
|
+
*/
|
|
192
|
+
export interface ToolDeUnHijo {
|
|
193
|
+
nombre: string;
|
|
194
|
+
detalle?: string;
|
|
195
|
+
agente: string;
|
|
196
|
+
}
|
|
197
|
+
export interface PeticionExterna {
|
|
198
|
+
/**
|
|
199
|
+
* Escribe en la traza de herramientas (con «Depurar»): cada `Bash` del hijo —pedido, ejecutado, permitido o denegado— y
|
|
200
|
+
* lo que salió, y cada tool denegada con su motivo. Ausente = sin traza. Medido en Windows: «node: command not found»
|
|
201
|
+
* solo se supo por lo que el hijo CONTÓ, no por la traza.
|
|
202
|
+
*/
|
|
203
|
+
trazar?: (datos: Readonly<Record<string, string | number | boolean | undefined>>) => void;
|
|
204
|
+
motor: MotorExterno;
|
|
205
|
+
/** La carpeta del proyecto: el hijo trabaja ahí y en ningún otro sitio. */
|
|
206
|
+
cwd: string;
|
|
207
|
+
/** El prompt del subagente (`core/agentes.ts#promptDeAgente`), con las reglas de XOne. */
|
|
208
|
+
instrucciones: string;
|
|
209
|
+
/** La tarea que le encarga el orquestador. */
|
|
210
|
+
tarea: string;
|
|
211
|
+
/**
|
|
212
|
+
* Con qué modelo del PRODUCTO corre el hijo. Ausente = el que él use por su cuenta.
|
|
213
|
+
*
|
|
214
|
+
* Medido: el SDK de Claude Code acepta `options.model` —y documenta los alias `opus`,
|
|
215
|
+
* `sonnet`, `haiku`, `fable`— y el `ThreadStartParams` de Codex acepta `model`, cuyos
|
|
216
|
+
* valores da su propio `model/list`. Antes esto no se pasaba y el `.md` que lo llevara se
|
|
217
|
+
* rechazaba, con el argumento de que ahí el modelo lo elige el agente; era falso.
|
|
218
|
+
*/
|
|
219
|
+
modelo?: string;
|
|
220
|
+
/**
|
|
221
|
+
* Si el papel de este agente escribe: sale de `soloLectura` de su `.md` y nada más.
|
|
222
|
+
*
|
|
223
|
+
* Es la primera de dos puertas y no la única: con esto en `true`, cada escritura pasa
|
|
224
|
+
* además por la `PoliticaDeEscrituraExterna` de la sesión y por las guardas de ruta. En
|
|
225
|
+
* `false` no se le pregunta a nadie — un agente de solo lectura no propone escrituras.
|
|
226
|
+
*/
|
|
227
|
+
permitirEscritura: boolean;
|
|
228
|
+
/**
|
|
229
|
+
* El nombre del agente, para poder decir QUIÉN pide la escritura.
|
|
230
|
+
*
|
|
231
|
+
* Viaja porque la petición de aprobación lo pinta en su campo `origen`, igual que el
|
|
232
|
+
* `[dev]` que `hitlDe` mete en la descripción de un interrupt: la tool es la misma para
|
|
233
|
+
* todos los especialistas, así que sin esto el diff diría «alguien quiere escribir».
|
|
234
|
+
*/
|
|
235
|
+
agente: string;
|
|
236
|
+
/**
|
|
237
|
+
* La cancelación del turno. Abortada, el motor MATA a su hijo y `correr` rechaza: pulsar Parar
|
|
238
|
+
* no puede dejar un Claude Code o un Codex vivo escribiendo el proyecto con el turno ya
|
|
239
|
+
* cerrado. Opcional: sin ella el hijo acaba por su cuenta o por su tope, que es lo de antes.
|
|
240
|
+
*/
|
|
241
|
+
senal?: AbortSignal;
|
|
242
|
+
/**
|
|
243
|
+
* La EJECUCIÓN que se le concede, solo a un agente con `ejecucion: true` en su `.md` y solo en
|
|
244
|
+
* Claude Code (`core/comandoExterno.ts`). Ausente —cualquier otro— es que `Bash` se deniega.
|
|
245
|
+
*/
|
|
246
|
+
ejecucion?: EjecucionExterna;
|
|
247
|
+
/**
|
|
248
|
+
* Las carpetas de ESTA sesión que el hijo puede LEER aunque no ejecute (artefactos y hotswap): el orquestador le pasa la
|
|
249
|
+
* maqueta y las capturas por ahí. Medido en Maset: un analista sin ellas contestó «no he podido leer la maqueta».
|
|
250
|
+
*/
|
|
251
|
+
lecturas?: readonly string[];
|
|
252
|
+
/**
|
|
253
|
+
* Cuánto razona el hijo: el `esfuerzo` de su `.md`, que Claude Code recibe como `effort`. Medido en Maset: el
|
|
254
|
+
* desarrollador en Opus pasaba 17 de sus 18 minutos generando (razonamiento incluido) y uno usando herramientas.
|
|
255
|
+
* Ausente = el que use Claude Code por su cuenta. Codex y OpenCode no lo reciben.
|
|
256
|
+
*/
|
|
257
|
+
esfuerzo?: Esfuerzo;
|
|
258
|
+
/**
|
|
259
|
+
* Las skills de su `.md` que EXISTEN (`repartirSkills(...).suyas`), por su nombre a secas. Claude Code solo ve y usa
|
|
260
|
+
* éstas (`skills` del SDK, con el prefijo del plugin): sin la lista veía también las del usuario. Ausente = ninguna.
|
|
261
|
+
*/
|
|
262
|
+
skills?: readonly string[];
|
|
263
|
+
}
|
|
264
|
+
/** Lo que un agente externo con ejecución puede correr y leer, y con qué entorno. */
|
|
265
|
+
export interface EjecucionExterna {
|
|
266
|
+
/** Los scripts que puede correr, por su NOMBRE: los ejecutables de sus skills. */
|
|
267
|
+
scripts: readonly string[];
|
|
268
|
+
/**
|
|
269
|
+
* El entorno del hijo: el de NUESTRA shell (`entornoDeShell`) — sin nuestras claves de API, con
|
|
270
|
+
* los `scripts/` en el PATH y las variables de la sesión (artefactos, hotswap, dispositivo).
|
|
271
|
+
* Medido: el Bash de Claude Code lo respeta, y autentica con su login sin la clave.
|
|
272
|
+
*/
|
|
273
|
+
entorno: Record<string, string>;
|
|
274
|
+
/**
|
|
275
|
+
* Las carpetas FUERA del proyecto que puede leer, en disco: las de artefactos y hotswap de ESTA
|
|
276
|
+
* sesión, donde sus scripts dejan las capturas y lo que no cabe. Viven bajo `.xonecode/`, que
|
|
277
|
+
* sigue denegada entera.
|
|
278
|
+
*/
|
|
279
|
+
lecturas: readonly string[];
|
|
280
|
+
/**
|
|
281
|
+
* SOLO en Windows: la ruta de cada script, por su nombre. Allí un script sin extensión no se lanza por su nombre (ni
|
|
282
|
+
* shebang ni bit de ejecución), así que la segunda llave REESCRIBE la llamada a `node '<ruta>' args`
|
|
283
|
+
* (`comandoExterno.ts#comandoConNode`). Medido en una máquina Windows de un usuario: el hijo no tenía ningún script
|
|
284
|
+
* y el `device-controller`, con nuestra shell, sí los corría con `node.exe "<ruta>"`. Ausente fuera de Windows.
|
|
285
|
+
*/
|
|
286
|
+
rutasConNode?: Readonly<Record<string, string>>;
|
|
287
|
+
/** Con `rutasConNode`: el Node ABSOLUTO con que se lanzan (el del servidor), porque en el Git Bash del hijo `node` puede no estar en el PATH. */
|
|
288
|
+
nodeDelServidor?: string;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Una escritura que un agente EXTERNO quiere hacer, tal y como se le enseña a quien decide.
|
|
292
|
+
*
|
|
293
|
+
* La ruta es la VIRTUAL —desde la raíz del proyecto— y no la de la máquina: es la que una
|
|
294
|
+
* persona reconoce y la única que puede viajar por el cable, que puede ir por un túnel.
|
|
295
|
+
*/
|
|
296
|
+
export interface EscrituraExternaPedida {
|
|
297
|
+
agente: string;
|
|
298
|
+
ruta: string;
|
|
299
|
+
/** El antes y el después, ya en líneas. Vacío si no se pudo componer: se pregunta igual. */
|
|
300
|
+
lineas: LineaDeDiff[];
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Quién autoriza una escritura de un agente externo. **Fail-closed por TIPO**, el mismo
|
|
304
|
+
* patrón que `core/cloudstudio.ts#PoliticaDeAprobacion` para la subida: no se puede montar
|
|
305
|
+
* un agente externo que escriba sin decir quién decide, y quien la rellena es una decisión
|
|
306
|
+
* de PIEL y no del motor.
|
|
307
|
+
*
|
|
308
|
+
* Las dos implementaciones existen ya y son las de `pedirAprobacion`, traducidas por
|
|
309
|
+
* `agent/subagentes/escrituraExterna.ts#politicaDeAprobacionExterna`: la interactiva enseña el diff y
|
|
310
|
+
* espera —con plazo, y naciendo rechazada—, y la autónoma de una tarea de fondo concede
|
|
311
|
+
* porque la autorización fue crear la tarea, lo anuncia con los nombres y lo apunta en
|
|
312
|
+
* `Tarea.autorizadas`.
|
|
313
|
+
*
|
|
314
|
+
* **Toma una LISTA y contesta UNA vez, porque hay un motor que decide así.** Medido contra
|
|
315
|
+
* `codex app-server` (0.152.1): un `item/fileChange/requestApproval` puede traer varios
|
|
316
|
+
* ficheros —«añade una línea a uno.txt y a dos.txt» llegó como un solo item con dos
|
|
317
|
+
* `changes`— y se contesta con un único `decision`, o sea que Codex los aplica todos o
|
|
318
|
+
* ninguno. Con una escritura por llamada solo quedaban dos salidas, y las dos mienten:
|
|
319
|
+
* preguntar N veces por algo que no se puede conceder a medias (el humano aprueba el
|
|
320
|
+
* primero, rechaza el segundo, y el primero tampoco se escribe), o enseñar un fichero y
|
|
321
|
+
* escribir dos. `pedirAprobacion` ya era una lista de pendientes con sus dos mapas: la que
|
|
322
|
+
* se quedaba corta era esta. Claude Code pasa la suya de un elemento, que es exactamente lo
|
|
323
|
+
* que su `canUseTool` decide cada vez.
|
|
324
|
+
*
|
|
325
|
+
* **Se concede solo si TODAS vienen aprobadas**: una sola negativa es un NO al conjunto, que
|
|
326
|
+
* es la dirección segura y además la única que el protocolo de Codex sabe expresar.
|
|
327
|
+
*/
|
|
328
|
+
export type PoliticaDeEscrituraExterna = (escrituras: readonly EscrituraExternaPedida[]) => Promise<boolean>;
|
|
329
|
+
export type Papel = "rapido" | "trabajo" | "afilado";
|
|
330
|
+
/**
|
|
331
|
+
* La fábrica de modelos, por PAPEL y no por nombre.
|
|
332
|
+
*
|
|
333
|
+
* Se reparte por papel porque es la palanca de coste: una sola pregunta de solo lectura
|
|
334
|
+
* midió 213.895 tokens de entrada y 11 llamadas al modelo. El papel que corre en TODOS
|
|
335
|
+
* los turnos arranca en `rapido`, y se sube solo con una medición delante.
|
|
336
|
+
*/
|
|
337
|
+
export interface ModelosPort {
|
|
338
|
+
/**
|
|
339
|
+
* El `esfuerzo` es OPCIONAL en los dos métodos, y esa opcionalidad es la que mantiene
|
|
340
|
+
* el cambio en una línea: `ModeloGuionizado` y cualquier doble con menos parámetros
|
|
341
|
+
* siguen encajando en esta interfaz, igual que pasa con `fase?` y `razonamiento?` en
|
|
342
|
+
* `Piel`. Ausente = no se manda el parámetro, que es lo que hacía este harness entero
|
|
343
|
+
* hasta ahora.
|
|
344
|
+
*
|
|
345
|
+
* Quien decide si un nivel es aplicable NO es quien llama: es
|
|
346
|
+
* `core/esfuerzo.ts#esfuerzoAplicable`, contra el modelo que de verdad resuelve el
|
|
347
|
+
* papel. Pasar aquí un `xhigh` para un modelo que no lo admite tiene que acabar en un
|
|
348
|
+
* parámetro omitido y no en un 400, y el único sitio que conoce las dos mitades —el
|
|
349
|
+
* nivel elegido y el modelo resuelto— está dentro.
|
|
350
|
+
*/
|
|
351
|
+
paraPapel(papel: Papel, esfuerzo?: Esfuerzo, clase?: ClaseDeTrabajo, pensamiento?: Pensamiento): unknown;
|
|
352
|
+
/**
|
|
353
|
+
* Un modelo CONCRETO, «proveedor/modelo», para el subagente que fija el suyo
|
|
354
|
+
* (`core/agentes.ts`). Los papeles no sirven para esto: son tres funciones del turno
|
|
355
|
+
* —rápido, trabajo, afilado— y un agente que quiere correr con Claude no está pidiendo
|
|
356
|
+
* un papel, está pidiendo ese modelo. Lanza si el texto no es un `proveedor/modelo`
|
|
357
|
+
* válido, que es lo que hace que un error de escritura en un `.md` se vea.
|
|
358
|
+
*/
|
|
359
|
+
paraModelo(id: string, esfuerzo?: Esfuerzo, clase?: ClaseDeTrabajo, pensamiento?: Pensamiento): unknown;
|
|
360
|
+
/** Qué modelo concreto resuelve cada papel, para que `describe` lo pueda enseñar. */
|
|
361
|
+
descripcion(): Record<Papel, string>;
|
|
362
|
+
/**
|
|
363
|
+
* El `proveedor/modelo` que resuelve ese papel, a secas: con qué id se APUNTA el consumo de una
|
|
364
|
+
* llamada (`ConsumoPorModelo`). Opcional para que los dobles no cambien; ausente, el consumo va a
|
|
365
|
+
* nombre del papel.
|
|
366
|
+
*/
|
|
367
|
+
idDePapel?(papel: Papel): string;
|
|
368
|
+
}
|
|
369
|
+
/** Modelo normalizado publicado por un proveedor, sin detalles de su cliente. */
|
|
370
|
+
export interface ModeloDisponible {
|
|
371
|
+
proveedor: Proveedor;
|
|
372
|
+
id: string;
|
|
373
|
+
nombre?: string;
|
|
374
|
+
contexto?: number;
|
|
375
|
+
}
|
|
376
|
+
/** Catálogo offline de modelos disponibles por proveedor. */
|
|
377
|
+
export interface CatalogoModelosPort {
|
|
378
|
+
listar(proveedor: Proveedor): Promise<ModeloDisponible[]>;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Un hallazgo del verificador. La forma NO es de diseño: es la que emite
|
|
382
|
+
* `xone-simulator validate --json` (xone-linter 1.4.0), medida contra un proyecto real.
|
|
383
|
+
*
|
|
384
|
+
* Tres cosas que la medición corrigió respecto al primer borrador, y las tres importan:
|
|
385
|
+
*
|
|
386
|
+
* 1. **`linea` es OPCIONAL.** `SourceLocation` la declara `line?: number`
|
|
387
|
+
* (`xone-linter/src/model/XoneModel.ts:3`) y en la corrida medida NINGÚN hallazgo la
|
|
388
|
+
* traía. Con un `linea: number` obligatorio, el adaptador tendría que inventarse un 0
|
|
389
|
+
* — y un número inventado en un informe de hechos es exactamente la mentira que este
|
|
390
|
+
* diseño existe para no contar.
|
|
391
|
+
* 2. **Las severidades son TRES**, no dos: `error | warning | info`
|
|
392
|
+
* (`xone-linter/src/validator/ValidationResult.ts:3`). Colapsar `info` en `warning`
|
|
393
|
+
* es una decisión de producto que nadie ha tomado.
|
|
394
|
+
* 3. **Se llama `code`, no `regla`**, y se conserva su nombre. El vocabulario del
|
|
395
|
+
* verificador es el que viaja al ejecutor como brief de reparación y al juez como
|
|
396
|
+
* hecho; traducirlo aquí obliga a destraducirlo en los dos sitios.
|
|
397
|
+
*/
|
|
398
|
+
export interface Hallazgo {
|
|
399
|
+
code: string;
|
|
400
|
+
severidad: "error" | "warning" | "info";
|
|
401
|
+
mensaje: string;
|
|
402
|
+
/** Ruta ABSOLUTA tal como la da el simulador. Opcional: no todo hallazgo tiene fichero. */
|
|
403
|
+
fichero?: string;
|
|
404
|
+
linea?: number;
|
|
405
|
+
columna?: number;
|
|
406
|
+
}
|
|
407
|
+
export interface InformeVerificacion {
|
|
408
|
+
verde: boolean;
|
|
409
|
+
hallazgos: Hallazgo[];
|
|
410
|
+
/**
|
|
411
|
+
* La copia que se midió era de edad desconocida: se INTENTÓ traerla de CloudStudio y no
|
|
412
|
+
* se pudo. Viaja DENTRO del informe y no en una bitácora aparte porque el informe es lo
|
|
413
|
+
* que se mueve —al ejecutor como brief, al juez como hecho, al `--json` de quien lo
|
|
414
|
+
* consuma— y ninguno de los tres lee la bitácora.
|
|
415
|
+
*
|
|
416
|
+
* Es un TERCER estado, no una variante de «no hay copia»: «nadie la ha traído» es
|
|
417
|
+
* honesto, «se creía que sí y no» produce hallazgos con código, fichero y línea de otra
|
|
418
|
+
* versión del proyecto.
|
|
419
|
+
*/
|
|
420
|
+
copiaVieja?: boolean;
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* La huella de un hallazgo, para detectar NO-PROGRESO: la misma huella dos veces seguidas
|
|
424
|
+
* significa que reparar no está avanzando, y se bloquea ANTES de agotar el presupuesto.
|
|
425
|
+
*
|
|
426
|
+
* Ignora el mensaje a propósito: lleva nombres interpolados que varían sin que el problema
|
|
427
|
+
* cambie. Y tolera la ausencia de línea, que es el caso normal según la medición.
|
|
428
|
+
*/
|
|
429
|
+
export declare function huella(h: Hallazgo): string;
|
|
430
|
+
/** El verificador determinista. Establece HECHOS: no opina y no auto-corrige. */
|
|
431
|
+
export interface VerifierPort {
|
|
432
|
+
verificar(rutaProyecto: string): Promise<InformeVerificacion>;
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Lo que se le cuenta al juez de QA de una tarea, y **nada más que esto**.
|
|
436
|
+
*
|
|
437
|
+
* El encargo es el brief, y el resto son HECHOS que ya midió alguien: qué ficheros se
|
|
438
|
+
* autorizó escribir (nombres relativos) y cómo acabó el verificador con sus hallazgos —
|
|
439
|
+
* que es lo que `InformeVerificacion` ya declara que viaja «al juez como hecho». Ni un
|
|
440
|
+
* byte de contenido de ningún fichero: el juez decide si el trabajo hace lo que se pedía,
|
|
441
|
+
* y para eso no hace falta abrir nada. Es la misma regla que gobierna los eventos de
|
|
442
|
+
* dominio, aplicada al único sitio nuevo por donde podría escaparse.
|
|
443
|
+
*/
|
|
444
|
+
export interface CasoDeJuez {
|
|
445
|
+
encargo: string;
|
|
446
|
+
/** La raíz del proyecto de la tarea. Está aquí para que el papel `afilado` se resuelva con
|
|
447
|
+
* la MISMA precedencia que en cualquier otro sitio —proyecto sobre global—: en la consola
|
|
448
|
+
* web `FuentesDeEleccion.proyecto` no se rellena nunca (el vestíbulo sirve muchos
|
|
449
|
+
* proyectos y las fuentes se construyen una vez al arrancar), así que hay que preguntarle
|
|
450
|
+
* al disco POR LA RAÍZ, igual que `cloudstudioDelProyecto`. Se queda en el host: no viaja
|
|
451
|
+
* por el cable. */
|
|
452
|
+
raiz: string;
|
|
453
|
+
/** Lo que la tarea AUTORIZÓ escribir, relativo a la raíz. Ver `Tarea.autorizadas`: es
|
|
454
|
+
* una PISTA de lo que tocó, no la verdad sobre el disco (esa la tiene git). */
|
|
455
|
+
autorizadas: readonly string[];
|
|
456
|
+
/** Cómo acabó el verificador, si se sabe. `no-corrio` se le DICE: un juez que no sabe
|
|
457
|
+
* que nadie midió juzgaría sobre un hecho que no existe. */
|
|
458
|
+
verificador?: EstadoDeVerificador;
|
|
459
|
+
/** Los del REPARTO: los que caen en ficheros que este turno tocó, más los que no dicen en
|
|
460
|
+
* qué fichero (inatribuibles, y ese es el lado conservador). Ver `preexistentes`. */
|
|
461
|
+
hallazgos?: readonly HallazgoDelTurno[];
|
|
462
|
+
/** Cuántos quedaron FUERA del reparto, o sea en ficheros que este turno no tocó. Sin este
|
|
463
|
+
* número, `hallazgos` se lee como si fuera todo lo que el simulador vio y como si todo
|
|
464
|
+
* fuera del turno — medido: el juez concluyó de dos avisos que el agente había modificado
|
|
465
|
+
* ficheros JavaScript. Ausente es «no se midió»; `0` es «no había ningún otro». */
|
|
466
|
+
preexistentes?: number;
|
|
467
|
+
/** QUÉ cambió en el proyecto, según GIT: las rutas RELATIVAS del diff de la sesión contra
|
|
468
|
+
* su «antes» (`corredorDeTareas.ts#revisionConGit`). Es el único HECHO sobre el disco que
|
|
469
|
+
* llega hasta aquí — `autorizadas` es la intención del agente—, y va como lista y no como
|
|
470
|
+
* booleano a propósito: todo el modo de fallo medido del juez era «no puedo comprobar la
|
|
471
|
+
* existencia ni el contenido de X», y el hecho fichero a fichero lo quita de raíz.
|
|
472
|
+
* **Ausente y vacía no son lo mismo**: ausente es «no se pudo preguntar a git» y `[]` es
|
|
473
|
+
* «git dice que no cambió nada». Colapsarlas inventaría un cargo o lo taparía. */
|
|
474
|
+
cambiados?: readonly string[];
|
|
475
|
+
/** Lo que dieron las comprobaciones VISUALES del turno, medido por el harness (`ResultadoDeTurno.comprobacionesVisuales`).
|
|
476
|
+
* Ausente = no hubo ninguna: y entonces «no consta» sí es la verdad. */
|
|
477
|
+
comprobacionesVisuales?: readonly string[];
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* El juez de QA: una de las DOS piezas que ocupan el sitio que dejó el modal de aprobación
|
|
481
|
+
* cuando las tareas pasaron a aplicar sus escrituras (§0 del diseño). La otra es el
|
|
482
|
+
* verificador, que ya corre dentro del turno.
|
|
483
|
+
*
|
|
484
|
+
* Es un PUERTO por la razón de siempre —`npm test` no puede necesitar una clave ni una
|
|
485
|
+
* conexión— y usa el papel `afilado`, que en `core/modelos.ts` está RESERVADO al juez.
|
|
486
|
+
*
|
|
487
|
+
* **No tiene doble, y es a propósito.** El modo offline lo cubre el propio papel: por
|
|
488
|
+
* omisión `afilado` resuelve a Ollama local, que es una consola usable sin red externa. Un
|
|
489
|
+
* doble aquí solo podría contestar «verde» o «rojo» sin haber juzgado nada, y de este
|
|
490
|
+
* veredicto depende que una tarea se dé por terminada: exactamente lo que `ES_DOBLE`
|
|
491
|
+
* existe para impedir. Que no se pueda usar es fallo del ENTORNO y se dice como tal.
|
|
492
|
+
*/
|
|
493
|
+
export interface JuezDeTareaPort {
|
|
494
|
+
juzgar(caso: CasoDeJuez): Promise<VeredictoDeTarea>;
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Lo que se le da al aumentador para redactar el encargo, y nada más.
|
|
498
|
+
*
|
|
499
|
+
* **El árbol del proyecto NO está aquí, a propósito**: sería contexto por gastar en una
|
|
500
|
+
* llamada cuyo trabajo es redactar, no analizar. Lo que hay es lo que una persona necesitaría
|
|
501
|
+
* para escribir el encargo por su cuenta.
|
|
502
|
+
*/
|
|
503
|
+
export interface PeticionDeTarea {
|
|
504
|
+
/** Lo que escribió la persona, tal cual. */
|
|
505
|
+
texto: string;
|
|
506
|
+
/**
|
|
507
|
+
* La pantalla de Stitch ELEGIDA para la tarea (con el proyecto de Stitch): el encargo la nombra con sus ids y no busca
|
|
508
|
+
* otra. Ausente = no se eligió ninguna.
|
|
509
|
+
*/
|
|
510
|
+
pantallaDeStitch?: {
|
|
511
|
+
name: string;
|
|
512
|
+
titulo: string;
|
|
513
|
+
proyecto?: string;
|
|
514
|
+
};
|
|
515
|
+
/**
|
|
516
|
+
* El proyecto para el que es la tarea. La `raiz` está aquí por lo MISMO que en
|
|
517
|
+
* `CasoDeJuez`: el papel `trabajo` se resuelve con la precedencia de siempre —proyecto
|
|
518
|
+
* sobre global— y en la consola web `FuentesDeEleccion.proyecto` no se rellena nunca, así
|
|
519
|
+
* que hay que preguntarle al disco POR LA RAÍZ. Se queda en el host: no viaja por el cable.
|
|
520
|
+
*/
|
|
521
|
+
proyecto: {
|
|
522
|
+
nombre: string;
|
|
523
|
+
raiz: string;
|
|
524
|
+
rama?: string;
|
|
525
|
+
};
|
|
526
|
+
/** Nombres y tipos de los adjuntos, NUNCA su contenido: la redacción tiene que poder decir
|
|
527
|
+
* para qué sirve cada uno, y para eso basta el nombre. */
|
|
528
|
+
adjuntos: readonly {
|
|
529
|
+
nombre: string;
|
|
530
|
+
mime?: string;
|
|
531
|
+
}[];
|
|
532
|
+
/** La memoria del proyecto, si existe (`.xonecode/memoria.md`). El árbol entero sería
|
|
533
|
+
* contexto por gastar; esto son las decisiones que ya se tomaron. */
|
|
534
|
+
memoria?: string;
|
|
535
|
+
/**
|
|
536
|
+
* Los CONECTORES del proyecto que llegan al agente, por su nombre («Stitch»). Medido en Maset: sin saberlo, el
|
|
537
|
+
* aumentador convirtió «la pantalla de Stish» en «búscala en el repo y, si no está, PARA», y la tarea no hizo nada.
|
|
538
|
+
*/
|
|
539
|
+
conectores?: readonly string[];
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Convierte la petición de un humano en un ENCARGO que una tarea autónoma pueda ejecutar.
|
|
543
|
+
*
|
|
544
|
+
* Existe como puerto por las dos razones de siempre, y aquí la segunda es la que manda:
|
|
545
|
+
* `npm test` sigue sin red ni clave, y **el fallo tiene que ser recuperable**. Si no hay
|
|
546
|
+
* modelo, la tarea se encola con el texto original y se DICE — perder lo que una persona
|
|
547
|
+
* acaba de escribir porque un modelo no contestó sería lo peor que puede hacer esa ventana.
|
|
548
|
+
*
|
|
549
|
+
* A diferencia del juez (`JuezDeTareaPort`, que no tiene doble a propósito), este SÍ lo
|
|
550
|
+
* tiene: de un veredicto del juez depende que una tarea se dé por terminada, y un doble que
|
|
551
|
+
* conteste «verde» sin juzgar es exactamente lo que `ES_DOBLE` existe para impedir; de un
|
|
552
|
+
* encargo augmentado no depende ninguna afirmación — lo lee una persona y lo edita antes de
|
|
553
|
+
* encolar.
|
|
554
|
+
*/
|
|
555
|
+
export interface AumentadorPort {
|
|
556
|
+
augmentar(peticion: PeticionDeTarea): Promise<string>;
|
|
557
|
+
}
|
|
558
|
+
export declare class McpVacio implements McpPort {
|
|
559
|
+
readonly [ES_DOBLE] = true;
|
|
560
|
+
catalogo(): Promise<CatalogoMcp>;
|
|
561
|
+
invocar(tool: string): Promise<unknown>;
|
|
562
|
+
cerrar(): Promise<void>;
|
|
563
|
+
}
|
|
564
|
+
export declare class SkillsEnMemoria implements SkillsPort {
|
|
565
|
+
private readonly contenido;
|
|
566
|
+
readonly [ES_DOBLE] = true;
|
|
567
|
+
constructor(contenido?: Record<string, string>);
|
|
568
|
+
catalogo(): SkillInfo[];
|
|
569
|
+
cargar(nombre: string): string;
|
|
570
|
+
}
|
|
571
|
+
export declare class ModeloGuionizado implements ModelosPort {
|
|
572
|
+
private readonly respuestas;
|
|
573
|
+
readonly [ES_DOBLE] = true;
|
|
574
|
+
constructor(respuestas?: string[]);
|
|
575
|
+
paraPapel(): unknown;
|
|
576
|
+
/** El mismo guion venga por papel o por id: el modo offline no distingue modelos, y
|
|
577
|
+
* fingir que sí obligaría a los tests a saber qué modelo pide cada agente. */
|
|
578
|
+
paraModelo(): unknown;
|
|
579
|
+
descripcion(): Record<Papel, string>;
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* El doble del aumentador: devuelve el texto original, DICIENDO que no lo redactó nadie.
|
|
583
|
+
*
|
|
584
|
+
* La marca `[DOBLE]` no es adorno y es la misma disciplina que `McpVacio` y
|
|
585
|
+
* `SkillsEnMemoria`: este texto se le enseña a una persona en la ventana de crear —para que
|
|
586
|
+
* lo edite— y después se le manda al agente, así que sin la marca pasaría por una redacción
|
|
587
|
+
* de verdad. Con `--guion` es lo que se monta, que es exactamente el caso que la marca
|
|
588
|
+
* describe.
|
|
589
|
+
*
|
|
590
|
+
* La plantilla entra por parámetro para que un test pueda afirmar sobre el paso de datos sin
|
|
591
|
+
* la marca de por medio.
|
|
592
|
+
*/
|
|
593
|
+
export declare class AumentadorGuionizado implements AumentadorPort {
|
|
594
|
+
private readonly plantilla;
|
|
595
|
+
readonly [ES_DOBLE] = true;
|
|
596
|
+
constructor(plantilla?: (t: string) => string);
|
|
597
|
+
augmentar(peticion: PeticionDeTarea): Promise<string>;
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* El doble: contesta sin lanzar ningún proceso.
|
|
601
|
+
*
|
|
602
|
+
* `disponible` devuelve `false` por omisión a propósito. Un doble que dijera que sí haría
|
|
603
|
+
* que los tests recorrieran la rama de «hay Claude Code» sin haberlo, que es justo la
|
|
604
|
+
* mentira que `ES_DOBLE` existe para impedir — y el modo offline enseñaría un especialista
|
|
605
|
+
* que no puede correr.
|
|
606
|
+
*/
|
|
607
|
+
export declare class SubagenteExternoGuionizado implements SubagenteExternoPort {
|
|
608
|
+
private readonly hay;
|
|
609
|
+
private readonly respuesta;
|
|
610
|
+
readonly [ES_DOBLE] = true;
|
|
611
|
+
constructor(hay?: boolean, respuesta?: string);
|
|
612
|
+
disponible(): Promise<boolean>;
|
|
613
|
+
correr(peticion: PeticionExterna): Promise<string>;
|
|
614
|
+
}
|
|
615
|
+
/** Catálogo determinista para recorrer la CLI sin red ni credenciales. */
|
|
616
|
+
export declare class CatalogoModelosEnMemoria implements CatalogoModelosPort {
|
|
617
|
+
private readonly porProveedor;
|
|
618
|
+
readonly [ES_DOBLE] = true;
|
|
619
|
+
constructor(porProveedor?: Partial<Record<Proveedor, ModeloDisponible[]>>);
|
|
620
|
+
listar(proveedor: Proveedor): Promise<ModeloDisponible[]>;
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* Verificador que siempre dice verde.
|
|
624
|
+
*
|
|
625
|
+
* Peligroso a propósito: es el doble que más miente si nadie lo declara, porque un verde
|
|
626
|
+
* falso deja pasar código roto. Por eso lleva la marca y por eso `describe` lo canta.
|
|
627
|
+
*/
|
|
628
|
+
export declare class StubVerifier implements VerifierPort {
|
|
629
|
+
readonly [ES_DOBLE] = true;
|
|
630
|
+
verificar(): Promise<InformeVerificacion>;
|
|
631
|
+
}
|
|
632
|
+
/** Verificador con guion, para recorrer el lazo de reparación sin LLM: [rojo, rojo, verde]. */
|
|
633
|
+
export declare class VerifierGuionizado implements VerifierPort {
|
|
634
|
+
private readonly guion;
|
|
635
|
+
readonly [ES_DOBLE] = true;
|
|
636
|
+
private i;
|
|
637
|
+
constructor(guion: InformeVerificacion[]);
|
|
638
|
+
verificar(): Promise<InformeVerificacion>;
|
|
639
|
+
}
|
|
640
|
+
/**
|
|
641
|
+
* El proyecto del cliente en CloudStudio.
|
|
642
|
+
*
|
|
643
|
+
* Modela lo MEDIDO contra el servidor, no lo que sería cómodo: el proyecto abierto es
|
|
644
|
+
* estado de sesión que caduca (`abrir` se repite), la rama activa solo se sabe por
|
|
645
|
+
* `contexto`, y la descarga completa es un ZIP entero que jamás pasa por el transcript.
|
|
646
|
+
*/
|
|
647
|
+
export interface CloudStudioPort {
|
|
648
|
+
abrir(nombre: string): Promise<void>;
|
|
649
|
+
contexto(): Promise<ContextoRemoto>;
|
|
650
|
+
/** Devuelve el ZIP en base64. Puede fallar por un fichero roto en Studio. */
|
|
651
|
+
descargarZip(): Promise<string>;
|
|
652
|
+
estructura(directorio?: string): Promise<EstructuraRemota>;
|
|
653
|
+
leerTexto(ruta: string): Promise<string>;
|
|
654
|
+
escribirTexto(ruta: string, contenido: string): Promise<void>;
|
|
655
|
+
borrarTexto(ruta: string): Promise<void>;
|
|
656
|
+
subirBinario(ruta: string, datos: Uint8Array): Promise<void>;
|
|
657
|
+
ramas(): Promise<string[]>;
|
|
658
|
+
cambiarRama(nombre: string): Promise<void>;
|
|
659
|
+
}
|
|
660
|
+
export interface OpcionesCloudStudioEnMemoria {
|
|
661
|
+
rama?: string;
|
|
662
|
+
textos?: Record<string, string>;
|
|
663
|
+
binarios?: Record<string, number>;
|
|
664
|
+
/** Motivo con el que `descargarZip` rechaza; ausente = el ZIP funciona. */
|
|
665
|
+
zipFalla?: string;
|
|
666
|
+
/**
|
|
667
|
+
* Motivo con el que `contexto` rechaza; ausente = se puede leer la rama activa.
|
|
668
|
+
*
|
|
669
|
+
* No es un capricho de test: medido contra CloudStudio, `studio_get_context` revienta
|
|
670
|
+
* para algunos proyectos —con el proyecto abierto y con el resto de tools contestando
|
|
671
|
+
* bien sobre ese mismo proyecto—, y sin poder reproducirlo aquí la tolerancia de
|
|
672
|
+
* `agent/cloudstudio/ramaActiva.ts` no tendría dónde probarse.
|
|
673
|
+
*/
|
|
674
|
+
contextoFalla?: string;
|
|
675
|
+
/** Tope de entradas por llamada, para reproducir el truncado del servidor real. */
|
|
676
|
+
topeEstructura?: number;
|
|
677
|
+
/** ZIP ya fabricado (por el test, fuera de la frontera) para que `descargarZip` lo devuelva. */
|
|
678
|
+
zipBase64?: string;
|
|
679
|
+
/**
|
|
680
|
+
* Lo que el servidor GUARDA de un texto escrito, por ruta: los N primeros caracteres. Es el
|
|
681
|
+
* corte que se ha visto en ficheros subidos a Studio (sin reproducir todavía), y sin poder
|
|
682
|
+
* fabricarlo aquí la relectura de `agent/cloudstudio/subida.ts` no tendría qué detectar.
|
|
683
|
+
*/
|
|
684
|
+
textoRecortadoA?: Record<string, number>;
|
|
685
|
+
/** Motivo con el que `leerTexto` rechaza DESPUÉS de una escritura (la relectura que comprueba). */
|
|
686
|
+
relecturaFalla?: string;
|
|
687
|
+
/** Motivo con el que `subirBinario` rechaza. */
|
|
688
|
+
binarioFalla?: string;
|
|
689
|
+
/**
|
|
690
|
+
* El `switch` contesta bien pero la rama activa NO cambia: `contexto` sigue diciendo la de
|
|
691
|
+
* antes. Es la razón de comprobar la rama antes de subir, en vez de fiarse del `switch`.
|
|
692
|
+
*/
|
|
693
|
+
cambiarRamaNoSurteEfecto?: boolean;
|
|
694
|
+
}
|
|
695
|
+
/** El proyecto remoto en memoria: recorre el flujo entero sin red ni credenciales. */
|
|
696
|
+
export declare class CloudStudioEnMemoria implements CloudStudioPort {
|
|
697
|
+
private readonly opciones;
|
|
698
|
+
readonly [ES_DOBLE] = true;
|
|
699
|
+
/** Lo escrito, para poder afirmar sobre ello en los tests. */
|
|
700
|
+
readonly escrituras: Array<{
|
|
701
|
+
tipo: "texto";
|
|
702
|
+
ruta: string;
|
|
703
|
+
bytes: number;
|
|
704
|
+
} | {
|
|
705
|
+
tipo: "binario";
|
|
706
|
+
ruta: string;
|
|
707
|
+
bytes: number;
|
|
708
|
+
} | {
|
|
709
|
+
tipo: "borrado";
|
|
710
|
+
ruta: string;
|
|
711
|
+
}>;
|
|
712
|
+
private abierto;
|
|
713
|
+
private ramaActual;
|
|
714
|
+
/**
|
|
715
|
+
* Los textos del servidor, que las escrituras MODIFICAN: la subida relee lo que escribió, y
|
|
716
|
+
* un doble que no guardara lo escrito haría fallar esa relectura en todos los tests. Campo
|
|
717
|
+
* PROPIO (no del prototipo), para que los envoltorios `Object.create` + `Object.assign` de
|
|
718
|
+
* los tests compartan el mismo mapa por referencia.
|
|
719
|
+
*/
|
|
720
|
+
readonly textos: Record<string, string>;
|
|
721
|
+
/** Las rutas escritas en esta vida del doble: solo esas relee con `relecturaFalla`. */
|
|
722
|
+
private readonly escritas;
|
|
723
|
+
constructor(opciones?: OpcionesCloudStudioEnMemoria);
|
|
724
|
+
abrir(nombre: string): Promise<void>;
|
|
725
|
+
private exigirAbierto;
|
|
726
|
+
contexto(): Promise<ContextoRemoto>;
|
|
727
|
+
descargarZip(): Promise<string>;
|
|
728
|
+
estructura(directorio?: string): Promise<EstructuraRemota>;
|
|
729
|
+
leerTexto(ruta: string): Promise<string>;
|
|
730
|
+
escribirTexto(ruta: string, contenido: string): Promise<void>;
|
|
731
|
+
borrarTexto(ruta: string): Promise<void>;
|
|
732
|
+
subirBinario(ruta: string, datos: Uint8Array): Promise<void>;
|
|
733
|
+
ramas(): Promise<string[]>;
|
|
734
|
+
cambiarRama(nombre: string): Promise<void>;
|
|
735
|
+
}
|
|
736
|
+
/** Un gestor de tareas en memoria: lo que el servidor y el cliente prueban sin red. Apunta lo ESCRITO. */
|
|
737
|
+
export declare class GestorDeTareasEnMemoria implements GestorDeTareasPort {
|
|
738
|
+
private readonly datos;
|
|
739
|
+
readonly [ES_DOBLE] = true;
|
|
740
|
+
readonly transicionesAplicadas: {
|
|
741
|
+
clave: string;
|
|
742
|
+
transicion: string;
|
|
743
|
+
}[];
|
|
744
|
+
readonly comentariosAplicados: {
|
|
745
|
+
clave: string;
|
|
746
|
+
texto: string;
|
|
747
|
+
}[];
|
|
748
|
+
/** Lo que se le pidió CREAR, en orden. */
|
|
749
|
+
readonly creadas: {
|
|
750
|
+
proyecto: string;
|
|
751
|
+
titulo: string;
|
|
752
|
+
descripcion: string;
|
|
753
|
+
}[];
|
|
754
|
+
constructor(datos?: {
|
|
755
|
+
sitios?: {
|
|
756
|
+
id: string;
|
|
757
|
+
nombre: string;
|
|
758
|
+
url?: string;
|
|
759
|
+
}[];
|
|
760
|
+
proyectos?: Record<string, {
|
|
761
|
+
clave: string;
|
|
762
|
+
nombre: string;
|
|
763
|
+
}[]>;
|
|
764
|
+
tareas?: FichaDelGestor[];
|
|
765
|
+
transiciones?: Record<string, TransicionDelGestor[]>;
|
|
766
|
+
/** El nombre visible de quien tiene la sesión del conector: lo que `mias` compara con `asignado`. */
|
|
767
|
+
yo?: string;
|
|
768
|
+
/**
|
|
769
|
+
* IXCODE-15, la forma de Notion: con `encontrados`, el doble BUSCA proyectos (y sin él no
|
|
770
|
+
* tiene el método, como Jira); con `descripciones`, DESCRIBE cada uno por su `proyecto`
|
|
771
|
+
* —y entonces `vincular` comprueba con esto y no con `proyectos(sitio)`—. Uno que no esté
|
|
772
|
+
* en la tabla se describe con un motivo.
|
|
773
|
+
*/
|
|
774
|
+
encontrados?: ProyectoEncontrado[];
|
|
775
|
+
descripciones?: Record<string, DescripcionDelProyecto>;
|
|
776
|
+
/**
|
|
777
|
+
* Con él, el doble CREA tareas: cada una con clave `<prefijo>-<n>` (n empieza en 1), que entra en `tareas` en
|
|
778
|
+
* la categoría `por-hacer` para que `ficha` la encuentre. Sin él no tiene el método, como un gestor que no crea.
|
|
779
|
+
* `crearFalla` hace que crear lance con ese motivo.
|
|
780
|
+
*/
|
|
781
|
+
creaConPrefijo?: string;
|
|
782
|
+
crearFalla?: string;
|
|
783
|
+
/** Con él, el doble LEE comentarios (por clave; una clave ausente no tiene ninguno). Sin él no tiene el método. */
|
|
784
|
+
comentarios?: Record<string, ComentarioDelGestor[]>;
|
|
785
|
+
/** Con él, el doble da los estados del flujo. Sin él no tiene el método. */
|
|
786
|
+
estados?: EstadoDelGestor[];
|
|
787
|
+
});
|
|
788
|
+
/** Solo existen si los datos los piden: su AUSENCIA es la forma de Jira, y el servidor la mira. */
|
|
789
|
+
readonly buscarProyectos?: (texto: string) => Promise<ProyectoEncontrado[]>;
|
|
790
|
+
readonly describirProyecto?: (v: Vinculo) => Promise<DescripcionDelProyecto>;
|
|
791
|
+
readonly crear?: (v: Vinculo, nueva: NuevaTareaEnElGestor) => Promise<TareaDelGestor>;
|
|
792
|
+
readonly comentarios?: (v: Vinculo, clave: string) => Promise<ComentarioDelGestor[]>;
|
|
793
|
+
readonly estados?: (v: Vinculo) => Promise<EstadoDelGestor[]>;
|
|
794
|
+
sitios(): Promise<{
|
|
795
|
+
id: string;
|
|
796
|
+
nombre: string;
|
|
797
|
+
url?: string;
|
|
798
|
+
}[]>;
|
|
799
|
+
proyectos(sitio: string): Promise<{
|
|
800
|
+
clave: string;
|
|
801
|
+
nombre: string;
|
|
802
|
+
}[]>;
|
|
803
|
+
pendientes(_v: Vinculo, texto?: string, opciones?: OpcionesDePendientes): Promise<{
|
|
804
|
+
clave: string;
|
|
805
|
+
etiqueta?: string;
|
|
806
|
+
titulo: string;
|
|
807
|
+
estado: string;
|
|
808
|
+
categoria: import("./gestorDeTareas.js").CategoriaDeTarea;
|
|
809
|
+
asignado?: string;
|
|
810
|
+
url?: string;
|
|
811
|
+
}[]>;
|
|
812
|
+
ficha(_v: Vinculo, clave: string): Promise<FichaDelGestor>;
|
|
813
|
+
transiciones(_v: Vinculo, clave: string): Promise<TransicionDelGestor[]>;
|
|
814
|
+
transicionar(_v: Vinculo, clave: string, transicion: string): Promise<void>;
|
|
815
|
+
comentar(_v: Vinculo, clave: string, texto: string): Promise<void>;
|
|
816
|
+
}
|
|
817
|
+
/**
|
|
818
|
+
* De dónde salen los iconos (IXCODE-18): Iconify, por la red. Un puerto porque `npm test` no
|
|
819
|
+
* puede necesitar una conexión, y porque la tool que lo usa (`agent/grafo/buscarIcono.ts`) no
|
|
820
|
+
* puede saber si hay red.
|
|
821
|
+
*
|
|
822
|
+
* **Lanza ante cualquier fallo**, con un mensaje que no lleva la URL ni el cuerpo remoto: quien
|
|
823
|
+
* lo llama (la tool) lo DEVUELVE como texto, porque una excepción se lleva el turno y el
|
|
824
|
+
* agente no reintenta. Ni `svg` ni `buscar` inventan nada cuando la red falta.
|
|
825
|
+
*/
|
|
826
|
+
export interface IconosPort {
|
|
827
|
+
/** Ids `prefijo:nombre`, ya con forma de id. Vacío es «no hay», no un fallo. */
|
|
828
|
+
buscar(consulta: string, opciones: {
|
|
829
|
+
limite: number;
|
|
830
|
+
prefijo?: string;
|
|
831
|
+
}): Promise<string[]>;
|
|
832
|
+
/** El SVG con el color y la altura ya cocidos (`core/iconos.ts#urlDeSvg`). */
|
|
833
|
+
svg(id: string, opciones: {
|
|
834
|
+
color: string;
|
|
835
|
+
tamano: number;
|
|
836
|
+
}): Promise<string>;
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* El doble: un catálogo fijo, sin red. Genera un SVG mínimo con el color y el tamaño pedidos, así
|
|
840
|
+
* que un test ve que llegaron a quien había que llegar. `fallo` simula la red caída.
|
|
841
|
+
*/
|
|
842
|
+
export declare class IconosEnMemoria implements IconosPort {
|
|
843
|
+
private readonly ids;
|
|
844
|
+
private readonly fallo?;
|
|
845
|
+
readonly [ES_DOBLE] = true;
|
|
846
|
+
readonly peticiones: Array<{
|
|
847
|
+
id: string;
|
|
848
|
+
color: string;
|
|
849
|
+
tamano: number;
|
|
850
|
+
}>;
|
|
851
|
+
constructor(ids?: readonly string[], fallo?: string | undefined);
|
|
852
|
+
buscar(consulta: string, opciones: {
|
|
853
|
+
limite: number;
|
|
854
|
+
prefijo?: string;
|
|
855
|
+
}): Promise<string[]>;
|
|
856
|
+
svg(id: string, opciones: {
|
|
857
|
+
color: string;
|
|
858
|
+
tamano: number;
|
|
859
|
+
}): Promise<string>;
|
|
860
|
+
}
|
|
861
|
+
/**
|
|
862
|
+
* De dónde salen las fuentes: Google Fonts, por la red. Un puerto por lo mismo que `IconosPort`:
|
|
863
|
+
* `npm test` no puede necesitar una conexión, y la tool (`agent/grafo/fuentesDeGoogle.ts`) no
|
|
864
|
+
* puede saber si hay red.
|
|
865
|
+
*
|
|
866
|
+
* **Lanza ante cualquier fallo**, con un mensaje sin URL ni cuerpo remoto; la tool lo DEVUELVE
|
|
867
|
+
* como texto. Ninguna operación inventa una familia ni un fichero cuando la red falta.
|
|
868
|
+
*/
|
|
869
|
+
export interface FuentesPort {
|
|
870
|
+
/** Las familias que encajan (`core/fuentes.ts#buscarEnCatalogo`). Vacío es «no hay», no un fallo. */
|
|
871
|
+
buscar(consulta: string, limite: number): Promise<FamiliaDeFuente[]>;
|
|
872
|
+
/** La familia con ese nombre EXACTO, o `undefined` si el catálogo no la tiene. */
|
|
873
|
+
familia(nombre: string): Promise<FamiliaDeFuente | undefined>;
|
|
874
|
+
/** Los bytes del `.ttf` estático de ese estilo, ya comprobados (`esTrueType`, tope de tamaño). */
|
|
875
|
+
ttf(familia: string, peso: Peso, cursiva: boolean): Promise<Uint8Array>;
|
|
876
|
+
}
|
|
877
|
+
/**
|
|
878
|
+
* El doble: un catálogo fijo, sin red. El `.ttf` son 16 bytes con la firma TrueType y el nombre del
|
|
879
|
+
* estilo detrás, así que un test ve qué se pidió. `fallo` simula la red caída.
|
|
880
|
+
*/
|
|
881
|
+
export declare class FuentesEnMemoria implements FuentesPort {
|
|
882
|
+
private readonly familias;
|
|
883
|
+
private readonly fallo?;
|
|
884
|
+
readonly [ES_DOBLE] = true;
|
|
885
|
+
readonly peticiones: Array<{
|
|
886
|
+
familia: string;
|
|
887
|
+
peso: Peso;
|
|
888
|
+
cursiva: boolean;
|
|
889
|
+
}>;
|
|
890
|
+
constructor(familias?: readonly FamiliaDeFuente[], fallo?: string | undefined);
|
|
891
|
+
buscar(consulta: string, limite: number): Promise<FamiliaDeFuente[]>;
|
|
892
|
+
familia(nombre: string): Promise<FamiliaDeFuente | undefined>;
|
|
893
|
+
ttf(familia: string, peso: Peso, cursiva: boolean): Promise<Uint8Array>;
|
|
894
|
+
}
|
|
895
|
+
/**
|
|
896
|
+
* Los conectores MCP, tal como los ve una SESIÓN del agente. Lo implementa el MISMO
|
|
897
|
+
* `ServicioDeConectores` de Ajustes y del gestor de tareas —uno por proceso: una segunda
|
|
898
|
+
* instancia no vería la autorización que Ajustes tiene a medias y pisaría su verificador PKCE—,
|
|
899
|
+
* así que aquí no se construye nada: se pasa.
|
|
900
|
+
*
|
|
901
|
+
* Todo LANZA con una frase sin URL ni cuerpo remoto; quien lo llama (la tool) lo DEVUELVE como
|
|
902
|
+
* texto, porque una excepción se lleva el turno.
|
|
903
|
+
*/
|
|
904
|
+
export interface ConectoresPort {
|
|
905
|
+
/** Los conectores que ESTE proyecto usa en el chat (`core/conectores.ts#conectoresParaElAgente`). */
|
|
906
|
+
delProyecto(raiz: string): ConectorParaElAgente[];
|
|
907
|
+
tools(id: string): Promise<ToolConEsquema[]>;
|
|
908
|
+
llamar(id: string, nombre: string, args: Record<string, unknown>, opciones?: {
|
|
909
|
+
topeMs?: number;
|
|
910
|
+
}): Promise<string>;
|
|
911
|
+
}
|
|
912
|
+
/** El doble: conectores fijos, sin red. `llamadas` deja ver qué llegó; `fallo` simula la red caída. */
|
|
913
|
+
export declare class ConectoresEnMemoria implements ConectoresPort {
|
|
914
|
+
private readonly conectores;
|
|
915
|
+
private readonly fallo?;
|
|
916
|
+
readonly [ES_DOBLE] = true;
|
|
917
|
+
readonly llamadas: Array<{
|
|
918
|
+
id: string;
|
|
919
|
+
nombre: string;
|
|
920
|
+
args: Record<string, unknown>;
|
|
921
|
+
topeMs?: number;
|
|
922
|
+
}>;
|
|
923
|
+
constructor(conectores?: Record<string, {
|
|
924
|
+
nombre: string;
|
|
925
|
+
tools: ToolConEsquema[];
|
|
926
|
+
respuesta?: string;
|
|
927
|
+
}>, fallo?: string | undefined);
|
|
928
|
+
delProyecto(): ConectorParaElAgente[];
|
|
929
|
+
tools(id: string): Promise<ToolConEsquema[]>;
|
|
930
|
+
llamar(id: string, nombre: string, args: Record<string, unknown>, opciones?: {
|
|
931
|
+
topeMs?: number;
|
|
932
|
+
}): Promise<string>;
|
|
933
|
+
}
|
|
934
|
+
/**
|
|
935
|
+
* El puente de la sesión remota: un WebSocket SALIENTE y cifrado hacia `xonecode-server`.
|
|
936
|
+
* Mensajes en CLARO por esta interfaz: el cifrado vive en la implementación real
|
|
937
|
+
* (`agent/remoto/puenteWebSocket.ts`), que es la única que carga el paquete del puente.
|
|
938
|
+
*/
|
|
939
|
+
export type EstadoDelPuente = {
|
|
940
|
+
estado: "abierta";
|
|
941
|
+
url: string;
|
|
942
|
+
} | {
|
|
943
|
+
estado: "reconectando";
|
|
944
|
+
} | {
|
|
945
|
+
estado: "cerrada";
|
|
946
|
+
motivo?: string;
|
|
947
|
+
};
|
|
948
|
+
export interface EscuchasDelPuente {
|
|
949
|
+
alEstado(estado: EstadoDelPuente): void;
|
|
950
|
+
alPresencia(moviles: readonly string[]): void;
|
|
951
|
+
alMensaje(de: string, mensaje: unknown): void;
|
|
952
|
+
}
|
|
953
|
+
export interface CanalRemoto {
|
|
954
|
+
/** `para` ausente = a todos los móviles. */
|
|
955
|
+
enviar(para: string | undefined, mensaje: unknown): Promise<void>;
|
|
956
|
+
/**
|
|
957
|
+
* Cierra la sala. La promesa se resuelve cuando el relé ya cerró el socket (con tope): por la
|
|
958
|
+
* vía ngrok el «cerrada» al móvil viaja por el MISMO túnel, y matarlo antes lo perdía.
|
|
959
|
+
*/
|
|
960
|
+
cerrar(): Promise<void>;
|
|
961
|
+
}
|
|
962
|
+
export interface PuenteRemotoPort {
|
|
963
|
+
abrir(servidor: string, escuchas: EscuchasDelPuente): Promise<CanalRemoto>;
|
|
964
|
+
}
|
|
965
|
+
/** El doble: deja al test hacer de servidor y de móviles, y apunta lo enviado. */
|
|
966
|
+
export declare class PuenteRemotoEnMemoria implements PuenteRemotoPort {
|
|
967
|
+
readonly [ES_DOBLE] = true;
|
|
968
|
+
readonly aperturas: string[];
|
|
969
|
+
readonly enviados: {
|
|
970
|
+
para: string | undefined;
|
|
971
|
+
mensaje: unknown;
|
|
972
|
+
}[];
|
|
973
|
+
cerrados: number;
|
|
974
|
+
/**
|
|
975
|
+
* Un registro POR canal abierto: el real tiene sockets viejos que aún pueden hablar tras
|
|
976
|
+
* cerrarse o reemplazarse, y sin poder disparar eventos de uno viejo ese fallo no se probaría.
|
|
977
|
+
*/
|
|
978
|
+
readonly canales: {
|
|
979
|
+
servidor: string;
|
|
980
|
+
escuchas: EscuchasDelPuente;
|
|
981
|
+
cerrado: boolean;
|
|
982
|
+
enviados: {
|
|
983
|
+
para: string | undefined;
|
|
984
|
+
mensaje: unknown;
|
|
985
|
+
}[];
|
|
986
|
+
}[];
|
|
987
|
+
abrir(servidor: string, escuchas: EscuchasDelPuente): Promise<CanalRemoto>;
|
|
988
|
+
private ultimo;
|
|
989
|
+
/** Lo que haría el servidor real; sin índice, sobre el canal MÁS RECIENTE. */
|
|
990
|
+
abierta(url?: string, canal?: number): void;
|
|
991
|
+
presencia(...moviles: string[]): void;
|
|
992
|
+
presenciaDe(canal: number, ...moviles: string[]): void;
|
|
993
|
+
delMovil(de: string, mensaje: unknown): void;
|
|
994
|
+
cerrada(motivo?: string, canal?: number): void;
|
|
995
|
+
reconectando(canal?: number): void;
|
|
996
|
+
}
|
|
997
|
+
/**
|
|
998
|
+
* El túnel de la vía «ngrok» de la sesión remota: un puente LOCAL más un ngrok que lo publica.
|
|
999
|
+
* La implementación real (`agent/remoto/tunelNgrok.ts`) entra por opción, como el puente; aquí
|
|
1000
|
+
* solo la forma. Un fallo LANZA con un texto de `core/tunel.ts#MOTIVOS_DEL_TUNEL`, nunca con lo
|
|
1001
|
+
* que diga ngrok.
|
|
1002
|
+
*/
|
|
1003
|
+
export interface TunelAbierto {
|
|
1004
|
+
/** La dirección del puente por el túnel: `wss://<publica>/ws`. */
|
|
1005
|
+
servidor: string;
|
|
1006
|
+
/** Mata ngrok y cierra el puente local. Idempotente. */
|
|
1007
|
+
cerrar(): Promise<void>;
|
|
1008
|
+
/** Si el túnel se cae solo (ngrok sale): una vez, con un texto fijo. */
|
|
1009
|
+
alCaer(f: (motivo: string) => void): void;
|
|
1010
|
+
}
|
|
1011
|
+
export interface TunelPort {
|
|
1012
|
+
abrir(o: {
|
|
1013
|
+
dominio?: string;
|
|
1014
|
+
}): Promise<TunelAbierto>;
|
|
1015
|
+
}
|
|
1016
|
+
/** El doble: apunta aperturas y cierres, y deja al test elegir la dirección, un fallo o la caída. */
|
|
1017
|
+
export declare class TunelEnMemoria implements TunelPort {
|
|
1018
|
+
readonly [ES_DOBLE] = true;
|
|
1019
|
+
readonly aperturas: {
|
|
1020
|
+
dominio?: string;
|
|
1021
|
+
}[];
|
|
1022
|
+
cerrados: number;
|
|
1023
|
+
/** El `servidor` que devuelve la próxima apertura. */
|
|
1024
|
+
servidor: string;
|
|
1025
|
+
/** Con valor, la próxima apertura LANZA con este motivo (y se consume). */
|
|
1026
|
+
fallo: string | undefined;
|
|
1027
|
+
/** Un registro por túnel abierto: cerrado o caído ya no avisa, como el real. */
|
|
1028
|
+
private readonly tuneles;
|
|
1029
|
+
abrir(o: {
|
|
1030
|
+
dominio?: string;
|
|
1031
|
+
}): Promise<TunelAbierto>;
|
|
1032
|
+
/** Lo que haría ngrok al salir solo; sin índice, el túnel MÁS RECIENTE. Una vez por túnel. */
|
|
1033
|
+
caer(motivo: string, tunel?: number): void;
|
|
1034
|
+
}
|