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,260 @@
1
+ /**
2
+ * Política de contexto del harness.
3
+ *
4
+ * DeepAgents usa 170k tokens cuando el proveedor no publica su ventana de contexto. Con
5
+ * Ollama eso retrasa demasiado la compresión y cada llamada reenvía lecturas ya resueltas.
6
+ * Este umbral es independiente del proveedor: limita el coste sin borrar el trabajo reciente.
7
+ */
8
+ import { createSummarizationMiddleware } from "deepagents";
9
+ import { createMiddleware, toolCallLimitMiddleware } from "langchain";
10
+ import { z } from "zod";
11
+ import { AIMessage, HumanMessage } from "@langchain/core/messages";
12
+ import { mensajeDeTopeAgotado } from "../../core/topeAgotado.js";
13
+ import { RUTA_HISTORIAL_RESUMIDO } from "../grafo/memoriaDeProyecto.js";
14
+ export const UMBRAL_RESUMEN_TOKENS = 32_000;
15
+ export const CONTEXTO_RECIENTE_TOKENS = 8_000;
16
+ export function resumenDeContexto(backend) {
17
+ return createSummarizationMiddleware({
18
+ backend,
19
+ trigger: { type: "tokens", value: UMBRAL_RESUMEN_TOKENS },
20
+ keep: { type: "tokens", value: CONTEXTO_RECIENTE_TOKENS },
21
+ // Las tools de fichero pueden llevar contenido grande. Los argumentos antiguos ya
22
+ // están representados por el resumen, no deben volver a inflar las siguientes llamadas.
23
+ truncateArgsSettings: {
24
+ trigger: { type: "tokens", value: UMBRAL_RESUMEN_TOKENS },
25
+ keep: { type: "tokens", value: CONTEXTO_RECIENTE_TOKENS },
26
+ maxLength: 1_000,
27
+ },
28
+ trimTokensToSummarize: 12_000,
29
+ // El backend lo escribe directamente; no debe aparecer en el árbol ni en las tools del
30
+ // agente. Así el estado de sesión permanece junto al proyecto y fuera de la app XOne.
31
+ historyPathPrefix: RUTA_HISTORIAL_RESUMIDO,
32
+ });
33
+ }
34
+ /**
35
+ * Devuelve el ENCARGO a la conversación después de que el resumen se lo lleve.
36
+ *
37
+ * ## El fallo que cierra, medido offline el 17-09-2026
38
+ *
39
+ * Un turno real del usuario: el orquestador delegó una pregunta sobre si XOne servía para un
40
+ * CRM, el especialista dio 57 pasos y volvió con la respuesta de la pregunta **anterior** —«la
41
+ * ventana de inicio de mi app»—. El orquestador lo detectó y relanzó dos veces: 1,5M de tokens
42
+ * para una pregunta. El propio modelo dijo que «parece que trae una sesión antigua pegada», y
43
+ * esa hipótesis era falsa: los subagentes van en `handoff`, así que arrancan con el encargo y
44
+ * nada más, y aunque HEREDAN nuestro checkpointer, el namespace de cada `task` lleva el paso y
45
+ * el id del checkpoint dentro, así que no puede reanudar nada.
46
+ *
47
+ * Lo que pasa de verdad está en el middleware de resumen: al cruzar el umbral, los mensajes
48
+ * `[0, corte)` se sustituyen por UN resumen, y el mensaje 0 es justamente el encargo. `keep`
49
+ * solo conserva la COLA —no hay opción para el primero— y el prompt de resumen por omisión
50
+ * pide «temas, decisiones y contexto para continuar», no el encargo. O sea que a partir de los
51
+ * 32k el especialista sigue trabajando **sin la pregunta que le hicieron**, y contesta a lo que
52
+ * el resumen le deje entender. Medido en `resumenDeContexto.test.ts`.
53
+ *
54
+ * ## Por qué por CÓDIGO y no por `summaryPrompt`
55
+ *
56
+ * Se podría pedir en el prompt del resumen que conserve el encargo, y a veces lo haría. Un
57
+ * agente que pierde su encargo no contesta peor: contesta a otra cosa, y el coste de eso ya
58
+ * está medido en millones de tokens. Es la misma regla que hace que los avisos de honestidad
59
+ * sean código y no prompt (`core/bitacora.ts`).
60
+ *
61
+ * El encargo se saca del ESTADO, que el resumen no reescribe (guarda un `_summarizationEvent`
62
+ * y reconstruye la lista efectiva), así que ahí sigue intacto el mensaje 0. Y se reinserta solo
63
+ * si NO está: por debajo del umbral no hay nada que devolver y duplicarlo sería peor.
64
+ */
65
+ export function conservarElEncargo() {
66
+ return createMiddleware({
67
+ name: "ConservarElEncargoMiddleware",
68
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
+ wrapModelCall: (request, handler) => {
70
+ const mensajes = request?.messages;
71
+ const historial = request?.state?.messages;
72
+ if (!Array.isArray(mensajes) || !Array.isArray(historial) || mensajes.length === 0)
73
+ return handler(request);
74
+ // **El ÚLTIMO humano, no el primero**, y la diferencia es el defecto entero: en la
75
+ // conversación de un ESPECIALISTA solo hay uno —el encargo— y los dos coinciden, pero la
76
+ // del ORQUESTADOR es multiturno, y ahí el primero es la pregunta de hace tres turnos.
77
+ // Reinyectar esa sería reintroducir a mano justo el fallo que esto arregla.
78
+ const encargo = [...historial].reverse().find((m) => esDeHumano(m));
79
+ if (encargo === undefined || mensajes.includes(encargo))
80
+ return handler(request);
81
+ // Por CONTENIDO además de por identidad: la lista efectiva se reconstruye, así que el
82
+ // mensaje puede ser otro objeto con el mismo texto. Sin esto se duplicaría el encargo en
83
+ // cada llamada posterior al resumen.
84
+ const texto = textoPlano(encargo);
85
+ if (texto !== "" && mensajes.some((m) => esDeHumano(m) && textoPlano(m) === texto))
86
+ return handler(request);
87
+ return handler({ ...request, messages: [encargo, ...mensajes] });
88
+ },
89
+ });
90
+ }
91
+ function esDeHumano(msg) {
92
+ if (!msg || typeof msg !== "object")
93
+ return false;
94
+ const m = msg;
95
+ return m.type === "human" || m.role === "user" || m instanceof HumanMessage;
96
+ }
97
+ function textoPlano(msg) {
98
+ const c = msg?.content;
99
+ if (typeof c === "string")
100
+ return c;
101
+ if (Array.isArray(c))
102
+ return c.map((b) => (typeof b === "object" && b !== null && "text" in b ? String(b.text) : "")).join("");
103
+ return "";
104
+ }
105
+ /**
106
+ * El resumen y la devolución del encargo, SIEMPRE juntos y en este orden.
107
+ *
108
+ * Van en una sola función porque separarlos es el fallo: el primero de la lista envuelve al
109
+ * siguiente, así que `conservarElEncargo` tiene que ver los mensajes YA resumidos — delante no
110
+ * habría nada que devolver. Montarlos a mano en dos sitios (el orquestador y cada especialista)
111
+ * es el patrón que en este repo ha fallado nueve veces: una composición de producción que vive
112
+ * en un cierre que los tests doblan, y que puede dejar de estar montada con todo en verde.
113
+ */
114
+ export function resumenConEncargo(backend) {
115
+ return [resumenDeContexto(backend), conservarElEncargo()];
116
+ }
117
+ /**
118
+ * Cuántas llamadas al modelo puede gastar UN especialista en un encargo.
119
+ *
120
+ * Medido el 17-09-2026 con el banco: una pregunta de estructura se resuelve en 3-7 llamadas en
121
+ * TODO el turno, y la de capacidad —la clase cara— la terminó bien un modelo en 10. El que se
122
+ * descarriló llevaba 32 y subiendo cuando el reloj lo mató, y 57 en el turno que lo destapó. El
123
+ * tope deja intacto lo que funciona y corta lo otro.
124
+ *
125
+ * **No es un ahorro, es una frontera.** Un especialista hace una tarea específica con un
126
+ * encargo bien descrito; si necesita treinta llamadas, lo que falla es la delegación, y seguir
127
+ * dándole cuerda solo hace más cara la misma respuesta mala.
128
+ */
129
+ export const TOPE_DE_LLAMADAS_DEL_ESPECIALISTA = 15;
130
+ /**
131
+ * El tope, con `exitBehavior: "end"` y no `"error"`.
132
+ *
133
+ * Con `"error"` la delegación entera se cae y el orquestador se queda sin nada, que es como
134
+ * empieza el bucle de reintentos que ya costó 1,5M de tokens. Con `"end"` el especialista
135
+ * devuelve lo que tenga y quien decide es el orquestador, que para eso lee la respuesta.
136
+ *
137
+ * Es de la librería (`langchain`), y deepagents lo contempla: sus claves de conteo están en
138
+ * `EXCLUDED_STATE_KEYS` a propósito, «each agent counts its own calls, so they never cross the
139
+ * boundary». O sea que el tope de un especialista no toca el del padre.
140
+ */
141
+ const ESTADO_DEL_TOPE = z.object({ llamadasDelEspecialista: z.number().default(0) });
142
+ /**
143
+ * El tope, NUESTRO y no el de la librería.
144
+ *
145
+ * `modelCallLimitMiddleware` cuenta bien y corta bien, pero lo que deja como respuesta es un
146
+ * `AIMessage` con su frase en inglés —«Model call limits exceeded: …»—, y el `task` de
147
+ * deepagents devuelve SOLO el último mensaje (`extractLastMessage`). O sea que quien delegó
148
+ * recibe esa frase y **las quince llamadas de trabajo se pierden**: medido el 19-09-2026,
149
+ * 100-160k de entrada por especialista devolviendo menos de 900 tokens. Esa es la razón de que
150
+ * el orquestador encadene al siguiente — no enruta mal, es que no recibe nada con lo que seguir.
151
+ *
152
+ * No se pudo arreglar por fuera: su `jumpTo: "end"` **cortocircuita todos los middlewares
153
+ * posteriores**, incluidos `afterAgent` y su propio reset del contador (medido contra la
154
+ * librería real con `FakeToolCallingModel` y `runLimit: 0`, ver el test). No hay dónde
155
+ * engancharse. Así que el contador, la decisión y el mensaje son de aquí: uno de cada, y el
156
+ * mensaje se compone en `core/` donde se puede probar sin librería.
157
+ *
158
+ * `exitBehavior` sigue siendo «terminar» y no «lanzar», por el argumento de siempre: con un
159
+ * error la delegación entera se cae y el orquestador se queda sin nada, que es como empieza el
160
+ * bucle de reintentos que costó 1,5M de tokens.
161
+ */
162
+ export function topeDeLlamadas(limite = TOPE_DE_LLAMADAS_DEL_ESPECIALISTA, alCortar) {
163
+ return createMiddleware({
164
+ name: "TopeDeLlamadasMiddleware",
165
+ stateSchema: ESTADO_DEL_TOPE,
166
+ beforeModel: {
167
+ canJumpTo: ["end"],
168
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
169
+ hook: (state) => {
170
+ if ((state?.llamadasDelEspecialista ?? 0) < limite)
171
+ return undefined;
172
+ // Que el corte se VEA. Sin esto el único sitio donde consta es el mensaje que recibe
173
+ // quien delegó, y la traza sigue diciendo «15 llamadas» como si hubiera terminado.
174
+ alCortar?.();
175
+ const parcial = ultimoTextoSustancial(state?.messages);
176
+ return {
177
+ jumpTo: "end",
178
+ messages: [
179
+ new AIMessage(mensajeDeTopeAgotado({ limite, ...(parcial === undefined ? {} : { parcial }) })),
180
+ ],
181
+ };
182
+ },
183
+ },
184
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
185
+ afterModel: (state) => ({
186
+ llamadasDelEspecialista: (state?.llamadasDelEspecialista ?? 0) + 1,
187
+ }),
188
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
189
+ });
190
+ }
191
+ /** Lo último que el especialista dijo con contenido: el trabajo que el corte iba a tirar. */
192
+ function ultimoTextoSustancial(mensajes) {
193
+ if (!Array.isArray(mensajes))
194
+ return undefined;
195
+ return [...mensajes]
196
+ .reverse()
197
+ .map((m) => textoPlano(m))
198
+ .find((texto) => texto.trim() !== "");
199
+ }
200
+ /**
201
+ * Cuántas TOOLS puede gastar un especialista en un encargo.
202
+ *
203
+ * El tope de llamadas al modelo acota los VIAJES; este acota **lo que se acumula**, que es lo
204
+ * que multiplica. Medido el 17-09-2026 en una conversación de tres preguntas: en la tercera, el
205
+ * consultor llegó a 43 resultados de tool metidos en su contexto, y como cada llamada al modelo
206
+ * reenvía todo lo anterior, la primera costó 5.264 tokens y la última 39.888 — 406k en total. No
207
+ * era un bucle: era la acumulación al cuadrado.
208
+ *
209
+ * Veinte es generoso contra su propia regla, que ya le pide «máximo tres referencias por
210
+ * pregunta y un `grep` por hipótesis»: si con veinte no le llega, lo que falla es la delegación
211
+ * o la regla, no el tope.
212
+ */
213
+ export const TOPE_DE_TOOLS_DEL_ESPECIALISTA = 20;
214
+ /**
215
+ * **`continue`, y NO `end`: son incompatibles con pedir varias tools a la vez.**
216
+ *
217
+ * Medido el 17-09-2026 en el primer turno con el tope puesto: «Cannot end execution with other
218
+ * tool calls pending. Found calls to: read_file, ls, grep». La documentación de langchain lo
219
+ * dice igual —`end` «raises NotImplementedError if there are multiple tool calls»— y nosotros le
220
+ * PEDIMOS al especialista que agrupe las lecturas independientes en un mismo mensaje, así que
221
+ * llegar al tope con varias en vuelo es el caso normal, no el raro.
222
+ *
223
+ * `continue` bloquea las que sobran con un mensaje de error y deja que el modelo termine: se
224
+ * queda sin más tools y contesta con lo que tiene, que es lo mismo que buscaba `end` pero sin
225
+ * romperse. `error` tumbaría la delegación entera, que es como empieza el bucle de reintentos.
226
+ *
227
+ * Dos reglas nuestras que vivían sin hablarse —«agrupa las tools» y «corta al llegar al tope»—
228
+ * y cuyo choque solo se ve corriendo. Por eso el test las ata juntas.
229
+ */
230
+ export const SALIDA_DEL_TOPE_DE_TOOLS = "continue";
231
+ /**
232
+ * Cuántas TOOLS puede gastar el ORQUESTADOR, y **es un guarda, no una economía**.
233
+ *
234
+ * ## Por qué NO lleva tope de LLAMADAS, y esto sí
235
+ *
236
+ * El argumento contra caparle las llamadas sigue en pie y es bueno: **el que contesta al
237
+ * usuario no puede quedarse a medias**. Pero ese argumento es sobre no cortarle la VOZ, y el
238
+ * tope de tools con `exitBehavior: "continue"` no corta nada — se queda sin más tools y
239
+ * contesta con lo que tenga. Le quita la pala, no la palabra.
240
+ *
241
+ * ## Por qué el número es ALTO, y qué NO es
242
+ *
243
+ * **No está puesto para ahorrar.** Medido el 19-09-2026 sobre turnos reales, el orquestador
244
+ * gasta 41 tools en un encargo visual normal —18 lecturas, 15 `grep`, 5 de navegación y 3
245
+ * delegaciones— y sus llamadas al modelo van de 14 a 49 según el turno. Esas lecturas SON el
246
+ * trabajo: recortarlas no abarata el turno, empeora la respuesta. Lo que abarata es quitarle la
247
+ * NECESIDAD de leer, que es lo que hacen `conHechosDelProyecto` y la operación `estilos` — y se
248
+ * está moviendo: la navegación pasó de 1-2 usos por turno a 5.
249
+ *
250
+ * Así que esto se sitúa POR ENCIMA de lo observado a propósito: no muerde en ningún turno
251
+ * medido y solo para uno desbocado. Es el mismo papel que `topeDeRondas` y el tope propio de
252
+ * los artefactos — «aquí no hay humano que frene el bucle»—, y por eso vive aquí y no en una
253
+ * medida de coste. Si algún día muerde en un turno normal, lo que hay que mirar es por qué ese
254
+ * turno necesitó 60 tools, no subir el número.
255
+ */
256
+ export const TOPE_DE_TOOLS_DEL_ORQUESTADOR = 60;
257
+ export function topeDeTools(limite = TOPE_DE_TOOLS_DEL_ESPECIALISTA) {
258
+ return toolCallLimitMiddleware({ runLimit: limite, exitBehavior: SALIDA_DEL_TOPE_DE_TOOLS });
259
+ }
260
+ //# sourceMappingURL=resumenDeContexto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resumenDeContexto.js","sourceRoot":"","sources":["../../../src/agent/turno/resumenDeContexto.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,39 @@ const CAMPOS_SEGUROS = {
37
37
  * minutos en otro proceso, sin una sola tool que cruce.
