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 @@
1
+ {"version":3,"file":"procesosEnMaquina.js","sourceRoot":"","sources":["../../../src/agent/dispositivos/procesosEnMaquina.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * El APARATO como sensor del bucle de reparación: ¿qué dice la app al arrancar?
3
+ *
4
+ * Es la tercera fuente de hallazgos, y contesta una pregunta que las otras dos no pueden.
5
+ * `xone-simulator validate` mira la estructura y `smoke` ejecuta el ciclo de vida en un
6
+ * runtime de Node; ninguno de los dos sabe si la app ARRANCA en un Android de verdad, con su
7
+ * SQLite, sus recursos y su Rhino. Medido sobre AppDemo: el simulador daba verde y el aparato
8
+ * decía `Invalid resource ID 0x6000000N` cinco veces distintas.
9
+ *
10
+ * CUATRO REGLAS, y las cuatro salieron de medir:
11
+ *
12
+ * - **Despliega SIEMPRE antes de leer.** Sin eso el log sería de la versión anterior del
13
+ * proyecto, y devolverle al agente errores que ya arregló es la peor clase de feedback:
14
+ * plausible y falso. El despliegue en caliente costó 5 s sobre un `pixel8`.
15
+ * - **El buffer se vacía ANTES de reiniciar.** Es lo que ya hace `xone-desplegar-android` por
16
+ * su cuenta y por el mismo motivo: si no, lo que se lee es la excepción del intento
17
+ * anterior, que es la forma más fácil de creer que algo sigue roto cuando ya no lo está.
18
+ * - **Sin aparato es fallo del ENTORNO, no un rojo.** La misma familia que
19
+ * `ErrorDelSimulador`: un informe rojo diría «tu proyecto está mal» cuando lo que pasa es
20
+ * que no hay móvil enchufado. Y **no se arranca uno solo**: levantar un emulador cuesta
21
+ * minutos de la máquina de alguien, y esa decisión no la toma un sensor — para eso está
22
+ * `xone-arrancar-android`, que el agente puede llamar.
23
+ * - **Solo ve la pantalla de ENTRADA, y se declara.** El despliegue reinicia la app, así que
24
+ * lo que se lee es lo que pasa al arrancar. Para tener hallazgos de una colección concreta
25
+ * hay que NAVEGAR hasta ella, y eso es trabajo del `device-controller` dentro del turno, no
26
+ * de un sensor automático.
27
+ *
28
+ * Todo entra por dependencias: `npm test` no puede necesitar un aparato.
29
+ */
30
+ import { execFile } from "node:child_process";
31
+ import { existsSync } from "node:fs";
32
+ import { join } from "node:path";
33
+ import { hallazgosDeLog } from "../../core/logDeDispositivo.js";
34
+ import { RAIZ_SKILLS } from "../grafo/skills.js";
35
+ import { localizadorDeAndroid, TOPES_MS } from "./dispositivosEnMaquina.js";
36
+ import { parsearAdbDevices } from "../../core/dispositivos.js";
37
+ /** No se pudo PREGUNTARLE al aparato. Entorno, no proyecto. */
38
+ export class ErrorDelAparato extends Error {
39
+ constructor(motivo) {
40
+ super(motivo);
41
+ this.name = "ErrorDelAparato";
42
+ }
43
+ }
44
+ /**
45
+ * Despliega y devuelve lo que el aparato dijo, en la forma que el bucle ya consume.
46
+ *
47
+ * **Verde es que no hay hallazgos DE LA APP.** Lo de la plataforma viaja en el informe —no se
48
+ * tira nunca, ver `core/logDeDispositivo.ts`— pero como `warning`, así que no pinta el turno
49
+ * de rojo: son quejas de Android sobre sí mismo y nadie las puede arreglar desde un `.xne`.
50
+ */
51
+ export async function arranqueEnDispositivo(raiz, deps) {
52
+ if (!(await deps.hayAparato())) {
53
+ throw new ErrorDelAparato("no hay ningún aparato conectado, así que no se ha podido probar el arranque");
54
+ }
55
+ await deps.limpiarLog();
56
+ const despliegue = await deps.desplegar(raiz);
57
+ if (!despliegue.ok) {
58
+ /**
59
+ * Que el despliegue falle NO es un proyecto roto: puede ser el túnel, el canal o que el
60
+ * host no esté instalado. Se lanza, y quien llama lo dice como aviso — igual que el
61
+ * binario del simulador que falta.
62
+ */
63
+ throw new ErrorDelAparato(`no se pudo desplegar en el aparato: ${despliegue.detalle}`);
64
+ }
65
+ const { aHallazgosDelTurno } = hallazgosDeLog(await deps.leerLog());
66
+ const hallazgos = aHallazgosDelTurno();
67
+ return { verde: !hallazgos.some((h) => h.severidad === "error"), hallazgos };
68
+ }
69
+ /** El host de XOne en Android. Vive aquí y en los scripts de la skill, que son otro proceso. */
70
+ const PAQUETE = "com.xone.android.framework";
71
+ /**
72
+ * Cuánto se le da al despliegue. El script hace la cadena entera —túnel, ZIP, subida,
73
+ * reinicio, lanzamiento y comprobación de que la app está VIVA— y sobre un `pixel8` en
74
+ * caliente tardó 5 s con un proyecto de 6,8 MB. El tope es para el caso frío con un proyecto
75
+ * grande, y por debajo del tope de reloj de un comando del harness.
76
+ */
77
+ export const TOPE_DE_DESPLIEGUE_MS = 300_000;
78
+ /**
79
+ * El sensor de verdad: `adb` para el log y el script de la skill para el despliegue.
80
+ *
81
+ * **El despliegue NO se reimplementa aquí.** `xone-desplegar-android` ya es la cadena medida
82
+ * —y la única que sabe que hay que reiniciar con `SetupActivity` y no con `.mainEntry`, y que
83
+ * el ZIP va sin `.xonecode`—. Reescribirla sería un segundo sitio donde esa secuencia puede
84
+ * divergir, que es como este repo se ha roto siempre.
85
+ */
86
+ export function sensorDeArranqueReal() {
87
+ const { enSdk } = localizadorDeAndroid({
88
+ plataforma: process.platform,
89
+ entorno: process.env,
90
+ home: process.env["HOME"] ?? "",
91
+ existe: (ruta) => existsSync(ruta),
92
+ });
93
+ const adb = enSdk("adb", "platform-tools");
94
+ const correr = (binario, args, ms) => new Promise((resolver, rechazar) => {
95
+ execFile(binario, args, { timeout: ms, maxBuffer: 64 * 1024 * 1024 }, (error, stdout) => {
96
+ if (error !== null)
97
+ rechazar(error);
98
+ else
99
+ resolver(stdout);
100
+ });
101
+ });
102
+ const exigirAdb = () => {
103
+ if (adb === undefined)
104
+ throw new ErrorDelAparato("no encuentro «adb»: ni en el PATH ni en el SDK");
105
+ return adb;
106
+ };
107
+ return {
108
+ hayAparato: async () => {
109
+ try {
110
+ return parsearAdbDevices(await correr(exigirAdb(), ["devices"], TOPES_MS.adb)).some((d) => d.estado === "conectado");
111
+ }
112
+ catch {
113
+ // No poder preguntar no es «no hay»: se dice arriba, con su motivo.
114
+ throw new ErrorDelAparato("no se pudo preguntar a adb qué aparatos hay");
115
+ }
116
+ },
117
+ limpiarLog: async () => {
118
+ await correr(exigirAdb(), ["logcat", "-c"], TOPES_MS.adb);
119
+ },
120
+ desplegar: async (raiz) => {
121
+ const script = join(RAIZ_SKILLS, "xone-hotswap", "scripts", "xone-desplegar-android");
122
+ if (!existsSync(script))
123
+ return { ok: false, detalle: "falta xone-desplegar-android en el paquete" };
124
+ try {
125
+ // El `cwd` es la raíz del proyecto: el script empaqueta lo que hay ahí.
126
+ await new Promise((resolver, rechazar) => {
127
+ execFile(process.execPath, [script], { cwd: raiz, timeout: TOPE_DE_DESPLIEGUE_MS, maxBuffer: 16 * 1024 * 1024 }, (error) => (error === null ? resolver() : rechazar(error)));
128
+ });
129
+ return { ok: true, detalle: "" };
130
+ }
131
+ catch (error) {
132
+ // Una línea, no el volcado: esto va a un aviso del turno.
133
+ const texto = error instanceof Error ? error.message : String(error);
134
+ return { ok: false, detalle: texto.split("\n")[0] ?? "falló el despliegue" };
135
+ }
136
+ },
137
+ leerLog: async () => {
138
+ const pid = (await correr(exigirAdb(), ["shell", "pidof", PAQUETE], TOPES_MS.adb))
139
+ .trim()
140
+ .split(/\s+/)[0];
141
+ if (pid === undefined || pid === "") {
142
+ /**
143
+ * La app NO está viva tras desplegar. Es un hecho del proyecto y no del entorno —el
144
+ * despliegue dijo que sí—, así que no se lanza: se devuelve lo que haya sin acotar por
145
+ * PID, que es donde estará la traza de la muerte. Filtrar por un PID que ya no existe
146
+ * se llevaría por delante justo esa traza.
147
+ */
148
+ return correr(exigirAdb(), ["logcat", "-d", "-t", "400"], TOPES_MS.adb);
149
+ }
150
+ return correr(exigirAdb(), ["logcat", "-d", "--pid", pid], TOPES_MS.adb);
151
+ },
152
+ };
153
+ }
154
+ //# sourceMappingURL=sensorDeArranque.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensorDeArranque.js","sourceRoot":"","sources":["../../../src/agent/dispositivos/sensorDeArranque.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Convertir un documento del proyecto a PDF, imprimiéndolo con un NAVEGADOR.
3
+ *
4
+ * El porqué de que esto lo haga el harness y no el agente está en `core/exportacion.ts`.
5
+ * Aquí está lo que toca disco, y tres decisiones que no son de forma:
6
+ *
7
+ * - **El navegador se busca en una lista CERRADA de rutas conocidas**, igual que las
8
+ * herramientas de `core/dispositivos.ts`: lo que no está en la lista no se lanza. Y su RUTA
9
+ * se queda en el host — por el cable viaja que hay navegador o que no, nunca dónde.
10
+ * - **Se imprime SIN JavaScript** (`--blink-settings=scriptEnabled=false`). Un `.md` o un
11
+ * `.html` del proyecto puede traer un `<script>` dentro, y un PDF no necesita ejecutar
12
+ * nada: es la misma razón por la que un artefacto se sirve en un iframe con origen opaco.
13
+ * - **El HTML intermedio se escribe FUERA del proyecto.** Dentro entraría en git, en el
14
+ * commit de cada turno y en la siguiente subida a CloudStudio — un fichero de andamiaje en
15
+ * la app del cliente.
16
+ */
17
+ import { execFile } from "node:child_process";
18
+ import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
19
+ import { tmpdir } from "node:os";
20
+ import { basename, join, resolve } from "node:path";
21
+ import { conPoliticaSinScripts, documentoImprimible, esMarkdown, motivoDeExportacionInaceptable, rutaDePdf, } from "../core/exportacion.js";
22
+ import { motivoDeRutaInaceptable } from "./grafo/arbolDeProyecto.js";
23
+ /**
24
+ * Dónde puede estar un navegador que sepa imprimir. Lista CERRADA y en este orden.
25
+ *
26
+ * Son todos Chromium por dentro, que es el que trae `--print-to-pdf`: Safari y Firefox no
27
+ * tienen equivalente en línea de comandos, así que no están y no es un olvido.
28
+ */
29
+ export const NAVEGADORES_CONOCIDOS = [
30
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
31
+ "/Applications/Chromium.app/Contents/MacOS/Chromium",
32
+ "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
33
+ "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
34
+ "/usr/bin/chromium",
35
+ "/usr/bin/chromium-browser",
36
+ "/usr/bin/google-chrome",
37
+ "/usr/bin/google-chrome-stable",
38
+ ];
39
+ /** El primero que exista, o AUSENTE. Ausente = aquí no se puede imprimir, y se DICE con el
40
+ * remedio: no hay forma de adivinar que lo que falta es un navegador. */
41
+ export function navegadorParaImprimir(existe = existsSync) {
42
+ return NAVEGADORES_CONOCIDOS.find((ruta) => existe(ruta));
43
+ }
44
+ /** Qué decir cuando no hay ninguno. Vive aquí y no en quien llama para que las tres pieles
45
+ * digan lo mismo. */
46
+ export const SIN_NAVEGADOR = "no encuentro un navegador con el que imprimir. El PDF se genera con Chrome, Chromium, Edge o Brave " +
47
+ "en modo headless; instala uno y vuelve a intentarlo.";
48
+ /**
49
+ * Exporta `ruta` (relativa al proyecto) a un PDF hermano. Nunca LANZA.
50
+ *
51
+ * Las barreras son las MISMAS que usa la pestaña Ficheros y en el mismo orden: la criba de
52
+ * balde sobre el texto (`motivoDeRutaInaceptable`) y luego el camino REAL, porque un enlace
53
+ * simbólico dentro de la raíz puede apuntar fuera. No hay una segunda copia de esas reglas
54
+ * aquí: un segundo sitio donde decidir sobre una ruta es un segundo sitio donde el
55
+ * fail-closed puede dejar de estarlo.
56
+ */
57
+ export async function exportarAPdf(opciones) {
58
+ const malaRuta = motivoDeRutaInaceptable(opciones.ruta);
59
+ if (malaRuta !== undefined)
60
+ return { error: malaRuta };
61
+ const malaExtension = motivoDeExportacionInaceptable(opciones.ruta);
62
+ if (malaExtension !== undefined)
63
+ return { error: malaExtension };
64
+ const navegador = opciones.navegador ?? (opciones.buscarNavegador ?? navegadorParaImprimir)();
65
+ if (navegador === undefined)
66
+ return { error: SIN_NAVEGADOR };
67
+ const origen = resolve(opciones.raiz, opciones.ruta);
68
+ if (!existsSync(origen))
69
+ return { error: `«${opciones.ruta}» no está en el proyecto` };
70
+ let fuente;
71
+ try {
72
+ fuente = readFileSync(origen, "utf8");
73
+ }
74
+ catch {
75
+ // El mensaje de Node lleva la ruta absoluta y esto viaja por el cable (`sinRutas`).
76
+ return { error: `no se pudo leer «${opciones.ruta}»` };
77
+ }
78
+ let cuerpo;
79
+ try {
80
+ cuerpo = esMarkdown(opciones.ruta) ? await (opciones.aHtml ?? marcadoAHtml)(fuente) : fuente;
81
+ }
82
+ catch {
83
+ return { error: `no se pudo convertir «${opciones.ruta}»` };
84
+ }
85
+ // Fuera del proyecto: dentro entraría en git, en el commit del turno y en la subida.
86
+ const taller = mkdtempSync(join(tmpdir(), "xonecode-pdf-"));
87
+ const html = join(taller, "documento.html");
88
+ const destino = resolve(opciones.raiz, rutaDePdf(opciones.ruta));
89
+ try {
90
+ writeFileSync(html, esMarkdown(opciones.ruta)
91
+ ? documentoImprimible(cuerpo, basename(opciones.ruta))
92
+ : // Un `.html` no pasa por la plantilla, así que se le inyecta la política aparte. No
93
+ // se envuelve dentro de la nuestra: meter un documento entero en nuestro `<body>`
94
+ // lo rompería.
95
+ conPoliticaSinScripts(cuerpo), "utf8");
96
+ await (opciones.imprimir ?? lanzarNavegador)(navegador, [
97
+ "--headless",
98
+ "--disable-gpu",
99
+ // **Aquí NO va ningún flag para desactivar JavaScript**, y no es un olvido: medido
100
+ // contra el Chrome instalado, ni `--disable-javascript` ni
101
+ // `--blink-settings=scriptEnabled=false` lo desactivan — y el segundo además hace que
102
+ // `--print-to-pdf` no escriba nada, en silencio y saliendo con 0. Lo que sí funciona es
103
+ // la CSP del documento (`POLITICA_SIN_SCRIPTS`).
104
+ "--no-pdf-header-footer",
105
+ `--print-to-pdf=${destino}`,
106
+ `file://${html}`,
107
+ ]);
108
+ }
109
+ catch (error) {
110
+ const motivo = error instanceof Error ? error.message : String(error);
111
+ return { error: `el navegador no pudo imprimir: ${motivo}` };
112
+ }
113
+ finally {
114
+ // El taller se borra pase lo que pase: son ficheros nuestros en un temporal.
115
+ rmSync(taller, { recursive: true, force: true });
116
+ }
117
+ // «Terminó bien» y «hay PDF» son dos cosas: el navegador sale con 0 aunque no escriba nada.
118
+ // Es la misma regla que ya usa la instalación de dispositivos — manda la MEDIDA, no el
119
+ // código de salida.
120
+ if (!existsSync(destino))
121
+ return { error: "el navegador terminó sin escribir ningún PDF" };
122
+ return { ruta: rutaDePdf(opciones.ruta) };
123
+ }
124
+ /** `marked` cargado perezosamente, por lo dicho arriba. */
125
+ async function marcadoAHtml(markdown) {
126
+ const { marked } = await import("marked");
127
+ return marked.parse(markdown, { async: false });
128
+ }
129
+ function lanzarNavegador(navegador, argumentos) {
130
+ return new Promise((resolver, rechazar) => {
131
+ execFile(navegador, [...argumentos], { timeout: TOPE_DE_IMPRESION_MS }, (error) =>
132
+ // Su stderr trae avisos del sistema gráfico incluso cuando todo va bien, así que lo que
133
+ // se mira es el error del proceso y después si el fichero está.
134
+ error === null ? resolver() : rechazar(error));
135
+ });
136
+ }
137
+ /** Un documento largo con tablas tarda segundos, no minutos; un navegador que no vuelve en
138
+ * este plazo está colgado y no imprimiendo. */
139
+ export const TOPE_DE_IMPRESION_MS = 2 * 60 * 1000;
140
+ //# sourceMappingURL=exportarPdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportarPdf.js","sourceRoot":"","sources":["../../src/agent/exportarPdf.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { open, readFile, realpath, stat } from "node:fs/promises";
3
3
  import { isAbsolute, relative, resolve, sep } from "node:path";
4
- import { ficherosDelProyecto } from "./turnoReal.js";
4
+ import { ficherosDelProyecto } from "../turno/turnoReal.js";
5
5
  import { puedeLeerRuta } from "./perfiles.js";
6
6
  import { esVistaAplanada } from "./proyecto.js";
7
7
  /**
@@ -167,7 +167,7 @@ export async function leerFicheroDeProyecto(raiz, ruta) {
167
167
  * tope, su codificación y las dos caras del SVG.
168
168
  *
169
169
  * Se extrajo de `leerFicheroDeProyecto` cuando los ARTEFACTOS de una sesión necesitaron lo
170
- * mismo (`agent/artefactosEnDisco.ts`). Lo que NO se extrajo es la barrera: la de un
170
+ * mismo (`agent/grafo/artefactosEnDisco.ts`). Lo que NO se extrajo es la barrera: la de un
171
171
  * fichero del proyecto y la de un artefacto son reglas distintas —una pregunta
172
172
  * `puedeLeerRuta` y las vistas aplanadas, la otra que el nombre sea un segmento llano
173
173
  * dentro de la carpeta de la sesión—, y fundirlas en un parámetro sería la clase de
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arbolDeProyecto.js","sourceRoot":"","sources":["../../../src/agent/grafo/arbolDeProyecto.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Leer un ARTEFACTO de la sesión: lo que el agente dibujó y no es del proyecto.
3
3
  *
4
- * Los escribe el backend por la ruta virtual `/artefactos/<nombre>` (`agent/proyecto.ts`) y
4
+ * Los escribe el backend por la ruta virtual `/artefactos/<nombre>` (`agent/grafo/proyecto.ts`) y
5
5
  * caen en `.xonecode/sesiones/<id>/artefactos/`. Esta es la puerta de vuelta, la que deja
6
6
  * ENSEÑARLOS en la consola web: un HTML en un iframe, una imagen en su visor, y la
7
7
  * descarga.
@@ -23,7 +23,7 @@
23
23
  */
24
24
  import { readFile, realpath, stat } from "node:fs/promises";
25
25
  import { join, sep } from "node:path";
26
- import { RUTA_ARTEFACTOS, carpetaDeArtefactosDeSesion, esRutaDeArtefacto, mimeDeArtefacto, } from "../core/artefactos.js";
26
+ import { RUTA_ARTEFACTOS, carpetaDeArtefactosDeSesion, esRutaDeArtefacto, mimeDeArtefacto, } from "../../core/artefactos.js";
27
27
  import { leerContenidoDeFichero } from "./arbolDeProyecto.js";
28
28
  /**
29
29
  * Bytes que la ruta HTTP sirve como mucho.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artefactosEnDisco.js","sourceRoot":"","sources":["../../../src/agent/grafo/artefactosEnDisco.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,46 @@
1
1
  import { tool } from "@langchain/core/tools";
2
2
  import { z } from "zod";
3
3
  import { puedeLeerRuta } from "./perfiles.js";
4
+ /**
5
+ * El nombre de esta tool, en UN sitio.
6
+ *
7
+ * Existe porque `xone_navegacion` manda aquí cuando no sabe contestar, y una sugerencia que
8
+ * nombre una tool que ya no se llama así manda al modelo a llamar a algo que no existe —
9
+ * gasta un viaje y devuelve un error. Es la lección del token `HANDOFF DE ANÁLISIS`: lo que se
10
+ * nombra desde otro sitio no se escribe dos veces.
11
+ */
12
+ export const NOMBRE_BUSQUEDA_REGEX = "regex_search";
13
+ /** Los ficheros donde vive lo que se puede nombrar una colección: el XML y los scripts. */
14
+ const GLOB_DE_FUENTES = "**/*.{xne,xml,js}";
15
+ /** Escapa lo que en una regex significaría otra cosa. Un nombre XOne no suele traerlo, pero
16
+ * una sugerencia que no se puede ejecutar es peor que ninguna. */
17
+ const comoLiteral = (texto) => texto.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
18
+ /**
19
+ * La llamada EXACTA a `regex_search` que busca un término como texto, lista para copiar.
20
+ *
21
+ * Se devuelve la llamada entera y no un consejo en prosa («busca con regex_search») por lo
22
+ * mismo que `porQueNo` dice la ruta buena en vez de solo negarse: un modelo al que se le dice
23
+ * qué hacer sin decirle cómo se inventa los argumentos, y aquí inventarlos cuesta un viaje y
24
+ * un error de esquema. Se comprueba contra el esquema REAL de la tool en su test.
25
+ */
26
+ export function llamadaDeBusqueda(termino, glob = GLOB_DE_FUENTES) {
27
+ return `${NOMBRE_BUSQUEDA_REGEX} ${JSON.stringify({ pattern: patronDe(termino), glob })}`;
28
+ }
29
+ /**
30
+ * El patrón para buscar un término como texto.
31
+ *
32
+ * **`\b` solo cuando los extremos son carácter de palabra**, y esto NO es cosmético: `\b` es
33
+ * una frontera entre palabra y no-palabra, así que `\bcoll name=\b` no casa nunca — el `=`
34
+ * final ya no es palabra y la frontera cae donde no hay nada que delimitar. Un nombre de
35
+ * colección sí la quiere (`\bClientes\b` no encuentra `ClientesViejos`); un fragmento con
36
+ * signos, no. Salió de un test que ejecutó la sugerencia.
37
+ */
38
+ function patronDe(termino) {
39
+ const literal = comoLiteral(termino);
40
+ const abre = /^\w/.test(termino) ? "\\b" : "";
41
+ const cierra = /\w$/.test(termino) ? "\\b" : "";
42
+ return `${abre}${literal}${cierra}`;
43
+ }
4
44
  /** Límites defensivos: la regex es una ayuda de localización, no un lector masivo. */
5
45
  export const LIMITES_REGEX = {
6
46
  archivos: 50,
@@ -82,7 +122,7 @@ export function crearBusquedaRegex(backend) {
82
122
  return `No se encontraron coincidencias.${avisos.length ? ` Nota: ${avisos.join("; ")}.` : ""}`;
83
123
  return `${lineas.join("\n")}${avisos.length ? `\n\nNota: ${avisos.join("; ")}.` : ""}`;
84
124
  }, {
85
- name: "regex_search",
125
+ name: NOMBRE_BUSQUEDA_REGEX,
86
126
  description: "Busca una expresión regular JavaScript por LÍNEA en ficheros del proyecto. " +
87
127
  "Úsala solo cuando grep literal no baste; acota path y glob, localiza líneas y después usa read_file paginado. " +
88
128
  "No ejecuta shell, no admite regex multilínea y omite rutas protegidas y ficheros grandes.",
@@ -0,0 +1 @@
1
+ {"version":3,"file":"busquedaRegex.js","sourceRoot":"","sources":["../../../src/agent/grafo/busquedaRegex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import { tool } from "@langchain/core/tools";
2
+ import { z } from "zod";
3
+ import { esRutaDeArtefacto, mimeDeArtefacto, nombreDeArtefacto } from "../../core/artefactos.js";
4
+ import { juzgarPantalla, TOPE_DE_PETICIONES, } from "../dispositivos/juezVisual.js";
5
+ /**
6
+ * `xone_critica_visual`: enseñarle una captura al crítico y traer su veredicto.
7
+ *
8
+ * **Por qué es una TOOL y no un paso del cierre.** El crítico necesita PEDIR pantallas —juzga
9
+ * la captura que le den, así que si el conductor fotografió el login, dictamina sobre el
10
+ * login—, y quien puede ir a buscarlas es el conductor. Las tres formas de resolver eso se
11
+ * midieron contra los invariantes del repo y dos se caen solas:
12
+ *
13
+ * - Que el conductor haga de crítico es que el que trabaja se puntúe a sí mismo. Es lo que
14
+ * `juezDeTarea` ya prohíbe por escrito —«a un modelo se le puede pedir que avise y a veces
15
+ * no avisa»— y lo que el prompt del conductor tiene prohibido («no digas que hiciste un
16
+ * paso que no hiciste»). Medido el mismo día: un turno describió los 19 botones de una
17
+ * pantalla leyéndolos del `.xne` y se leía como si los hubiera visto.
18
+ * - Que el crítico conduzca el aparato es darle una shell, y el invariante es «backend con
19
+ * shell, exactamente UNO»: una shell no pasa por `permisosDe` ni por el `virtualMode`, o
20
+ * sea que concederla es conceder la máquina — y precisamente al que existe para ser
21
+ * independiente.
22
+ *
23
+ * Queda ésta: el crítico **pide por nombre** y el orquestador vuelve a delegar en el
24
+ * conductor. La tool no toca el aparato, no escribe nada y solo lee de la carpeta de
25
+ * artefactos de la sesión.
26
+ *
27
+ * **La guarda de ruta se RE-APLICA a mano**, como en las otras dos tools propias: una tool de
28
+ * LangChain añadida por xonecode NO pasa por el middleware de permisos, así que sin esto sería
29
+ * una forma de leer cualquier fichero de la máquina y mandárselo a un modelo.
30
+ */
31
+ const Entrada = z.object({
32
+ captura: z
33
+ .string()
34
+ .describe("La ruta virtual de la captura, siempre bajo /artefactos/ (la que anunció el evento)"),
35
+ pantalla: z
36
+ .string()
37
+ .describe("De qué pantalla o colección es la captura, para que el crítico sepa qué mira"),
38
+ });
39
+ export function crearCriticaVisual(deps) {
40
+ return tool(async (entrada) => {
41
+ // Lista BLANCA de forma, sobre el TEXTO que escribe el modelo. `esRutaDeArtefacto` no es
42
+ // un `startsWith`: comprueba la forma entera.
43
+ if (!esRutaDeArtefacto(entrada.captura)) {
44
+ return `«${entrada.captura}» no es una captura de esta sesión. Solo puedo mirar lo que hay bajo /artefactos/.`;
45
+ }
46
+ const nombre = nombreDeArtefacto(entrada.captura);
47
+ const mime = mimeDeArtefacto(nombre);
48
+ if (mime === undefined || !mime.startsWith("image/")) {
49
+ return `«${nombre}» no es una imagen, así que no hay nada que mirar.`;
50
+ }
51
+ let bytes;
52
+ try {
53
+ bytes = await deps.leerArtefacto(nombre);
54
+ }
55
+ catch (error) {
56
+ // El mensaje de un error de Node lleva la ruta absoluta y esto va al modelo: solo el
57
+ // nombre del error. Y se DEVUELVE, no se lanza: que falte una captura no puede
58
+ // llevarse el turno por delante.
59
+ return `No pude abrir «${nombre}» (${error instanceof Error ? error.name : "error"}).`;
60
+ }
61
+ let veredicto;
62
+ try {
63
+ veredicto = await juzgarPantalla({ base64: bytes.toString("base64"), mime }, { pantalla: entrada.pantalla }, deps.invocar);
64
+ }
65
+ catch (error) {
66
+ // Fallo del ENTORNO —sin modelo, sin clave, sin red—: se dice, y no se convierte en un
67
+ // veredicto. Un rojo inventado culparía al trabajo de un problema de la máquina.
68
+ return `No se pudo consultar al crítico visual: ${error instanceof Error ? error.message : "error"}`;
69
+ }
70
+ const lineas = [`Veredicto visual de «${entrada.pantalla}»: ${veredicto.veredicto}.`];
71
+ if (veredicto.observaciones.length > 0) {
72
+ /**
73
+ * **El aviso no es cortesía: está medido.** Seis vueltas sobre la misma captura
74
+ * describieron un texto CORTADO como «girado 180°», y pedirle en el prompt que no
75
+ * diagnostique no lo evitó. A dónde apunta sí acertó las seis veces. Sin esta línea,
76
+ * el desarrollador se pone a buscar una rotación que no existe.
77
+ */
78
+ lineas.push("Lo que dice que ve (la REDACCIÓN no es fiable: describe mal la causa. Fíate de QUÉ", "control señala, no de su explicación, y míralo tú):");
79
+ for (const o of veredicto.observaciones)
80
+ lineas.push(`- ${o}`);
81
+ }
82
+ /**
83
+ * **Un rojo tiene que ENTERAR a alguien, y el sitio fuerte es aquí.**
84
+ *
85
+ * La regla de «lo que salga vuelve a `developer-xone`» vive en el prompt del
86
+ * orquestador, o sea a miles de tokens del momento en que llega el veredicto. Eso es
87
+ * una sugerencia. Este repo ya tiene escrito que «los avisos de honestidad son código,
88
+ * no prompt», y el patrón para que un modelo haga lo siguiente es el de
89
+ * `xone_navegacion` cuando no sabe contestar: se devuelve el PASO SIGUIENTE escrito, no
90
+ * un consejo — a un modelo al que se le dice qué hacer sin decirle cómo se le inventa
91
+ * los argumentos.
92
+ *
93
+ * **Límite declarado, y es el que queda abierto**: esto no es un tope. No puede serlo
94
+ * desde aquí, porque la tool se construye por SESIÓN y no por turno, así que no tiene
95
+ * dónde contar las vueltas. Lo que acota hoy es que cada arreglo pasa por una
96
+ * aprobación humana. Un tope de verdad exige que el bucle lo lleve el harness
97
+ * (`conVerificacion`), y eso pide conducir el aparato desde código — medido: no se
98
+ * puede, porque llegar a una pantalla necesita abrir cajones y mirar el árbol.
99
+ */
100
+ if (veredicto.veredicto === "rojo") {
101
+ lineas.push("Esto es un defecto del proyecto SIN ARREGLAR: no lo cuentes y ya está. Encárgaselo a", "`developer-xone` pasándole estas observaciones tal cual, y cuando lo haya corregido", "manda otra vez al conductor a esta misma pantalla y vuelve a llamarme con la captura", "nueva. No des la pantalla por buena hasta que yo la vea en verde.");
102
+ }
103
+ if (veredicto.necesito.length > 0) {
104
+ lineas.push(`Necesita ver ${veredicto.necesito.length === 1 ? "otra pantalla" : "otras pantallas"} para dictaminar: ${veredicto.necesito.join(", ")}.`, `Encarga al conductor que llegue ahí y capture, y vuelve a llamarme con esa captura (como mucho ${TOPE_DE_PETICIONES} veces).`);
105
+ }
106
+ return lineas.join("\n");
107
+ }, {
108
+ name: "xone_critica_visual",
109
+ description: "Enseña una captura de pantalla del aparato a un revisor visual y devuelve qué se ve " +
110
+ "mal: texto cortado, controles solapados o fuera de la pantalla, cosas ilegibles. " +
111
+ "Ve lo que ninguna comprobación estática puede ver. Puede pedir otras pantallas.",
112
+ schema: Entrada,
113
+ });
114
+ }
115
+ //# sourceMappingURL=criticaVisual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criticaVisual.js","sourceRoot":"","sources":["../../../src/agent/grafo/criticaVisual.ts"],"names":[],"mappings":"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"}