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.
Files changed (315) hide show
  1. package/apps/web/dist/assets/{index-BB3SamhR.css → index-Boak51UP.css} +1 -1
  2. package/apps/web/dist/assets/index-Cg28x6nG.js +477 -0
  3. package/apps/web/dist/assets/{php-D_2--9WK.js → php-Cu6F_QCJ.js} +1 -1
  4. package/apps/web/dist/assets/{ruby-DSHSDbk1.js → ruby-BiqQPoC6.js} +1 -1
  5. package/apps/web/dist/index.html +2 -2
  6. package/dist/agent/{cloudstudioClient.js → cloudstudio/cloudstudioClient.js} +10 -0
  7. package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -0
  8. package/dist/agent/{cloudstudioMcp.js → cloudstudio/cloudstudioMcp.js} +5 -5
  9. package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -0
  10. package/dist/agent/{descarga.js → cloudstudio/descarga.js} +17 -7
  11. package/dist/agent/cloudstudio/descarga.js.map +1 -0
  12. package/dist/agent/cloudstudio/manifiesto.js.map +1 -0
  13. package/dist/agent/cloudstudio/ramaActiva.js +11 -0
  14. package/dist/agent/cloudstudio/ramaActiva.js.map +1 -0
  15. package/dist/agent/{subida.js → cloudstudio/subida.js} +16 -7
  16. package/dist/agent/cloudstudio/subida.js.map +1 -0
  17. package/dist/agent/{zip.js → cloudstudio/zip.js} +1 -1
  18. package/dist/agent/cloudstudio/zip.js.map +1 -0
  19. package/dist/agent/{authEnDisco.js → config/authEnDisco.js} +3 -3
  20. package/dist/agent/config/authEnDisco.js.map +1 -0
  21. package/dist/agent/{catalogoModelos.js → config/catalogoModelos.js} +47 -1
  22. package/dist/agent/config/catalogoModelos.js.map +1 -0
  23. package/dist/agent/{configEnDisco.js → config/configEnDisco.js} +6 -6
  24. package/dist/agent/config/configEnDisco.js.map +1 -0
  25. package/dist/agent/{crearProyecto.js → config/crearProyecto.js} +2 -2
  26. package/dist/agent/config/crearProyecto.js.map +1 -0
  27. package/dist/agent/config/entorno.js.map +1 -0
  28. package/dist/agent/config/gemini.js.map +1 -0
  29. package/dist/agent/config/modelos.js +235 -0
  30. package/dist/agent/config/modelos.js.map +1 -0
  31. package/dist/agent/{modelosDeMotor.js → config/modelosDeMotor.js} +1 -1
  32. package/dist/agent/config/modelosDeMotor.js.map +1 -0
  33. package/dist/agent/config/mudanzaEnDisco.js +121 -0
  34. package/dist/agent/config/mudanzaEnDisco.js.map +1 -0
  35. package/dist/agent/{persona.js → config/persona.js} +1 -1
  36. package/dist/agent/config/persona.js.map +1 -0
  37. package/dist/agent/config/selectorEnMaquina.js +45 -0
  38. package/dist/agent/config/selectorEnMaquina.js.map +1 -0
  39. package/dist/agent/{settingsEnDisco.js → config/settingsEnDisco.js} +37 -2
  40. package/dist/agent/config/settingsEnDisco.js.map +1 -0
  41. package/dist/agent/{versionEnDisco.js → config/versionEnDisco.js} +8 -4
  42. package/dist/agent/config/versionEnDisco.js.map +1 -0
  43. package/dist/agent/dispositivos/arranqueDeEmulador.js +146 -0
  44. package/dist/agent/dispositivos/arranqueDeEmulador.js.map +1 -0
  45. package/dist/agent/{dispositivosEnMaquina.js → dispositivos/dispositivosEnMaquina.js} +93 -6
  46. package/dist/agent/dispositivos/dispositivosEnMaquina.js.map +1 -0
  47. package/dist/agent/dispositivos/hotswap.js.map +1 -0
  48. package/dist/agent/dispositivos/instalacionEnMaquina.js.map +1 -0
  49. package/dist/agent/dispositivos/juezVisual.js +152 -0
  50. package/dist/agent/dispositivos/juezVisual.js.map +1 -0
  51. package/dist/agent/{lanzamientoEnMaquina.js → dispositivos/lanzamientoEnMaquina.js} +1 -1
  52. package/dist/agent/dispositivos/lanzamientoEnMaquina.js.map +1 -0
  53. package/dist/agent/{paqueteDelProyecto.js → dispositivos/paqueteDelProyecto.js} +5 -5
  54. package/dist/agent/dispositivos/paqueteDelProyecto.js.map +1 -0
  55. package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -0
  56. package/dist/agent/dispositivos/sensorDeArranque.js +154 -0
  57. package/dist/agent/dispositivos/sensorDeArranque.js.map +1 -0
  58. package/dist/agent/exportarPdf.js +140 -0
  59. package/dist/agent/exportarPdf.js.map +1 -0
  60. package/dist/agent/{arbolDeProyecto.js → grafo/arbolDeProyecto.js} +2 -2
  61. package/dist/agent/grafo/arbolDeProyecto.js.map +1 -0
  62. package/dist/agent/{artefactosEnDisco.js → grafo/artefactosEnDisco.js} +2 -2
  63. package/dist/agent/grafo/artefactosEnDisco.js.map +1 -0
  64. package/dist/agent/{busquedaRegex.js → grafo/busquedaRegex.js} +41 -1
  65. package/dist/agent/grafo/busquedaRegex.js.map +1 -0
  66. package/dist/agent/grafo/criticaVisual.js +115 -0
  67. package/dist/agent/grafo/criticaVisual.js.map +1 -0
  68. package/dist/agent/grafo/excluirTools.js +82 -0
  69. package/dist/agent/grafo/excluirTools.js.map +1 -0
  70. package/dist/agent/{memoriaDeProyecto.js → grafo/memoriaDeProyecto.js} +1 -1
  71. package/dist/agent/grafo/memoriaDeProyecto.js.map +1 -0
  72. package/dist/agent/grafo/navegacionXone.js +231 -0
  73. package/dist/agent/grafo/navegacionXone.js.map +1 -0
  74. package/dist/agent/{perfiles.js → grafo/perfiles.js} +96 -10
  75. package/dist/agent/grafo/perfiles.js.map +1 -0
  76. package/dist/agent/{proyecto.js → grafo/proyecto.js} +274 -24
  77. package/dist/agent/grafo/proyecto.js.map +1 -0
  78. package/dist/agent/grafo/skills.js +425 -0
  79. package/dist/agent/grafo/skills.js.map +1 -0
  80. package/dist/agent/grafo/xoneAgent.js +566 -0
  81. package/dist/agent/grafo/xoneAgent.js.map +1 -0
  82. package/dist/agent/navegacion/estilosEnDisco.js +110 -0
  83. package/dist/agent/navegacion/estilosEnDisco.js.map +1 -0
  84. package/dist/agent/navegacion/hechosEnDisco.js +26 -0
  85. package/dist/agent/navegacion/hechosEnDisco.js.map +1 -0
  86. package/dist/agent/navegacion/indiceEnDisco.js +36 -0
  87. package/dist/agent/navegacion/indiceEnDisco.js.map +1 -0
  88. package/dist/agent/navegacion/modeloDeProyecto.js +228 -0
  89. package/dist/agent/navegacion/modeloDeProyecto.js.map +1 -0
  90. package/dist/agent/raizDelPaquete.js +56 -0
  91. package/dist/agent/raizDelPaquete.js.map +1 -0
  92. package/dist/agent/{checkpointer.js → sesiones/checkpointer.js} +1 -1
  93. package/dist/agent/sesiones/checkpointer.js.map +1 -0
  94. package/dist/agent/sesiones/git.js.map +1 -0
  95. package/dist/agent/{gitSync.js → sesiones/gitSync.js} +3 -3
  96. package/dist/agent/sesiones/gitSync.js.map +1 -0
  97. package/dist/agent/{sesionGit.js → sesiones/sesionGit.js} +2 -2
  98. package/dist/agent/sesiones/sesionGit.js.map +1 -0
  99. package/dist/agent/subagentes/agentesEnDisco.js +818 -0
  100. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -0
  101. package/dist/agent/subagentes/consumoExterno.js.map +1 -0
  102. package/dist/agent/subagentes/escrituraDeCodex.js.map +1 -0
  103. package/dist/agent/{escrituraDeOpencode.js → subagentes/escrituraDeOpencode.js} +1 -1
  104. package/dist/agent/subagentes/escrituraDeOpencode.js.map +1 -0
  105. package/dist/agent/{escrituraExterna.js → subagentes/escrituraExterna.js} +59 -6
  106. package/dist/agent/subagentes/escrituraExterna.js.map +1 -0
  107. package/dist/agent/subagentes/pluginDeSkills.js +99 -0
  108. package/dist/agent/subagentes/pluginDeSkills.js.map +1 -0
  109. package/dist/agent/subagentes/subagenteCodex.js.map +1 -0
  110. package/dist/agent/{subagenteExterno.js → subagentes/subagenteExterno.js} +48 -0
  111. package/dist/agent/subagentes/subagenteExterno.js.map +1 -0
  112. package/dist/agent/{subagenteOpencode.js → subagentes/subagenteOpencode.js} +53 -1
  113. package/dist/agent/subagentes/subagenteOpencode.js.map +1 -0
  114. package/dist/agent/{aumentador.js → tareas/aumentador.js} +2 -2
  115. package/dist/agent/tareas/aumentador.js.map +1 -0
  116. package/dist/agent/{juezDeTarea.js → tareas/juezDeTarea.js} +6 -6
  117. package/dist/agent/tareas/juezDeTarea.js.map +1 -0
  118. package/dist/agent/{tareasEnDisco.js → tareas/tareasEnDisco.js} +53 -4
  119. package/dist/agent/tareas/tareasEnDisco.js.map +1 -0
  120. package/dist/agent/{diagnosticoDeTools.js → turno/diagnosticoDeTools.js} +5 -1
  121. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -0
  122. package/dist/agent/{guionizado.js → turno/guionizado.js} +1 -1
  123. package/dist/agent/turno/guionizado.js.map +1 -0
  124. package/dist/agent/turno/informeDeTraza.js +245 -0
  125. package/dist/agent/turno/informeDeTraza.js.map +1 -0
  126. package/dist/agent/turno/inspectorDePrompt.js +205 -0
  127. package/dist/agent/turno/inspectorDePrompt.js.map +1 -0
  128. package/dist/agent/{instantanea.js → turno/instantanea.js} +7 -2
  129. package/dist/agent/turno/instantanea.js.map +1 -0
  130. package/dist/agent/{interrupts.js → turno/interrupts.js} +2 -2
  131. package/dist/agent/turno/interrupts.js.map +1 -0
  132. package/dist/agent/turno/mensajes.js.map +1 -0
  133. package/dist/agent/turno/normalizar.js.map +1 -0
  134. package/dist/agent/{puente.js → turno/puente.js} +71 -4
  135. package/dist/agent/turno/puente.js.map +1 -0
  136. package/dist/agent/turno/resumenDeContexto.js +260 -0
  137. package/dist/agent/turno/resumenDeContexto.js.map +1 -0
  138. package/dist/agent/{resumenDeTool.js → turno/resumenDeTool.js} +33 -0
  139. package/dist/agent/turno/resumenDeTool.js.map +1 -0
  140. package/dist/agent/turno/rubrica.js +91 -0
  141. package/dist/agent/turno/rubrica.js.map +1 -0
  142. package/dist/agent/turno/textoDeTool.js.map +1 -0
  143. package/dist/agent/{turnoReal.js → turno/turnoReal.js} +210 -25
  144. package/dist/agent/turno/turnoReal.js.map +1 -0
  145. package/dist/agent/turno/verificador.js.map +1 -0
  146. package/dist/cli/config.js +1 -1
  147. package/dist/cli/config.js.map +1 -1
  148. package/dist/cli/consola.js +72 -9
  149. package/dist/cli/consola.js.map +1 -1
  150. package/dist/cli/describe.js +2 -2
  151. package/dist/cli/describe.js.map +1 -1
  152. package/dist/cli/doctor.js +1 -1
  153. package/dist/cli/doctor.js.map +1 -1
  154. package/dist/cli/fuentesDeDisco.js +29 -0
  155. package/dist/cli/fuentesDeDisco.js.map +1 -0
  156. package/dist/cli/main.js +87 -31
  157. package/dist/cli/main.js.map +1 -1
  158. package/dist/cli/run.js +40 -10
  159. package/dist/cli/run.js.map +1 -1
  160. package/dist/cli/traza.js +48 -0
  161. package/dist/cli/traza.js.map +1 -0
  162. package/dist/cli/tui/correrTui.js +4 -4
  163. package/dist/cli/tui/correrTui.js.map +1 -1
  164. package/dist/cli/verify.js +1 -1
  165. package/dist/cli/verify.js.map +1 -1
  166. package/dist/core/actos.js +1 -1
  167. package/dist/core/adjuntos.js +2 -2
  168. package/dist/core/agentes.js +247 -7
  169. package/dist/core/agentes.js.map +1 -1
  170. package/dist/core/artefactos.js +4 -4
  171. package/dist/core/config.js +1 -1
  172. package/dist/core/contextos.js +12 -1
  173. package/dist/core/contextos.js.map +1 -1
  174. package/dist/core/descargas.js +1 -1
  175. package/dist/core/dispositivos.js +53 -3
  176. package/dist/core/dispositivos.js.map +1 -1
  177. package/dist/core/esfuerzo.js +141 -0
  178. package/dist/core/esfuerzo.js.map +1 -0
  179. package/dist/core/esqueleto.js +1 -1
  180. package/dist/core/estilos.js +78 -0
  181. package/dist/core/estilos.js.map +1 -0
  182. package/dist/core/exportacion.js +140 -0
  183. package/dist/core/exportacion.js.map +1 -0
  184. package/dist/core/hechosDelProyecto.js +87 -0
  185. package/dist/core/hechosDelProyecto.js.map +1 -0
  186. package/dist/core/logDeDispositivo.js +143 -0
  187. package/dist/core/logDeDispositivo.js.map +1 -0
  188. package/dist/core/modelos.js +48 -3
  189. package/dist/core/modelos.js.map +1 -1
  190. package/dist/core/mudanzaDeWorkspace.js +93 -0
  191. package/dist/core/mudanzaDeWorkspace.js.map +1 -0
  192. package/dist/core/navegacion.js +134 -0
  193. package/dist/core/navegacion.js.map +1 -0
  194. package/dist/core/notify.js +5 -0
  195. package/dist/core/notify.js.map +1 -1
  196. package/dist/core/planDeSubida.js +1 -1
  197. package/dist/core/planes.js +70 -0
  198. package/dist/core/planes.js.map +1 -0
  199. package/dist/core/ports.js +4 -0
  200. package/dist/core/ports.js.map +1 -1
  201. package/dist/core/rubrica.js +90 -0
  202. package/dist/core/rubrica.js.map +1 -0
  203. package/dist/core/selectorDeCarpeta.js +87 -0
  204. package/dist/core/selectorDeCarpeta.js.map +1 -0
  205. package/dist/core/settings.js +56 -7
  206. package/dist/core/settings.js.map +1 -1
  207. package/dist/core/shellDeAgente.js +144 -0
  208. package/dist/core/shellDeAgente.js.map +1 -0
  209. package/dist/core/skills.js +158 -0
  210. package/dist/core/skills.js.map +1 -0
  211. package/dist/core/topeAgotado.js +69 -0
  212. package/dist/core/topeAgotado.js.map +1 -0
  213. package/dist/core/zipDeSkill.js +107 -0
  214. package/dist/core/zipDeSkill.js.map +1 -0
  215. package/dist/web/servidor/arranque.js +853 -54
  216. package/dist/web/servidor/arranque.js.map +1 -1
  217. package/dist/web/servidor/corredorDeTareas.js +3 -3
  218. package/dist/web/servidor/corredorDeTareas.js.map +1 -1
  219. package/dist/web/servidor/sesiones.js +34 -6
  220. package/dist/web/servidor/sesiones.js.map +1 -1
  221. package/dist/web/servidor/transporte.js +1 -1
  222. package/dist/web/servidor/transporte.js.map +1 -1
  223. package/dist/web/servidor/vestibulo.js +62 -13
  224. package/dist/web/servidor/vestibulo.js.map +1 -1
  225. package/package.json +7 -4
  226. package/skills/archify/SKILL.md +25 -2
  227. package/skills/artifacts-builder/SKILL.md +23 -0
  228. package/skills/xone-hotswap/SKILL.md +96 -0
  229. package/skills/xone-hotswap/scripts/xone-arrancar-android +202 -0
  230. package/skills/xone-hotswap/scripts/xone-arrancar-ios +85 -0
  231. package/skills/xone-hotswap/scripts/xone-captura-android +93 -0
  232. package/skills/xone-hotswap/scripts/xone-desplegar-android +439 -0
  233. package/skills/xone-hotswap/scripts/xone-hotswap +201 -0
  234. package/skills/xone-hotswap/scripts/xone-log-android +102 -0
  235. package/skills/xone-hotswap/scripts/xone-reiniciar-android +132 -0
  236. package/skills/xone-plan-builder/SKILL.md +22 -4
  237. package/skills/xone-spec-builder/SKILL.md +37 -7
  238. package/apps/web/dist/assets/index-CFYAoHdw.js +0 -477
  239. package/dist/agent/agentesEnDisco.js +0 -539
  240. package/dist/agent/agentesEnDisco.js.map +0 -1
  241. package/dist/agent/arbolDeProyecto.js.map +0 -1
  242. package/dist/agent/artefactosEnDisco.js.map +0 -1
  243. package/dist/agent/aumentador.js.map +0 -1
  244. package/dist/agent/authEnDisco.js.map +0 -1
  245. package/dist/agent/busquedaRegex.js.map +0 -1
  246. package/dist/agent/catalogoModelos.js.map +0 -1
  247. package/dist/agent/checkpointer.js.map +0 -1
  248. package/dist/agent/cloudstudioClient.js.map +0 -1
  249. package/dist/agent/cloudstudioMcp.js.map +0 -1
  250. package/dist/agent/configEnDisco.js.map +0 -1
  251. package/dist/agent/consumoExterno.js.map +0 -1
  252. package/dist/agent/crearProyecto.js.map +0 -1
  253. package/dist/agent/descarga.js.map +0 -1
  254. package/dist/agent/diagnosticoDeTools.js.map +0 -1
  255. package/dist/agent/dispositivosEnMaquina.js.map +0 -1
  256. package/dist/agent/entorno.js.map +0 -1
  257. package/dist/agent/escrituraDeCodex.js.map +0 -1
  258. package/dist/agent/escrituraDeOpencode.js.map +0 -1
  259. package/dist/agent/escrituraExterna.js.map +0 -1
  260. package/dist/agent/gemini.js.map +0 -1
  261. package/dist/agent/git.js.map +0 -1
  262. package/dist/agent/gitSync.js.map +0 -1
  263. package/dist/agent/guionizado.js.map +0 -1
  264. package/dist/agent/hotswap.js.map +0 -1
  265. package/dist/agent/instalacionEnMaquina.js.map +0 -1
  266. package/dist/agent/instantanea.js.map +0 -1
  267. package/dist/agent/interrupts.js.map +0 -1
  268. package/dist/agent/juezDeTarea.js.map +0 -1
  269. package/dist/agent/lanzamientoEnMaquina.js.map +0 -1
  270. package/dist/agent/manifiesto.js.map +0 -1
  271. package/dist/agent/memoriaDeProyecto.js.map +0 -1
  272. package/dist/agent/mensajes.js.map +0 -1
  273. package/dist/agent/modelos.js +0 -130
  274. package/dist/agent/modelos.js.map +0 -1
  275. package/dist/agent/modelosDeMotor.js.map +0 -1
  276. package/dist/agent/normalizar.js.map +0 -1
  277. package/dist/agent/paqueteDelProyecto.js.map +0 -1
  278. package/dist/agent/perfiles.js.map +0 -1
  279. package/dist/agent/persona.js.map +0 -1
  280. package/dist/agent/procesosEnMaquina.js.map +0 -1
  281. package/dist/agent/proyecto.js.map +0 -1
  282. package/dist/agent/puente.js.map +0 -1
  283. package/dist/agent/resumenDeContexto.js +0 -30
  284. package/dist/agent/resumenDeContexto.js.map +0 -1
  285. package/dist/agent/resumenDeTool.js.map +0 -1
  286. package/dist/agent/sesionGit.js.map +0 -1
  287. package/dist/agent/settingsEnDisco.js.map +0 -1
  288. package/dist/agent/skills.js +0 -65
  289. package/dist/agent/skills.js.map +0 -1
  290. package/dist/agent/subagenteCodex.js.map +0 -1
  291. package/dist/agent/subagenteExterno.js.map +0 -1
  292. package/dist/agent/subagenteOpencode.js.map +0 -1
  293. package/dist/agent/subida.js.map +0 -1
  294. package/dist/agent/tareasEnDisco.js.map +0 -1
  295. package/dist/agent/textoDeTool.js.map +0 -1
  296. package/dist/agent/turnoReal.js.map +0 -1
  297. package/dist/agent/verificador.js.map +0 -1
  298. package/dist/agent/versionEnDisco.js.map +0 -1
  299. package/dist/agent/xoneAgent.js +0 -347
  300. package/dist/agent/xoneAgent.js.map +0 -1
  301. package/dist/agent/zip.js.map +0 -1
  302. /package/dist/agent/{manifiesto.js → cloudstudio/manifiesto.js} +0 -0
  303. /package/dist/agent/{entorno.js → config/entorno.js} +0 -0
  304. /package/dist/agent/{gemini.js → config/gemini.js} +0 -0
  305. /package/dist/agent/{hotswap.js → dispositivos/hotswap.js} +0 -0
  306. /package/dist/agent/{instalacionEnMaquina.js → dispositivos/instalacionEnMaquina.js} +0 -0
  307. /package/dist/agent/{procesosEnMaquina.js → dispositivos/procesosEnMaquina.js} +0 -0
  308. /package/dist/agent/{git.js → sesiones/git.js} +0 -0
  309. /package/dist/agent/{consumoExterno.js → subagentes/consumoExterno.js} +0 -0
  310. /package/dist/agent/{escrituraDeCodex.js → subagentes/escrituraDeCodex.js} +0 -0
  311. /package/dist/agent/{subagenteCodex.js → subagentes/subagenteCodex.js} +0 -0
  312. /package/dist/agent/{mensajes.js → turno/mensajes.js} +0 -0
  313. /package/dist/agent/{normalizar.js → turno/normalizar.js} +0 -0
  314. /package/dist/agent/{textoDeTool.js → turno/textoDeTool.js} +0 -0
  315. /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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"}