38
38
  */
39
39
  task: ["subagent_type"],
40
+ /**
41
+ * De `xone_navegacion` sale la OPERACIÓN y **no el `nombre`**, que es una colección del
42
+ * proyecto — o sea contenido, y aquí no entra contenido.
43
+ *
44
+ * Hace falta por un fallo de instrumento medido el 19-09-2026: al añadir la operación
45
+ * `estilos` no se pudo comprobar si el modelo llegaba a usarla, porque la traza registraba
46
+ * «xone_navegacion» a secas. Siete operaciones bajo un solo nombre es no poder contestar
47
+ * cuál de las siete se usa, que es justo lo que se quería saber. La operación es un enum
48
+ * cerrado de siete valores: no hay nada del proyecto dentro.
49
+ */
50
+ xone_navegacion: ["operacion"],
51
+ /**
52
+ * **El comando ENTERO**, y es la única entrada de esta tabla que no es una ruta ni un
53
+ * patrón. Está aquí a propósito: a un agente con `ejecucion: true` no se le pregunta antes
54
+ * de cada comando —preguntar cuatro veces por «lanza la app» mata el bucle—, así que lo
55
+ * que sustituye a esa pregunta es VERLO. Un `⚙ execute` sin detalle sería la peor de las
56
+ * dos: ni se pregunta ni se enseña.
57
+ *
58
+ * **Límite declarado, y no se tapa con un filtro**: si el modelo escribe una ruta absoluta
59
+ * en su comando, esa ruta sale en el evento y por tanto por el cable, que es lo que
60
+ * `sinRutas` evita en los demás sitios. Por eso el entorno le da una variable por skill y
61
+ * el `cwd` es la raíz del proyecto: para que no le haga falta escribir ninguna. Un
62
+ * limpiador que adivinara qué trozo de una línea de shell es una ruta fallaría en
63
+ * silencio, que es peor que un límite escrito.
64
+ */
65
+ execute: ["command"],
66
+ /**
67
+ * De un motor externo: QUÉ skill se carga y QUÉ se busca. Nunca los `args` con que se
68
+ * invoca una skill, que pueden llevar contenido del proyecto dentro — el mismo trato que
69
+ * la `description` de `task`.
70
+ */
71
+ Skill: ["skill"],
72
+ ToolSearch: ["query"],
40
73
  };
