xonecode 0.38.44 → 0.39.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/web/dist/assets/{EditorDeFichero-BeWDctgN.js → EditorDeFichero-4HFwLke_.js} +1 -1
- package/apps/web/dist/assets/index-C57A_ylS.css +1 -0
- package/apps/web/dist/assets/index-CYZEmLsX.js +506 -0
- package/apps/web/dist/assets/{php-D3QdOnb8.js → php-CdQiFsq1.js} +1 -1
- package/apps/web/dist/assets/{ruby-DDAcW-Z2.js → ruby-3JrCXo0h.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/cloudstudio/cloudstudioClient.d.ts +29 -0
- package/dist/agent/cloudstudio/cloudstudioMcp.d.ts +414 -0
- package/dist/agent/cloudstudio/conexionDeServidor.d.ts +37 -0
- package/dist/agent/cloudstudio/conexionDeServidor.js +63 -0
- package/dist/agent/cloudstudio/conexionDeServidor.js.map +1 -0
- package/dist/agent/cloudstudio/crearRama.d.ts +15 -0
- package/dist/agent/cloudstudio/crearRama.js +16 -0
- package/dist/agent/cloudstudio/crearRama.js.map +1 -0
- package/dist/agent/cloudstudio/descarga.d.ts +44 -0
- package/dist/agent/cloudstudio/manifiesto.d.ts +25 -0
- package/dist/agent/cloudstudio/ramaActiva.d.ts +24 -0
- package/dist/agent/cloudstudio/subida.d.ts +61 -0
- package/dist/agent/cloudstudio/subida.js +7 -1
- package/dist/agent/cloudstudio/subida.js.map +1 -1
- package/dist/agent/cloudstudio/validarTrasDescarga.d.ts +13 -0
- package/dist/agent/cloudstudio/zip.d.ts +13 -0
- package/dist/agent/conectores/conectoresEnDisco.d.ts +47 -0
- package/dist/agent/conectores/gestorJira.d.ts +50 -0
- package/dist/agent/conectores/gestorNotion.d.ts +45 -0
- package/dist/agent/conectores/proveedorDeConector.d.ts +43 -0
- package/dist/agent/conectores/servicioDeConectores.d.ts +112 -0
- package/dist/agent/config/authEnDisco.d.ts +43 -0
- package/dist/agent/config/catalogoModelos.d.ts +79 -0
- package/dist/agent/config/configEnDisco.d.ts +235 -0
- package/dist/agent/config/crearProyecto.d.ts +20 -0
- package/dist/agent/config/diagnosticoDeNodeEnMaquina.d.ts +44 -0
- package/dist/agent/config/ecoDeRazonamiento.d.ts +104 -0
- package/dist/agent/config/entorno.d.ts +83 -0
- package/dist/agent/config/fuentesEnRed.d.ts +12 -0
- package/dist/agent/config/gemini.d.ts +5 -0
- package/dist/agent/config/iconosEnRed.d.ts +10 -0
- package/dist/agent/config/identidadEnDisco.d.ts +27 -0
- package/dist/agent/config/modelos.d.ts +77 -0
- package/dist/agent/config/modelosDeMotor.d.ts +52 -0
- package/dist/agent/config/mudanzaEnDisco.d.ts +99 -0
- package/dist/agent/config/persona.d.ts +1 -0
- package/dist/agent/config/selectorEnMaquina.d.ts +35 -0
- package/dist/agent/config/settingsEnDisco.d.ts +206 -0
- package/dist/agent/config/versionEnDisco.d.ts +17 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.d.ts +60 -0
- package/dist/agent/dispositivos/cajasDeMaqueta.d.ts +61 -0
- package/dist/agent/dispositivos/decodificarImagen.d.ts +21 -0
- package/dist/agent/dispositivos/descargaDeHerramientas.d.ts +44 -0
- package/dist/agent/dispositivos/dispositivosEnMaquina.d.ts +161 -0
- package/dist/agent/dispositivos/geometriaEnDisco.d.ts +17 -0
- package/dist/agent/dispositivos/hotswap.d.ts +194 -0
- package/dist/agent/dispositivos/instalacionEnMaquina.d.ts +156 -0
- package/dist/agent/dispositivos/juezVisual.d.ts +144 -0
- package/dist/agent/dispositivos/lanzamientoEnMaquina.d.ts +197 -0
- package/dist/agent/dispositivos/paqueteDelProyecto.d.ts +28 -0
- package/dist/agent/dispositivos/procesosEnMaquina.d.ts +154 -0
- package/dist/agent/dispositivos/recargaEnAparato.d.ts +30 -0
- package/dist/agent/dispositivos/sensorDeArranque.d.ts +42 -0
- package/dist/agent/exportarPdf.d.ts +72 -0
- package/dist/agent/grafo/aprendido.d.ts +28 -0
- package/dist/agent/grafo/arbolDeProyecto.d.ts +205 -0
- package/dist/agent/grafo/artefactosEnDisco.d.ts +35 -0
- package/dist/agent/grafo/atributosXone.d.ts +31 -0
- package/dist/agent/grafo/buscarIcono.d.ts +32 -0
- package/dist/agent/grafo/busquedaRegex.d.ts +56 -0
- package/dist/agent/grafo/codificacionDelProyecto.d.ts +7 -0
- package/dist/agent/grafo/compararCapturas.d.ts +22 -0
- package/dist/agent/grafo/copiarArtefacto.d.ts +64 -0
- package/dist/agent/grafo/criticaVisual.d.ts +60 -0
- package/dist/agent/grafo/describirImagen.d.ts +79 -0
- package/dist/agent/grafo/diferenciaDeCapturas.d.ts +33 -0
- package/dist/agent/grafo/ejecucionCancelable.d.ts +45 -0
- package/dist/agent/grafo/escriturasEnSerie.d.ts +31 -0
- package/dist/agent/grafo/excluirTools.d.ts +37 -0
- package/dist/agent/grafo/fuentesDeGoogle.d.ts +37 -0
- package/dist/agent/grafo/generarFondoSvg.d.ts +52 -0
- package/dist/agent/grafo/incorporarAdjunto.d.ts +98 -0
- package/dist/agent/grafo/lectorDeReferencias.d.ts +28 -0
- package/dist/agent/grafo/marcarCriteriosDelPlan.d.ts +47 -0
- package/dist/agent/grafo/memoriaDeProyecto.d.ts +15 -0
- package/dist/agent/grafo/navegacionXone.d.ts +60 -0
- package/dist/agent/grafo/opcionesDeFicheros.d.ts +23 -0
- package/dist/agent/grafo/perfiles.d.ts +225 -0
- package/dist/agent/grafo/proyecto.d.ts +450 -0
- package/dist/agent/grafo/skills.d.ts +181 -0
- package/dist/agent/grafo/traerDeLaMaquina.d.ts +60 -0
- package/dist/agent/grafo/unirSecciones.d.ts +20 -0
- package/dist/agent/grafo/validacionXone.d.ts +35 -0
- package/dist/agent/grafo/validarFicheroXone.d.ts +33 -0
- package/dist/agent/grafo/xoneAgent.d.ts +166 -0
- package/dist/agent/motores/motoresLocales.d.ts +87 -0
- package/dist/agent/motores/trueforge/capacidades.d.ts +183 -0
- package/dist/agent/motores/trueforge/convertirAP.d.ts +38 -0
- package/dist/agent/motores/trueforge/detencion.d.ts +70 -0
- package/dist/agent/motores/trueforge/esperas.d.ts +38 -0
- package/dist/agent/motores/trueforge/eventosTrueforge.d.ts +56 -0
- package/dist/agent/motores/trueforge/informesDeHijos.d.ts +48 -0
- package/dist/agent/motores/trueforge/medidaAutomatica.d.ts +37 -0
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.d.ts +60 -0
- package/dist/agent/motores/trueforge/memoriaTrueforge.d.ts +131 -0
- package/dist/agent/motores/trueforge/metricasTrueforge.d.ts +45 -0
- package/dist/agent/motores/trueforge/modeloExterno.d.ts +9 -0
- package/dist/agent/motores/trueforge/modeloLangchain.d.ts +69 -0
- package/dist/agent/motores/trueforge/notas.d.ts +48 -0
- package/dist/agent/motores/trueforge/proponerTareas.d.ts +30 -0
- package/dist/agent/motores/trueforge/recortes.d.ts +47 -0
- package/dist/agent/motores/trueforge/resumenSeguro.d.ts +33 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.d.ts +273 -0
- package/dist/agent/motores/trueforge/skillsTrueforge.d.ts +16 -0
- package/dist/agent/motores/trueforge/toolsDeConectores.d.ts +36 -0
- package/dist/agent/motores/trueforge/toolsDeFichero.d.ts +146 -0
- package/dist/agent/motores/trueforge/toolsPropias.d.ts +38 -0
- package/dist/agent/motores/trueforge/traerDeStitch.d.ts +63 -0
- package/dist/agent/motores/trueforge/trueforge.d.ts +35 -0
- package/dist/agent/navegacion/estilosEnDisco.d.ts +41 -0
- package/dist/agent/navegacion/hechosEnDisco.d.ts +19 -0
- package/dist/agent/navegacion/indiceEnDisco.d.ts +50 -0
- package/dist/agent/navegacion/modeloDeProyecto.d.ts +86 -0
- package/dist/agent/planesEnDisco.d.ts +18 -0
- package/dist/agent/publicarPlan.d.ts +20 -0
- package/dist/agent/raizDelPaquete.d.ts +9 -0
- package/dist/agent/remoto/ngrokEnMaquina.d.ts +44 -0
- package/dist/agent/remoto/puenteWebSocket.d.ts +59 -0
- package/dist/agent/remoto/tunelNgrok.d.ts +31 -0
- package/dist/agent/renombrarSobre.d.ts +14 -0
- package/dist/agent/sesiones/adjuntosDeSesion.d.ts +64 -0
- package/dist/agent/sesiones/baseDeFichero.d.ts +9 -0
- package/dist/agent/sesiones/checkpointer.d.ts +146 -0
- package/dist/agent/sesiones/git.d.ts +66 -0
- package/dist/agent/sesiones/gitSync.d.ts +264 -0
- package/dist/agent/sesiones/memoriaDeHilo.d.ts +4 -0
- package/dist/agent/sesiones/modeloDelCambio.d.ts +7 -0
- package/dist/agent/sesiones/parcheEnTexto.d.ts +9 -0
- package/dist/agent/sesiones/sesionGit.d.ts +155 -0
- package/dist/agent/subagentes/actividadDeCodex.d.ts +8 -0
- package/dist/agent/subagentes/agentesEnDisco.d.ts +198 -0
- package/dist/agent/subagentes/consumoExterno.d.ts +83 -0
- package/dist/agent/subagentes/ejecutableEnWindows.d.ts +53 -0
- package/dist/agent/subagentes/escrituraDeCodex.d.ts +94 -0
- package/dist/agent/subagentes/escrituraDeOpencode.d.ts +67 -0
- package/dist/agent/subagentes/escrituraExterna.d.ts +419 -0
- package/dist/agent/subagentes/pluginDeSkills.d.ts +84 -0
- package/dist/agent/subagentes/subagenteCodex.d.ts +76 -0
- package/dist/agent/subagentes/subagenteExterno.d.ts +169 -0
- package/dist/agent/subagentes/subagenteOpencode.d.ts +126 -0
- package/dist/agent/tareas/aumentador.d.ts +99 -0
- package/dist/agent/tareas/juezDeTarea.d.ts +64 -0
- package/dist/agent/tareas/reflejoEnElGestor.d.ts +38 -0
- package/dist/agent/tareas/sondeoDelGestor.d.ts +49 -0
- package/dist/agent/tareas/tareasEnDisco.d.ts +148 -0
- package/dist/agent/tareas/tareasEnDisco.js +17 -0
- package/dist/agent/tareas/tareasEnDisco.js.map +1 -1
- package/dist/agent/trazaDeErroresEnDisco.d.ts +10 -0
- package/dist/agent/turno/depuracion.d.ts +1 -0
- package/dist/agent/turno/diagnosticoDeTools.d.ts +124 -0
- package/dist/agent/turno/ficherosDelProyecto.d.ts +10 -0
- package/dist/agent/turno/guionizado.d.ts +18 -0
- package/dist/agent/turno/informeDeTraza.d.ts +220 -0
- package/dist/agent/turno/inspectorDePrompt.d.ts +150 -0
- package/dist/agent/turno/instantanea.d.ts +16 -0
- package/dist/agent/turno/interrupts.d.ts +54 -0
- package/dist/agent/turno/juezDelTurnoConModelo.d.ts +26 -0
- package/dist/agent/turno/mensajes.d.ts +23 -0
- package/dist/agent/turno/normalizar.d.ts +15 -0
- package/dist/agent/turno/puente.d.ts +196 -0
- package/dist/agent/turno/registroDeFallos.d.ts +39 -0
- package/dist/agent/turno/resumenDeContexto.d.ts +269 -0
- package/dist/agent/turno/resumenDeTool.d.ts +33 -0
- package/dist/agent/turno/rubrica.d.ts +35 -0
- package/dist/agent/turno/sesionReal.d.ts +89 -0
- package/dist/agent/turno/textoDeTool.d.ts +19 -0
- package/dist/agent/turno/turnoReal.d.ts +210 -0
- package/dist/agent/turno/verificacion.d.ts +85 -0
- package/dist/agent/turno/verificador.d.ts +66 -0
- package/dist/bin.d.ts +2 -0
- package/dist/cli/acuseDeModelo.d.ts +18 -0
- package/dist/cli/aprobar.d.ts +162 -0
- package/dist/cli/config.d.ts +17 -0
- package/dist/cli/consola.d.ts +473 -0
- package/dist/cli/describe.d.ts +7 -0
- package/dist/cli/doctor.d.ts +8 -0
- package/dist/cli/fuentesDeDisco.d.ts +25 -0
- package/dist/cli/main.d.ts +291 -0
- package/dist/cli/markdown.d.ts +126 -0
- package/dist/cli/panel.d.ts +38 -0
- package/dist/cli/podar.d.ts +38 -0
- package/dist/cli/run.d.ts +30 -0
- package/dist/cli/spinner.d.ts +37 -0
- package/dist/cli/stdio.d.ts +94 -0
- package/dist/cli/tema.d.ts +68 -0
- package/dist/cli/tokens.d.ts +16 -0
- package/dist/cli/traza.d.ts +19 -0
- package/dist/cli/tui/app.d.ts +23 -0
- package/dist/cli/tui/aprobarTui.d.ts +46 -0
- package/dist/cli/tui/barra.d.ts +43 -0
- package/dist/cli/tui/correrTui.d.ts +119 -0
- package/dist/cli/tui/entrada.d.ts +14 -0
- package/dist/cli/tui/filas.d.ts +13 -0
- package/dist/cli/tui/logo.d.ts +20 -0
- package/dist/cli/tui/pielTui.d.ts +15 -0
- package/dist/cli/tui/raton.d.ts +68 -0
- package/dist/cli/tui/sidebar.d.ts +63 -0
- package/dist/cli/tui/store.d.ts +102 -0
- package/dist/cli/tui/tarjeta.d.ts +8 -0
- package/dist/cli/tui/temaInk.d.ts +67 -0
- package/dist/cli/tui/transcript.d.ts +32 -0
- package/dist/cli/verify.d.ts +9 -0
- package/dist/cli/wizardInicial.d.ts +59 -0
- package/dist/core/actos.d.ts +437 -0
- package/dist/core/adjuntos.d.ts +77 -0
- package/dist/core/agentes.d.ts +353 -0
- package/dist/core/analisisDeSesion.d.ts +63 -0
- package/dist/core/aprendido.d.ts +41 -0
- package/dist/core/artefactos.d.ts +74 -0
- package/dist/core/atributosXone.d.ts +53 -0
- package/dist/core/bitacora.d.ts +21 -0
- package/dist/core/cloudstudio.d.ts +168 -0
- package/dist/core/codificacion.d.ts +81 -0
- package/dist/core/comandoExterno.d.ts +49 -0
- package/dist/core/compararCapturas.d.ts +136 -0
- package/dist/core/conectores.d.ts +296 -0
- package/dist/core/config.d.ts +148 -0
- package/dist/core/contextos.d.ts +54 -0
- package/dist/core/convertirAP.d.ts +56 -0
- package/dist/core/copiaDeAvd.d.ts +44 -0
- package/dist/core/cssBienFormado.d.ts +22 -0
- package/dist/core/deps.d.ts +28 -0
- package/dist/core/descargas.d.ts +61 -0
- package/dist/core/descripcionDePantalla.d.ts +121 -0
- package/dist/core/descriptoresDeApp.d.ts +108 -0
- package/dist/core/diagnosticoDeNode.d.ts +51 -0
- package/dist/core/diff.d.ts +26 -0
- package/dist/core/diffDeColecciones.d.ts +54 -0
- package/dist/core/disenoVinculado.d.ts +17 -0
- package/dist/core/dispositivoDeSesion.d.ts +22 -0
- package/dist/core/dispositivoElegido.d.ts +17 -0
- package/dist/core/dispositivos.d.ts +469 -0
- package/dist/core/entrega.d.ts +341 -0
- package/dist/core/entrelazar.d.ts +48 -0
- package/dist/core/esfuerzo.d.ts +120 -0
- package/dist/core/esqueleto.d.ts +38 -0
- package/dist/core/estiloMedido.d.ts +70 -0
- package/dist/core/estilos.d.ts +76 -0
- package/dist/core/events.d.ts +218 -0
- package/dist/core/exportacion.d.ts +88 -0
- package/dist/core/fallos.d.ts +79 -0
- package/dist/core/fondosSvg.d.ts +115 -0
- package/dist/core/fotoDeColecciones.d.ts +45 -0
- package/dist/core/fuentes.d.ts +96 -0
- package/dist/core/geometriaDePantalla.d.ts +171 -0
- package/dist/core/gestorDeTareas.d.ts +295 -0
- package/dist/core/hechosDelProyecto.d.ts +70 -0
- package/dist/core/hotswap.d.ts +30 -0
- package/dist/core/iconos.d.ts +86 -0
- package/dist/core/identidadDeProveedor.d.ts +20 -0
- package/dist/core/idiomaDeLaRespuesta.d.ts +26 -0
- package/dist/core/imagenesDeDocumento.d.ts +40 -0
- package/dist/core/jsParaRhino.d.ts +3 -0
- package/dist/core/juezDelTurno.d.ts +95 -0
- package/dist/core/logDeDispositivo.d.ts +67 -0
- package/dist/core/memoria.d.ts +18 -0
- package/dist/core/metodoDeComparacionVisual.d.ts +20 -0
- package/dist/core/modelos.d.ts +198 -0
- package/dist/core/modoDeEscritura.d.ts +155 -0
- package/dist/core/motor.d.ts +43 -0
- package/dist/core/motoresLocales.d.ts +113 -0
- package/dist/core/mudanzaDeWorkspace.d.ts +112 -0
- package/dist/core/navegacion.d.ts +172 -0
- package/dist/core/notify.d.ts +77 -0
- package/dist/core/nucleoXone.d.ts +28 -0
- package/dist/core/panorama.d.ts +68 -0
- package/dist/core/paqueteDeSoporte.d.ts +100 -0
- package/dist/core/planDeSubida.d.ts +56 -0
- package/dist/core/planes.d.ts +53 -0
- package/dist/core/podaDeCheckpoint.d.ts +75 -0
- package/dist/core/ports.d.ts +1034 -0
- package/dist/core/puedeLanzarse.d.ts +181 -0
- package/dist/core/puertosDeAvd.d.ts +59 -0
- package/dist/core/recargaEnCaliente.d.ts +52 -0
- package/dist/core/referenciasDeImagen.d.ts +36 -0
- package/dist/core/remoto.d.ts +76 -0
- package/dist/core/repartoDeEncargo.d.ts +80 -0
- package/dist/core/rubrica.d.ts +78 -0
- package/dist/core/rutaVirtual.d.ts +29 -0
- package/dist/core/selectorDeCarpeta.d.ts +59 -0
- package/dist/core/serieDeEscrituras.d.ts +58 -0
- package/dist/core/settings.d.ts +421 -0
- package/dist/core/shellDeAgente.d.ts +177 -0
- package/dist/core/skills.d.ts +129 -0
- package/dist/core/stitch.d.ts +114 -0
- package/dist/core/tareas.d.ts +412 -0
- package/dist/core/tareasDelPlan.d.ts +123 -0
- package/dist/core/tareasEnElGestor.d.ts +117 -0
- package/dist/core/textos.d.ts +8 -0
- package/dist/core/topeAgotado.d.ts +55 -0
- package/dist/core/traerDeLaMaquina.d.ts +33 -0
- package/dist/core/trazaDeErrores.d.ts +83 -0
- package/dist/core/tunel.d.ts +45 -0
- package/dist/core/turno.d.ts +154 -0
- package/dist/core/validacionDeEscritura.d.ts +95 -0
- package/dist/core/verificacionDeSubida.d.ts +14 -0
- package/dist/core/version.d.ts +35 -0
- package/dist/core/xmlBienFormado.d.ts +23 -0
- package/dist/core/zipDeAdjunto.d.ts +28 -0
- package/dist/core/zipDeSkill.d.ts +74 -0
- package/dist/lib/tareaAutonoma.d.ts +36 -0
- package/dist/lib/tareaAutonoma.js +259 -0
- package/dist/lib/tareaAutonoma.js.map +1 -0
- package/dist/lib.d.ts +31 -0
- package/dist/lib.js +28 -0
- package/dist/lib.js.map +1 -0
- package/dist/vendor/hitl.d.ts +69 -0
- package/dist/vendor/skillLoaders/catalog.d.ts +27 -0
- package/dist/vendor/sqliteSaver.d.ts +22 -0
- package/dist/vendor/tokenTracking.d.ts +22 -0
- package/dist/web/servidor/arranque.d.ts +1372 -0
- package/dist/web/servidor/arranque.js +39 -0
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/consolaDeTarea.d.ts +166 -0
- package/dist/web/servidor/consolaWeb.d.ts +142 -0
- package/dist/web/servidor/corredorDeTareas.d.ts +395 -0
- package/dist/web/servidor/datosDeCierre.d.ts +4 -0
- package/dist/web/servidor/interrupcion.d.ts +39 -0
- package/dist/web/servidor/pielWeb.d.ts +32 -0
- package/dist/web/servidor/puenteRemoto.d.ts +80 -0
- package/dist/web/servidor/servidor.d.ts +53 -0
- package/dist/web/servidor/sesiones.d.ts +342 -0
- package/dist/web/servidor/soporte.d.ts +65 -0
- package/dist/web/servidor/transporte.d.ts +2751 -0
- package/dist/web/servidor/vestibulo.d.ts +952 -0
- package/dist/web/servidor/visorOpenui.d.ts +33 -0
- package/package.json +9 -1
- package/apps/web/dist/assets/index-B-6cDRAV.js +0 -506
- package/apps/web/dist/assets/index-BQdHnRbo.css +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type ImagenReferida } from "../../core/referenciasDeImagen.js";
|
|
3
|
+
import type { Papel } from "../../core/ports.js";
|
|
4
|
+
import { type InvocarVisual } from "../dispositivos/juezVisual.js";
|
|
5
|
+
/**
|
|
6
|
+
* `describe_image`: que el agente VEA una imagen (IXCODE-23).
|
|
7
|
+
*
|
|
8
|
+
* ## Por qué existe, medido
|
|
9
|
+
*
|
|
10
|
+
* Con una imagen adjunta, el agente contestaba «en este harness no tengo visión» sin abrirla. Dos
|
|
11
|
+
* causas, las dos nuestras: el aviso de adjuntos se lo DECÍA («no hay visión en este harness
|
|
12
|
+
* todavía»), y el `read_file` de TrueForge devolvía «fichero binario» ante un PNG. Pero el modelo sí
|
|
13
|
+
* ve: medido contra la API, `deepseek-flash` nombró el color de un cuadrado liso y describió bien un
|
|
14
|
+
* icono adjunto («un círculo negro con un símbolo de suma blanco»). No faltaba la visión, faltaba el
|
|
15
|
+
* camino hasta ella.
|
|
16
|
+
*
|
|
17
|
+
* ## Por qué una llamada APARTE y no la imagen en la conversación
|
|
18
|
+
*
|
|
19
|
+
* - En un API compatible con OpenAI, el resultado de una tool es TEXTO: una imagen devuelta por
|
|
20
|
+
* `read_file` no le llega al modelo como imagen. La única entrada sería un mensaje de usuario falso.
|
|
21
|
+
* - Una imagen en el historial se PAGA en cada llamada siguiente (se cobra por píxeles, no por bytes),
|
|
22
|
+
* y se quedaría en la foto de TrueForge y en la traza. Una descripción se paga UNA vez y es texto.
|
|
23
|
+
*
|
|
24
|
+
* Es el camino que ya usa `xone_critica_visual` (`invocarVisualConModelos`), con otra pregunta: el
|
|
25
|
+
* crítico JUZGA una pantalla, ésta DESCRIBE lo que haya.
|
|
26
|
+
*
|
|
27
|
+
* ## Las guardas
|
|
28
|
+
*
|
|
29
|
+
* La MISMA regla de ruta que las maquetas del crítico (`imagenReferida`, lista blanca de forma, sin
|
|
30
|
+
* dotfiles) y la misma lectura (`lectorDeReferencias`, texto y `realpath`): una tool de LangChain
|
|
31
|
+
* añadida por xonecode no pasa por el middleware de permisos, así que sin esto mandaría a un modelo
|
|
32
|
+
* cualquier fichero de la máquina. Todo rechazo se DEVUELVE, nunca se lanza. De un error de lectura
|
|
33
|
+
* solo cruza el `code` (su mensaje lleva la ruta absoluta).
|
|
34
|
+
*
|
|
35
|
+
* **Acepta también la ruta COMPLETA de la máquina** (petición suya: es la que el agente ve a veces en
|
|
36
|
+
* un error o la que pega la persona), pero solo si cae dentro de lo montado —el proyecto, los adjuntos
|
|
37
|
+
* y los artefactos de la sesión—: se TRADUCE a su ruta virtual y pasa por la misma regla. Fuera de ahí
|
|
38
|
+
* se rechaza con el camino (`traer_de_la_maquina` y después esta), para que no sea una forma de mandar
|
|
39
|
+
* a un modelo cualquier fichero de la máquina.
|
|
40
|
+
*
|
|
41
|
+
* **Límite declarado**: un modelo SIN visión puede no fallar y describir lo que no recibió. La
|
|
42
|
+
* respuesta dice que la descripción es de un modelo, y quien la lee no debe darla por medida.
|
|
43
|
+
*/
|
|
44
|
+
export declare const NOMBRE_DESCRIBIR_IMAGEN = "describe_image";
|
|
45
|
+
/** El papel del modelo que mira. `afilado` es del juez (`core/modelos.ts`); describir es trabajo. */
|
|
46
|
+
export declare const PAPEL_DE_DESCRIBIR: Papel;
|
|
47
|
+
/** Tope de bytes de la imagen: una captura de pantalla son cientos de KB; esto para un fichero absurdo antes de mandarlo. */
|
|
48
|
+
export declare const TOPE_DE_BYTES_DE_IMAGEN: number;
|
|
49
|
+
export declare const PROMPT_DE_DESCRIPCION: string;
|
|
50
|
+
export interface DependenciasDeDescribir {
|
|
51
|
+
invocar: InvocarVisual;
|
|
52
|
+
/** Lee la imagen ya validada (`crearLectorDeReferencias`). Lanza con un `code`. */
|
|
53
|
+
leer: (imagen: ImagenReferida) => Promise<Buffer>;
|
|
54
|
+
/**
|
|
55
|
+
* Las carpetas montadas, para traducir una ruta COMPLETA a la virtual. Ausentes, solo vale la virtual.
|
|
56
|
+
* El orden importa: las de la sesión viven DENTRO del proyecto (`.xonecode/sesiones/…`), así que se
|
|
57
|
+
* miran antes que la raíz.
|
|
58
|
+
*/
|
|
59
|
+
carpetas?: {
|
|
60
|
+
raiz: string;
|
|
61
|
+
adjuntos?: string;
|
|
62
|
+
artefactos?: string;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* La ruta virtual de una ruta completa que cae dentro de lo montado, o `undefined`. Solo compara TEXTO:
|
|
67
|
+
* lo que salga pasa después por `imagenReferida` y por el `realpath` del lector, como cualquier otra.
|
|
68
|
+
*/
|
|
69
|
+
export declare function rutaVirtualDe(completa: string, carpetas: NonNullable<DependenciasDeDescribir["carpetas"]>): string | undefined;
|
|
70
|
+
export declare function crearDescribirImagen(deps: DependenciasDeDescribir): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
|
|
71
|
+
ruta: z.ZodString;
|
|
72
|
+
pregunta: z.ZodOptional<z.ZodString>;
|
|
73
|
+
}, z.core.$strip>, {
|
|
74
|
+
ruta: string;
|
|
75
|
+
pregunta?: string | undefined;
|
|
76
|
+
}, {
|
|
77
|
+
ruta: string;
|
|
78
|
+
pregunta?: string | undefined;
|
|
79
|
+
}, string, unknown, "describe_image">;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const NOMBRE_DIFERENCIA_DE_CAPTURAS = "diferencia_de_capturas";
|
|
3
|
+
export interface DependenciasDeDiferencia {
|
|
4
|
+
leerArtefacto: (nombre: string) => Promise<Buffer>;
|
|
5
|
+
}
|
|
6
|
+
export declare function crearDiferenciaDeCapturas(deps: DependenciasDeDiferencia): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
|
|
7
|
+
antes: z.ZodString;
|
|
8
|
+
despues: z.ZodString;
|
|
9
|
+
zona: z.ZodOptional<z.ZodObject<{
|
|
10
|
+
x: z.ZodNumber;
|
|
11
|
+
y: z.ZodNumber;
|
|
12
|
+
ancho: z.ZodNumber;
|
|
13
|
+
alto: z.ZodNumber;
|
|
14
|
+
}, z.core.$strip>>;
|
|
15
|
+
}, z.core.$strip>, {
|
|
16
|
+
antes: string;
|
|
17
|
+
despues: string;
|
|
18
|
+
zona?: {
|
|
19
|
+
x: number;
|
|
20
|
+
y: number;
|
|
21
|
+
ancho: number;
|
|
22
|
+
alto: number;
|
|
23
|
+
} | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
antes: string;
|
|
26
|
+
despues: string;
|
|
27
|
+
zona?: {
|
|
28
|
+
x: number;
|
|
29
|
+
y: number;
|
|
30
|
+
ancho: number;
|
|
31
|
+
alto: number;
|
|
32
|
+
} | undefined;
|
|
33
|
+
}, string, unknown, "diferencia_de_capturas">;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface ResultadoDeEjecucion {
|
|
2
|
+
output: string;
|
|
3
|
+
exitCode: number | null;
|
|
4
|
+
truncated: boolean;
|
|
5
|
+
}
|
|
6
|
+
/** El hijo, visto por este módulo — sin `stdin`, que `execute` nunca teclea. */
|
|
7
|
+
interface ProcesoDeShell {
|
|
8
|
+
pid?: number;
|
|
9
|
+
stdout: {
|
|
10
|
+
on: (evento: "data", cb: (dato: unknown) => void) => void;
|
|
11
|
+
};
|
|
12
|
+
stderr: {
|
|
13
|
+
on: (evento: "data", cb: (dato: unknown) => void) => void;
|
|
14
|
+
};
|
|
15
|
+
on: (evento: "close" | "error", cb: (...args: unknown[]) => void) => void;
|
|
16
|
+
kill: (senal?: string) => boolean;
|
|
17
|
+
}
|
|
18
|
+
export type LanzarShell = (comando: string, opciones: {
|
|
19
|
+
env: Record<string, string>;
|
|
20
|
+
cwd: string;
|
|
21
|
+
}) => ProcesoDeShell;
|
|
22
|
+
/**
|
|
23
|
+
* **`detached: true` no es cosmético: es la causa raíz.** Sin él, el hijo comparte el grupo
|
|
24
|
+
* de proceso de xonecode entero, y `process.kill(-pid)` (dentro de `matarGrupoReal`) mataría
|
|
25
|
+
* ESE grupo — el propio xonecode incluido. `LocalShellBackend.execute` de la librería no lo
|
|
26
|
+
* pone, y por eso su `child.kill()` solo alcanza al hijo inmediato.
|
|
27
|
+
*
|
|
28
|
+
* **`detached` es solo de POSIX.** Es lo que hace al hijo líder de su propio grupo para que
|
|
29
|
+
* `process.kill(-pid)` alcance al árbol; en Windows no hay grupos de proceso POSIX, así que
|
|
30
|
+
* `matarGrupoReal` usa `taskkill /T` (recorre el árbol por PID, no por grupo) y no lo
|
|
31
|
+
* necesita — y ahí `detached: true` le abre al hijo su PROPIA ventana de consola visible (lo
|
|
32
|
+
* dice la documentación de Node). `windowsHide: true` va siempre, en las dos plataformas: en
|
|
33
|
+
* POSIX no hace nada, en Windows evita esa ventana.
|
|
34
|
+
*/
|
|
35
|
+
export declare const lanzarReal: LanzarShell;
|
|
36
|
+
export declare function crearExecuteCancelable(opciones: {
|
|
37
|
+
env: Record<string, string>;
|
|
38
|
+
cwd: string;
|
|
39
|
+
timeoutS: number;
|
|
40
|
+
maxOutputBytes?: number;
|
|
41
|
+
}, deps?: {
|
|
42
|
+
lanzar?: LanzarShell;
|
|
43
|
+
matarGrupo?: (pid: number, senal: string) => void;
|
|
44
|
+
}): (comando: string, senal?: AbortSignal) => Promise<ResultadoDeEjecucion>;
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dos escrituras sobre el MISMO fichero no se solapan: la segunda espera a que acabe la
|
|
3
|
+
* primera. Sobre ficheros distintos no cambia nada.
|
|
4
|
+
*
|
|
5
|
+
* **El fallo que cierra es silencioso, que es lo que lo hace grave.** `write` y `edit` del
|
|
6
|
+
* backend son leer-modificar-escribir sobre el fichero entero, así que dos a la vez se pisan
|
|
7
|
+
* y **las dos contestan que bien**. Reproducido contra el backend real: cuatro `edit`
|
|
8
|
+
* concurrentes, cuatro resultados sin error, **una** aplicada. Y ocurre de verdad — en una
|
|
9
|
+
* sesión de MyAllXOne la traza de errores registró dos `edit` sobre `/funciones.js` entrando
|
|
10
|
+
* en el MISMO milisegundo, con el testigo `escrituraSolapada` disparado.
|
|
11
|
+
*
|
|
12
|
+
* **Por qué serializar basta**, que era la objeción razonable: la segunda edición calculó su
|
|
13
|
+
* `old_string` contra un contenido que la primera acaba de cambiar. Cierto — y por eso este
|
|
14
|
+
* envoltorio va POR FUERA de quien edita, no por dentro: cuando le llega el turno, el camino
|
|
15
|
+
* de escritura vuelve a leer el fichero y vuelve a buscar el `old_string` contra lo que hay
|
|
16
|
+
* AHORA. Si el ancla sigue, la edición es correcta; si desapareció, el backend contesta que
|
|
17
|
+
* no lo encuentra y el modelo recibe su error y reintenta. Medido: en serie, cuatro ediciones
|
|
18
|
+
* independientes se aplican las cuatro, y dos que se pisan dan una aplicada y **un error
|
|
19
|
+
* visible** — en vez de una aplicada y un cambio perdido sin que nadie se entere.
|
|
20
|
+
*
|
|
21
|
+
* **Dónde va en la pila**: por dentro de las guardas de RUTA —que contestan con una
|
|
22
|
+
* comparación de texto y deben seguir contestando primero, ver `proyecto.ts`— y por fuera de
|
|
23
|
+
* `sinContenidoInvalido`, para que leer el fichero de antes, validar y escribir sean un solo
|
|
24
|
+
* turno. Al revés, dos validaciones podrían intercalarse entre la lectura y la escritura, que
|
|
25
|
+
* es exactamente la carrera que esto viene a quitar.
|
|
26
|
+
*
|
|
27
|
+
* **No toca `read`, `ls`, `glob` ni nada que no escriba.** Serializar lecturas no arregla
|
|
28
|
+
* nada y convertiría en secuencial el trabajo que sí puede ir en paralelo, que es la mitad de
|
|
29
|
+
* lo que el agente hace.
|
|
30
|
+
*/
|
|
31
|
+
export declare function escriturasEnSerie<T extends object>(backend: T): T;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quita del PROMPT las tools que un agente no puede usar.
|
|
3
|
+
*
|
|
4
|
+
* ## Por qué, medido el 17-09-2026
|
|
5
|
+
*
|
|
6
|
+
* El inspector (`agent/turno/inspectorDePrompt.ts`) enseñó que en un turno de la pregunta más
|
|
7
|
+
* barata que tenemos, los esquemas de las tools eran **12.350 de los 14.135 caracteres** de la
|
|
8
|
+
* primera llamada — el 87 % — y que se reenvían ENTEROS en cada una: ~12.400 de los 15.466
|
|
9
|
+
* tokens del turno. La pregunta ocupaba cuarenta caracteres.
|
|
10
|
+
*
|
|
11
|
+
* Y dentro de eso, el orquestador —que es de SOLO LECTURA por `permisosDe`— cargaba los
|
|
12
|
+
* esquemas de `write_file`, `edit_file` y `delete`: 3.743 caracteres, unos 940 tokens POR
|
|
13
|
+
* LLAMADA, por tres tools que tiene prohibido usar. `permissions` acota el PERMISO; el esquema
|
|
14
|
+
* viaja igual.
|
|
15
|
+
*
|
|
16
|
+
* ## Qué es y qué NO es
|
|
17
|
+
*
|
|
18
|
+
* **No es una frontera de seguridad**, y eso no es una opinión nuestra: deepagents tiene el
|
|
19
|
+
* mismo middleware (`createToolExclusionMiddleware`, que no exporta) y su propia documentación
|
|
20
|
+
* lo dice con esas palabras — «exclusions calibrate the agent per model; they are not a security
|
|
21
|
+
* boundary». La frontera sigue siendo `permisosDe`, intacta, y esto es coste.
|
|
22
|
+
*
|
|
23
|
+
* Por eso hace las DOS cosas: quita la tool de la petición (que es lo que ahorra) **y** rechaza
|
|
24
|
+
* su llamada si aun así llegara. Solo lo primero sería fiar la barrera a que el modelo no
|
|
25
|
+
* invente un nombre que no ha visto, y en este repo eso no es una barrera.
|
|
26
|
+
*/
|
|
27
|
+
import { createMiddleware } from "langchain";
|
|
28
|
+
import { type QuienDecidePermisos } from "./perfiles.js";
|
|
29
|
+
export declare function excluirTools(nombres: readonly string[]): ReturnType<typeof createMiddleware>;
|
|
30
|
+
/**
|
|
31
|
+
* Las que este perfil NO puede usar, DERIVADAS de lo que ya decide `toolsDe`.
|
|
32
|
+
*
|
|
33
|
+
* Escritas a mano serían una segunda lista que hay que acordarse de actualizar, y el día que un
|
|
34
|
+
* perfil gane una capacidad se quedaría sin ella en silencio — el patrón de fallo de este repo.
|
|
35
|
+
* Así, conceder una tool en `perfiles.ts` la saca de aquí sola.
|
|
36
|
+
*/
|
|
37
|
+
export declare function toolsQueNoUsa(perfil: QuienDecidePermisos): string[];
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { NOMBRE_BUSCAR_FUENTE, NOMBRE_TRAER_FUENTE, recibeFuentes } from "../../core/fuentes.js";
|
|
3
|
+
import type { FuentesPort } from "../../core/ports.js";
|
|
4
|
+
import type { QuienDecidePermisos } from "./perfiles.js";
|
|
5
|
+
export { NOMBRE_BUSCAR_FUENTE, NOMBRE_TRAER_FUENTE, recibeFuentes };
|
|
6
|
+
export declare function crearBuscarFuente(fuentes: FuentesPort): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
|
|
7
|
+
consulta: z.ZodString;
|
|
8
|
+
limite: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
9
|
+
}, z.core.$strip>, {
|
|
10
|
+
consulta: string;
|
|
11
|
+
limite?: number | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
consulta: string;
|
|
14
|
+
limite?: unknown;
|
|
15
|
+
}, string, unknown, "buscar_fuente">;
|
|
16
|
+
export interface DondeTraerFuente {
|
|
17
|
+
/** La raíz REAL del proyecto en disco. */
|
|
18
|
+
raiz: string;
|
|
19
|
+
/** De quién son los permisos que hay que reaplicar. */
|
|
20
|
+
perfil: QuienDecidePermisos;
|
|
21
|
+
}
|
|
22
|
+
export declare function crearTraerFuente(fuentes: FuentesPort, donde: DondeTraerFuente): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
|
|
23
|
+
familia: z.ZodString;
|
|
24
|
+
peso: z.ZodCoercedNumber<unknown>;
|
|
25
|
+
cursiva: z.ZodOptional<z.ZodBoolean>;
|
|
26
|
+
file_path: z.ZodString;
|
|
27
|
+
}, z.core.$strip>, {
|
|
28
|
+
familia: string;
|
|
29
|
+
peso: number;
|
|
30
|
+
file_path: string;
|
|
31
|
+
cursiva?: boolean | undefined;
|
|
32
|
+
}, {
|
|
33
|
+
familia: string;
|
|
34
|
+
peso: unknown;
|
|
35
|
+
file_path: string;
|
|
36
|
+
cursiva?: boolean | undefined;
|
|
37
|
+
}, string, unknown, "traer_fuente">;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { NOMBRE_GENERAR_FONDO } from "../../core/fondosSvg.js";
|
|
3
|
+
import { recibeBuscarIcono } from "./buscarIcono.js";
|
|
4
|
+
export { NOMBRE_GENERAR_FONDO };
|
|
5
|
+
/**
|
|
6
|
+
* Generar el fondo SVG de un frame o un botón (degradado, sombra, resplandor), para lo que XOne
|
|
7
|
+
* no trae propio (IXCODE-18). **Pura y sin red**: no hay puerto, siempre está montada donde se
|
|
8
|
+
* reparte. Las plantillas, y por qué no llevan ningún filtro, están en `core/fondosSvg.ts`.
|
|
9
|
+
*
|
|
10
|
+
* **Solo lee**, como `buscar_icono`: el SVG lo escribe `write_file` con su aprobación. Y va a los
|
|
11
|
+
* MISMOS especialistas (`recibeBuscarIcono`, la regla de dato de quien escribe el proyecto), en
|
|
12
|
+
* los dos motores. Los rechazos se DEVUELVEN como texto, nunca se lanzan.
|
|
13
|
+
*/
|
|
14
|
+
export declare const recibeGenerarFondo: typeof recibeBuscarIcono;
|
|
15
|
+
export declare function crearGenerarFondoSvg(): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
|
|
16
|
+
tipo: z.ZodEnum<{
|
|
17
|
+
"degradado-lineal": "degradado-lineal";
|
|
18
|
+
"degradado-radial": "degradado-radial";
|
|
19
|
+
sombra: "sombra";
|
|
20
|
+
glow: "glow";
|
|
21
|
+
}>;
|
|
22
|
+
nombre: z.ZodString;
|
|
23
|
+
ancho: z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>;
|
|
24
|
+
alto: z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>;
|
|
25
|
+
colores: z.ZodArray<z.ZodString>;
|
|
26
|
+
angulo: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
27
|
+
radio: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
28
|
+
intensidad: z.ZodOptional<z.ZodEnum<{
|
|
29
|
+
[x: string]: string;
|
|
30
|
+
}>>;
|
|
31
|
+
fondo: z.ZodOptional<z.ZodString>;
|
|
32
|
+
}, z.core.$strip>, {
|
|
33
|
+
tipo: "degradado-lineal" | "degradado-radial" | "sombra" | "glow";
|
|
34
|
+
nombre: string;
|
|
35
|
+
ancho: string | number;
|
|
36
|
+
alto: string | number;
|
|
37
|
+
colores: string[];
|
|
38
|
+
angulo?: number | undefined;
|
|
39
|
+
radio?: number | undefined;
|
|
40
|
+
intensidad?: string | undefined;
|
|
41
|
+
fondo?: string | undefined;
|
|
42
|
+
}, {
|
|
43
|
+
tipo: "degradado-lineal" | "degradado-radial" | "sombra" | "glow";
|
|
44
|
+
nombre: string;
|
|
45
|
+
ancho: string | number;
|
|
46
|
+
alto: string | number;
|
|
47
|
+
colores: string[];
|
|
48
|
+
angulo?: unknown;
|
|
49
|
+
radio?: unknown;
|
|
50
|
+
intensidad?: string | undefined;
|
|
51
|
+
fondo?: string | undefined;
|
|
52
|
+
}, string, unknown, "generar_fondo_svg">;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Agente } from "../../core/agentes.js";
|
|
3
|
+
import { NOMBRE_INCORPORAR_ADJUNTO } from "../../core/adjuntos.js";
|
|
4
|
+
import { type QuienDecidePermisos } from "./perfiles.js";
|
|
5
|
+
export { NOMBRE_INCORPORAR_ADJUNTO };
|
|
6
|
+
/**
|
|
7
|
+
* Meter un ADJUNTO del chat en el PROYECTO (IXCODE-7): «pon este icono en el menú».
|
|
8
|
+
*
|
|
9
|
+
* ## Por qué es una tool y no un `read_file` + `write_file`
|
|
10
|
+
*
|
|
11
|
+
* Las tools de fichero son de TEXTO (`write(filePath, content: string)`), y un PNG no
|
|
12
|
+
* sobrevive a esa ida y vuelta: lleva ceros en su cabecera y se copiaría corrupto sin que nadie
|
|
13
|
+
* se enterara hasta abrir la app. Es el mismo reparto que `copiar_artefacto`: el harness copia
|
|
14
|
+
* los BYTES porque el agente no puede, y darle una shell para eso sería peor que el problema.
|
|
15
|
+
*
|
|
16
|
+
* ## Por qué pasa por la APROBACIÓN, y `copiar_artefacto` no
|
|
17
|
+
*
|
|
18
|
+
* `copiar_artefacto` es del documentador, confinado por `escribeEn` a `/doc/`. Ésta es de quien
|
|
19
|
+
* escribe el proyecto ENTERO, así que el destino puede ser cualquier fichero de la app —también
|
|
20
|
+
* uno que ya existe, que se REEMPLAZA—. Eso es exactamente lo que `write_file` no hace sin que
|
|
21
|
+
* alguien lo apruebe, y una tool que lo hiciera sería la puerta trasera de la aprobación. Por
|
|
22
|
+
* eso va en el HITL por su NOMBRE, en los dos motores (`perfiles.ts#hitlDe`, las capacidades de
|
|
23
|
+
* TrueForge), y por eso el destino se llama `file_path`: es la clave que leen `seDetieneEn`, la
|
|
24
|
+
* tarjeta (`interrupts.ts#ficheroDe`) y el modo autónomo al anotar la ruta.
|
|
25
|
+
*
|
|
26
|
+
* ## Las guardas, reaplicadas A MANO
|
|
27
|
+
*
|
|
28
|
+
* Una tool propia no pasa por el middleware de permisos ni por la pila del backend: escribe al
|
|
29
|
+
* disco directo. Así que lo que ahí es gratis aquí hay que decirlo:
|
|
30
|
+
*
|
|
31
|
+
* 1. **El ORIGEN es un adjunto de verdad**: un nombre de la lista BLANCA de forma
|
|
32
|
+
* (`nombreDeAdjuntoAceptable`), no un `startsWith` — sin eso sería `/adjuntos/../.env`.
|
|
33
|
+
* 2. **El DESTINO lo puede escribir ESTE agente** (`puedeEscribirRuta`), y no es un sitio de
|
|
34
|
+
* artefacto equivocado (`artefactoFueraDeSitio`).
|
|
35
|
+
* 3. **El destino es el PROYECTO**: ni `/artefactos/`, ni `/planes/`, ni `/adjuntos/`, ni
|
|
36
|
+
* `/skills/`, ni los otros montajes del backend (`/hotswap/`, las descargas de deepagents,
|
|
37
|
+
* `/MEMORIA_PROYECTO.md`). Detrás de esas rutas el backend tiene OTRA carpeta; esta tool
|
|
38
|
+
* escribiría en la del proyecto un fichero con ese nombre. Y es además lo que sostiene a
|
|
39
|
+
* `seDetieneEn`: por `/artefactos/` y `/planes/` NO se pregunta, así que la única barrera ahí
|
|
40
|
+
* es este rechazo (`incorporarAdjunto.test.ts` lo ata ruta a ruta).
|
|
41
|
+
* 4. **Ni una vista APLANADA** (`X.xml` con su `X.xne`): la regla es del proyecto, no del
|
|
42
|
+
* backend por el que esta tool no pasa.
|
|
43
|
+
* 5. **Y todo, dos veces: por TEXTO y por `realpath`**, como `copiar_artefacto` y las escrituras
|
|
44
|
+
* de los motores externos. En APFS `.XONECODE` abre `.xonecode`, y un enlace dentro de la raíz
|
|
45
|
+
* puede apuntar fuera. **A diferencia de `copiar_artefacto`, la contención se comprueba ANTES
|
|
46
|
+
* de crear carpetas**: sobre el primer ancestro que existe, para que un destino que sale del
|
|
47
|
+
* proyecto no deje un árbol vacío fuera. El fichero final, si existe, no puede ser un enlace:
|
|
48
|
+
* escribir lo seguiría.
|
|
49
|
+
*
|
|
50
|
+
* Todo rechazo se DEVUELVE como texto, nunca se lanza (un `throw` se lleva el turno), y de un
|
|
51
|
+
* error de Node solo viaja su `code`: su mensaje lleva la ruta de la máquina.
|
|
52
|
+
*/
|
|
53
|
+
/**
|
|
54
|
+
* Quién la recibe: escribe el PROYECTO y no está confinado por `escribeEn`. Regla de DATO, no una
|
|
55
|
+
* lista de nombres: de los de serie da `designer-xone` y `developer-xone`, que es lo que se
|
|
56
|
+
* decidió. Quien ejecuta no: la shell ya se le quitó el `write_file` para que tocar el proyecto
|
|
57
|
+
* siga siendo el camino del diff. Y quien va acotado por `escribeEn` (el documentador) tiene
|
|
58
|
+
* `copiar_artefacto` para lo suyo.
|
|
59
|
+
*
|
|
60
|
+
* **Solo llega a `motor: "modelo"`**, sin que esta función lo mire: los de motor externo se montan
|
|
61
|
+
* aparte y no reciben tools propias (corren en otro proceso), y tampoco ven `/adjuntos/`: es una
|
|
62
|
+
* ruta virtual de nuestro backend. El inventario que lee el orquestador lo dice
|
|
63
|
+
* (`core/adjuntos.ts#conAdjuntos`).
|
|
64
|
+
*/
|
|
65
|
+
export declare function recibeIncorporarAdjunto(a: Pick<Agente, "soloLectura" | "ejecucion" | "escribeEn">): boolean;
|
|
66
|
+
export interface DondeIncorporar {
|
|
67
|
+
/** La raíz REAL del proyecto en disco. */
|
|
68
|
+
raiz: string;
|
|
69
|
+
/** La carpeta REAL de adjuntos de esta sesión (o tarea). Puede no existir todavía. */
|
|
70
|
+
carpetaDeAdjuntos: string;
|
|
71
|
+
/** De quién son los permisos que hay que reaplicar. */
|
|
72
|
+
perfil: QuienDecidePermisos;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* ¿Por qué no vale `ruta` como destino, mirando SOLO el texto? `undefined` = vale.
|
|
76
|
+
*
|
|
77
|
+
* Se aplica dos veces: a lo que escribió el modelo y a la ruta que sale del `realpath`.
|
|
78
|
+
* Todo se compara también sin mayúsculas (APFS: `/Adjuntos/` es la misma carpeta en disco).
|
|
79
|
+
*/
|
|
80
|
+
export declare function motivoDeDestino(perfil: QuienDecidePermisos, ruta: string): string | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* (5b) ¿Por qué no vale `destinoVirtual` mirando el DISCO? `undefined` = vale. ANTES de crear nada:
|
|
83
|
+
* el primer ancestro que existe tiene que caer dentro de la raíz, y lo que resulta se vuelve a
|
|
84
|
+
* juzgar como ruta virtual (un enlace `/icons` → `.xonecode/` pasa el texto y no esto). El
|
|
85
|
+
* fichero final, si ya está, no puede ser un enlace (se seguiría) ni una carpeta. Exportada
|
|
86
|
+
* porque `traer_fuente` escribe un binario al proyecto con las MISMAS guardas. Nunca lanza.
|
|
87
|
+
*/
|
|
88
|
+
export declare function motivoDeDestinoEnDisco(donde: Pick<DondeIncorporar, "raiz" | "perfil">, destinoVirtual: string): string | undefined;
|
|
89
|
+
export declare function crearIncorporarAdjunto(donde: DondeIncorporar): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
|
|
90
|
+
adjunto: z.ZodString;
|
|
91
|
+
file_path: z.ZodString;
|
|
92
|
+
}, z.core.$strip>, {
|
|
93
|
+
adjunto: string;
|
|
94
|
+
file_path: string;
|
|
95
|
+
}, {
|
|
96
|
+
adjunto: string;
|
|
97
|
+
file_path: string;
|
|
98
|
+
}, string, unknown, "incorporar_adjunto">;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ImagenReferida } from "../../core/referenciasDeImagen.js";
|
|
2
|
+
/**
|
|
3
|
+
* La lectura de una maqueta (`core/referenciasDeImagen.ts` decide QUÉ rutas valen; esto las abre).
|
|
4
|
+
*
|
|
5
|
+
* **La comprobación se repite dos veces: por el TEXTO (la regla pura) y por el `realpath`.** Un enlace
|
|
6
|
+
* simbólico dentro del proyecto puede apuntar a `/etc` o a `~/.ssh`, y el texto de la ruta no lo dice:
|
|
7
|
+
* es lo que hacen también las escrituras de los motores externos y el lector de Ficheros. Se resuelve
|
|
8
|
+
* el enlace y se exige que lo que salga siga DENTRO de la carpeta de su origen.
|
|
9
|
+
*
|
|
10
|
+
* Solo lee y solo abre lo que ya pasó la regla. **Lanza con un `code`** (ENOENT si el origen no está
|
|
11
|
+
* montado o el fichero no existe, EACCES si el enlace sale de la carpeta): quien la llama devuelve
|
|
12
|
+
* solo ese código, porque el mensaje de un error de Node lleva la ruta absoluta de la máquina.
|
|
13
|
+
*/
|
|
14
|
+
export interface CarpetasDeReferencia {
|
|
15
|
+
/** La carpeta de artefactos de la sesión. */
|
|
16
|
+
artefactos?: string;
|
|
17
|
+
/** La carpeta de adjuntos (de solo lectura). Ausente = `/adjuntos/` no está montada. */
|
|
18
|
+
adjuntos?: string;
|
|
19
|
+
/** La raíz del proyecto. */
|
|
20
|
+
raiz: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function crearLectorDeReferencias(carpetas: CarpetasDeReferencia): (imagen: ImagenReferida) => Promise<Buffer>;
|
|
23
|
+
/**
|
|
24
|
+
* El `code.html` que acompaña a una maqueta —el de Stitch: `screen.png` y `code.html` en la misma carpeta—,
|
|
25
|
+
* con su ruta en disco, o `undefined` si no hay. Con la MISMA comprobación que la lectura: por el texto de
|
|
26
|
+
* la carpeta y por el `realpath`, para que un enlace no lleve a renderizar un HTML de fuera.
|
|
27
|
+
*/
|
|
28
|
+
export declare function crearLocalizadorDeHtmlDeMaqueta(carpetas: CarpetasDeReferencia): (imagen: ImagenReferida) => string | undefined;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Marcar en el plan lo que se COMPROBÓ en el aparato.
|
|
4
|
+
*
|
|
5
|
+
* ## Por qué existe
|
|
6
|
+
*
|
|
7
|
+
* Un criterio de un `TASKS.md` dice cosas como «pulsarla abre la pantalla nueva», y quien lo
|
|
8
|
+
* comprueba es el `device-controller`, en el emulador. Pero ese agente no tiene `write_file` ni
|
|
9
|
+
* `edit_file` —ejecuta, y el camino normal de tocar ficheros es el del desarrollador—, y el
|
|
10
|
+
* orquestador es de solo lectura: medido en una sesión real, el conductor comprobó en el
|
|
11
|
+
* emulador la entrada del drawer, la lista y el detalle, y el plan siguió con todas las casillas
|
|
12
|
+
* a cero. Lo verificado no volvía nunca al plan.
|
|
13
|
+
*
|
|
14
|
+
* ## Por qué una tool y no `edit_file`
|
|
15
|
+
*
|
|
16
|
+
* Porque lo que se le concede es EXACTAMENTE marcar casillas, y eso lo decide el código:
|
|
17
|
+
* `marcarCriterios` (`core/tareasDelPlan.ts`) solo cambia `- [ ]` a `- [x]` en la sección de UNA
|
|
18
|
+
* tarea. Un `edit_file` le abriría el fichero entero —y en deepagents, a quien ejecuta no se le
|
|
19
|
+
* pueden pasar `permissions` junto a su backend con shell—.
|
|
20
|
+
*
|
|
21
|
+
* ## Las guardas
|
|
22
|
+
*
|
|
23
|
+
* - El nombre del plan es un SLUG (`motivoDePlanInaceptable`): es un segmento de ruta, y sin esto
|
|
24
|
+
* `../..` saldría de la carpeta de planes.
|
|
25
|
+
* - Ni la carpeta ni el fichero pueden ser un enlace (`lstat`), y el camino REAL tiene que seguir
|
|
26
|
+
* dentro de `.xonecode/planes/`: lo mismo que `planesEnDisco.ts` al leer.
|
|
27
|
+
* - No crea nada: sin `TASKS.md` no hay criterios que marcar.
|
|
28
|
+
*
|
|
29
|
+
* **Límite declarado**: escribe directo al disco, sin la cola de `escriturasEnSerie`. Un
|
|
30
|
+
* `edit_file` del desarrollador sobre el MISMO `TASKS.md` a la vez podría pisar la marca.
|
|
31
|
+
*/
|
|
32
|
+
export declare const NOMBRE_MARCAR_CRITERIOS = "marcar_criterios_del_plan";
|
|
33
|
+
export declare function crearMarcarCriteriosDelPlan(donde: {
|
|
34
|
+
raiz: string;
|
|
35
|
+
}): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
|
|
36
|
+
plan: z.ZodString;
|
|
37
|
+
tarea: z.ZodString;
|
|
38
|
+
criterios: z.ZodArray<z.ZodNumber>;
|
|
39
|
+
}, z.core.$strip>, {
|
|
40
|
+
plan: string;
|
|
41
|
+
tarea: string;
|
|
42
|
+
criterios: number[];
|
|
43
|
+
}, {
|
|
44
|
+
plan: string;
|
|
45
|
+
tarea: string;
|
|
46
|
+
criterios: number[];
|
|
47
|
+
}, string, unknown, "marcar_criterios_del_plan">;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const NOMBRE_ARCHIVO_MEMORIA = "memoria.md";
|
|
2
|
+
/** Ruta que ve el agente dentro de su backend virtual. Vive en `core/memoria.ts`, que la
|
|
3
|
+
* reconoce también en el flujo de tools. */
|
|
4
|
+
export { RUTA_MEMORIA_VIRTUAL } from "../../core/memoria.js";
|
|
5
|
+
/** Ruta real dentro del backend virtual; nunca se enseña al agente. */
|
|
6
|
+
export declare const RUTA_MEMORIA_INTERNA = "/.xonecode/memoria.md";
|
|
7
|
+
/** Almacén interno de los historiales que DeepAgents ya ha resumido. */
|
|
8
|
+
export declare const RUTA_HISTORIAL_RESUMIDO = "/.xonecode/conversation_history";
|
|
9
|
+
export declare function rutaMemoriaDeProyecto(raiz: string): string;
|
|
10
|
+
export declare const PLANTILLA_MEMORIA = "# Memoria del proyecto\n\nEsta memoria recoge solo hechos confirmados, decisiones acordadas y riesgos que ayudan a\ncontinuar el trabajo. No es un transcript ni guarda secretos, credenciales o contenido de\nficheros completos.\n\n## Decisiones\n\n- A\u00FAn no hay decisiones registradas.\n\n## Estado y convenciones\n\n- A\u00FAn no hay estado persistente registrado.\n\n## Riesgos y pendientes\n\n- A\u00FAn no hay riesgos o pendientes registrados.\n";
|
|
11
|
+
/**
|
|
12
|
+
* Crea la memoria inicial una sola vez. `flag: wx` es la barrera contra pisar una
|
|
13
|
+
* memoria existente, incluso si dos sesiones arrancan a la vez.
|
|
14
|
+
*/
|
|
15
|
+
export declare function asegurarMemoriaDeProyecto(raiz: string): boolean;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { CargarIndice } from "../navegacion/indiceEnDisco.js";
|
|
3
|
+
import type { CargarEstilos } from "../navegacion/estilosEnDisco.js";
|
|
4
|
+
/**
|
|
5
|
+
* `xone_navegacion`: preguntar por la ESTRUCTURA del proyecto sin leer ficheros.
|
|
6
|
+
*
|
|
7
|
+
* **Por qué existe, medido.** Sobre un proyecto real de 41 `.xne`, contestar «¿qué
|
|
8
|
+
* colecciones tiene el proyecto?» leyendo ficheros cuesta unos 18.000 tokens; contestarla
|
|
9
|
+
* desde el índice cuesta 141. Y una pregunta de capacidad («¿podríamos hacer un CRM?») llegó
|
|
10
|
+
* a gastar 21 pasos de exploración. Lo caro no es abrir un `.xne` —son un par de kilobytes—,
|
|
11
|
+
* es **no saber cuál de los cuarenta y uno abrir**. `grep` y `regex_search` buscan TEXTO;
|
|
12
|
+
* esto contesta sobre el modelo ya resuelto, así que un `mapcol` encuentra su colección
|
|
13
|
+
* aunque el nombre aparezca en otros veinte sitios.
|
|
14
|
+
*
|
|
15
|
+
* **El esquema es deliberadamente pequeño.** El inspector midió que el 87 % de una llamada
|
|
16
|
+
* son los esquemas de las tools y quitarle al orquestador tres que no podía usar valió un
|
|
17
|
+
* −24 % del turno. Una tool con una operación enumerada y un nombre opcional cuesta poco en
|
|
18
|
+
* cada llamada; cuatro tools separadas costarían cuatro veces eso para siempre.
|
|
19
|
+
*
|
|
20
|
+
* **Las rutas que devuelve son VIRTUALES y ya están filtradas.** Quien las traduce y aplica
|
|
21
|
+
* `puedeLeerRuta` y `esVistaAplanada` es el adaptador (`navegacion/modeloDeProyecto.ts`), y
|
|
22
|
+
* lo hace en la FUENTE: lo que el agente no puede abrir no llega ni a estar en el índice. Se
|
|
23
|
+
* filtra ahí y no aquí a propósito — es el único sitio donde una ruta se crea, está probado
|
|
24
|
+
* contra una fuga, y un segundo filtro sobre los mismos datos sería un segundo sitio donde
|
|
25
|
+
* equivocarse sin añadir barrera. Lo que esta tool NO hace nunca es aceptar una ruta del
|
|
26
|
+
* modelo: se pregunta por NOMBRE, así que no hay ruta que validar a la entrada.
|
|
27
|
+
*/
|
|
28
|
+
/** Topes. Una respuesta que no cabe se recorta DICIENDO cuánto se dejó fuera: una lista
|
|
29
|
+
* truncada en silencio se lee como la lista entera, y sobre eso se concluye de más. */
|
|
30
|
+
export declare const LIMITES_NAVEGACION: {
|
|
31
|
+
readonly inventario: 200;
|
|
32
|
+
readonly referencias: 60;
|
|
33
|
+
readonly campos: 150;
|
|
34
|
+
readonly definiciones: 20;
|
|
35
|
+
readonly problemas: 40;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* La tool. `cargar` entra por parámetro —y con él la raíz ya fijada— para que el modelo no
|
|
39
|
+
* pueda decir sobre QUÉ proyecto pregunta: si pudiera, esto sería una tool que lee cualquier
|
|
40
|
+
* carpeta de la máquina.
|
|
41
|
+
*/
|
|
42
|
+
export declare function crearNavegacionXone(cargar: CargarIndice, ficheros: ReadonlySet<string>, cargarEstilos?: CargarEstilos): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
|
|
43
|
+
operacion: z.ZodEnum<{
|
|
44
|
+
estilos: "estilos";
|
|
45
|
+
detalle: "detalle";
|
|
46
|
+
app: "app";
|
|
47
|
+
inventario: "inventario";
|
|
48
|
+
definicion: "definicion";
|
|
49
|
+
referencias: "referencias";
|
|
50
|
+
campos: "campos";
|
|
51
|
+
problemas: "problemas";
|
|
52
|
+
}>;
|
|
53
|
+
nombre: z.ZodOptional<z.ZodString>;
|
|
54
|
+
}, z.core.$strip>, {
|
|
55
|
+
operacion: "estilos" | "detalle" | "app" | "inventario" | "definicion" | "referencias" | "campos" | "problemas";
|
|
56
|
+
nombre?: string | undefined;
|
|
57
|
+
}, {
|
|
58
|
+
operacion: "estilos" | "detalle" | "app" | "inventario" | "definicion" | "referencias" | "campos" | "problemas";
|
|
59
|
+
nombre?: string | undefined;
|
|
60
|
+
}, string, unknown, "xone_navegacion">;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Presupuesto de las herramientas de ficheros.
|
|
3
|
+
*
|
|
4
|
+
* DeepAgents 1.13 incorpora `max_count` y `output_mode` en `grep`. El valor por
|
|
5
|
+
* defecto de la librería (1.000) sigue siendo demasiado generoso para un agente
|
|
6
|
+
* que explora proyectos XOne: 100 resultados bastan para localizar candidatos y
|
|
7
|
+
* el modelo puede subirlo explícitamente en una búsqueda excepcional.
|
|
8
|
+
*
|
|
9
|
+
* A partir de 6k tokens la salida se conserva bajo `/large_tool_results/` y se
|
|
10
|
+
* sustituye por una referencia paginable. Así una lectura o búsqueda accidental
|
|
11
|
+
* no consume toda la ventana antes de que actúe el resumen de conversación.
|
|
12
|
+
*
|
|
13
|
+
* **Esa carpeta se monta FUERA del proyecto** (`core/descargas.ts`,
|
|
14
|
+
* `agent/grafo/proyecto.ts#backendConDescargas`), y hasta el 10-09-2026 no: la escribe la librería
|
|
15
|
+
* llamando al backend directamente, esa ruta no estaba montada en ninguna parte y caía en el
|
|
16
|
+
* `FilesystemBackend` de la raíz. Medido en el AppDemo real del usuario, 26 KB de salida
|
|
17
|
+
* cruda de una tool dentro de la app XOne y commiteados. Bajar este tope no era el arreglo:
|
|
18
|
+
* el desalojo es la función, el fallo era el sitio.
|
|
19
|
+
*/
|
|
20
|
+
export declare const OPCIONES_BUSQUEDA_FICHEROS: {
|
|
21
|
+
readonly grepMaxCount: 100;
|
|
22
|
+
readonly toolTokenLimitBeforeEvict: 6000;
|
|
23
|
+
};
|