xonecode 0.5.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/web/dist/assets/{index-BB3SamhR.css → index-Boak51UP.css} +1 -1
- package/apps/web/dist/assets/index-Cg28x6nG.js +477 -0
- package/apps/web/dist/assets/{php-D_2--9WK.js → php-Cu6F_QCJ.js} +1 -1
- package/apps/web/dist/assets/{ruby-DSHSDbk1.js → ruby-BiqQPoC6.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/{cloudstudioClient.js → cloudstudio/cloudstudioClient.js} +10 -0
- package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -0
- package/dist/agent/{cloudstudioMcp.js → cloudstudio/cloudstudioMcp.js} +5 -5
- package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -0
- package/dist/agent/{descarga.js → cloudstudio/descarga.js} +17 -7
- package/dist/agent/cloudstudio/descarga.js.map +1 -0
- package/dist/agent/cloudstudio/manifiesto.js.map +1 -0
- package/dist/agent/cloudstudio/ramaActiva.js +11 -0
- package/dist/agent/cloudstudio/ramaActiva.js.map +1 -0
- package/dist/agent/{subida.js → cloudstudio/subida.js} +16 -7
- package/dist/agent/cloudstudio/subida.js.map +1 -0
- package/dist/agent/{zip.js → cloudstudio/zip.js} +1 -1
- package/dist/agent/cloudstudio/zip.js.map +1 -0
- package/dist/agent/{authEnDisco.js → config/authEnDisco.js} +3 -3
- package/dist/agent/config/authEnDisco.js.map +1 -0
- package/dist/agent/{catalogoModelos.js → config/catalogoModelos.js} +47 -1
- package/dist/agent/config/catalogoModelos.js.map +1 -0
- package/dist/agent/{configEnDisco.js → config/configEnDisco.js} +6 -6
- package/dist/agent/config/configEnDisco.js.map +1 -0
- package/dist/agent/{crearProyecto.js → config/crearProyecto.js} +2 -2
- package/dist/agent/config/crearProyecto.js.map +1 -0
- package/dist/agent/config/entorno.js.map +1 -0
- package/dist/agent/config/gemini.js.map +1 -0
- package/dist/agent/config/modelos.js +235 -0
- package/dist/agent/config/modelos.js.map +1 -0
- package/dist/agent/{modelosDeMotor.js → config/modelosDeMotor.js} +1 -1
- package/dist/agent/config/modelosDeMotor.js.map +1 -0
- package/dist/agent/config/mudanzaEnDisco.js +121 -0
- package/dist/agent/config/mudanzaEnDisco.js.map +1 -0
- package/dist/agent/{persona.js → config/persona.js} +1 -1
- package/dist/agent/config/persona.js.map +1 -0
- package/dist/agent/config/selectorEnMaquina.js +45 -0
- package/dist/agent/config/selectorEnMaquina.js.map +1 -0
- package/dist/agent/{settingsEnDisco.js → config/settingsEnDisco.js} +37 -2
- package/dist/agent/config/settingsEnDisco.js.map +1 -0
- package/dist/agent/{versionEnDisco.js → config/versionEnDisco.js} +8 -4
- package/dist/agent/config/versionEnDisco.js.map +1 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js +146 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js.map +1 -0
- package/dist/agent/{dispositivosEnMaquina.js → dispositivos/dispositivosEnMaquina.js} +93 -6
- package/dist/agent/dispositivos/dispositivosEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/hotswap.js.map +1 -0
- package/dist/agent/dispositivos/instalacionEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/juezVisual.js +152 -0
- package/dist/agent/dispositivos/juezVisual.js.map +1 -0
- package/dist/agent/{lanzamientoEnMaquina.js → dispositivos/lanzamientoEnMaquina.js} +1 -1
- package/dist/agent/dispositivos/lanzamientoEnMaquina.js.map +1 -0
- package/dist/agent/{paqueteDelProyecto.js → dispositivos/paqueteDelProyecto.js} +5 -5
- package/dist/agent/dispositivos/paqueteDelProyecto.js.map +1 -0
- package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/sensorDeArranque.js +154 -0
- package/dist/agent/dispositivos/sensorDeArranque.js.map +1 -0
- package/dist/agent/exportarPdf.js +140 -0
- package/dist/agent/exportarPdf.js.map +1 -0
- package/dist/agent/{arbolDeProyecto.js → grafo/arbolDeProyecto.js} +2 -2
- package/dist/agent/grafo/arbolDeProyecto.js.map +1 -0
- package/dist/agent/{artefactosEnDisco.js → grafo/artefactosEnDisco.js} +2 -2
- package/dist/agent/grafo/artefactosEnDisco.js.map +1 -0
- package/dist/agent/{busquedaRegex.js → grafo/busquedaRegex.js} +41 -1
- package/dist/agent/grafo/busquedaRegex.js.map +1 -0
- package/dist/agent/grafo/criticaVisual.js +115 -0
- package/dist/agent/grafo/criticaVisual.js.map +1 -0
- package/dist/agent/grafo/excluirTools.js +82 -0
- package/dist/agent/grafo/excluirTools.js.map +1 -0
- package/dist/agent/{memoriaDeProyecto.js → grafo/memoriaDeProyecto.js} +1 -1
- package/dist/agent/grafo/memoriaDeProyecto.js.map +1 -0
- package/dist/agent/grafo/navegacionXone.js +231 -0
- package/dist/agent/grafo/navegacionXone.js.map +1 -0
- package/dist/agent/{perfiles.js → grafo/perfiles.js} +96 -10
- package/dist/agent/grafo/perfiles.js.map +1 -0
- package/dist/agent/{proyecto.js → grafo/proyecto.js} +274 -24
- package/dist/agent/grafo/proyecto.js.map +1 -0
- package/dist/agent/grafo/skills.js +425 -0
- package/dist/agent/grafo/skills.js.map +1 -0
- package/dist/agent/grafo/xoneAgent.js +566 -0
- package/dist/agent/grafo/xoneAgent.js.map +1 -0
- package/dist/agent/navegacion/estilosEnDisco.js +110 -0
- package/dist/agent/navegacion/estilosEnDisco.js.map +1 -0
- package/dist/agent/navegacion/hechosEnDisco.js +26 -0
- package/dist/agent/navegacion/hechosEnDisco.js.map +1 -0
- package/dist/agent/navegacion/indiceEnDisco.js +36 -0
- package/dist/agent/navegacion/indiceEnDisco.js.map +1 -0
- package/dist/agent/navegacion/modeloDeProyecto.js +228 -0
- package/dist/agent/navegacion/modeloDeProyecto.js.map +1 -0
- package/dist/agent/raizDelPaquete.js +56 -0
- package/dist/agent/raizDelPaquete.js.map +1 -0
- package/dist/agent/{checkpointer.js → sesiones/checkpointer.js} +1 -1
- package/dist/agent/sesiones/checkpointer.js.map +1 -0
- package/dist/agent/sesiones/git.js.map +1 -0
- package/dist/agent/{gitSync.js → sesiones/gitSync.js} +3 -3
- package/dist/agent/sesiones/gitSync.js.map +1 -0
- package/dist/agent/{sesionGit.js → sesiones/sesionGit.js} +2 -2
- package/dist/agent/sesiones/sesionGit.js.map +1 -0
- package/dist/agent/subagentes/agentesEnDisco.js +818 -0
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -0
- package/dist/agent/subagentes/consumoExterno.js.map +1 -0
- package/dist/agent/subagentes/escrituraDeCodex.js.map +1 -0
- package/dist/agent/{escrituraDeOpencode.js → subagentes/escrituraDeOpencode.js} +1 -1
- package/dist/agent/subagentes/escrituraDeOpencode.js.map +1 -0
- package/dist/agent/{escrituraExterna.js → subagentes/escrituraExterna.js} +59 -6
- package/dist/agent/subagentes/escrituraExterna.js.map +1 -0
- package/dist/agent/subagentes/pluginDeSkills.js +99 -0
- package/dist/agent/subagentes/pluginDeSkills.js.map +1 -0
- package/dist/agent/subagentes/subagenteCodex.js.map +1 -0
- package/dist/agent/{subagenteExterno.js → subagentes/subagenteExterno.js} +48 -0
- package/dist/agent/subagentes/subagenteExterno.js.map +1 -0
- package/dist/agent/{subagenteOpencode.js → subagentes/subagenteOpencode.js} +53 -1
- package/dist/agent/subagentes/subagenteOpencode.js.map +1 -0
- package/dist/agent/{aumentador.js → tareas/aumentador.js} +2 -2
- package/dist/agent/tareas/aumentador.js.map +1 -0
- package/dist/agent/{juezDeTarea.js → tareas/juezDeTarea.js} +6 -6
- package/dist/agent/tareas/juezDeTarea.js.map +1 -0
- package/dist/agent/{tareasEnDisco.js → tareas/tareasEnDisco.js} +53 -4
- package/dist/agent/tareas/tareasEnDisco.js.map +1 -0
- package/dist/agent/{diagnosticoDeTools.js → turno/diagnosticoDeTools.js} +5 -1
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -0
- package/dist/agent/{guionizado.js → turno/guionizado.js} +1 -1
- package/dist/agent/turno/guionizado.js.map +1 -0
- package/dist/agent/turno/informeDeTraza.js +245 -0
- package/dist/agent/turno/informeDeTraza.js.map +1 -0
- package/dist/agent/turno/inspectorDePrompt.js +205 -0
- package/dist/agent/turno/inspectorDePrompt.js.map +1 -0
- package/dist/agent/{instantanea.js → turno/instantanea.js} +7 -2
- package/dist/agent/turno/instantanea.js.map +1 -0
- package/dist/agent/{interrupts.js → turno/interrupts.js} +2 -2
- package/dist/agent/turno/interrupts.js.map +1 -0
- package/dist/agent/turno/mensajes.js.map +1 -0
- package/dist/agent/turno/normalizar.js.map +1 -0
- package/dist/agent/{puente.js → turno/puente.js} +71 -4
- package/dist/agent/turno/puente.js.map +1 -0
- package/dist/agent/turno/resumenDeContexto.js +260 -0
- package/dist/agent/turno/resumenDeContexto.js.map +1 -0
- package/dist/agent/{resumenDeTool.js → turno/resumenDeTool.js} +33 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -0
- package/dist/agent/turno/rubrica.js +91 -0
- package/dist/agent/turno/rubrica.js.map +1 -0
- package/dist/agent/turno/textoDeTool.js.map +1 -0
- package/dist/agent/{turnoReal.js → turno/turnoReal.js} +210 -25
- package/dist/agent/turno/turnoReal.js.map +1 -0
- package/dist/agent/turno/verificador.js.map +1 -0
- package/dist/cli/config.js +1 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/consola.js +72 -9
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/describe.js +2 -2
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/fuentesDeDisco.js +29 -0
- package/dist/cli/fuentesDeDisco.js.map +1 -0
- package/dist/cli/main.js +87 -31
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/run.js +40 -10
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/traza.js +48 -0
- package/dist/cli/traza.js.map +1 -0
- package/dist/cli/tui/correrTui.js +4 -4
- package/dist/cli/tui/correrTui.js.map +1 -1
- package/dist/cli/verify.js +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/core/actos.js +1 -1
- package/dist/core/adjuntos.js +2 -2
- package/dist/core/agentes.js +247 -7
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/artefactos.js +4 -4
- package/dist/core/config.js +1 -1
- package/dist/core/contextos.js +12 -1
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/descargas.js +1 -1
- package/dist/core/dispositivos.js +53 -3
- package/dist/core/dispositivos.js.map +1 -1
- package/dist/core/esfuerzo.js +141 -0
- package/dist/core/esfuerzo.js.map +1 -0
- package/dist/core/esqueleto.js +1 -1
- package/dist/core/estilos.js +78 -0
- package/dist/core/estilos.js.map +1 -0
- package/dist/core/exportacion.js +140 -0
- package/dist/core/exportacion.js.map +1 -0
- package/dist/core/hechosDelProyecto.js +87 -0
- package/dist/core/hechosDelProyecto.js.map +1 -0
- package/dist/core/logDeDispositivo.js +143 -0
- package/dist/core/logDeDispositivo.js.map +1 -0
- package/dist/core/modelos.js +48 -3
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/mudanzaDeWorkspace.js +93 -0
- package/dist/core/mudanzaDeWorkspace.js.map +1 -0
- package/dist/core/navegacion.js +134 -0
- package/dist/core/navegacion.js.map +1 -0
- package/dist/core/notify.js +5 -0
- package/dist/core/notify.js.map +1 -1
- package/dist/core/planDeSubida.js +1 -1
- package/dist/core/planes.js +70 -0
- package/dist/core/planes.js.map +1 -0
- package/dist/core/ports.js +4 -0
- package/dist/core/ports.js.map +1 -1
- package/dist/core/rubrica.js +90 -0
- package/dist/core/rubrica.js.map +1 -0
- package/dist/core/selectorDeCarpeta.js +87 -0
- package/dist/core/selectorDeCarpeta.js.map +1 -0
- package/dist/core/settings.js +56 -7
- package/dist/core/settings.js.map +1 -1
- package/dist/core/shellDeAgente.js +144 -0
- package/dist/core/shellDeAgente.js.map +1 -0
- package/dist/core/skills.js +158 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/topeAgotado.js +69 -0
- package/dist/core/topeAgotado.js.map +1 -0
- package/dist/core/zipDeSkill.js +107 -0
- package/dist/core/zipDeSkill.js.map +1 -0
- package/dist/web/servidor/arranque.js +853 -54
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/corredorDeTareas.js +3 -3
- package/dist/web/servidor/corredorDeTareas.js.map +1 -1
- package/dist/web/servidor/sesiones.js +34 -6
- package/dist/web/servidor/sesiones.js.map +1 -1
- package/dist/web/servidor/transporte.js +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/dist/web/servidor/vestibulo.js +62 -13
- package/dist/web/servidor/vestibulo.js.map +1 -1
- package/package.json +7 -4
- package/skills/archify/SKILL.md +25 -2
- package/skills/artifacts-builder/SKILL.md +23 -0
- package/skills/xone-hotswap/SKILL.md +96 -0
- package/skills/xone-hotswap/scripts/xone-arrancar-android +202 -0
- package/skills/xone-hotswap/scripts/xone-arrancar-ios +85 -0
- package/skills/xone-hotswap/scripts/xone-captura-android +93 -0
- package/skills/xone-hotswap/scripts/xone-desplegar-android +439 -0
- package/skills/xone-hotswap/scripts/xone-hotswap +201 -0
- package/skills/xone-hotswap/scripts/xone-log-android +102 -0
- package/skills/xone-hotswap/scripts/xone-reiniciar-android +132 -0
- package/skills/xone-plan-builder/SKILL.md +22 -4
- package/skills/xone-spec-builder/SKILL.md +37 -7
- package/apps/web/dist/assets/index-CFYAoHdw.js +0 -477
- package/dist/agent/agentesEnDisco.js +0 -539
- package/dist/agent/agentesEnDisco.js.map +0 -1
- package/dist/agent/arbolDeProyecto.js.map +0 -1
- package/dist/agent/artefactosEnDisco.js.map +0 -1
- package/dist/agent/aumentador.js.map +0 -1
- package/dist/agent/authEnDisco.js.map +0 -1
- package/dist/agent/busquedaRegex.js.map +0 -1
- package/dist/agent/catalogoModelos.js.map +0 -1
- package/dist/agent/checkpointer.js.map +0 -1
- package/dist/agent/cloudstudioClient.js.map +0 -1
- package/dist/agent/cloudstudioMcp.js.map +0 -1
- package/dist/agent/configEnDisco.js.map +0 -1
- package/dist/agent/consumoExterno.js.map +0 -1
- package/dist/agent/crearProyecto.js.map +0 -1
- package/dist/agent/descarga.js.map +0 -1
- package/dist/agent/diagnosticoDeTools.js.map +0 -1
- package/dist/agent/dispositivosEnMaquina.js.map +0 -1
- package/dist/agent/entorno.js.map +0 -1
- package/dist/agent/escrituraDeCodex.js.map +0 -1
- package/dist/agent/escrituraDeOpencode.js.map +0 -1
- package/dist/agent/escrituraExterna.js.map +0 -1
- package/dist/agent/gemini.js.map +0 -1
- package/dist/agent/git.js.map +0 -1
- package/dist/agent/gitSync.js.map +0 -1
- package/dist/agent/guionizado.js.map +0 -1
- package/dist/agent/hotswap.js.map +0 -1
- package/dist/agent/instalacionEnMaquina.js.map +0 -1
- package/dist/agent/instantanea.js.map +0 -1
- package/dist/agent/interrupts.js.map +0 -1
- package/dist/agent/juezDeTarea.js.map +0 -1
- package/dist/agent/lanzamientoEnMaquina.js.map +0 -1
- package/dist/agent/manifiesto.js.map +0 -1
- package/dist/agent/memoriaDeProyecto.js.map +0 -1
- package/dist/agent/mensajes.js.map +0 -1
- package/dist/agent/modelos.js +0 -130
- package/dist/agent/modelos.js.map +0 -1
- package/dist/agent/modelosDeMotor.js.map +0 -1
- package/dist/agent/normalizar.js.map +0 -1
- package/dist/agent/paqueteDelProyecto.js.map +0 -1
- package/dist/agent/perfiles.js.map +0 -1
- package/dist/agent/persona.js.map +0 -1
- package/dist/agent/procesosEnMaquina.js.map +0 -1
- package/dist/agent/proyecto.js.map +0 -1
- package/dist/agent/puente.js.map +0 -1
- package/dist/agent/resumenDeContexto.js +0 -30
- package/dist/agent/resumenDeContexto.js.map +0 -1
- package/dist/agent/resumenDeTool.js.map +0 -1
- package/dist/agent/sesionGit.js.map +0 -1
- package/dist/agent/settingsEnDisco.js.map +0 -1
- package/dist/agent/skills.js +0 -65
- package/dist/agent/skills.js.map +0 -1
- package/dist/agent/subagenteCodex.js.map +0 -1
- package/dist/agent/subagenteExterno.js.map +0 -1
- package/dist/agent/subagenteOpencode.js.map +0 -1
- package/dist/agent/subida.js.map +0 -1
- package/dist/agent/tareasEnDisco.js.map +0 -1
- package/dist/agent/textoDeTool.js.map +0 -1
- package/dist/agent/turnoReal.js.map +0 -1
- package/dist/agent/verificador.js.map +0 -1
- package/dist/agent/versionEnDisco.js.map +0 -1
- package/dist/agent/xoneAgent.js +0 -347
- package/dist/agent/xoneAgent.js.map +0 -1
- package/dist/agent/zip.js.map +0 -1
- /package/dist/agent/{manifiesto.js → cloudstudio/manifiesto.js} +0 -0
- /package/dist/agent/{entorno.js → config/entorno.js} +0 -0
- /package/dist/agent/{gemini.js → config/gemini.js} +0 -0
- /package/dist/agent/{hotswap.js → dispositivos/hotswap.js} +0 -0
- /package/dist/agent/{instalacionEnMaquina.js → dispositivos/instalacionEnMaquina.js} +0 -0
- /package/dist/agent/{procesosEnMaquina.js → dispositivos/procesosEnMaquina.js} +0 -0
- /package/dist/agent/{git.js → sesiones/git.js} +0 -0
- /package/dist/agent/{consumoExterno.js → subagentes/consumoExterno.js} +0 -0
- /package/dist/agent/{escrituraDeCodex.js → subagentes/escrituraDeCodex.js} +0 -0
- /package/dist/agent/{subagenteCodex.js → subagentes/subagenteCodex.js} +0 -0
- /package/dist/agent/{mensajes.js → turno/mensajes.js} +0 -0
- /package/dist/agent/{normalizar.js → turno/normalizar.js} +0 -0
- /package/dist/agent/{textoDeTool.js → turno/textoDeTool.js} +0 -0
- /package/dist/agent/{verificador.js → turno/verificador.js} +0 -0
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
import { createDeepAgent, createFilesystemMiddleware } from "deepagents";
|
|
2
|
+
import { MAPA_DEL_PROYECTO, fichaDeAgente, promptDeAgente, repartirSkills } from "../../core/agentes.js";
|
|
3
|
+
import { RunnableLambda } from "@langchain/core/runnables";
|
|
4
|
+
import { AIMessage } from "@langchain/core/messages";
|
|
5
|
+
import { MemorySaver } from "@langchain/langgraph";
|
|
6
|
+
import { backendDeAgente, entornoDeLaShellDelProyecto } from "./proyecto.js";
|
|
7
|
+
import { permisosDe, hitlDe, montajeDeFicheros, puedeEjecutar } from "./perfiles.js";
|
|
8
|
+
import { crearBusquedaRegex } from "./busquedaRegex.js";
|
|
9
|
+
import { crearNavegacionXone } from "./navegacionXone.js";
|
|
10
|
+
import { estilosDeDisco, indiceEnDisco } from "../navegacion/indiceEnDisco.js";
|
|
11
|
+
import { readFileSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { crearCriticaVisual } from "./criticaVisual.js";
|
|
14
|
+
import { invocarVisualConModelos } from "../dispositivos/juezVisual.js";
|
|
15
|
+
import { inventarioDelProyecto } from "../subagentes/escrituraExterna.js";
|
|
16
|
+
import { middlewareTextoDeTool } from "../turno/textoDeTool.js";
|
|
17
|
+
import { resumenConEncargo, topeDeLlamadas, TOPE_DE_LLAMADAS_DEL_ESPECIALISTA, topeDeTools, TOPE_DE_TOOLS_DEL_ORQUESTADOR } from "../turno/resumenDeContexto.js";
|
|
18
|
+
import { middlewareDeRubrica } from "../turno/rubrica.js";
|
|
19
|
+
import { inspectorDePrompt } from "../turno/inspectorDePrompt.js";
|
|
20
|
+
import { excluirTools, toolsQueNoUsa } from "./excluirTools.js";
|
|
21
|
+
import { createTokenTrackingMiddleware, } from "../../vendor/tokenTracking.js";
|
|
22
|
+
/**
|
|
23
|
+
* El prompt del orquestador, GENERADO a partir de los subagentes que hay.
|
|
24
|
+
*
|
|
25
|
+
* Era una constante que nombraba a `docs`, `planner`, `dev` y `mockup` a pelo. Desde que los
|
|
26
|
+
* subagentes son ficheros que el usuario escribe y borra, eso se queda mintiendo el primer
|
|
27
|
+
* día: mandarle delegar en `mockup` cuando `mockup` no existe es la misma clase de botón
|
|
28
|
+
* muerto que este repo lleva semanas quitando de la interfaz.
|
|
29
|
+
*
|
|
30
|
+
* Lo que se conserva es lo GENERAL —no tienes tools, delega, encadena con handoff, no
|
|
31
|
+
* afirmes lo que no te han confirmado—, y lo específico sale de la propia lista. La línea
|
|
32
|
+
* del encadenado para diagramas solo se escribe si existen los dos agentes de los que
|
|
33
|
+
* habla: una instrucción sobre un especialista que no está no la puede seguir nadie.
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* Quién es el orquestador a efectos de permisos: SOLO LECTURA.
|
|
37
|
+
*
|
|
38
|
+
* Es un `QuienDecidePermisos` y no un `Agente` porque el orquestador no es un especialista
|
|
39
|
+
* —no se puede dar de alta, ni borrar, ni editar desde Ajustes—, pero sus tools de fichero
|
|
40
|
+
* son las mismas y tienen que pasar por la misma función. Ver dónde se usa, en
|
|
41
|
+
* `construirAgente`, para el agujero que esto cierra.
|
|
42
|
+
*/
|
|
43
|
+
export const PERFIL_DEL_ORQUESTADOR = { nombre: "orquestador", soloLectura: true };
|
|
44
|
+
export function promptOrquestador(agentes) {
|
|
45
|
+
const hay = (n) => agentes.some((a) => a.nombre === n);
|
|
46
|
+
return [
|
|
47
|
+
"Eres el orquestador de un harness de desarrollo para la plataforma XOne.",
|
|
48
|
+
// El mapa lo ve él TAMBIÉN, y no solo los especialistas: desde que contesta lo que puede
|
|
49
|
+
// en vez de delegarlo todo, es quien más lo necesita.
|
|
50
|
+
MAPA_DEL_PROYECTO,
|
|
51
|
+
// Decía «NO tienes herramientas», y era falso: tiene las seis de fichero. Ahora son de
|
|
52
|
+
// SOLO LECTURA (`PERFIL_DEL_ORQUESTADOR`), así que la frase dice lo que de verdad puede.
|
|
53
|
+
//
|
|
54
|
+
// Y decía «tu único trabajo es delegar», que era falso por el otro lado y CARO: medido con
|
|
55
|
+
// el banco (`docs/bancos/2026-09-17-base.json`), la misma pregunta de estructura costaba
|
|
56
|
+
// 9.462 tokens contestada aquí y 38.198 delegada, con la MISMA respuesta buena. Delegar es
|
|
57
|
+
// un viaje entero de ida y vuelta con el prompt de un especialista detrás, así que para lo
|
|
58
|
+
// que se resuelve con un `grep` no compra nada. La regla es explícita en las dos
|
|
59
|
+
// direcciones porque «puedes leer» a secas no le quitaba la orden de delegar siempre.
|
|
60
|
+
"NO tienes herramientas para MODIFICAR nada, pero SÍ para LEER y BUSCAR.",
|
|
61
|
+
"Si la pregunta se contesta mirando el proyecto —dónde se declara algo, qué colecciones hay,",
|
|
62
|
+
"qué valor tiene un atributo, qué fichero incluye a cuál—, CONTÉSTALA TÚ: busca con `grep` y",
|
|
63
|
+
"lee lo justo. Delegar cuesta varias veces más y no la contesta mejor.",
|
|
64
|
+
"Delega cuando haya que ESCRIBIR ficheros (tú no puedes), cuando el encargo tenga varios",
|
|
65
|
+
"pasos, o cuando haga falta el criterio de un especialista.",
|
|
66
|
+
agentes.length === 0
|
|
67
|
+
? "AVISO: ahora mismo no hay ningún especialista dado de alta, así que no puedes delegar en nadie. Dilo en vez de intentar resolverlo tú."
|
|
68
|
+
: `Los especialistas disponibles son: ${agentes.map((a) => a.nombre).join(", ")}. La ficha de cada uno —qué sabe hacer y qué devuelve— va en la descripción de \`task\`; léela antes de elegir.`,
|
|
69
|
+
/**
|
|
70
|
+
* **Que puede ENCADENARLOS, y que la cadena la compone él.**
|
|
71
|
+
*
|
|
72
|
+
* Hasta aquí solo había reglas de secuencia escritas a mano —los diagramas y la del
|
|
73
|
+
* aparato—, o sea que cualquier encargo que no encajara en esas dos se resolvía con una
|
|
74
|
+
* sola delegación. Esto no añade una tercera regla: le dice la FORMA (entender → hacer →
|
|
75
|
+
* comprobar) y le deja montar la cadena con las fichas que ya tiene, que es lo que hace
|
|
76
|
+
* que un especialista nuevo del usuario entre solo en el reparto.
|
|
77
|
+
*/
|
|
78
|
+
"Un encargo grande no es UNA delegación: móntalo como una cadena, y la cadena la eliges tú",
|
|
79
|
+
"leyendo las fichas — primero quien ENTIENDE (los que solo leen), luego quien HACE (los que",
|
|
80
|
+
"escriben) y al final quien COMPRUEBA (los que alcanzan la máquina o el aparato). Salta las",
|
|
81
|
+
"etapas que no hagan falta y no inventes las que no tengas: si nadie puede comprobar algo,",
|
|
82
|
+
"dilo en vez de darlo por bueno.",
|
|
83
|
+
hay("analyst-xone") && hay("designer-xone")
|
|
84
|
+
? "Para diagramas o esquemas de la app, delega en `designer-xone`; si deben reflejar el código real, encarga PRIMERO el análisis a `analyst-xone` y usa su resultado antes de dibujar."
|
|
85
|
+
: "",
|
|
86
|
+
/**
|
|
87
|
+
* **Escribir y PROBARLO EN UN APARATO son dos encargos, y el segundo necesita un
|
|
88
|
+
* destino.** Sin esta regla, «crea una pantalla y pruébala» se leía como una sola `task`
|
|
89
|
+
* al desarrollador — que no tiene `execute`, así que «probar» se quedaba en que dijera
|
|
90
|
+
* que lo había hecho, que es justo lo que su prompt le prohíbe afirmar.
|
|
91
|
+
*
|
|
92
|
+
* Y lo que se le pide al conductor no es «prueba»: es a DÓNDE tiene que llegar. Medido
|
|
93
|
+
* sobre un proyecto real, la ruta existe y el harness la sabe
|
|
94
|
+
* (`xone_navegacion referencias Calculadora` → `EntradaApp.MAP_BT_CALCULADORA_DR`), pero
|
|
95
|
+
* el conductor no la busca si nadie le dice qué pantalla importa.
|
|
96
|
+
*
|
|
97
|
+
* Nombra a dos especialistas a pelo, igual que la regla de los diagramas: al renombrarlos
|
|
98
|
+
* hay que cambiarlo aquí o la regla se queda escrita y muerta.
|
|
99
|
+
*/
|
|
100
|
+
hay("developer-xone") && hay("device-controller")
|
|
101
|
+
? "Si el encargo incluye PROBARLO en un móvil o emulador, son DOS pasos y en este orden: `developer-xone` escribe, y luego `device-controller` lo despliega y lo comprueba. Dile SIEMPRE a qué pantalla o colección tiene que llegar, no solo «pruébalo». Si tienes `xone_critica_visual`, pásale la captura que deje: ve fallos de pintado que ninguna comprobación estática detecta, y si te pide otra pantalla, encárgasela al conductor y vuelve. Lo que salga de todo eso vuelve a `developer-xone` para corregir; no des por buena una pantalla que nadie ha mirado."
|
|
102
|
+
: "",
|
|
103
|
+
"Los especialistas no comparten el transcript: al encadenarlos, incluye en la descripción",
|
|
104
|
+
"de la siguiente `task` un bloque `HANDOFF DE ANÁLISIS` compacto con los hechos verificados,",
|
|
105
|
+
"rutas/evidencias y lagunas. No pidas al siguiente especialista redescubrir esos hechos.",
|
|
106
|
+
"Cuando varias tareas sean independientes, delégalas EN EL MISMO mensaje para",
|
|
107
|
+
"que corran a la vez.",
|
|
108
|
+
"No afirmes que un cambio se ha aplicado si no te lo ha confirmado el especialista.",
|
|
109
|
+
]
|
|
110
|
+
.filter((l) => l !== "")
|
|
111
|
+
.join(" ");
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Indicaciones que el modelo recibe junto a las tools reales de fichero.
|
|
115
|
+
*
|
|
116
|
+
* No crean herramientas ni rebajan permisos: hacen explícito el destino correcto
|
|
117
|
+
* para que una skill no confunda su propia carpeta de instrucciones con la salida.
|
|
118
|
+
*/
|
|
119
|
+
/**
|
|
120
|
+
* **`read_file` NO está aquí, y es deliberado.**
|
|
121
|
+
*
|
|
122
|
+
* Una descripción propia REEMPLAZA la de la librería, no se suma a ella, así que la nuestra
|
|
123
|
+
* —que solo hablaba de coste— borraba tres cosas que deepagents ya dice y que no son nuestras
|
|
124
|
+
* de decir: que la salida lleva una cabecera de formato **que no hay que reinyectar al
|
|
125
|
+
* editar** (eso es CORRECCIÓN, no ahorro), que conviene pedir varias lecturas en una misma
|
|
126
|
+
* respuesta, y que un resultado grande se descarga a `/large_tool_results/` y se pagina desde
|
|
127
|
+
* ahí. Medido al comparar dos parches suyos: entre `1.13.2` y `1.13.5` ese formato CAMBIÓ
|
|
128
|
+
* —de prefijos de número de línea a una cabecera `@@ … @@`— y con él la advertencia. Una copia
|
|
129
|
+
* nuestra habría quedado describiendo un formato que ya no existe, sin un error que leer.
|
|
130
|
+
*
|
|
131
|
+
* La regla: lo que describe la TOOL es de la librería y se actualiza con ella; lo que decimos
|
|
132
|
+
* nosotros es cómo QUEREMOS usarla, y eso vive en el prompt del especialista
|
|
133
|
+
* (`core/agentes.ts#promptDeAgente`), donde no compite con nada.
|
|
134
|
+
*/
|
|
135
|
+
export const DESCRIPCIONES_FICHEROS = {
|
|
136
|
+
write_file: [
|
|
137
|
+
"Escribe un fichero del proyecto en una ruta absoluta.",
|
|
138
|
+
"Para diagramas, esquemas, arquitecturas y flujos: carga primero la skill `archify`;",
|
|
139
|
+
"no escribas nunca dentro de `/skills`. Si el usuario pide el resultado renderizado,",
|
|
140
|
+
"guárdalo como HTML autocontenido en `/artefactos/<nombre>.html`.",
|
|
141
|
+
"Para dashboards, informes o tablas HTML interactivas carga `artifacts-builder` y usa",
|
|
142
|
+
"también `/artefactos/<nombre>.html`. `/artefactos/` NO es del proyecto: es la carpeta de",
|
|
143
|
+
"esta sesión, no pasa por aprobación, no entra en git y no sube a CloudStudio — un HTML",
|
|
144
|
+
"escrito fuera de ella acaba dentro de la app XOne del usuario. La ruta",
|
|
145
|
+
"`/MEMORIA_PROYECTO.md` es exclusivamente",
|
|
146
|
+
"para hechos confirmados, decisiones y pendientes útiles; no guardes transcripciones ni secretos.",
|
|
147
|
+
].join(" "),
|
|
148
|
+
edit_file: [
|
|
149
|
+
"Modifica un fichero existente del proyecto en una ruta absoluta.",
|
|
150
|
+
"No modifiques `/skills`: son instrucciones de solo lectura. Para actualizar la memoria",
|
|
151
|
+
"usa solo `/MEMORIA_PROYECTO.md` y conserva su contenido útil.",
|
|
152
|
+
].join(" "),
|
|
153
|
+
grep: [
|
|
154
|
+
"Busca texto LITERAL (no regex) de forma progresiva para ahorrar contexto.",
|
|
155
|
+
"Primero acota con `path` y `glob`; para localizar candidatos usa",
|
|
156
|
+
"`output_mode=\"files_with_matches\"` o `output_mode=\"count\"`.",
|
|
157
|
+
"Usa `output_mode=\"content\"` solo con un patrón específico: devuelve la ruta y el NÚMERO",
|
|
158
|
+
"DE LÍNEA de cada coincidencia, así que lee después con `read_file` ALREDEDOR de esa línea",
|
|
159
|
+
"(`offset` = línea menos 5), nunca desde el principio del fichero. La búsqueda devuelve",
|
|
160
|
+
"como máximo 100 coincidencias salvo que justifiques subir `max_count`.",
|
|
161
|
+
"Varias búsquedas independientes van en el MISMO mensaje, igual que las lecturas.",
|
|
162
|
+
].join(" "),
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* Presupuesto de las herramientas de ficheros.
|
|
166
|
+
*
|
|
167
|
+
* DeepAgents 1.13 incorpora `max_count` y `output_mode` en `grep`. El valor por
|
|
168
|
+
* defecto de la librería (1.000) sigue siendo demasiado generoso para un agente
|
|
169
|
+
* que explora proyectos XOne: 100 resultados bastan para localizar candidatos y
|
|
170
|
+
* el modelo puede subirlo explícitamente en una búsqueda excepcional.
|
|
171
|
+
*
|
|
172
|
+
* A partir de 6k tokens la salida se conserva bajo `/large_tool_results/` y se
|
|
173
|
+
* sustituye por una referencia paginable. Así una lectura o búsqueda accidental
|
|
174
|
+
* no consume toda la ventana antes de que actúe el resumen de conversación.
|
|
175
|
+
*
|
|
176
|
+
* **Esa carpeta se monta FUERA del proyecto** (`core/descargas.ts`,
|
|
177
|
+
* `agent/grafo/proyecto.ts#backendConDescargas`), y hasta el 10-09-2026 no: la escribe la librería
|
|
178
|
+
* llamando al backend directamente, esa ruta no estaba montada en ninguna parte y caía en el
|
|
179
|
+
* `FilesystemBackend` de la raíz. Medido en el AppDemo real del usuario, 26 KB de salida
|
|
180
|
+
* cruda de una tool dentro de la app XOne y commiteados. Bajar este tope no era el arreglo:
|
|
181
|
+
* el desalojo es la función, el fallo era el sitio.
|
|
182
|
+
*/
|
|
183
|
+
export const OPCIONES_BUSQUEDA_FICHEROS = {
|
|
184
|
+
grepMaxCount: 100,
|
|
185
|
+
toolTokenLimitBeforeEvict: 6_000,
|
|
186
|
+
};
|
|
187
|
+
/**
|
|
188
|
+
* El agente real.
|
|
189
|
+
*
|
|
190
|
+
* Cuatro decisiones que no son negociables, y las cuatro están medidas o impuestas por la
|
|
191
|
+
* librería (ver `DISENO.md` §14.3 y el patrón de `runtime.ts`):
|
|
192
|
+
*
|
|
193
|
+
* 1. **El backend va confinado** (`virtualMode: true`) y envuelto para que las vistas
|
|
194
|
+
* aplanadas no existan.
|
|
195
|
+
* 2. **El orquestador no recibe ninguna tool.** Si las tuviera haría el trabajo él mismo y
|
|
196
|
+
* se comería el catálogo entero en su prompt.
|
|
197
|
+
* 3. **Se ocupa el nombre `general-purpose`** para eliminar el destino que la librería
|
|
198
|
+
* añade sola: sin capacidad XOne, sus respuestas serían inventadas. Está medido que
|
|
199
|
+
* ocupar el nombre lo sustituye en el catálogo (`agent/generalPurpose.test.ts`).
|
|
200
|
+
* 4. **El HITL va en las tools de fichero**, que en la v1 son las que escriben.
|
|
201
|
+
*/
|
|
202
|
+
/** El inspector, o nada: `inspectorDePrompt` devuelve `undefined` si no se ha pedido. */
|
|
203
|
+
function inspector(raiz, origen) {
|
|
204
|
+
const mw = inspectorDePrompt(raiz, origen);
|
|
205
|
+
return mw === undefined ? [] : [mw];
|
|
206
|
+
}
|
|
207
|
+
export async function construirAgente(opciones) {
|
|
208
|
+
// Las cuatro capas y su orden están en `backendDeAgente`, que vive en `proyecto.ts` para
|
|
209
|
+
// poder PROBARSE: aquí no había forma, porque `construirAgente` se simula en todos los
|
|
210
|
+
// tests que lo tocan y el cableado se quedaba sin nadie mirándolo.
|
|
211
|
+
/**
|
|
212
|
+
* El cargador del índice de navegación, con la RAÍZ ya fijada.
|
|
213
|
+
*
|
|
214
|
+
* Entra por opción para poder doblarse en un test, y con su omisión real puesta aquí —no en
|
|
215
|
+
* el llamador— por el patrón de fallo de siempre: compuesto arriba, en un cierre que todos
|
|
216
|
+
* los tests simulan, el cableado quedaría escrito y sin probar. `xoneAgent.navegacion.test.ts`
|
|
217
|
+
* lo mira desde fuera.
|
|
218
|
+
*
|
|
219
|
+
* La raíz NO entra por parámetro de la tool: si el modelo pudiera decir sobre qué carpeta
|
|
220
|
+
* pregunta, esto sería una tool que lee cualquier sitio de la máquina.
|
|
221
|
+
*/
|
|
222
|
+
const cargarIndice = opciones.navegacion ?? indiceEnDisco(opciones.raiz);
|
|
223
|
+
/**
|
|
224
|
+
* El resolvedor de ESTILOS, que va con la misma tool y por el mismo camino.
|
|
225
|
+
*
|
|
226
|
+
* Entra por parámetro como el índice, y ausente deja la operación `estilos` diciendo que no
|
|
227
|
+
* está montada — en vez de fallar dentro. Un test que doble la navegación no tiene por qué
|
|
228
|
+
* saber de esto.
|
|
229
|
+
*/
|
|
230
|
+
const cargarEstilos = opciones.estilos ?? estilosDeDisco(opciones.raiz);
|
|
231
|
+
const comunes = {
|
|
232
|
+
raiz: opciones.raiz,
|
|
233
|
+
ficheros: opciones.ficheros,
|
|
234
|
+
...(opciones.artefactos === undefined ? {} : { artefactos: opciones.artefactos }),
|
|
235
|
+
...(opciones.adjuntos === undefined ? {} : { adjuntos: opciones.adjuntos }),
|
|
236
|
+
};
|
|
237
|
+
const backend = backendDeAgente(comunes);
|
|
238
|
+
/**
|
|
239
|
+
* El backend CON shell, y solo si alguien lo va a usar.
|
|
240
|
+
*
|
|
241
|
+
* Se construye aparte porque es otra cadena entera: la base ejecuta, y eso cambia lo que
|
|
242
|
+
* la librería registra (`execute`) y lo que se le puede pasar (`permissions` lanza junto a
|
|
243
|
+
* un backend ejecutable). Que sea `undefined` cuando nadie declara `ejecucion` no es una
|
|
244
|
+
* optimización: es lo que hace que el caso normal sea, byte a byte, el de antes.
|
|
245
|
+
*/
|
|
246
|
+
const conShell = opciones.agentes.some((a) => puedeEjecutar(a))
|
|
247
|
+
? backendDeAgente({
|
|
248
|
+
...comunes,
|
|
249
|
+
ejecucion: {
|
|
250
|
+
entorno: entornoDeLaShellDelProyecto(opciones.raiz, opciones.artefactos?.carpeta),
|
|
251
|
+
},
|
|
252
|
+
})
|
|
253
|
+
: undefined;
|
|
254
|
+
// Si no hay tracker, no se añade el middleware: es opcional a propósito arriba.
|
|
255
|
+
const middlewareTracker = (origen) => opciones.tracker
|
|
256
|
+
? [
|
|
257
|
+
createTokenTrackingMiddleware(opciones.tracker, alContarDelTracker(origen, opciones.diagnostico, opciones.alContarTokens)),
|
|
258
|
+
]
|
|
259
|
+
: [];
|
|
260
|
+
// El catálogo, una vez por construcción y no una por agente: `catalogo()` es un puerto y
|
|
261
|
+
// llamarlo N veces para preguntarle lo mismo es trabajo por nada.
|
|
262
|
+
const catalogoDeSkills = new Set(opciones.skills.catalogo().map((s) => s.nombre));
|
|
263
|
+
/**
|
|
264
|
+
* Los que corren FUERA: Claude Code y compañía.
|
|
265
|
+
*
|
|
266
|
+
* Entran como `CompiledSubAgent` —`{name, description, runnable}`, que deepagents acepta
|
|
267
|
+
* junto a los normales— y no como `SubAgent`: eso último es modelo + prompt + tools, y
|
|
268
|
+
* aquí no hay modelo nuestro que poner. Con esto los tres motores llegan al orquestador
|
|
269
|
+
* por el MISMO `task`, y él no tiene que saber de qué está hecho cada especialista.
|
|
270
|
+
*
|
|
271
|
+
* Se pregunta si el motor está DISPONIBLE antes de montarlo. Un especialista que el
|
|
272
|
+
* orquestador puede elegir y que revienta en cuanto lo elige es un botón muerto dentro del
|
|
273
|
+
* grafo: peor que uno de interfaz, porque el que lo pulsa es el modelo y se lo cree.
|
|
274
|
+
*/
|
|
275
|
+
const externos = [];
|
|
276
|
+
for (const agente of opciones.agentes.filter((a) => a.motor !== "modelo")) {
|
|
277
|
+
const motor = agente.motor;
|
|
278
|
+
if (!(await opciones.subagenteExterno.disponible(motor)))
|
|
279
|
+
continue;
|
|
280
|
+
externos.push({
|
|
281
|
+
name: agente.nombre,
|
|
282
|
+
description: fichaDeAgente(agente),
|
|
283
|
+
runnable: RunnableLambda.from(async (entrada) => {
|
|
284
|
+
// La tarea es el último mensaje que le pasa el orquestador. El hijo no comparte
|
|
285
|
+
// transcript —es un proceso aparte, con su propia sesión—, así que lo que no venga
|
|
286
|
+
// en esa descripción no existe para él: es la misma regla del handoff que el prompt
|
|
287
|
+
// del orquestador ya impone entre especialistas.
|
|
288
|
+
const ultimo = entrada.messages?.at(-1);
|
|
289
|
+
const tarea = typeof ultimo?.content === "string" ? ultimo.content : String(ultimo?.content ?? "");
|
|
290
|
+
const texto = await opciones.subagenteExterno.correr({
|
|
291
|
+
motor,
|
|
292
|
+
cwd: opciones.raiz,
|
|
293
|
+
/**
|
|
294
|
+
* Sus instrucciones MÁS el inventario del proyecto. Ese añadido no es un lujo: un
|
|
295
|
+
* hijo de Claude Code no tiene ninguna herramienta para listar carpetas —medido—,
|
|
296
|
+
* así que sin él lee a ciegas nombres inventados y concluye que el proyecto está
|
|
297
|
+
* vacío. Se le dice lo que el harness ya sabe, que es el patrón de `/adjuntos/`.
|
|
298
|
+
*/
|
|
299
|
+
instrucciones: `${promptDeAgente(agente, repartirSkills(agente, catalogoDeSkills))}\n\n${inventarioDelProyecto(opciones.ficheros)}`,
|
|
300
|
+
tarea,
|
|
301
|
+
// El modelo del producto que pida su `.md`, si pide alguno. Ausente = el que el
|
|
302
|
+
// agente externo use por su cuenta, que es lo de siempre.
|
|
303
|
+
...(agente.modelo === undefined ? {} : { modelo: agente.modelo }),
|
|
304
|
+
/**
|
|
305
|
+
* Lo que diga su `.md`, y nada más. Es la PRIMERA de dos puertas: con esto en
|
|
306
|
+
* cierto, cada escritura pasa además por la política de la sesión y por las
|
|
307
|
+
* guardas de ruta (`agent/subagentes/escrituraExterna.ts`). Un agente de solo lectura no
|
|
308
|
+
* llega a preguntar.
|
|
309
|
+
*/
|
|
310
|
+
permitirEscritura: !agente.soloLectura,
|
|
311
|
+
// Para poder decir QUIÉN pide la escritura en la petición de aprobación: la tool
|
|
312
|
+
// es la misma para todos los especialistas, así que sin esto el diff diría
|
|
313
|
+
// «alguien quiere escribir». Es el papel del `[dev]` que `hitlDe` mete en la
|
|
314
|
+
// descripción de un interrupt del grafo.
|
|
315
|
+
agente: agente.nombre,
|
|
316
|
+
});
|
|
317
|
+
return { messages: [new AIMessage(texto)] };
|
|
318
|
+
}),
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
const subagentes = opciones.agentes
|
|
322
|
+
.filter((a) => a.motor === "modelo")
|
|
323
|
+
.map((perfil) => {
|
|
324
|
+
// Una vez por perfil: con qué backend ve los ficheros, con qué permisos y con qué tools.
|
|
325
|
+
const ficheros = montajeDeFicheros(perfil, {
|
|
326
|
+
normal: backend,
|
|
327
|
+
...(conShell === undefined ? {} : { conShell }),
|
|
328
|
+
});
|
|
329
|
+
return {
|
|
330
|
+
name: perfil.nombre,
|
|
331
|
+
description: fichaDeAgente(perfil),
|
|
332
|
+
systemPrompt: promptDeAgente(perfil, repartirSkills(perfil, catalogoDeSkills)),
|
|
333
|
+
// Los subagentes no heredan las skills del orquestador. Se entregan como fuentes
|
|
334
|
+
// directas para mantener cada perfil limitado a su catálogo declarado.
|
|
335
|
+
skills: rutasDeSkills(perfil, catalogoDeSkills),
|
|
336
|
+
// `tools` solo lleva tools PROPIAS. Pasarle los NOMBRES de las de fichero las sustituía
|
|
337
|
+
// por cadenas, dejando al especialista sin ninguna capacidad real. Las de fichero las
|
|
338
|
+
// monta el middleware; regex_search es una tool real y confinada al mismo backend.
|
|
339
|
+
/**
|
|
340
|
+
* Las dos tools propias, y contestan preguntas DISTINTAS: `regex_search` busca TEXTO y
|
|
341
|
+
* `xone_navegacion` contesta sobre el modelo ya resuelto. Un `mapcol` encuentra su
|
|
342
|
+
* colección aunque el nombre salga en otros veinte sitios, y el inventario cuesta 141
|
|
343
|
+
* tokens donde leer los `.xne` cuesta 18.000 (medido sobre un proyecto real).
|
|
344
|
+
*
|
|
345
|
+
* A los CINCO especialistas y no a unos pocos: los cinco trabajan sobre un proyecto XOne
|
|
346
|
+
* y la pregunta que esto abarata —«qué hay aquí»— se la hacen todos. El esquema es de una
|
|
347
|
+
* operación enumerada y un nombre, que es poco en cada llamada. El orquestador la lleva
|
|
348
|
+
* TAMBIÉN, y eso lo decidió una medida que tumbó lo contrario: ver su propio `tools` más
|
|
349
|
+
* abajo.
|
|
350
|
+
*/
|
|
351
|
+
tools: [crearBusquedaRegex(ficheros.backend), crearNavegacionXone(cargarIndice, opciones.ficheros, cargarEstilos)],
|
|
352
|
+
//
|
|
353
|
+
// Las tools de fichero las monta el `FilesystemMiddleware` a partir del backend, y
|
|
354
|
+
// quien las acota por NOMBRE es su propia opción `tools` (con la restricción de que
|
|
355
|
+
// `read_file` tiene que estar siempre). Aquí el solo-lectura se impone con
|
|
356
|
+
// `permissions`, que la librería aplica sobre `ls`, `read_file`, `write_file`,
|
|
357
|
+
// `edit_file`, `glob` y `grep` — o sea, sobre todas las que importan.
|
|
358
|
+
/**
|
|
359
|
+
* **Ausente para quien EJECUTA**, y por la misma razón que en el middleware: deepagents
|
|
360
|
+
* lanza `ConfigurationError` al combinar `permissions` con un backend ejecutable. Dejarlo
|
|
361
|
+
* aquí «por si acaso» no añadiría una barrera, tumbaría la construcción del agente.
|
|
362
|
+
*/
|
|
363
|
+
...(ficheros.permissions === undefined ? {} : { permissions: ficheros.permissions }),
|
|
364
|
+
interruptOn: hitlDe(perfil),
|
|
365
|
+
// En CADA especialista, no solo en el orquestador: son ellos los que llaman a las
|
|
366
|
+
// tools de fichero, así que es su siguiente llamada al modelo la que reventaba.
|
|
367
|
+
// El nombre coincide con el middleware por defecto de DeepAgents y lo sustituye: así
|
|
368
|
+
// aplica tanto al especialista como al orquestador.
|
|
369
|
+
middleware: [
|
|
370
|
+
createFilesystemMiddleware({
|
|
371
|
+
// Quién se lleva la shell, con qué permisos y con qué tools lo decide una función
|
|
372
|
+
// pura y probada (`perfiles.ts#montajeDeFicheros`), no un `if` aquí dentro.
|
|
373
|
+
...ficheros,
|
|
374
|
+
customToolDescriptions: DESCRIPCIONES_FICHEROS,
|
|
375
|
+
...OPCIONES_BUSQUEDA_FICHEROS,
|
|
376
|
+
}),
|
|
377
|
+
// El tope es del ESPECIALISTA y no del orquestador: el que contesta al usuario no
|
|
378
|
+
// puede quedarse a medias, y el que hace un encargo acotado sí debe. Ver
|
|
379
|
+
// `resumenDeContexto.ts#topeDeLlamadas`.
|
|
380
|
+
// El corte se ANOTA con el nombre de ESTE perfil: sin origen, saber que hubo un corte no
|
|
381
|
+
// dice a quién le pasó, que es justo lo que hace falta para calibrar el presupuesto.
|
|
382
|
+
topeDeLlamadas(undefined, () => opciones.diagnostico?.corte?.(perfil.nombre, TOPE_DE_LLAMADAS_DEL_ESPECIALISTA)),
|
|
383
|
+
// Y el de TOOLS, que es el que acota lo que se ACUMULA: 43 resultados en el contexto
|
|
384
|
+
// hicieron que la última llamada costara ocho veces la primera.
|
|
385
|
+
topeDeTools(),
|
|
386
|
+
// Los DOS, y en su orden, que es lo que `resumenConEncargo` garantiza: el resumen
|
|
387
|
+
// se lleva el encargo por delante al cruzar el umbral, y el segundo lo devuelve.
|
|
388
|
+
// Sobre el backend del PERFIL: quien tiene shell descarga en SU cadena, que es la que
|
|
389
|
+
// tiene montadas `/large_tool_results/` y `/conversation_history/` con su misma raíz.
|
|
390
|
+
...resumenConEncargo(ficheros.backend),
|
|
391
|
+
middlewareTextoDeTool(),
|
|
392
|
+
...middlewareTracker(perfil.nombre),
|
|
393
|
+
// El ÚLTIMO, y por eso ve la petición ya pasada por todos los de arriba: el resumen, la
|
|
394
|
+
// devolución del encargo y la conversión de los `ToolMessage`. Puesto delante enseñaría
|
|
395
|
+
// lo que otros van a cambiar después, que es la mentira de un inspector.
|
|
396
|
+
...inspector(opciones.raiz, perfil.nombre),
|
|
397
|
+
],
|
|
398
|
+
// El modelo que fije el agente en su fichero, y si no lo fija, el del papel que le
|
|
399
|
+
// toca por lo que hace: `rapido` para el que solo lee, `trabajo` para el que escribe.
|
|
400
|
+
// Fijarlo es la excepción y no la norma — un agente con modelo escrito se queda ahí
|
|
401
|
+
// aunque el usuario cambie el suyo con `/modelo`, que es justo lo que quiere quien
|
|
402
|
+
// escribe «este revisor corre con Claude» y no lo que quiere nadie más.
|
|
403
|
+
// Y el ESFUERZO del perfil, que gana sobre el de la sesión: quien escribe «este
|
|
404
|
+
// consultor piensa poco» lo dice de ESE especialista, no de la conversación. Ausente
|
|
405
|
+
// deja pasar el de la sesión, que es lo que `Modelos` resuelve por dentro.
|
|
406
|
+
model: perfil.modelo === undefined
|
|
407
|
+
? opciones.modelos.paraPapel(perfil.soloLectura ? "rapido" : "trabajo", perfil.esfuerzo)
|
|
408
|
+
: opciones.modelos.paraModelo(perfil.modelo, perfil.esfuerzo),
|
|
409
|
+
};
|
|
410
|
+
});
|
|
411
|
+
return createDeepAgent({
|
|
412
|
+
model: opciones.modelos.paraPapel("rapido"),
|
|
413
|
+
systemPrompt: promptOrquestador(opciones.agentes),
|
|
414
|
+
backend,
|
|
415
|
+
/**
|
|
416
|
+
* **El orquestador SÍ la lleva, y eso lo decidió una medida que tumbó lo contrario.**
|
|
417
|
+
*
|
|
418
|
+
* La primera versión se la dio solo a los especialistas con el argumento de que el
|
|
419
|
+
* orquestador delega. Medido sobre un proyecto real con la pregunta que motivó la tool
|
|
420
|
+
* —«¿cuántas colecciones tiene mi proyecto?»—: **no delegó**. La contestó él, con `ls`,
|
|
421
|
+
* `glob`, `grep` y `read_file`, en once llamadas y ~88k tokens, y la tool no llegó a
|
|
422
|
+
* estar disponible porque vivía en los subagentes. O sea que el razonamiento era bueno y
|
|
423
|
+
* el comportamiento otro, que es justo lo que este repo prefiere medir antes que suponer.
|
|
424
|
+
*
|
|
425
|
+
* No le abre nada: es de LECTURA y el orquestador ya lee (`permisosDe` le deja
|
|
426
|
+
* `read`/`ls`/`glob`/`grep` y le deniega el disco entero para escribir). Lo que cambia es
|
|
427
|
+
* el precio de orientarse. Su esquema viaja en cada llamada suya —y eso no es gratis,
|
|
428
|
+
* `excluirTools` existe por eso—, pero es una operación enumerada y un nombre frente a
|
|
429
|
+
* las once llamadas que sustituye.
|
|
430
|
+
*/
|
|
431
|
+
/**
|
|
432
|
+
* **Y la crítica visual va SOLO aquí, y solo si hay carpeta de artefactos.**
|
|
433
|
+
*
|
|
434
|
+
* Aquí porque es quien reparte: el crítico pide pantallas por nombre y el único que puede
|
|
435
|
+
* ir a por ellas es el conductor, así que el que tiene que oír la petición es el que
|
|
436
|
+
* delega. Dársela al conductor sería que el que trabaja se puntúe solo — lo que
|
|
437
|
+
* `juezDeTarea` prohíbe por escrito y lo que su propio prompt le prohíbe afirmar.
|
|
438
|
+
*
|
|
439
|
+
* Y solo con carpeta porque sin ella no hay ninguna captura que mirar: una tool cuyo
|
|
440
|
+
* único final posible es «no encuentro nada» es el botón muerto de siempre, y encima
|
|
441
|
+
* cobrando su esquema en cada llamada.
|
|
442
|
+
*/
|
|
443
|
+
tools: [
|
|
444
|
+
crearNavegacionXone(cargarIndice, opciones.ficheros, cargarEstilos),
|
|
445
|
+
...(opciones.artefactos === undefined
|
|
446
|
+
? []
|
|
447
|
+
: [
|
|
448
|
+
crearCriticaVisual({
|
|
449
|
+
leerArtefacto: async (nombre) => readFileSync(join(opciones.artefactos.carpeta, nombre)),
|
|
450
|
+
invocar: invocarVisualConModelos(opciones.modelos),
|
|
451
|
+
}),
|
|
452
|
+
]),
|
|
453
|
+
],
|
|
454
|
+
interruptOn: hitlDe(PERFIL_DEL_ORQUESTADOR),
|
|
455
|
+
checkpointer: opciones.checkpointer ?? new MemorySaver(),
|
|
456
|
+
// El contenido de los `ToolMessage` va como TEXTO al modelo. Sin esto, un turno real
|
|
457
|
+
// revienta tras 8-10 tools con «Non string tool message content is not supported» —
|
|
458
|
+
// y no es de langchain ni de deepagents, sino de `@langchain/ollama` (ver
|
|
459
|
+
// `textoDeTool.ts`). Medido con dos modelos, nube y local.
|
|
460
|
+
middleware: [
|
|
461
|
+
createFilesystemMiddleware({
|
|
462
|
+
backend,
|
|
463
|
+
/**
|
|
464
|
+
* EL ORQUESTADOR VA DE SOLO LECTURA, que es lo que su propio prompt afirma.
|
|
465
|
+
*
|
|
466
|
+
* Esto faltaba, y fue un agujero declarado durante toda una tanda: `permissions`
|
|
467
|
+
* solo lo recibían los subagentes, así que las seis tools de fichero de aquí
|
|
468
|
+
* corrían sin ninguna de las denegaciones estructurales. Medido: contestaba
|
|
469
|
+
* «Successfully wrote» a `/.env`, a `/skills/pwn.txt` —que aterrizaba en la
|
|
470
|
+
* carpeta `skills/` de ESTE repo, o sea en las instrucciones del propio harness—
|
|
471
|
+
* y, desde los adjuntos, en `~/.xonecode/tareas/<id>/adjuntos/`, fuera del
|
|
472
|
+
* proyecto. Lo único que lo tapaba era el prompt, que es exactamente lo que este
|
|
473
|
+
* repo no acepta como barrera. Y el HITL tampoco alcanzaba: `hitlDe` se monta por
|
|
474
|
+
* subagente, así que una escritura de aquí no pasaba por ninguna aprobación.
|
|
475
|
+
*
|
|
476
|
+
* **Se le ponen permisos en vez de quitarle las tools**, que era la otra opción
|
|
477
|
+
* sobre la mesa, y el motivo es el comentario de abajo: este middleware SUSTITUYE
|
|
478
|
+
* al de por omisión de deepagents porque comparte nombre. Quitarlo podría
|
|
479
|
+
* reinstalar el suyo —sin permisos— y reabrir el agujero por accidente; ponerle
|
|
480
|
+
* `permissions` no puede.
|
|
481
|
+
*
|
|
482
|
+
* `soloLectura: true` añade `deny write /**`, así que el orquestador conserva
|
|
483
|
+
* `read`/`ls`/`glob`/`grep` para orientarse y no puede tocar el disco por ninguna
|
|
484
|
+
* ruta. `interruptOn` va por espejo con la rama de los subagentes: `hitlDe`
|
|
485
|
+
* devuelve `{}` para un perfil de solo lectura —no hay nada que aprobar—, y
|
|
486
|
+
* escribirlo aquí es lo que hace que las dos ramas se lean iguales.
|
|
487
|
+
*/
|
|
488
|
+
permissions: permisosDe(PERFIL_DEL_ORQUESTADOR),
|
|
489
|
+
customToolDescriptions: DESCRIPCIONES_FICHEROS,
|
|
490
|
+
...OPCIONES_BUSQUEDA_FICHEROS,
|
|
491
|
+
}),
|
|
492
|
+
// Los DOS, y en su orden, que es lo que `resumenConEncargo` garantiza: el resumen
|
|
493
|
+
// se lleva el encargo por delante al cruzar el umbral, y el segundo lo devuelve.
|
|
494
|
+
...resumenConEncargo(backend),
|
|
495
|
+
// Los esquemas de las tools que NO puede usar son el 25 % de su cabecera, y la cabecera
|
|
496
|
+
// es el 87 % de cada llamada (`inspectorDePrompt`). `permissions` acota el permiso; el
|
|
497
|
+
// esquema viaja igual, así que esto lo quita del prompt Y sigue rechazando la llamada.
|
|
498
|
+
// La frontera sigue siendo `permisosDe`: ver `excluirTools.ts`.
|
|
499
|
+
excluirTools(toolsQueNoUsa(PERFIL_DEL_ORQUESTADOR)),
|
|
500
|
+
// Un GUARDA contra desbocamiento, no una economía: con `continue` no le corta la
|
|
501
|
+
// respuesta, solo deja de darle tools. Está por encima de todo lo medido a propósito —
|
|
502
|
+
// ver `TOPE_DE_TOOLS_DEL_ORQUESTADOR`—, y no lleva tope de LLAMADAS porque el que
|
|
503
|
+
// contesta al usuario no puede quedarse a medias.
|
|
504
|
+
topeDeTools(TOPE_DE_TOOLS_DEL_ORQUESTADOR),
|
|
505
|
+
middlewareTextoDeTool(),
|
|
506
|
+
/**
|
|
507
|
+
* El bucle de rúbrica, y va en el ORQUESTADOR y no en los especialistas.
|
|
508
|
+
*
|
|
509
|
+
* Es quien cierra el encargo de la persona; un especialista contesta a quien le delegó,
|
|
510
|
+
* que es otra pregunta. Y el gancho es `afterAgent`, que en un especialista ni siquiera
|
|
511
|
+
* corre cuando lo corta su tope (medido: el `jumpTo: "end"` cortocircuita lo posterior),
|
|
512
|
+
* así que allí el bucle sería mudo justo en el caso que más importa.
|
|
513
|
+
*
|
|
514
|
+
* Sin `calificador` no se monta, y montado sin rúbrica no hace nada.
|
|
515
|
+
*/
|
|
516
|
+
...(opciones.calificador === undefined
|
|
517
|
+
? []
|
|
518
|
+
: [middlewareDeRubrica({ calificar: opciones.calificador })]),
|
|
519
|
+
...middlewareTracker("orquestador"),
|
|
520
|
+
...inspector(opciones.raiz, "orquestador"),
|
|
521
|
+
],
|
|
522
|
+
subagents: [
|
|
523
|
+
...subagentes,
|
|
524
|
+
...externos,
|
|
525
|
+
{
|
|
526
|
+
name: "general-purpose",
|
|
527
|
+
description: "NO USAR. No tiene ninguna capacidad de XOne, así que cualquier respuesta sobre el proyecto o la plataforma sería inventada.",
|
|
528
|
+
systemPrompt: "No tienes ninguna herramienta. Responde SIEMPRE que la tarea debe delegarse a docs, planner, dev o mockup.",
|
|
529
|
+
tools: [],
|
|
530
|
+
},
|
|
531
|
+
],
|
|
532
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Rutas virtuales que SkillsMiddleware carga de forma progresiva para un agente.
|
|
537
|
+
*
|
|
538
|
+
* Recibe el AGENTE y no su nombre: antes buscaba el perfil en `PERFILES`, y con subagentes
|
|
539
|
+
* escritos por el usuario ese `Record` no tiene su entrada — `perfil.skills` habría
|
|
540
|
+
* reventado con «cannot read properties of undefined» en cuanto alguien creara el primero.
|
|
541
|
+
*
|
|
542
|
+
* Solo las que EXISTEN. Una ruta a una skill que no está haría que el middleware fallara al
|
|
543
|
+
* montarla; que falte se dice en el prompt (`promptDeAgente`), que es donde se puede leer.
|
|
544
|
+
*/
|
|
545
|
+
export function rutasDeSkills(agente, disponibles) {
|
|
546
|
+
return agente.skills.filter((skill) => disponibles.has(skill)).map((skill) => `/skills/${skill}/`);
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Lo que se hace cada vez que el tracker cuenta: avisar a los DOS que lo esperan.
|
|
550
|
+
*
|
|
551
|
+
* **Extraída y exportada porque uno de los dos se cayó**, y en verde: el callback nació
|
|
552
|
+
* llamando solo al diagnóstico, así que el aviso de consumo tenía un único disparador —el
|
|
553
|
+
* de un agente EXTERNO— y una sesión normal subía sus tokens en silencio. Medido en la
|
|
554
|
+
* pantalla del usuario: el contador de la web no apareció nunca. Con la composición dentro
|
|
555
|
+
* de `construirAgente`, que todos sus tests doblan, no había dónde cazarlo.
|
|
556
|
+
*
|
|
557
|
+
* `alContarTokens` no lleva el uso dentro a propósito: quien escucha tiene el tracker —es
|
|
558
|
+
* él quien lo pasó— y dos fuentes para el mismo número son dos números que divergen.
|
|
559
|
+
*/
|
|
560
|
+
export function alContarDelTracker(origen, diagnostico, alContarTokens) {
|
|
561
|
+
return (uso) => {
|
|
562
|
+
diagnostico?.modelo(origen, uso);
|
|
563
|
+
alContarTokens?.();
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
//# sourceMappingURL=xoneAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xoneAgent.js","sourceRoot":"","sources":["../../../src/agent/grafo/xoneAgent.ts"],"names":[],"mappings":"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"}
|