41
74
  function objetoDeArgs(args) {
42
75
  let objeto = args;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resumenDeTool.js","sourceRoot":"","sources":["../../../src/agent/turno/resumenDeTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { createMiddleware } from "langchain";
2
+ import { AIMessage, HumanMessage } from "@langchain/core/messages";
3
+ import { z } from "zod";
4
+ import { avisoDeNoSatisfecho, esTerminal, mensajeDeRevision, TOPE_DE_VUELTAS, } from "../../core/rubrica.js";
5
+ const ESTADO_DE_RUBRICA = z.object({
6
+ /** La rúbrica de ESTE encargo. Sin ella el middleware no hace nada. */
7
+ rubrica: z.string().optional(),
8
+ vueltasDeRubrica: z.number().default(0),
9
+ estadoDeRubrica: z.string().optional(),
10
+ });
11
+ /**
12
+ * El bucle de rúbrica, portado del `RubricMiddleware` de deepagents (que está en su SDK de
13
+ * Python y no en el de JS).
14
+ *
15
+ * En la parada natural del agente —el modelo contesta sin pedir más tools— se juzga lo hecho
16
+ * contra la rúbrica. `necesita-revision` mete el comentario como mensaje y **salta de vuelta al
17
+ * modelo** (`jumpTo: "model"`, que el langchain de JS admite desde `afterAgent`); cualquier otro
18
+ * veredicto cierra.
19
+ *
20
+ * **Sin rúbrica no hace NADA**, igual que el original, y por eso se puede montar siempre: un
21
+ * turno normal no paga ni una llamada. Lo que decide si hay bucle es el dato, no una bandera.
22
+ *
23
+ * **Y a diferencia del original, un final no satisfecho SE DICE**: allí el estado vive en un
24
+ * campo privado y la última respuesta sigue siendo la del modelo —que puede estar afirmando que
25
+ * terminó—. Aquí se apila el aviso, que es la misma regla que hizo falta en el tope de llamadas.
26
+ *
27
+ * `alEvaluar` existe para que el harness pueda enseñarlo donde una persona lo vea: un mensaje
28
+ * apilado llega al transcript, pero no a la pantalla.
29
+ */
30
+ export function middlewareDeRubrica(opciones) {
31
+ const tope = opciones.tope ?? TOPE_DE_VUELTAS;
32
+ return createMiddleware({
33
+ name: "RubricaMiddleware",
34
+ stateSchema: ESTADO_DE_RUBRICA,
35
+ afterAgent: {
36
+ canJumpTo: ["model"],
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ hook: async (state) => {
39
+ const rubrica = typeof state?.rubrica === "string" ? state.rubrica.trim() : "";
40
+ if (rubrica === "")
41
+ return undefined;
42
+ // Un estado ya terminal significa que este turno ya se juzgó y se cerró. Sin esta
43
+ // guarda, volver a pasar por aquí reabriría un bucle que ya había decidido.
44
+ const previo = state?.estadoDeRubrica;
45
+ if (previo !== undefined && esTerminal(previo))
46
+ return undefined;
47
+ const vuelta = (state?.vueltasDeRubrica ?? 0) + 1;
48
+ if (vuelta > tope)
49
+ return cerrar("tope-de-vueltas", vuelta - 1, opciones.alEvaluar);
50
+ let calificacion;
51
+ try {
52
+ calificacion = await opciones.calificar(state?.messages ?? [], rubrica);
53
+ }
54
+ catch {
55
+ // Que el calificador no conteste es fallo del ENTORNO, no del trabajo. Se distingue
56
+ // a propósito de `fallido`, que culpa a la rúbrica: mezclarlos manda a arreglar lo
57
+ // que no estaba roto.
58
+ return cerrar("error-del-calificador", vuelta, opciones.alEvaluar);
59
+ }
60
+ opciones.alEvaluar?.(calificacion.veredicto, vuelta);
61
+ if (calificacion.veredicto === "satisfecho") {
62
+ return { vueltasDeRubrica: vuelta, estadoDeRubrica: "satisfecho" };
63
+ }
64
+ if (calificacion.veredicto === "fallido") {
65
+ return {
66
+ vueltasDeRubrica: vuelta,
67
+ estadoDeRubrica: "fallido",
68
+ messages: [new AIMessage(avisoDeNoSatisfecho("fallido", calificacion.comentario) ?? "")],
69
+ };
70
+ }
71
+ return {
72
+ vueltasDeRubrica: vuelta,
73
+ estadoDeRubrica: "necesita-revision",
74
+ messages: [new HumanMessage(mensajeDeRevision(calificacion.comentario, vuelta, tope))],
75
+ jumpTo: "model",
76
+ };
77
+ },
78
+ },
79
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
80
+ });
81
+ }
82
+ /** Cierra el bucle diciéndolo: un final no satisfecho que se calla es el fallo del original. */
83
+ function cerrar(estado, vuelta, alEvaluar) {
84
+ alEvaluar?.(estado, vuelta);
85
+ return {
86
+ vueltasDeRubrica: vuelta,
87
+ estadoDeRubrica: estado,
88
+ messages: [new AIMessage(avisoDeNoSatisfecho(estado) ?? "")],
89
+ };
90
+ }
91
+ //# sourceMappingURL=rubrica.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rubrica.js","sourceRoot":"","sources":["../../../src/agent/turno/rubrica.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textoDeTool.js","sourceRoot":"","sources":["../../../src/agent/turno/textoDeTool.ts"],"names":[],"mappings":"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"}