xonecode 0.38.41 → 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/apps/web/dist/assets/{EditorDeFichero-B5qtmfKO.js → EditorDeFichero-BeWDctgN.js} +1 -1
- package/apps/web/dist/assets/{index-C6XoIOQg.js → index-B-6cDRAV.js} +20 -20
- package/apps/web/dist/assets/{php-I6JfbNBQ.js → php-D3QdOnb8.js} +1 -1
- package/apps/web/dist/assets/{ruby-DlqXDLOX.js → ruby-DDAcW-Z2.js} +1 -1
- package/apps/web/dist/index.html +1 -1
- 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/medidaAutomatica.js +4 -2
- package/dist/agent/motores/trueforge/medidaAutomatica.js.map +1 -1
- 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/sesionTrueforge.js +32 -15
- package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
- 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/soporte.js +2 -0
- package/dist/web/servidor/soporte.js.map +1 -1
- 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,8 @@
|
|
|
1
|
+
/** Lo que sale de un `item/completed` de Codex: las tools que hizo y lo que contó. */
|
|
2
|
+
export declare function actividadDeItemDeCodex(item: unknown, cwd: string, real?: (ruta: string) => string): {
|
|
3
|
+
tools: {
|
|
4
|
+
nombre: string;
|
|
5
|
+
detalle?: string;
|
|
6
|
+
}[];
|
|
7
|
+
razonamiento?: string;
|
|
8
|
+
};
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Los subagentes en disco: `<base>/.xonecode/agentes/<nombre>.md`, uno por fichero.
|
|
3
|
+
*
|
|
4
|
+
* Ficheros y no una entrada en `config.json` por tres razones. El cuerpo son
|
|
5
|
+
* INSTRUCCIONES, o sea prosa larga, y la prosa dentro de un JSON se vuelve inmanejable en
|
|
6
|
+
* cuanto pasa de dos frases. Es la convención que ya conoce quien viene de Claude Code
|
|
7
|
+
* (`.claude/agents/*.md`), así que el fichero se lee sin explicar nada. Y se edita a mano y
|
|
8
|
+
* se diffea, que es lo que va a pasar de verdad con un prompt que se afina.
|
|
9
|
+
*
|
|
10
|
+
* `.xonecode/` hereda además dos protecciones que aquí importan: está denegada entera al
|
|
11
|
+
* agente (`permisosDe`) y **no sube nunca** a CloudStudio. Un subagente es configuración de
|
|
12
|
+
* la herramienta, no del proyecto XOne — no tiene por qué acabar en Studio.
|
|
13
|
+
*
|
|
14
|
+
* Dos sitios, con la misma precedencia que los modelos: el GLOBAL (`~/.xonecode/agentes/`)
|
|
15
|
+
* y el del PROYECTO, y el de proyecto gana. Un «revisor de XOne» se quiere en todos los
|
|
16
|
+
* proyectos; un «experto en esta app», solo en uno.
|
|
17
|
+
*/
|
|
18
|
+
import { type Agente, type AgenteCargado, type Carga, type Lectura } from "../../core/agentes.js";
|
|
19
|
+
/** La carpeta de agentes de una raíz cualquiera. */
|
|
20
|
+
export declare function rutaDeAgentes(base: string): string;
|
|
21
|
+
/** La global. `homedir()` en el momento de la llamada, como el resto del repo: cachearla en
|
|
22
|
+
* una constante de módulo la congelaría para los tests que la cambian. */
|
|
23
|
+
export declare function rutaGlobalDeAgentes(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Lee una carpeta. Un fichero que no se puede leer o que no valida NO tumba la carga: se
|
|
26
|
+
* salta, se apunta el motivo y los demás siguen — es la misma postura que `reabrirSesion`
|
|
27
|
+
* con una línea corrupta del `.jsonl`, y la que evita que un `.md` a medio escribir deje la
|
|
28
|
+
* consola sin ningún subagente.
|
|
29
|
+
*/
|
|
30
|
+
export declare function leerCarpetaDeAgentes(carpeta: string, origen: Agente["origen"]): Lectura;
|
|
31
|
+
/**
|
|
32
|
+
* Los agentes en vigor para un proyecto: los globales, pisados por los del proyecto.
|
|
33
|
+
*
|
|
34
|
+
* `raizDelProyecto` es opcional porque el vestíbulo existe ANTES de que haya proyecto
|
|
35
|
+
* abierto (`web/servidor/vestibulo.ts`) y la ventana de ajustes se abre desde ahí: sin
|
|
36
|
+
* raíz se contestan los globales, que es la verdad, en vez de una lista vacía.
|
|
37
|
+
*/
|
|
38
|
+
export declare function cargarAgentes(raizDelProyecto?: string): Carga;
|
|
39
|
+
/** ¿Es uno de los que trae xonecode? La guarda del `borrar`, y la lista de la pantalla. */
|
|
40
|
+
export declare function esDeSerie(nombre: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* De quién es cada `.md`: ausente si lo escribió el usuario, `intacta`/`modificada` si es
|
|
43
|
+
* uno de los nuestros. Ver `AgenteCargado` para los tres estados y qué se hace con cada uno.
|
|
44
|
+
*
|
|
45
|
+
* Pura y exportada a propósito, no compuesta dentro de `cargarAgentes`: es el patrón de
|
|
46
|
+
* fallo de esta arquitectura —una regla que vive en un cierre que todos los tests doblan—, y
|
|
47
|
+
* la trampa de abajo es justo la que se queda sin probar así.
|
|
48
|
+
*
|
|
49
|
+
* **La regla es «de serie Y del GLOBAL», y el segundo requisito no es decorativo.** La
|
|
50
|
+
* siembra solo toca el global, así que un `docs.md` en `.xonecode/agentes/` DEL PROYECTO lo
|
|
51
|
+
* escribió el usuario aunque se llame igual que uno nuestro. Con `nombre ∈ AGENTES_DE_SERIE`
|
|
52
|
+
* a secas se quedaría sin botón de borrar —un fichero suyo que no puede borrar— y con un
|
|
53
|
+
* «Restaurar el de serie» que le pisaría el suyo con el global.
|
|
54
|
+
*/
|
|
55
|
+
export declare function marcarSemilla<T extends Agente>(agentes: readonly T[], desactualizados: readonly string[]): (T & AgenteCargado)[];
|
|
56
|
+
/**
|
|
57
|
+
* Escribe un agente.
|
|
58
|
+
*
|
|
59
|
+
* `segmentoSeguro` por lo mismo que en `sesiones.ts`: el nombre llega del cliente por HTTP,
|
|
60
|
+
* y un `../../.env` compondría una ruta fuera de la carpeta. Misma función que usa
|
|
61
|
+
* `rutaDeWorkspace`, no una copia — dos guardas es cómo una se corrige y la otra no. LANZA
|
|
62
|
+
* en vez de limpiar, y está bien: limpiar el nombre hasta hacerlo válido guardaría el
|
|
63
|
+
* agente con uno que nadie pidió, y quien lo mandó creería que se llama de otra forma.
|
|
64
|
+
*
|
|
65
|
+
* La validación va ANTES del `mkdirSync`, y no es cosmético: al revés, un nombre rechazado
|
|
66
|
+
* dejaba la carpeta creada de todas formas — y la carpeta es justo la marca de «ya se
|
|
67
|
+
* sembró» (`sembrarAgentes`), así que un intento fallido en el global habría impedido para
|
|
68
|
+
* siempre que se sembraran los cuatro de serie.
|
|
69
|
+
*/
|
|
70
|
+
export declare function guardarAgente(base: string, agente: Agente): void;
|
|
71
|
+
/**
|
|
72
|
+
* Devuelve un agente de serie a como lo entregamos, pisando lo que el usuario tuviera.
|
|
73
|
+
*
|
|
74
|
+
* Es lo que ocupa el sitio del borrado en un agente sembrado, y existe porque el borrado
|
|
75
|
+
* NO hacía lo que la consola prometía: la marca recuerda que se entregó, así que
|
|
76
|
+
* `sembrarAgentes` no lo resiembra (ver «uno BORRADO no se resucita») — o sea que el
|
|
77
|
+
* «bórralo si quieres el nuevo» dejaba sin ninguno de los dos y para siempre.
|
|
78
|
+
*
|
|
79
|
+
* **No escribe la marca, y es deliberado.** La reanota la siembra siguiente, que corre ANTES
|
|
80
|
+
* de cualquier lectura —`cargarAgentes` la llama primero— y que ya sabe reconocer su propio
|
|
81
|
+
* hash. Escribirla aquí sería un segundo sitio donde decidir sobre la marca, y el único que
|
|
82
|
+
* podría resucitar un agente que el usuario borró a propósito: con una marca ilegible, este
|
|
83
|
+
* camino la reescribiría con una sola clave y las demás pasarían por «nunca entregadas».
|
|
84
|
+
*
|
|
85
|
+
* Devuelve si pudo, como `borrarAgente`: de algo que no es de serie no hay versión nuestra
|
|
86
|
+
* que poner, y la interfaz no puede decir «restaurado» de eso.
|
|
87
|
+
*/
|
|
88
|
+
export declare function restaurarAgente(base: string, nombre: string): boolean;
|
|
89
|
+
/** Los tres desenlaces de un renombrado. Tres situaciones distintas, tres valores. */
|
|
90
|
+
export type Renombrado = "hecho" | "sin-origen" | "destino-ocupado";
|
|
91
|
+
/**
|
|
92
|
+
* Renombra un subagente, escribiendo a la vez lo que se haya cambiado de él.
|
|
93
|
+
*
|
|
94
|
+
* **`renameSync` y LUEGO escribir**, nunca escribir y luego borrar: un fallo entre los dos
|
|
95
|
+
* pasos deja UN fichero —el renombrado, con el contenido de antes—, nunca dos con el mismo
|
|
96
|
+
* prompt ni cero. Al revés, una excepción entre el `write` y el `rm` deja los DOS, que es
|
|
97
|
+
* justo lo que el campo deshabilitado del formulario evitaba: dos subagentes con la misma
|
|
98
|
+
* descripción y ninguna forma de saber a cuál delega el orquestador.
|
|
99
|
+
*
|
|
100
|
+
* Las dos cosas en el mismo paso porque el formulario permite cambiar el nombre Y el resto en
|
|
101
|
+
* la misma pulsación; guardar solo una dejaría la pantalla mintiendo.
|
|
102
|
+
*
|
|
103
|
+
* **El destino ocupado es un NO**, sea de serie o del usuario: sin esta guarda, renombrar
|
|
104
|
+
* `advisor` a `docs` se llevaba por delante el `docs.md` sembrado —o el otro subagente— sin
|
|
105
|
+
* decir nada. Un caso especial para los de serie diría un motivo menos cierto.
|
|
106
|
+
*
|
|
107
|
+
* **Pero «existe» no es «es otro fichero», y eso está MEDIDO en una máquina de verdad.** APFS
|
|
108
|
+
* es insensible a mayúsculas, así que con un `Documentador.md` en disco el `existsSync` de
|
|
109
|
+
* `documentador.md` contesta SÍ —es el mismo fichero— y esta guarda rechazaba justo el arreglo
|
|
110
|
+
* que el aviso del cargador propone, que es el renombrado más común de todos. Se compara por
|
|
111
|
+
* INODO (`dev` + `ino`): si el destino ES el origen, no hay nada ocupado. En un sistema
|
|
112
|
+
* sensible a mayúsculas son dos ficheros con dos inodos, así que la comparación sigue diciendo
|
|
113
|
+
* la verdad ahí — y si el otro existe de verdad, se sigue rechazando.
|
|
114
|
+
*
|
|
115
|
+
* Que un de serie NO se pueda renombrar no se decide aquí: esto mueve un fichero, y la regla
|
|
116
|
+
* del producto vive donde ya vive la de que no se borra (`arranque.ts#atenderAgente`). Dos
|
|
117
|
+
* sitios donde decidir lo mismo es cómo uno de los dos se queda sin la regla.
|
|
118
|
+
*/
|
|
119
|
+
export declare function renombrarAgente(base: string, viejo: string, agente: Agente): Renombrado;
|
|
120
|
+
/** Borra uno. Devuelve si existía: la interfaz no puede decir «borrado» de algo que no estaba. */
|
|
121
|
+
export declare function borrarAgente(base: string, nombre: string): boolean;
|
|
122
|
+
/** El nombre de la marca. Empieza por punto y no acaba en `.md`: el cargador la ignora. */
|
|
123
|
+
export declare const FICHERO_DE_SEMILLA = ".semilla.json";
|
|
124
|
+
export interface Siembra {
|
|
125
|
+
/** Los que se han escrito ahora: nuevos, o actualizados porque nadie los había tocado. */
|
|
126
|
+
escritos: string[];
|
|
127
|
+
/**
|
|
128
|
+
* Los que se quedan atrás: existen, no coinciden con lo que sembramos, y la versión de
|
|
129
|
+
* serie ha cambiado. No se pisan —puede ser trabajo del usuario— pero se DICEN: callarlo
|
|
130
|
+
* es lo que dejaba a un `docs.md` sin la consulta acotada durante semanas.
|
|
131
|
+
*/
|
|
132
|
+
desactualizados: string[];
|
|
133
|
+
/**
|
|
134
|
+
* Los que se RETIRARON por un renombrado. Es el quinto caso, y el único que no puede salir
|
|
135
|
+
* del bucle de serie: habla de una clave de la marca que ya no nombra a ningún agente.
|
|
136
|
+
*/
|
|
137
|
+
retirados: Retirado[];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Un agente de serie que cambió de nombre.
|
|
141
|
+
*
|
|
142
|
+
* Los dos desenlaces no se cuentan igual, y por eso viaja cuál fue: al nuestro intacto se le
|
|
143
|
+
* retira el fichero —y hay que decirlo, o el especialista desaparece de la lista sin que nada
|
|
144
|
+
* lo explique—, mientras que al que el usuario afinó se le deja donde está.
|
|
145
|
+
*/
|
|
146
|
+
export interface Retirado {
|
|
147
|
+
/** El nombre que ya no es de serie. */
|
|
148
|
+
nombre: string;
|
|
149
|
+
/** El que tiene ahora. */
|
|
150
|
+
ahoraSeLlama: string;
|
|
151
|
+
/** Cierto si era nuestra semilla intacta y se ha borrado del disco. */
|
|
152
|
+
borrado: boolean;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Siembra los agentes de serie, y ACTUALIZA los que nadie ha tocado.
|
|
156
|
+
*
|
|
157
|
+
* La regla anterior era «la carpeta es la marca»: si existía, no se escribía nada nunca más.
|
|
158
|
+
* Respetaba el prompt afinado por el usuario —que es lo que había que respetar— pero eligió
|
|
159
|
+
* un cuerno del dilema y el otro acabó mordiendo: **ningún agente nuevo, y ninguna
|
|
160
|
+
* corrección a uno existente, alcanzaba a quien ya hubiera arrancado una vez**. Medido: el
|
|
161
|
+
* `docs.md` de un usuario llevaba semanas sin la consulta acotada, y el probador de
|
|
162
|
+
* dispositivos no le habría llegado jamás.
|
|
163
|
+
*
|
|
164
|
+
* Ahora la marca es un fichero, `.semilla.json`, con el HASH DE LO QUE ESCRIBIMOS NOSOTROS
|
|
165
|
+
* para cada agente. Con eso se distinguen los cuatro casos que antes eran uno solo:
|
|
166
|
+
*
|
|
167
|
+
* | en disco | en la marca | qué se hace |
|
|
168
|
+
* |---|---|---|
|
|
169
|
+
* | no está | no está | es un agente NUEVO: se escribe |
|
|
170
|
+
* | no está | está | lo BORRÓ el usuario: no se resucita |
|
|
171
|
+
* | está, y su hash es el nuestro | está | nadie lo tocó: se actualiza |
|
|
172
|
+
* | está, y su hash NO es el nuestro | cualquiera | es suyo: se deja, y se DICE |
|
|
173
|
+
*
|
|
174
|
+
* Y un quinto, que aparece el día que un agente se RENOMBRA y que no puede salir de ese bucle
|
|
175
|
+
* porque habla de una clave que ya no nombra a ninguno: ver `RENOMBRADOS` y `Retirado`.
|
|
176
|
+
*
|
|
177
|
+
* **Y una carpeta sin marca se ADOPTA, no se siembra.** Es la de quien ya venía de la regla
|
|
178
|
+
* vieja, y ahí no se puede saber qué borró a propósito: dar por nuevo lo que falta le
|
|
179
|
+
* resucitaría un agente que eliminó. Así que se anota lo que hay —como nuestro si coincide
|
|
180
|
+
* con la versión de serie de hoy, como `ajeno` si no— y no se escribe ningún `.md` esa vez.
|
|
181
|
+
* Desde la siguiente, todo lo de arriba funciona. El coste es una ronda de retraso para las
|
|
182
|
+
* instalaciones viejas; la alternativa es pisar o resucitar sin permiso.
|
|
183
|
+
*
|
|
184
|
+
* El fichero de marca empieza por punto y no acaba en `.md`, así que `leerCarpetaDeAgentes`
|
|
185
|
+
* ni lo mira — no hace falta excluirlo a mano en dos sitios.
|
|
186
|
+
*/
|
|
187
|
+
/** Dónde se guarda la copia de un agente de serie editado antes de actualizarlo: `.anteriores/<nombre>.<fecha>.md`. */
|
|
188
|
+
export declare const CARPETA_DE_ANTERIORES = ".anteriores";
|
|
189
|
+
export declare function sembrarAgentes(base?: string): Siembra;
|
|
190
|
+
/**
|
|
191
|
+
* Los cinco. Nacieron como una mudanza de los textos que había en código; desde entonces
|
|
192
|
+
* `docs` lleva además la consulta acotada, y el que conduce aparatos llegó con la documentación
|
|
193
|
+
* del protocolo hotswap y pasó por dos nombres más antes de `device-controller` (ver
|
|
194
|
+
* `RENOMBRADOS`). Cada regla que
|
|
195
|
+
* se añade aquí se mide antes con los evals, porque un prompt más largo es coste en TODAS las
|
|
196
|
+
* llamadas.
|
|
197
|
+
*/
|
|
198
|
+
export declare const AGENTES_DE_SERIE: readonly Agente[];
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qué ha consumido un agente EXTERNO, leído de lo que él mismo reporta.
|
|
3
|
+
*
|
|
4
|
+
* Los tres motores lo dicen, y las tres formas están MEDIDAS contra sus contratos reales y no
|
|
5
|
+
* deducidas:
|
|
6
|
+
* - **Claude Code**: el mensaje `result` trae `modelUsage`, un mapa por modelo. Su propia
|
|
7
|
+
* documentación dice que es «the correct field for token/cost accounting», por encima de
|
|
8
|
+
* `usage` — que es solo del bucle principal y se deja fuera los subagentes del hijo.
|
|
9
|
+
* - **Codex**: manda `thread/tokenUsage/updated` con `tokenUsage.total`. Estaba en la lista
|
|
10
|
+
* de RUIDO de `subagenteCodex.ts`, o sea que el dato llevaba llegando desde el principio y
|
|
11
|
+
* se tiraba.
|
|
12
|
+
*
|
|
13
|
+
* - **OpenCode**: el resultado de `session/prompt` de ACP trae `usage` con `inputTokens`,
|
|
14
|
+
* `outputTokens`, `totalTokens` y `cachedReadTokens`. Llega UNA vez, al final del turno.
|
|
15
|
+
*
|
|
16
|
+
* **Los dos primeros son ACUMULADOS, así que se lee el último y no se suman.** Lo dicen los dos
|
|
17
|
+
* contratos con esas palabras («each result carries the running total so far, so read the
|
|
18
|
+
* latest result rather than summing») y es la diferencia entre contar bien y contar el doble.
|
|
19
|
+
* Entre ejecuciones distintas sí se suma: cada `correr` es otra sesión del producto.
|
|
20
|
+
*/
|
|
21
|
+
import type { ConsumoDeSesion, ConsumoExterno } from "../../core/ports.js";
|
|
22
|
+
/**
|
|
23
|
+
* Lo que consumió un `query()` de Claude Code, sumando TODOS sus modelos.
|
|
24
|
+
*
|
|
25
|
+
* Se suma por modelo porque un hijo puede usar más de uno en la misma ejecución (su
|
|
26
|
+
* compactación y sus propios subagentes corren en otro), y aquí la pregunta es cuánto ha
|
|
27
|
+
* costado el especialista entero, no cada pieza.
|
|
28
|
+
*
|
|
29
|
+
* La CACHÉ va aparte de la entrada, igual que en `vendor/tokenTracking.ts`: son tokens que
|
|
30
|
+
* se leyeron pero no se pagaron igual, y meterlos en «entrada» inflaría la cifra que se
|
|
31
|
+
* enseña. Que existan los dos campos es lo que permite decir la verdad sin elegir cuál.
|
|
32
|
+
*/
|
|
33
|
+
export declare function consumoDeClaude(resultado: unknown): {
|
|
34
|
+
entrada: number;
|
|
35
|
+
salida: number;
|
|
36
|
+
cache: number;
|
|
37
|
+
/** El mismo gasto, por el id de modelo que Claude Code da como clave de `modelUsage`. */
|
|
38
|
+
porModelo: Record<string, {
|
|
39
|
+
entrada: number;
|
|
40
|
+
salida: number;
|
|
41
|
+
cache: number;
|
|
42
|
+
}>;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Lo que lleva consumido un hilo de Codex, de su `thread/tokenUsage/updated`.
|
|
46
|
+
*
|
|
47
|
+
* Se lee `total` y no `last`: `last` es el de la última llamada —lo que ocupa la ventana—, y
|
|
48
|
+
* aquí la pregunta es cuánto lleva el hilo. Son las dos preguntas que
|
|
49
|
+
* `vendor/tokenTracking.ts` ya separa con `contexto` y los acumulados.
|
|
50
|
+
*
|
|
51
|
+
* `reasoningOutputTokens` NO se suma a la salida: por el esquema del propio binario va
|
|
52
|
+
* dentro de `outputTokens`, así que sumarlo sería contarlo dos veces.
|
|
53
|
+
*/
|
|
54
|
+
export declare function consumoDeCodex(params: unknown): {
|
|
55
|
+
entrada: number;
|
|
56
|
+
salida: number;
|
|
57
|
+
cache: number;
|
|
58
|
+
} | undefined;
|
|
59
|
+
/** Suma de consumos, para acumular entre ejecuciones. */
|
|
60
|
+
export declare function sumarConsumo(a: ConsumoDeSesion, b: {
|
|
61
|
+
entrada: number;
|
|
62
|
+
salida: number;
|
|
63
|
+
cache: number;
|
|
64
|
+
}): ConsumoDeSesion;
|
|
65
|
+
export declare const SIN_CONSUMO: ConsumoDeSesion;
|
|
66
|
+
export type { ConsumoDeSesion, ConsumoExterno };
|
|
67
|
+
/**
|
|
68
|
+
* Lo que consumió un turno de OpenCode, del `usage` que devuelve `session/prompt`.
|
|
69
|
+
*
|
|
70
|
+
* **La caché NO está dentro de la entrada, y eso se comprobó con la aritmética de una medida
|
|
71
|
+
* real**: `inputTokens: 8756`, `outputTokens: 141`, `cachedReadTokens: 1792` y
|
|
72
|
+
* `totalTokens: 10689` — y 8756 + 141 + 1792 = 10689. O sea que `inputTokens` excluye la
|
|
73
|
+
* caché, así que se copia tal cual en vez de restarla. Si estuvieran sumados, enseñar
|
|
74
|
+
* `inputTokens` como entrada inflaría la cifra.
|
|
75
|
+
*
|
|
76
|
+
* Ausente devuelve `undefined` y no un cero: un contador a cero que nadie ha medido es la
|
|
77
|
+
* cifra inventada de siempre, y quien llama ya sabe no pintar lo que no consta.
|
|
78
|
+
*/
|
|
79
|
+
export declare function consumoDeOpencode(uso: unknown): {
|
|
80
|
+
entrada: number;
|
|
81
|
+
salida: number;
|
|
82
|
+
cache: number;
|
|
83
|
+
} | undefined;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El ejecutable de VERDAD de un motor externo en Windows.
|
|
3
|
+
*
|
|
4
|
+
* npm instala `opencode` y `codex` como un `.cmd`, y `spawn("opencode")` sin shell busca solo
|
|
5
|
+
* `opencode.exe` en el PATH: `ENOENT`. La medida de Ajustes pasaba por la shell y daba «Listo»;
|
|
6
|
+
* lanzarlo fallaba. Medido sobre opencode 1.18.34 y sobre el `@openai/codex` de npm.
|
|
7
|
+
*
|
|
8
|
+
* No se arregla con `shell: true` ni con `cmd.exe /c`: Parar mata al hijo (`PeticionExterna.senal`),
|
|
9
|
+
* y el hijo sería `cmd.exe` —el motor nieto sobreviviría—. Se lee el shim y se lanza el NATIVO:
|
|
10
|
+
*
|
|
11
|
+
* - **OpenCode**: el shim apunta a un `.exe` (`"%dp0%\node_modules\opencode-ai\bin\opencode.exe"`),
|
|
12
|
+
* y se lanza ese.
|
|
13
|
+
* - **Codex**: el shim apunta a un script de Node (`…\@openai\codex\bin\codex.js`) que a su vez
|
|
14
|
+
* lanza el `codex.exe` de su paquete de plataforma. Tampoco se lanza `node codex.js`: en Windows
|
|
15
|
+
* matar a `node` no le reenvía nada al nieto. Se busca el `codex.exe` con la MISMA regla que el
|
|
16
|
+
* script (`@openai/codex-win32-<arch>/vendor/<triple>/bin/codex.exe`), igual que con el binario
|
|
17
|
+
* del SDK de Claude. Lo único que el script añade al entorno son `CODEX_MANAGED_*`, que solo
|
|
18
|
+
* deciden cómo sugiere actualizarse.
|
|
19
|
+
*
|
|
20
|
+
* Un shim de otro script de Node no se persigue: se devuelve `undefined` y quien llama se queda
|
|
21
|
+
* con el nombre a secas. Fuera del PATH × PATHEXT no se acepta nada: npm deja además un `opencode`
|
|
22
|
+
* SIN extensión, que es el shim de sh para Git Bash y no se puede lanzar.
|
|
23
|
+
*/
|
|
24
|
+
/** Lo que el resolvedor necesita de la máquina, para poder probarlo sin ella. */
|
|
25
|
+
export interface MaquinaWindows {
|
|
26
|
+
readonly path: string | undefined;
|
|
27
|
+
readonly pathext: string | undefined;
|
|
28
|
+
readonly esFichero: (ruta: string) => boolean;
|
|
29
|
+
readonly leer: (ruta: string) => string;
|
|
30
|
+
/** `process.arch`: decide el paquete de plataforma de Codex. */
|
|
31
|
+
readonly arquitectura?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Lo que lanza un shim `.cmd` de npm, RELATIVO a la carpeta del shim: un `.exe` o un `.js`. Es la
|
|
35
|
+
* ÚLTIMA ruta `"%dp0%\…"` del fichero: el de un script de Node nombra antes `"%dp0%\node.exe"`
|
|
36
|
+
* en el `IF EXIST` que busca un Node al lado, y ese no es el destino.
|
|
37
|
+
*/
|
|
38
|
+
export declare function destinoDeShimDeNpm(texto: string): string | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* El `codex.exe` que lanzaría `…\@openai\codex\bin\codex.js`. El script lo resuelve con
|
|
41
|
+
* `require.resolve("@openai/codex-win32-<arch>/package.json")` desde su paquete (anidado o
|
|
42
|
+
* subido al `node_modules` de al lado) y cae a `vendor/` dentro del propio paquete.
|
|
43
|
+
*/
|
|
44
|
+
export declare function nativoDeCodex(script: string, maquina: MaquinaWindows): string | undefined;
|
|
45
|
+
/** La ruta del ejecutable que de verdad se lanza para `nombre`, o `undefined` si no hay uno. */
|
|
46
|
+
export declare function resolverEnWindows(nombre: string, maquina: MaquinaWindows): string | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* El binario que se le pasa a `spawn`. Fuera de Windows, tal cual. En Windows, un nombre a secas o
|
|
49
|
+
* un `.cmd` se resuelven a su nativo; una ruta a un `.exe` (lo que alguien puso en `OPENCODE_BIN`
|
|
50
|
+
* o `CODEX_BIN`) se respeta. Lo que no se resuelve se devuelve como llegó: el `ENOENT` dirá lo que
|
|
51
|
+
* pasa.
|
|
52
|
+
*/
|
|
53
|
+
export declare function ejecutableParaLanzar(binario: string, maquina?: MaquinaWindows, plataforma?: NodeJS.Platform): string;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qué puede escribir un agente externo con motor **codex**, y quién lo autoriza.
|
|
3
|
+
*
|
|
4
|
+
* Este fichero es el gemelo de `escrituraExterna.ts` para el otro motor, y existe por la
|
|
5
|
+
* misma razón: las rutas que Codex propone son **absolutas** y van al disco directas, así
|
|
6
|
+
* que ninguna de las cuatro capas que protegen al proyecto por el camino de LangGraph
|
|
7
|
+
* —`permisosDe`, el `virtualMode`, las vistas aplanadas y las guardas de artefactos y
|
|
8
|
+
* descargas— las ve. Lo que NO se hace aquí es volver a escribir esas guardas: se llama a
|
|
9
|
+
* `veredictoDeRuta`, la misma función, porque un segundo sitio donde decidir sobre una ruta
|
|
10
|
+
* sería un segundo sitio donde el fail-closed puede dejar de estarlo.
|
|
11
|
+
*
|
|
12
|
+
* Lo propio de Codex es solo la FORMA, y está medida contra el binario real (codex-cli
|
|
13
|
+
* 0.152.1, 11-09-2026, tres ejecuciones):
|
|
14
|
+
*
|
|
15
|
+
* - **La palanca es `approvalPolicy`, no `sandbox`.** Con `sandbox: "workspace-write"` las
|
|
16
|
+
* escrituras dentro del cwd ocurren solas y no vuelven a xonecode — que es exactamente el
|
|
17
|
+
* motivo por el que `core/agentes.ts` rechazaba un `.md` de codex que pidiera escribir.
|
|
18
|
+
* Con `sandbox: "read-only"` + `approvalPolicy: "on-request"`, la denegación la sigue
|
|
19
|
+
* poniendo la caja del sistema operativo y cada escritura llega como una PETICIÓN que
|
|
20
|
+
* contestamos nosotros: el mismo papel que el `ask` del hook `PreToolUse` en Claude Code.
|
|
21
|
+
* Medido: al contestar `accept` el fichero se escribe, y al contestar `decline` no queda
|
|
22
|
+
* fichero, el item queda `declined` y el turno SIGUE (el agente lo cuenta en su respuesta).
|
|
23
|
+
* Por eso el sandbox se queda en `read-only` SIEMPRE, también con la escritura concedida:
|
|
24
|
+
* no existe ningún modo en el que Codex escriba sin pasar por aquí.
|
|
25
|
+
*
|
|
26
|
+
* - **La petición no dice sobre QUÉ se decide.** `item/fileChange/requestApproval` trae
|
|
27
|
+
* `{threadId, turnId, itemId, startedAtMs, reason, grantRoot}` y nada más; los ficheros
|
|
28
|
+
* vienen ANTES, en el `item/started` cuyo `item.id` es ese `itemId`. De ahí que el
|
|
29
|
+
* adaptador lleve un registro de items: sin él no hay diff que enseñar, y sin diff no hay
|
|
30
|
+
* decisión que tomar.
|
|
31
|
+
*
|
|
32
|
+
* - **`add` y `update` no traen lo mismo en `diff`**: en `add` es el CONTENIDO entero
|
|
33
|
+
* (`"medido.\n"`), y en `update` un hunk unificado
|
|
34
|
+
* (`"@@ -1,3 +1,3 @@\n uno\n-dos\n+DOS\n tres\n"`). Por eso `cambioDe()` no sirve aquí
|
|
35
|
+
* —espera los argumentos de un `Write`/`Edit`— y hay una traducción propia a
|
|
36
|
+
* `LineaDeDiff[]`, que es lo único que las tres pieles saben pintar.
|
|
37
|
+
*/
|
|
38
|
+
import type { LineaDeDiff } from "../../core/diff.js";
|
|
39
|
+
import type { PoliticaDeEscrituraExterna } from "../../core/ports.js";
|
|
40
|
+
import { type VeredictoDeEscrituras } from "./escrituraExterna.js";
|
|
41
|
+
/** Un `FileUpdateChange` tal y como llega. Se tipa flojo a propósito: viene de fuera. */
|
|
42
|
+
export interface CambioDeCodex {
|
|
43
|
+
path?: unknown;
|
|
44
|
+
kind?: {
|
|
45
|
+
type?: unknown;
|
|
46
|
+
move_path?: unknown;
|
|
47
|
+
} | undefined;
|
|
48
|
+
diff?: unknown;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* El diff de un cambio, traducido a lo que pintan las pieles.
|
|
52
|
+
*
|
|
53
|
+
* Dos formas y no una, porque el binario manda dos (medido):
|
|
54
|
+
* - `add`: el contenido entero, sin cabeceras. Todo es línea AÑADIDA.
|
|
55
|
+
* - `update`: hunks unificados. Se tira la cabecera `@@ …@@` y la marca
|
|
56
|
+
* ``, que no son contenido del fichero; el primer carácter de
|
|
57
|
+
* lo demás dice el tipo.
|
|
58
|
+
*
|
|
59
|
+
* **Límite declarado**: con varios hunks, las líneas de uno y de otro salen seguidas, sin
|
|
60
|
+
* decir que en medio hay fichero que no cambia. Meter un separador exigiría inventar una
|
|
61
|
+
* línea que no está en el fichero, y `LineaDeDiff` no tiene forma de marcarla como tal.
|
|
62
|
+
*/
|
|
63
|
+
export declare function lineasDeCambioDeCodex(kind: string, diff: unknown): LineaDeDiff[];
|
|
64
|
+
/**
|
|
65
|
+
* Los cambios de un item, traducidos a escrituras propuestas y comprobados contra las guardas.
|
|
66
|
+
*
|
|
67
|
+
* Lo propio de Codex es solo esto: reconocer el `kind` y componer las líneas. Las guardas de
|
|
68
|
+
* ruta y la política son `escrituraExterna.ts`, compartidas con el otro motor que escribe por
|
|
69
|
+
* petición.
|
|
70
|
+
*
|
|
71
|
+
* **`delete` y `move_path` se deniegan, y está declarado.** En Claude Code esa escritura no
|
|
72
|
+
* existe —no hay tool de borrar ni de renombrar, así que las listas ni la nombran—, `cambioDe`
|
|
73
|
+
* no sabe componer su diff, y un renombrado son DOS destinos que habría que guardar por
|
|
74
|
+
* separado. Es la paridad conservadora entre motores, y se afloja el día que se mida.
|
|
75
|
+
*/
|
|
76
|
+
export declare function veredictoDeCambiosDeCodex(opciones: {
|
|
77
|
+
cwd: string;
|
|
78
|
+
agente: string;
|
|
79
|
+
cambios: unknown;
|
|
80
|
+
ficheros: ReadonlySet<string>;
|
|
81
|
+
real?: (ruta: string) => string;
|
|
82
|
+
}): VeredictoDeEscrituras;
|
|
83
|
+
/** La decisión entera para Codex: traducir, y de ahí en adelante el camino compartido. */
|
|
84
|
+
export declare function decisionDeEscrituraDeCodex(opciones: {
|
|
85
|
+
cwd: string;
|
|
86
|
+
agente: string;
|
|
87
|
+
cambios: unknown;
|
|
88
|
+
ficheros: ReadonlySet<string>;
|
|
89
|
+
real?: (ruta: string) => string;
|
|
90
|
+
aprobar?: PoliticaDeEscrituraExterna;
|
|
91
|
+
}): Promise<{
|
|
92
|
+
concedida: boolean;
|
|
93
|
+
motivo?: string;
|
|
94
|
+
}>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qué puede escribir un agente externo con motor **opencode**, y quién lo autoriza.
|
|
3
|
+
*
|
|
4
|
+
* El tercer motor, y el que menos código propio necesita: su petición de permiso trae TODO en
|
|
5
|
+
* un solo mensaje. Medido contra el binario real (opencode 1.18.27, 11-09-2026):
|
|
6
|
+
*
|
|
7
|
+
* session/request_permission {
|
|
8
|
+
* toolCall: { toolCallId, title, kind: "edit", status, locations: [{path}],
|
|
9
|
+
* rawInput: {filepath, diff}, content: [{type:"diff", path, oldText, newText}] },
|
|
10
|
+
* options: [ {optionId:"once"}, {optionId:"always"}, {optionId:"reject"} ] }
|
|
11
|
+
*
|
|
12
|
+
* De ahí salen las dos cosas que hacen falta y nada más: la RUTA (absoluta, como en los otros
|
|
13
|
+
* dos motores) y el ANTES y el DESPUÉS. **`oldText`/`newText` entran directos en
|
|
14
|
+
* `core/diff.ts#diffDeLineas`**, que es la misma función que compone el diff de una aprobación
|
|
15
|
+
* del grafo — así que aquí no hay ni registro de items (como en Codex, cuya petición solo trae
|
|
16
|
+
* un `itemId`) ni parser de hunks. Es la forma más sencilla de las tres.
|
|
17
|
+
*
|
|
18
|
+
* Las guardas de ruta y la política NO se reescriben: son `escrituraExterna.ts`, compartidas.
|
|
19
|
+
* Y se reaplican aunque la configuración de opencode ya deniegue por su cuenta: esa capa es
|
|
20
|
+
* NUESTRA configuración, pero quien la aplica es él. La guarda de xonecode es código.
|
|
21
|
+
*/
|
|
22
|
+
import type { PoliticaDeEscrituraExterna } from "../../core/ports.js";
|
|
23
|
+
import { type EscrituraPropuesta, type VeredictoDeEscrituras } from "./escrituraExterna.js";
|
|
24
|
+
/** El `toolCall` de una petición de permiso de ACP. Se tipa flojo: viene de fuera. */
|
|
25
|
+
export interface ToolCallDeOpencode {
|
|
26
|
+
kind?: unknown;
|
|
27
|
+
locations?: unknown;
|
|
28
|
+
content?: unknown;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Las escrituras que propone un `toolCall`, o el motivo por el que no se puede decidir.
|
|
32
|
+
*
|
|
33
|
+
* **Solo `kind: "edit"`.** Lo que no sea una edición no tiene diff que componer, y decidir
|
|
34
|
+
* sobre una escritura sin poder enseñarla es justo lo que este camino existe para impedir —
|
|
35
|
+
* el mismo argumento por el que en Codex un `item/commandExecution/requestApproval` se deniega
|
|
36
|
+
* siempre. La configuración ya le quita `bash`, `webfetch` y `websearch`; esto es la segunda
|
|
37
|
+
* llave, por si esa capa fallara.
|
|
38
|
+
*
|
|
39
|
+
* Del `content` se leen los trozos `diff`, que es donde vienen el antes y el después. Si no
|
|
40
|
+
* hay ninguno se cae a `locations`, **y entonces se pregunta igual con el diff vacío**: decidir
|
|
41
|
+
* sin diff es peor que decidir con diff, pero escribir sin decisión es lo que esto evita.
|
|
42
|
+
*/
|
|
43
|
+
export declare function propuestasDeToolCall(toolCall: ToolCallDeOpencode | undefined): {
|
|
44
|
+
propuestas: EscrituraPropuesta[];
|
|
45
|
+
} | {
|
|
46
|
+
motivo: string;
|
|
47
|
+
};
|
|
48
|
+
/** El veredicto de ruta de un `toolCall`, para poder probar la traducción aparte. */
|
|
49
|
+
export declare function veredictoDeToolCall(opciones: {
|
|
50
|
+
cwd: string;
|
|
51
|
+
agente: string;
|
|
52
|
+
toolCall: ToolCallDeOpencode | undefined;
|
|
53
|
+
ficheros: ReadonlySet<string>;
|
|
54
|
+
real?: (ruta: string) => string;
|
|
55
|
+
}): VeredictoDeEscrituras;
|
|
56
|
+
/** La decisión entera: traducir, y de ahí en adelante el camino compartido con Codex. */
|
|
57
|
+
export declare function decisionDeEscrituraDeOpencode(opciones: {
|
|
58
|
+
cwd: string;
|
|
59
|
+
agente: string;
|
|
60
|
+
toolCall: ToolCallDeOpencode | undefined;
|
|
61
|
+
ficheros: ReadonlySet<string>;
|
|
62
|
+
real?: (ruta: string) => string;
|
|
63
|
+
aprobar?: PoliticaDeEscrituraExterna;
|
|
64
|
+
}): Promise<{
|
|
65
|
+
concedida: boolean;
|
|
66
|
+
motivo?: string;
|
|
67
|
+
}>;
|