xonecode 0.3.0 → 0.5.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 (406) hide show
  1. package/README.md +49 -7
  2. package/THIRD_PARTY_NOTICES.md +128 -0
  3. package/apps/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  4. package/apps/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  5. package/apps/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  6. package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  7. package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  8. package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  9. package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  10. package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  11. package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  12. package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  13. package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  14. package/apps/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  15. package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  16. package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  17. package/apps/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  18. package/apps/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  19. package/apps/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  20. package/apps/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  21. package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  22. package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  23. package/apps/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  24. package/apps/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  25. package/apps/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  26. package/apps/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  27. package/apps/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  28. package/apps/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  29. package/apps/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  30. package/apps/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  31. package/apps/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  32. package/apps/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  33. package/apps/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  34. package/apps/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  35. package/apps/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  36. package/apps/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  37. package/apps/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  38. package/apps/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  39. package/apps/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  40. package/apps/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  41. package/apps/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  42. package/apps/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  43. package/apps/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  44. package/apps/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  45. package/apps/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  46. package/apps/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  47. package/apps/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  48. package/apps/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  49. package/apps/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  50. package/apps/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  51. package/apps/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  52. package/apps/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  53. package/apps/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  54. package/apps/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  55. package/apps/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  56. package/apps/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  57. package/apps/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  58. package/apps/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  59. package/apps/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  60. package/apps/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  61. package/apps/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  62. package/apps/web/dist/assets/c-BIGW1oBm.js +1 -0
  63. package/apps/web/dist/assets/cpp-DddhVWhK.js +1 -0
  64. package/apps/web/dist/assets/csharp-DSvCPggb.js +1 -0
  65. package/apps/web/dist/assets/css-CLj8gQPS.js +1 -0
  66. package/apps/web/dist/assets/go-C27-OAKa.js +1 -0
  67. package/apps/web/dist/assets/html-CfGypltT.js +1 -0
  68. package/apps/web/dist/assets/index-BB3SamhR.css +1 -0
  69. package/apps/web/dist/assets/index-CFYAoHdw.js +477 -0
  70. package/apps/web/dist/assets/ini-BEwlwnbL.js +1 -0
  71. package/apps/web/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  72. package/apps/web/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  73. package/apps/web/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  74. package/apps/web/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  75. package/apps/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  76. package/apps/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  77. package/apps/web/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  78. package/apps/web/dist/assets/java-CylS5w8V.js +1 -0
  79. package/apps/web/dist/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  80. package/apps/web/dist/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  81. package/apps/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  82. package/apps/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  83. package/apps/web/dist/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  84. package/apps/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
  85. package/apps/web/dist/assets/less-B1dDrJ26.js +1 -0
  86. package/apps/web/dist/assets/lua-BaeVxFsk.js +1 -0
  87. package/apps/web/dist/assets/markdown-Cvjx9yec.js +1 -0
  88. package/apps/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  89. package/apps/web/dist/assets/php-D_2--9WK.js +1 -0
  90. package/apps/web/dist/assets/python-B6aJPvgy.js +1 -0
  91. package/apps/web/dist/assets/ruby-DSHSDbk1.js +1 -0
  92. package/apps/web/dist/assets/rust-B1yitclQ.js +1 -0
  93. package/apps/web/dist/assets/scss-D5BDwBP9.js +1 -0
  94. package/apps/web/dist/assets/sql-CRqJ_cUM.js +1 -0
  95. package/apps/web/dist/assets/swift-C2oV4EkX.js +1 -0
  96. package/apps/web/dist/assets/toml-vGWfd6FD.js +1 -0
  97. package/apps/web/dist/assets/xml-sdJ4AIDG.js +1 -0
  98. package/apps/web/dist/assets/yaml-Buea-lGh.js +1 -0
  99. package/apps/web/dist/iconos/xonecode.png +0 -0
  100. package/apps/web/dist/index.html +20 -0
  101. package/dist/agent/agentesEnDisco.js +539 -0
  102. package/dist/agent/agentesEnDisco.js.map +1 -0
  103. package/dist/agent/arbolDeProyecto.js +245 -0
  104. package/dist/agent/arbolDeProyecto.js.map +1 -0
  105. package/dist/agent/artefactosEnDisco.js +139 -0
  106. package/dist/agent/artefactosEnDisco.js.map +1 -0
  107. package/dist/agent/aumentador.js +175 -0
  108. package/dist/agent/aumentador.js.map +1 -0
  109. package/dist/agent/authEnDisco.js +76 -1
  110. package/dist/agent/authEnDisco.js.map +1 -1
  111. package/dist/agent/busquedaRegex.js +92 -0
  112. package/dist/agent/busquedaRegex.js.map +1 -0
  113. package/dist/agent/catalogoModelos.js +345 -0
  114. package/dist/agent/catalogoModelos.js.map +1 -0
  115. package/dist/agent/checkpointer.js +127 -0
  116. package/dist/agent/checkpointer.js.map +1 -0
  117. package/dist/agent/cloudstudioClient.js +194 -0
  118. package/dist/agent/cloudstudioClient.js.map +1 -0
  119. package/dist/agent/cloudstudioMcp.js +722 -0
  120. package/dist/agent/cloudstudioMcp.js.map +1 -0
  121. package/dist/agent/configEnDisco.js +309 -11
  122. package/dist/agent/configEnDisco.js.map +1 -1
  123. package/dist/agent/consumoExterno.js +99 -0
  124. package/dist/agent/consumoExterno.js.map +1 -0
  125. package/dist/agent/descarga.js +149 -0
  126. package/dist/agent/descarga.js.map +1 -0
  127. package/dist/agent/diagnosticoDeTools.js +51 -0
  128. package/dist/agent/diagnosticoDeTools.js.map +1 -0
  129. package/dist/agent/dispositivosEnMaquina.js +596 -0
  130. package/dist/agent/dispositivosEnMaquina.js.map +1 -0
  131. package/dist/agent/escrituraDeCodex.js +134 -0
  132. package/dist/agent/escrituraDeCodex.js.map +1 -0
  133. package/dist/agent/escrituraDeOpencode.js +80 -0
  134. package/dist/agent/escrituraDeOpencode.js.map +1 -0
  135. package/dist/agent/escrituraExterna.js +742 -0
  136. package/dist/agent/escrituraExterna.js.map +1 -0
  137. package/dist/agent/gemini.js +81 -0
  138. package/dist/agent/gemini.js.map +1 -0
  139. package/dist/agent/git.js +83 -0
  140. package/dist/agent/git.js.map +1 -0
  141. package/dist/agent/gitSync.js +441 -0
  142. package/dist/agent/gitSync.js.map +1 -0
  143. package/dist/agent/hotswap.js +448 -0
  144. package/dist/agent/hotswap.js.map +1 -0
  145. package/dist/agent/instalacionEnMaquina.js +252 -0
  146. package/dist/agent/instalacionEnMaquina.js.map +1 -0
  147. package/dist/agent/instantanea.js +7 -10
  148. package/dist/agent/instantanea.js.map +1 -1
  149. package/dist/agent/interrupts.js +11 -2
  150. package/dist/agent/interrupts.js.map +1 -1
  151. package/dist/agent/juezDeTarea.js +345 -0
  152. package/dist/agent/juezDeTarea.js.map +1 -0
  153. package/dist/agent/lanzamientoEnMaquina.js +377 -0
  154. package/dist/agent/lanzamientoEnMaquina.js.map +1 -0
  155. package/dist/agent/manifiesto.js +59 -0
  156. package/dist/agent/manifiesto.js.map +1 -0
  157. package/dist/agent/memoriaDeProyecto.js +60 -0
  158. package/dist/agent/memoriaDeProyecto.js.map +1 -0
  159. package/dist/agent/modelos.js +105 -17
  160. package/dist/agent/modelos.js.map +1 -1
  161. package/dist/agent/modelosDeMotor.js +204 -0
  162. package/dist/agent/modelosDeMotor.js.map +1 -0
  163. package/dist/agent/paqueteDelProyecto.js +181 -0
  164. package/dist/agent/paqueteDelProyecto.js.map +1 -0
  165. package/dist/agent/perfiles.js +92 -31
  166. package/dist/agent/perfiles.js.map +1 -1
  167. package/dist/agent/persona.js +40 -0
  168. package/dist/agent/persona.js.map +1 -0
  169. package/dist/agent/procesosEnMaquina.js +204 -0
  170. package/dist/agent/procesosEnMaquina.js.map +1 -0
  171. package/dist/agent/proyecto.js +311 -13
  172. package/dist/agent/proyecto.js.map +1 -1
  173. package/dist/agent/puente.js +63 -6
  174. package/dist/agent/puente.js.map +1 -1
  175. package/dist/agent/resumenDeContexto.js +30 -0
  176. package/dist/agent/resumenDeContexto.js.map +1 -0
  177. package/dist/agent/resumenDeTool.js +64 -18
  178. package/dist/agent/resumenDeTool.js.map +1 -1
  179. package/dist/agent/sesionGit.js +481 -0
  180. package/dist/agent/sesionGit.js.map +1 -0
  181. package/dist/agent/settingsEnDisco.js +189 -0
  182. package/dist/agent/settingsEnDisco.js.map +1 -0
  183. package/dist/agent/subagenteCodex.js +368 -0
  184. package/dist/agent/subagenteCodex.js.map +1 -0
  185. package/dist/agent/subagenteExterno.js +423 -0
  186. package/dist/agent/subagenteExterno.js.map +1 -0
  187. package/dist/agent/subagenteOpencode.js +389 -0
  188. package/dist/agent/subagenteOpencode.js.map +1 -0
  189. package/dist/agent/subida.js +202 -0
  190. package/dist/agent/subida.js.map +1 -0
  191. package/dist/agent/tareasEnDisco.js +466 -0
  192. package/dist/agent/tareasEnDisco.js.map +1 -0
  193. package/dist/agent/turnoReal.js +663 -50
  194. package/dist/agent/turnoReal.js.map +1 -1
  195. package/dist/agent/versionEnDisco.js +48 -0
  196. package/dist/agent/versionEnDisco.js.map +1 -0
  197. package/dist/agent/xoneAgent.js +290 -49
  198. package/dist/agent/xoneAgent.js.map +1 -1
  199. package/dist/agent/zip.js +52 -0
  200. package/dist/agent/zip.js.map +1 -0
  201. package/dist/cli/acuseDeModelo.js +30 -0
  202. package/dist/cli/acuseDeModelo.js.map +1 -0
  203. package/dist/cli/aprobar.js +55 -2
  204. package/dist/cli/aprobar.js.map +1 -1
  205. package/dist/cli/config.js +9 -13
  206. package/dist/cli/config.js.map +1 -1
  207. package/dist/cli/consola.js +750 -19
  208. package/dist/cli/consola.js.map +1 -1
  209. package/dist/cli/main.js +740 -81
  210. package/dist/cli/main.js.map +1 -1
  211. package/dist/cli/markdown.js +188 -2
  212. package/dist/cli/markdown.js.map +1 -1
  213. package/dist/cli/run.js +32 -4
  214. package/dist/cli/run.js.map +1 -1
  215. package/dist/cli/stdio.js +46 -19
  216. package/dist/cli/stdio.js.map +1 -1
  217. package/dist/cli/tema.js +96 -8
  218. package/dist/cli/tema.js.map +1 -1
  219. package/dist/cli/tokens.js +29 -0
  220. package/dist/cli/tokens.js.map +1 -0
  221. package/dist/cli/tui/app.js +171 -0
  222. package/dist/cli/tui/app.js.map +1 -0
  223. package/dist/cli/tui/aprobarTui.js +80 -0
  224. package/dist/cli/tui/aprobarTui.js.map +1 -0
  225. package/dist/cli/tui/barra.js +37 -0
  226. package/dist/cli/tui/barra.js.map +1 -0
  227. package/dist/cli/tui/correrTui.js +478 -0
  228. package/dist/cli/tui/correrTui.js.map +1 -0
  229. package/dist/cli/tui/entrada.js +166 -0
  230. package/dist/cli/tui/entrada.js.map +1 -0
  231. package/dist/cli/tui/filas.js +24 -0
  232. package/dist/cli/tui/filas.js.map +1 -0
  233. package/dist/cli/tui/logo.js +49 -0
  234. package/dist/cli/tui/logo.js.map +1 -0
  235. package/dist/cli/tui/pielTui.js +14 -0
  236. package/dist/cli/tui/pielTui.js.map +1 -0
  237. package/dist/cli/tui/raton.js +126 -0
  238. package/dist/cli/tui/raton.js.map +1 -0
  239. package/dist/cli/tui/sidebar.js +86 -0
  240. package/dist/cli/tui/sidebar.js.map +1 -0
  241. package/dist/cli/tui/store.js +143 -0
  242. package/dist/cli/tui/store.js.map +1 -0
  243. package/dist/cli/tui/tarjeta.js +19 -0
  244. package/dist/cli/tui/tarjeta.js.map +1 -0
  245. package/dist/cli/tui/temaInk.js +114 -0
  246. package/dist/cli/tui/temaInk.js.map +1 -0
  247. package/dist/cli/tui/transcript.js +254 -0
  248. package/dist/cli/tui/transcript.js.map +1 -0
  249. package/dist/cli/wizardInicial.js +240 -0
  250. package/dist/cli/wizardInicial.js.map +1 -0
  251. package/dist/core/actos.js +113 -0
  252. package/dist/core/actos.js.map +1 -0
  253. package/dist/core/adjuntos.js +97 -0
  254. package/dist/core/adjuntos.js.map +1 -0
  255. package/dist/core/agentes.js +227 -0
  256. package/dist/core/agentes.js.map +1 -0
  257. package/dist/core/artefactos.js +149 -0
  258. package/dist/core/artefactos.js.map +1 -0
  259. package/dist/core/cloudstudio.js +7 -0
  260. package/dist/core/cloudstudio.js.map +1 -0
  261. package/dist/core/config.js +212 -5
  262. package/dist/core/config.js.map +1 -1
  263. package/dist/core/contextos.js +53 -1
  264. package/dist/core/contextos.js.map +1 -1
  265. package/dist/core/descargas.js +106 -0
  266. package/dist/core/descargas.js.map +1 -0
  267. package/dist/core/descriptoresDeApp.js +279 -0
  268. package/dist/core/descriptoresDeApp.js.map +1 -0
  269. package/dist/core/dispositivos.js +466 -0
  270. package/dist/core/dispositivos.js.map +1 -0
  271. package/dist/core/entrega.js +141 -0
  272. package/dist/core/entrega.js.map +1 -0
  273. package/dist/core/entrelazar.js +90 -0
  274. package/dist/core/entrelazar.js.map +1 -0
  275. package/dist/core/esqueleto.js +10 -0
  276. package/dist/core/esqueleto.js.map +1 -1
  277. package/dist/core/modelos.js +235 -3
  278. package/dist/core/modelos.js.map +1 -1
  279. package/dist/core/notify.js +27 -9
  280. package/dist/core/notify.js.map +1 -1
  281. package/dist/core/planDeSubida.js +127 -0
  282. package/dist/core/planDeSubida.js.map +1 -0
  283. package/dist/core/ports.js +189 -1
  284. package/dist/core/ports.js.map +1 -1
  285. package/dist/core/puedeLanzarse.js +239 -0
  286. package/dist/core/puedeLanzarse.js.map +1 -0
  287. package/dist/core/rutaVirtual.js +42 -0
  288. package/dist/core/rutaVirtual.js.map +1 -0
  289. package/dist/core/settings.js +246 -0
  290. package/dist/core/settings.js.map +1 -0
  291. package/dist/core/tareas.js +230 -0
  292. package/dist/core/tareas.js.map +1 -0
  293. package/dist/core/textos.js +36 -0
  294. package/dist/core/textos.js.map +1 -0
  295. package/dist/core/turno.js +56 -8
  296. package/dist/core/turno.js.map +1 -1
  297. package/dist/core/version.js +31 -0
  298. package/dist/core/version.js.map +1 -0
  299. package/dist/vendor/tokenTracking.js +22 -1
  300. package/dist/vendor/tokenTracking.js.map +1 -1
  301. package/dist/web/servidor/arranque.js +3964 -0
  302. package/dist/web/servidor/arranque.js.map +1 -0
  303. package/dist/web/servidor/consolaDeTarea.js +161 -0
  304. package/dist/web/servidor/consolaDeTarea.js.map +1 -0
  305. package/dist/web/servidor/consolaWeb.js +389 -0
  306. package/dist/web/servidor/consolaWeb.js.map +1 -0
  307. package/dist/web/servidor/corredorDeTareas.js +1119 -0
  308. package/dist/web/servidor/corredorDeTareas.js.map +1 -0
  309. package/dist/web/servidor/pielWeb.js +269 -0
  310. package/dist/web/servidor/pielWeb.js.map +1 -0
  311. package/dist/web/servidor/servidor.js +257 -0
  312. package/dist/web/servidor/servidor.js.map +1 -0
  313. package/dist/web/servidor/sesiones.js +440 -0
  314. package/dist/web/servidor/sesiones.js.map +1 -0
  315. package/dist/web/servidor/transporte.js +169 -0
  316. package/dist/web/servidor/transporte.js.map +1 -0
  317. package/dist/web/servidor/vestibulo.js +1276 -0
  318. package/dist/web/servidor/vestibulo.js.map +1 -0
  319. package/package.json +30 -8
  320. package/skills/archify/LICENSE +22 -0
  321. package/skills/archify/SKILL.md +109 -0
  322. package/skills/archify/THIRD_PARTY_NOTICES.md +56 -0
  323. package/skills/archify/assets/template.html +14787 -0
  324. package/skills/archify/bin/archify.mjs +1990 -0
  325. package/skills/archify/bin/open-artifact.mjs +86 -0
  326. package/skills/archify/bin/preview.mjs +648 -0
  327. package/skills/archify/bin/visual-check.mjs +829 -0
  328. package/skills/archify/brand-marks/README.md +31 -0
  329. package/skills/archify/brand-marks/catalog.json +131 -0
  330. package/skills/archify/delta/architecture-delta.mjs +1214 -0
  331. package/skills/archify/examples/agent-run.lifecycle.json +71 -0
  332. package/skills/archify/examples/agent-tool-call.workflow.json +94 -0
  333. package/skills/archify/examples/async-job-roundtrip.sequence.json +61 -0
  334. package/skills/archify/examples/brand-aware-delivery.architecture.json +47 -0
  335. package/skills/archify/examples/cache-miss-request.sequence.json +81 -0
  336. package/skills/archify/examples/checkout-platform.base.architecture.json +31 -0
  337. package/skills/archify/examples/checkout-platform.head.architecture.json +31 -0
  338. package/skills/archify/examples/dataflow-product-analytics.html +14898 -0
  339. package/skills/archify/examples/deployment-release.lifecycle.json +49 -0
  340. package/skills/archify/examples/event-stream.dataflow.json +57 -0
  341. package/skills/archify/examples/incident-response.workflow.json +64 -0
  342. package/skills/archify/examples/lifecycle-agent-run.html +14847 -0
  343. package/skills/archify/examples/product-analytics.dataflow.json +76 -0
  344. package/skills/archify/examples/production-deployment.architecture.json +71 -0
  345. package/skills/archify/examples/release-delivery.workflow.json +62 -0
  346. package/skills/archify/examples/sequence-cache-miss-request.html +14913 -0
  347. package/skills/archify/examples/web-app-rendered.html +14862 -0
  348. package/skills/archify/examples/web-app.architecture.json +46 -0
  349. package/skills/archify/examples/workflow-agent-tool-call-rendered.html +14904 -0
  350. package/skills/archify/migrations/workflow-v2.mjs +279 -0
  351. package/skills/archify/package.json +17 -0
  352. package/skills/archify/recipes/scenarios.mjs +391 -0
  353. package/skills/archify/references/authoring-contract.md +198 -0
  354. package/skills/archify/references/brand-marks.md +69 -0
  355. package/skills/archify/references/delivery-contract.md +116 -0
  356. package/skills/archify/references/viewer-runtime.md +45 -0
  357. package/skills/archify/renderers/architecture/grid.mjs +62 -0
  358. package/skills/archify/renderers/architecture/render-architecture.mjs +1078 -0
  359. package/skills/archify/renderers/dataflow/README.md +104 -0
  360. package/skills/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  361. package/skills/archify/renderers/lifecycle/README.md +115 -0
  362. package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  363. package/skills/archify/renderers/sequence/README.md +114 -0
  364. package/skills/archify/renderers/sequence/render-sequence.mjs +453 -0
  365. package/skills/archify/renderers/shared/brand-marks.mjs +563 -0
  366. package/skills/archify/renderers/shared/cli.mjs +218 -0
  367. package/skills/archify/renderers/shared/desktop-readability.mjs +26 -0
  368. package/skills/archify/renderers/shared/diagnostics.mjs +127 -0
  369. package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
  370. package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  371. package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
  372. package/skills/archify/renderers/shared/geometry.mjs +1423 -0
  373. package/skills/archify/renderers/shared/i18n.mjs +594 -0
  374. package/skills/archify/renderers/shared/layout-report.mjs +40 -0
  375. package/skills/archify/renderers/shared/legend.mjs +217 -0
  376. package/skills/archify/renderers/shared/output-path.mjs +321 -0
  377. package/skills/archify/renderers/shared/repository-evidence.mjs +235 -0
  378. package/skills/archify/renderers/shared/text-fit.mjs +49 -0
  379. package/skills/archify/renderers/shared/utils.mjs +232 -0
  380. package/skills/archify/renderers/shared/validator.mjs +86 -0
  381. package/skills/archify/renderers/workflow/README.md +223 -0
  382. package/skills/archify/renderers/workflow/render-workflow.mjs +35 -0
  383. package/skills/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  384. package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  385. package/skills/archify/schemas/README.md +211 -0
  386. package/skills/archify/schemas/architecture.schema.json +176 -0
  387. package/skills/archify/schemas/common.schema.json +115 -0
  388. package/skills/archify/schemas/dataflow.schema.json +243 -0
  389. package/skills/archify/schemas/lifecycle.schema.json +266 -0
  390. package/skills/archify/schemas/sequence.schema.json +223 -0
  391. package/skills/archify/schemas/workflow.schema.json +428 -0
  392. package/skills/archify/scripts/check-render-output.mjs +835 -0
  393. package/skills/archify/scripts/check-update.mjs +1667 -0
  394. package/skills/archify/scripts/render-examples.mjs +26 -0
  395. package/skills/archify/scripts/update-contract.mjs +182 -0
  396. package/skills/archify/skill-release.json +10 -0
  397. package/skills/artifacts-builder/SKILL.md +120 -0
  398. package/skills/artifacts-builder/reference/diagramas.md +123 -0
  399. package/skills/artifacts-builder/reference/estilo.md +123 -0
  400. package/skills/artifacts-builder/reference/exportar-pdf.md +56 -0
  401. package/skills/artifacts-builder/reference/graficas.md +22 -0
  402. package/skills/artifacts-builder/scripts/bundle_artifact.py +109 -0
  403. package/skills/artifacts-builder/scripts/validate_artifact.py +345 -0
  404. package/skills/xone-hotswap/SKILL.md +185 -0
  405. package/skills/xone-hotswap/references/comandos.md +706 -0
  406. package/skills/xone-hotswap/references/conexion-y-despliegue.md +226 -0
@@ -0,0 +1,389 @@
1
+ /**
2
+ * OpenCode como subagente: un turno contra `opencode acp`.
3
+ *
4
+ * **Todo lo de aquí está MEDIDO contra el binario real (opencode 1.18.27, 11-09-2026), no
5
+ * deducido.** De las tres superficies que ofrece —`run --format json`, el servidor HTTP de
6
+ * `serve`, y ACP— se usa **ACP** (Agent Client Protocol): es JSON-RPC 2.0 por línea sobre
7
+ * stdio, o sea el mismo molde que `subagenteCodex.ts`, y es la única de las tres que da un
8
+ * portón de permiso por stdio. `run` no lo tiene y `serve` es otro transporte entero.
9
+ *
10
+ * El baile: `initialize` → `session/new {cwd, mcpServers}` → `session/prompt {sessionId,
11
+ * prompt:[{type:"text"}]}`. Por el camino llegan `session/update` con el razonamiento, el
12
+ * texto, las tools y el consumo, y el agente nos hace peticiones —`session/request_permission`
13
+ * y las `fs/*`—.
14
+ *
15
+ * **Y da MÁS que los otros dos motores**: su petición de permiso trae la ruta y el antes y el
16
+ * después en el MISMO mensaje, así que no hace falta ni registro de items (Codex manda solo un
17
+ * `itemId`) ni parser de hunks. La traducción vive en `escrituraDeOpencode.ts`.
18
+ *
19
+ * ## Las TRES puertas por las que el proyecto podía mandar, y cómo se cierran
20
+ *
21
+ * Esto es lo que decide si esta integración se puede tener, y las tres están medidas contra un
22
+ * proyecto que las llevaba a la vez:
23
+ *
24
+ * 1. **Un `opencode.json` DEL PROYECTO pisa nuestra configuración.** Medido: leyó el `.env` y
25
+ * soltó el secreto, corrió shell y escribió con CERO peticiones de permiso. Ese fichero
26
+ * puede venir de CloudStudio — es la misma amenaza que `settingSources: ["user"]` cierra
27
+ * para Claude Code.
28
+ * 2. **Un PLUGIN del proyecto** (`.opencode/plugin/*.ts`) **ejecuta código arbitrario** dentro
29
+ * del proceso de opencode, y desde ahí engancha sus hooks. Medido con su control: sin la
30
+ * variable corre; con ella, no.
31
+ * 3. **La configuración GLOBAL del usuario también nos pisa**, así que `OPENCODE_CONFIG` es el
32
+ * eslabón débil y no se puede sostener nada encima: alguien con `edit: "allow"` en su
33
+ * `~/.config` mataría la aprobación en silencio.
34
+ *
35
+ * Las tres se cierran con `OPENCODE_CONFIG_DIR` apuntando a una carpeta NUESTRA (que pasa a
36
+ * ser «la global», y por eso gana) más `OPENCODE_DISABLE_PROJECT_CONFIG=1`. Las credenciales
37
+ * del usuario siguen resolviendo: su `auth.json` vive en el directorio de DATOS y no en el de
38
+ * configuración, así que mudar éste no le desautentica. **`OPENCODE_CONFIG` no se usa**, a
39
+ * propósito: es el que pierde.
40
+ *
41
+ * ## Lo que NO se puede guardar, y está declarado
42
+ *
43
+ * **La LECTURA se guarda por PATRÓN y no por código**, que es más flojo que en Claude Code. El
44
+ * motivo está medido: la petición de permiso de un `kind: "read"` llega con `locations: []` y
45
+ * `rawInput: {}` —sin ruta—, así que no hay nada que pasarle a una guarda; la ruta solo aparece
46
+ * en el `tool_call_update` posterior, cuando el permiso ya se concedió. Con `edit` no pasa: ése
47
+ * sí trae ruta y diff. Así que queda entre los otros dos: mejor que Codex, que no puede guardar
48
+ * la lectura de ninguna forma, y peor que Claude Code, donde la decide `veredictoDeLectura`.
49
+ */
50
+ import { spawn } from "node:child_process";
51
+ import { mkdirSync, writeFileSync } from "node:fs";
52
+ import { homedir } from "node:os";
53
+ import { join } from "node:path";
54
+ import { consumoDeOpencode } from "./consumoExterno.js";
55
+ import { decisionDeEscrituraDeOpencode } from "./escrituraDeOpencode.js";
56
+ /** El binario. `OPENCODE_BIN` gana, igual que `CODEX_BIN` en el otro motor. */
57
+ export function binarioDeOpencode() {
58
+ const puesto = process.env["OPENCODE_BIN"];
59
+ return puesto !== undefined && puesto.trim() !== "" ? puesto : "opencode";
60
+ }
61
+ /** La carpeta de configuración que gobernamos. Fuera del proyecto, a propósito. */
62
+ export function carpetaDeConfigDeOpencode(base) {
63
+ return join(base ?? join(homedir(), ".xonecode"), "opencode");
64
+ }
65
+ /** Diez minutos, igual que Codex, y por lo mismo: un hijo colgado colgaría el turno. */
66
+ const TOPE_MS = 10 * 60 * 1000;
67
+ /**
68
+ * La configuración con la que corre el hijo. **Es pura y por eso se puede probar entera.**
69
+ *
70
+ * Lo que deniega, y por qué cada uno:
71
+ * - `bash`: medido, no lo deniega — **le quita la tool**: «No tengo un tool de shell en este
72
+ * entorno». Es el análogo de la lista de tools denegadas del otro motor, y hace falta porque
73
+ * un comando escribe el proyecto entero sin diff que mirar.
74
+ * - `webfetch` y `websearch`: sacan el proyecto de la máquina.
75
+ * - `external_directory`: escribir o leer fuera de la carpeta. Medido contra `/tmp`.
76
+ * - `task`: un hijo suyo sería una segunda superficie de permisos sin medir. Se abrirá cuando
77
+ * se mida, no antes.
78
+ * - `question`: pregunta a una persona que aquí no hay.
79
+ * - `read`: una lista de patrones, porque su permiso no trae la ruta (ver la cabecera). Las
80
+ * **vistas aplanadas entran una a una**, con su ruta, porque «es un `.xml` que tiene un
81
+ * `.xne` al lado» no se puede escribir como un patrón — y si el agente las ve, edita el
82
+ * fichero equivocado y el cambio se pierde en la siguiente compilación.
83
+ * - `edit`: `ask`, que es lo que hace que cada escritura pase por `pedirAprobacion`.
84
+ */
85
+ export function configuracionDeOpencode(opciones) {
86
+ const negadas = {
87
+ "**/.env": "deny",
88
+ "**/.env.*": "deny",
89
+ "**/.git/**": "deny",
90
+ "**/.xonecode/**": "deny",
91
+ };
92
+ for (const vista of opciones.vistasAplanadas ?? [])
93
+ negadas[`**${vista}`] = "deny";
94
+ return `${JSON.stringify({
95
+ $schema: "https://opencode.ai/config.json",
96
+ ...(opciones.modelo === undefined ? {} : { model: opciones.modelo }),
97
+ permission: {
98
+ // El orden importa: lo permitido primero y las denegaciones después, que es como se
99
+ // midió que gana la regla más específica.
100
+ read: { "*": "allow", ...negadas },
101
+ edit: "ask",
102
+ bash: "deny",
103
+ webfetch: "deny",
104
+ websearch: "deny",
105
+ external_directory: "deny",
106
+ task: "deny",
107
+ question: "deny",
108
+ },
109
+ }, null, 2)}\n`;
110
+ }
111
+ /** ¿Está el binario? Se pregunta lanzándolo, que es la única respuesta que no miente. */
112
+ export async function opencodeDisponible() {
113
+ return new Promise((resolver) => {
114
+ let hijo;
115
+ try {
116
+ hijo = spawn(binarioDeOpencode(), ["--version"], { stdio: ["ignore", "pipe", "pipe"] });
117
+ }
118
+ catch {
119
+ resolver(false);
120
+ return;
121
+ }
122
+ // El `error` del spawn hay que escucharlo o un binario que no existe se lleva el proceso.
123
+ hijo.on("error", () => resolver(false));
124
+ hijo.on("close", (codigo) => resolver(codigo === 0));
125
+ });
126
+ }
127
+ /** Cómo se llama aquí cada tool, para que el colapsador la agrupe con las de todos. */
128
+ const NOMBRE_CANONICO = {
129
+ read: "read_file",
130
+ write: "write_file",
131
+ edit: "edit_file",
132
+ glob: "glob",
133
+ grep: "grep",
134
+ list: "ls",
135
+ };
136
+ export async function correrOpencode(peticion, opciones = {}) {
137
+ const carpeta = carpetaDeConfigDeOpencode(opciones.casa);
138
+ mkdirSync(carpeta, { recursive: true });
139
+ // Se REESCRIBE en cada arranque a propósito: así no puede quedarse una configuración vieja
140
+ // —más permisiva— de una versión anterior de xonecode.
141
+ writeFileSync(join(carpeta, "opencode.json"), configuracionDeOpencode({
142
+ vistasAplanadas: opciones.vistasAplanadas?.() ?? [],
143
+ ...(peticion.modelo === undefined ? {} : { modelo: peticion.modelo }),
144
+ }), { mode: 0o600 });
145
+ const hijo = spawn(binarioDeOpencode(), ["acp", "--cwd", peticion.cwd], {
146
+ stdio: ["pipe", "pipe", "pipe"],
147
+ cwd: peticion.cwd,
148
+ env: {
149
+ ...process.env,
150
+ OPENCODE_CONFIG_DIR: carpeta,
151
+ OPENCODE_DISABLE_PROJECT_CONFIG: "1",
152
+ },
153
+ });
154
+ return new Promise((cumplir, fallar) => {
155
+ let buffer = "";
156
+ let sesion;
157
+ let terminado = false;
158
+ let rechazadas = 0;
159
+ const texto = [];
160
+ let aprobando = 0;
161
+ let reloj;
162
+ /** Lo que cada tool iba a hacer, hasta saber si lo hizo. Se vacía al cerrarla. */
163
+ const enCurso = new Map();
164
+ const pararReloj = () => {
165
+ if (reloj !== undefined)
166
+ clearTimeout(reloj);
167
+ reloj = undefined;
168
+ };
169
+ const armarReloj = () => {
170
+ if (terminado || aprobando > 0)
171
+ return;
172
+ pararReloj();
173
+ reloj = setTimeout(() => acabar(new Error(`opencode no terminó en ${Math.round(TOPE_MS / 60000)} minutos`)), TOPE_MS);
174
+ };
175
+ const mandar = (objeto) => {
176
+ if (!terminado)
177
+ hijo.stdin.write(`${JSON.stringify(objeto)}\n`);
178
+ };
179
+ const acabar = (error, salida) => {
180
+ if (terminado)
181
+ return;
182
+ // `session/cancel` ANTES de matarlo: ACP tiene cancelación y Codex no, así que aquí sí
183
+ // se puede cerrar el turno del hijo en vez de dejarlo a medias.
184
+ if (sesion !== undefined)
185
+ mandar({ jsonrpc: "2.0", method: "session/cancel", params: { sessionId: sesion } });
186
+ terminado = true;
187
+ pararReloj();
188
+ hijo.kill();
189
+ if (error !== undefined)
190
+ fallar(error);
191
+ else
192
+ cumplir(salida ?? "");
193
+ };
194
+ armarReloj();
195
+ hijo.on("error", (e) => acabar(new Error(`no se pudo lanzar opencode: ${e.message}`)));
196
+ hijo.on("close", () => {
197
+ if (!terminado)
198
+ acabar(new Error("opencode terminó sin devolver ninguna respuesta"));
199
+ });
200
+ hijo.stdout.on("data", (trozo) => {
201
+ buffer += trozo.toString();
202
+ let corte;
203
+ while ((corte = buffer.indexOf("\n")) >= 0) {
204
+ const linea = buffer.slice(0, corte);
205
+ buffer = buffer.slice(corte + 1);
206
+ if (linea.trim() === "")
207
+ continue;
208
+ let m;
209
+ try {
210
+ m = JSON.parse(linea);
211
+ }
212
+ catch {
213
+ // Una línea que no es JSON se descarta: el binario mezcla trazas suyas por stdout.
214
+ continue;
215
+ }
216
+ atender(m);
217
+ }
218
+ });
219
+ /** Una petición del AGENTE hacia nosotros: lleva `id` **y** `method`. */
220
+ const atenderPeticion = (id, metodo, params) => {
221
+ if (metodo === "session/request_permission") {
222
+ const toolCall = params?.["toolCall"];
223
+ aprobando += 1;
224
+ pararReloj();
225
+ void decisionDeEscrituraDeOpencode({
226
+ cwd: peticion.cwd,
227
+ agente: peticion.agente,
228
+ toolCall,
229
+ ficheros: opciones.ficheros?.() ?? new Set(),
230
+ ...(opciones.real === undefined ? {} : { real: opciones.real }),
231
+ // La primera puerta es el papel del `.md`: a un agente de solo lectura no se le
232
+ // pregunta a nadie, se le dice que no.
233
+ ...(peticion.permitirEscritura && opciones.aprobar !== undefined ? { aprobar: opciones.aprobar } : {}),
234
+ })
235
+ .then(({ concedida }) => {
236
+ if (!concedida)
237
+ rechazadas += 1;
238
+ // **`always` no se manda NUNCA**: es la pre-aprobación de sesión, y lo que aquí
239
+ // se autoriza es una escritura concreta con su diff delante — la misma regla que
240
+ // `acceptForSession` y `grantRoot` en Codex.
241
+ responderPermiso(id, concedida ? "once" : "reject");
242
+ }, () => {
243
+ rechazadas += 1;
244
+ responderPermiso(id, "reject");
245
+ })
246
+ .finally(() => {
247
+ aprobando -= 1;
248
+ armarReloj();
249
+ });
250
+ return;
251
+ }
252
+ /**
253
+ * Lo demás que el agente puede pedirnos son las `fs/*`, y no las hacemos.
254
+ *
255
+ * **Y `fs/write_text_file` NO es la escritura, está medido**: rechazándola con un error,
256
+ * el fichero apareció igual. O sea que es un aviso y no un portón — creerse lo contrario
257
+ * habría dejado una guarda que no guarda nada. El único portón es el permiso de arriba.
258
+ *
259
+ * Un error de JSON-RPC es la forma que el propio protocolo tiene de decir «eso no lo
260
+ * hago», así que aquí no se aborta el turno (al contrario que en Codex, donde no había
261
+ * forma medida de contestar que no): medido, el hijo lo encaja y sigue.
262
+ */
263
+ mandar({ jsonrpc: "2.0", id, error: { code: -32601, message: "xonecode no implementa este método" } });
264
+ };
265
+ const responderPermiso = (id, optionId) => mandar({ jsonrpc: "2.0", id, result: { outcome: { outcome: "selected", optionId } } });
266
+ const atenderActualizacion = (u) => {
267
+ const clase = u["sessionUpdate"];
268
+ if (clase === "agent_message_chunk") {
269
+ const t = u["content"]?.text;
270
+ if (typeof t === "string")
271
+ texto.push(t);
272
+ return;
273
+ }
274
+ if (clase !== "tool_call_update")
275
+ return;
276
+ const id = u["toolCallId"];
277
+ if (typeof id !== "string")
278
+ return;
279
+ /**
280
+ * **El nombre y la ruta se APUNTAN en `in_progress`, y la línea sale en `completed`.**
281
+ *
282
+ * Las dos mitades son medidas. La primera: el `completed` trae `locations: null` y la
283
+ * ruta metida dentro del `title`, así que los datos hay que cogerlos antes. La segunda:
284
+ * **una tool que acaba en `failed` NO se anuncia** — es el invariante de
285
+ * `core/entrelazar.ts`, «solo se cuenta lo que va a ocurrir», porque una línea que diga
286
+ * que el hijo leyó algo que se le denegó afirma un hecho falso. Medido en vivo: con una
287
+ * lectura de `.env` denegada por patrón salía «lee /.env», y el `.env` no se leyó.
288
+ *
289
+ * De aquí sale un evento `tool` NORMAL, con el nombre canónico y la ruta VIRTUAL, para
290
+ * que el colapsador lo agrupe con los demás y ninguna piel sepa que hay dos orígenes.
291
+ */
292
+ if (u["status"] === "in_progress") {
293
+ const titulo = typeof u["title"] === "string" ? u["title"] : "";
294
+ const nombre = NOMBRE_CANONICO[titulo] ?? titulo;
295
+ if (nombre === "")
296
+ return;
297
+ const sitios = u["locations"];
298
+ const cruda = Array.isArray(sitios) ? sitios[0]?.path : undefined;
299
+ const detalle = typeof cruda === "string" && cruda.startsWith(peticion.cwd)
300
+ ? cruda.slice(peticion.cwd.length) || "/"
301
+ : undefined;
302
+ enCurso.set(id, { nombre, ...(detalle === undefined ? {} : { detalle }) });
303
+ return;
304
+ }
305
+ const apuntada = enCurso.get(id);
306
+ if (apuntada === undefined)
307
+ return;
308
+ enCurso.delete(id);
309
+ if (u["status"] === "completed")
310
+ opciones.alUsarTool?.(apuntada);
311
+ };
312
+ const atender = (m) => {
313
+ if (m.id !== undefined && m.method !== undefined) {
314
+ atenderPeticion(m.id, m.method, m.params);
315
+ return;
316
+ }
317
+ if (m.id === 1 && m.result !== undefined) {
318
+ mandar({ jsonrpc: "2.0", id: 2, method: "session/new", params: { cwd: peticion.cwd, mcpServers: [] } });
319
+ return;
320
+ }
321
+ if (m.id === 2) {
322
+ sesion = m.result?.sessionId;
323
+ if (sesion === undefined) {
324
+ acabar(new Error("opencode abrió la sesión sin devolver su id"));
325
+ return;
326
+ }
327
+ mandar({
328
+ jsonrpc: "2.0",
329
+ id: 3,
330
+ method: "session/prompt",
331
+ params: {
332
+ sessionId: sesion,
333
+ // Las instrucciones van DELANTE de la tarea en el mismo turno: ACP no expone un
334
+ // prompt de sistema por sesión, igual que el app-server de Codex.
335
+ prompt: [
336
+ { type: "text", text: peticion.instrucciones },
337
+ { type: "text", text: peticion.tarea },
338
+ ],
339
+ },
340
+ });
341
+ return;
342
+ }
343
+ if (m.id === 3) {
344
+ if (m.error !== undefined) {
345
+ acabar(new Error(`opencode: ${m.error.message ?? "error sin mensaje"}`));
346
+ return;
347
+ }
348
+ const consumo = consumoDeOpencode(m.result?.usage);
349
+ if (consumo !== undefined)
350
+ opciones.alConsumir?.(consumo);
351
+ acabar(undefined, respuestaFinal());
352
+ return;
353
+ }
354
+ if (m.method === "session/update") {
355
+ const u = m.params?.update;
356
+ if (u !== undefined)
357
+ atenderActualizacion(u);
358
+ }
359
+ };
360
+ /**
361
+ * Lo que se devuelve como respuesta del especialista.
362
+ *
363
+ * **Una respuesta vacía tras un rechazo no es un fallo, y tampoco es silencio**: medido,
364
+ * al rechazar una escritura el turno acaba bien (`stopReason: end_turn`) y a veces sin una
365
+ * sola palabra. Devolver `""` la haría pasar por «el especialista no tenía nada que
366
+ * decir», y lanzar tumbaría un turno que fue correcto. Así que se dice lo que pasó, con
367
+ * voz del harness y sin ponerle palabras al agente.
368
+ */
369
+ const respuestaFinal = () => {
370
+ const dicho = texto.join("").trim();
371
+ if (dicho !== "")
372
+ return dicho;
373
+ return rechazadas > 0
374
+ ? `(opencode terminó sin decir nada; se le rechazaron ${rechazadas} escritura(s))`
375
+ : "(opencode terminó sin decir nada)";
376
+ };
377
+ mandar({
378
+ jsonrpc: "2.0",
379
+ id: 1,
380
+ method: "initialize",
381
+ params: {
382
+ protocolVersion: 1,
383
+ // Las dos en `false` y a propósito: no servimos el sistema de ficheros del cliente.
384
+ clientCapabilities: { fs: { readTextFile: false, writeTextFile: false } },
385
+ },
386
+ });
387
+ });
388
+ }
389
+ //# sourceMappingURL=subagenteOpencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagenteOpencode.js","sourceRoot":"","sources":["../../src/agent/subagenteOpencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * La subida: del plan a las llamadas MCP, y de ahí a la ref y al registro.
3
+ *
4
+ * **Una sola rama**: se sube a la MISMA rama de la que se bajó el proyecto (`config.rama`).
5
+ * Hubo una rama de trabajo (`xonecode/<origen>`) para no escribir en la rama que el cliente
6
+ * tuviera abierta en Studio, y el precio era que lo subido vivía en un sitio que nadie mira
7
+ * mientras la rama del proyecto se quedaba quieta. Se sigue creando la rama si no existe
8
+ * —un proyecto cuyo `config.rama` nombra una rama que aún no está en el servidor—, pero con
9
+ * su propio nombre.
10
+ *
11
+ * Dos propiedades que no son negociables:
12
+ * - La ref se mueve SOLO si todo terminó. Con fallos parciales se queda donde estaba, así
13
+ * que el siguiente `/sync` vuelve a calcular el plan ENTERO contra esa misma ref sin
14
+ * mover —no solo lo que falló— y lo reenvía completo, incluidas las operaciones que la
15
+ * vez anterior SÍ funcionaron. Eso NO es «idempotente por construcción»: es seguro
16
+ * únicamente si escribir/borrar dos veces la misma ruta en CloudStudio no tiene efecto
17
+ * observable la segunda vez. Esta función no lo garantiza ni lo comprueba, solo lo
18
+ * asume del servidor.
19
+ * - La rama activa del servidor se restaura al terminar (incluso si falló al posicionar
20
+ * la rama, antes de tocar un solo fichero): `switch` le mueve el suelo a quien tenga
21
+ * Studio abierto en el navegador.
22
+ */
23
+ import { appendFileSync, mkdirSync, readFileSync, statSync, existsSync, readdirSync } from "node:fs";
24
+ import { dirname, join } from "node:path";
25
+ import { planDeSubida } from "../core/planDeSubida.js";
26
+ import { NOMBRE_CARPETA } from "./configEnDisco.js";
27
+ import { cambiosPendientes, marcarSubido } from "./gitSync.js";
28
+ import { rutaSyncJson } from "./descarga.js";
29
+ export function rutaSyncLog(raiz) {
30
+ return join(raiz, NOMBRE_CARPETA, "cloudstudio", "sync.log");
31
+ }
32
+ /** Los `.xne` presentes en local: con ellos se reconocen las vistas aplanadas. */
33
+ function fuentesXne(raiz) {
34
+ const salida = new Set();
35
+ const recorrer = (dir, prefijo) => {
36
+ for (const entrada of readdirSync(dir, { withFileTypes: true })) {
37
+ if (entrada.name === ".git" || entrada.name === NOMBRE_CARPETA)
38
+ continue;
39
+ const relativa = prefijo === "" ? entrada.name : `${prefijo}/${entrada.name}`;
40
+ if (entrada.isDirectory())
41
+ recorrer(join(dir, entrada.name), relativa);
42
+ else if (entrada.name.endsWith(".xne"))
43
+ salida.add(relativa);
44
+ }
45
+ };
46
+ recorrer(raiz, "");
47
+ return salida;
48
+ }
49
+ /**
50
+ * Lo que la descarga trajo DE VERDAD, según `sync.json` — **y solo si ese `sync.json` es
51
+ * de ESTE proyecto y de ESTA rama**.
52
+ *
53
+ * `descargados` es la única pata del candado de borrado que puede MENTIR: el manifiesto y
54
+ * el diff se calculan en el momento, pero esto es un fichero en disco que sobrevive a
55
+ * cambios de configuración. Un `/connect-studio` a otro proyecto, o un cambio de rama
56
+ * origen, deja el `sync.json` de la descarga ANTERIOR ahí quieto; sus rutas afirmarían
57
+ * «esto lo bajamos» sobre un proyecto en el que nunca entramos, y con eso el candado
58
+ * autorizaría borrados en el Studio del cliente equivocado.
59
+ *
60
+ * `EstadoDeSync` ya guarda proyecto y rama: se comparan, y si no casan se cae a conjunto
61
+ * vacío —que prohíbe TODO borrado— en vez de a uno inventado. Fail-closed, como el resto.
62
+ */
63
+ function descargadosDe(raiz, proyecto, rama, informar) {
64
+ const ruta = rutaSyncJson(raiz);
65
+ if (!existsSync(ruta))
66
+ return new Set();
67
+ try {
68
+ const estado = JSON.parse(readFileSync(ruta, "utf8"));
69
+ if (estado.proyecto?.id !== proyecto.id || estado.rama !== rama) {
70
+ informar("el sync.json en disco no es de este proyecto/rama: no se borrará nada en Studio " +
71
+ "hasta que vuelvas a bajar con /sync bajar\n");
72
+ return new Set();
73
+ }
74
+ return new Set(estado.descargados ?? []);
75
+ }
76
+ catch {
77
+ // Sin manifiesto legible no se puede afirmar qué se bajó, y sin eso el candado no
78
+ // existe: mejor un conjunto vacío (que prohíbe TODO borrado) que uno inventado.
79
+ return new Set();
80
+ }
81
+ }
82
+ export async function subir(opciones) {
83
+ const { puerto, raiz, ramaOrigen, proyecto, politicaDeAprobacion, informar = () => { } } = opciones;
84
+ const cambios = await cambiosPendientes(raiz, ramaOrigen);
85
+ const tamanos = new Map();
86
+ for (const cambio of cambios) {
87
+ const ruta = join(raiz, cambio.ruta);
88
+ if (existsSync(ruta))
89
+ tamanos.set(cambio.ruta, statSync(ruta).size);
90
+ }
91
+ const { operaciones: plan, omitidas } = planDeSubida({
92
+ cambios,
93
+ descargados: descargadosDe(raiz, proyecto, ramaOrigen, informar),
94
+ tamanos,
95
+ fuentesXne: fuentesXne(raiz),
96
+ });
97
+ const informe = { ok: [], fallos: [], omitidas };
98
+ // El log es «una línea por OPERACIÓN de sync» (criterio de aceptación), no una línea
99
+ // por fichero movido: un `/sync` sin nada pendiente también es una operación y queda
100
+ // registrado, o el JSONL mentiría por omisión sobre cuántas veces se sincronizó.
101
+ // `error` es el fallo ESTRUCTURAL (posicionar la rama, abrir el proyecto) que impide
102
+ // intentar el plan siquiera — el otro camino, un fichero suelto que falla, ya vive en
103
+ // `fallos` y no necesita este campo.
104
+ const registrar = (error) => {
105
+ const linea = JSON.stringify({
106
+ fecha: new Date().toISOString(),
107
+ dir: "subida",
108
+ proyecto: proyecto.nombre,
109
+ rama: ramaOrigen,
110
+ ok: informe.ok,
111
+ fallos: informe.fallos,
112
+ // Lo IMPOSIBLE queda por escrito igual que lo fallido: el usuario tiene que poder
113
+ // volver mañana y saber qué se quedó sin subir y por qué, no solo verlo pasar.
114
+ omitidas: informe.omitidas,
115
+ ...(error === undefined ? {} : { error }),
116
+ });
117
+ const log = rutaSyncLog(raiz);
118
+ mkdirSync(dirname(log), { recursive: true });
119
+ appendFileSync(log, `${linea}\n`);
120
+ };
121
+ // Las omisiones se dicen SIEMPRE, y antes de pedir autorización: quien autoriza tiene
122
+ // que ver también lo que NO se va a hacer. Y se dicen aunque el plan quede vacío, que
123
+ // es justo el caso en que callarlas haría creer que no había nada pendiente.
124
+ for (const omitida of omitidas)
125
+ informar(`no se sube «${omitida.ruta}»: ${omitida.motivo}\n`);
126
+ if (plan.length === 0) {
127
+ if (omitidas.length === 0)
128
+ informar("no hay nada que subir\n");
129
+ // La ref NO se mueve aquí: no se ha escrito nada en CloudStudio, y una ref que dice
130
+ // «esto ya está arriba» sin haber subido nada es exactamente la clase de mentira que
131
+ // se corrige en otra parte de esta misma ola. Lo omitido se vuelve a declarar en cada
132
+ // `/sync` mientras siga en el diff, que es la verdad: sigue sin sincronizar. Cuando
133
+ // haya OTRAS operaciones, la ref avanzará con ellas y arrastrará también lo omitido
134
+ // —por eso queda además escrito en `sync.log`, que sí sobrevive al turno—.
135
+ registrar();
136
+ return informe;
137
+ }
138
+ // La política decide ANTES de tocar el puerto: ni `abrir` ni `contexto` ni una sola
139
+ // escritura corren sin su autorización. Que no autorice deja el disco, el puerto y la
140
+ // ref exactamente como estaban — sea cual sea la política que haya detrás.
141
+ if (!(await politicaDeAprobacion(plan))) {
142
+ informar("subida cancelada: no se ha aplicado nada\n");
143
+ registrar();
144
+ return informe;
145
+ }
146
+ await puerto.abrir(proyecto.nombre);
147
+ const antes = await puerto.contexto();
148
+ try {
149
+ try {
150
+ // Posicionarse en la rama del PROYECTO. Aquí hubo un `crearRama` perezoso para la
151
+ // rama de trabajo —que no existía hasta la primera subida—, y sin rama de trabajo no
152
+ // tiene qué crear: `config.rama` salió de la lista de ramas del servidor en el alta,
153
+ // así que existir existe. Si alguien la borró en Studio desde entonces, el `switch`
154
+ // falla, queda en `sync.log` y se relanza: inventarse una rama desde sí misma no
155
+ // arreglaría nada y firmaría un linaje falso.
156
+ await puerto.cambiarRama(ramaOrigen);
157
+ for (const operacion of plan) {
158
+ try {
159
+ if (operacion.tipo === "borrado")
160
+ await puerto.borrarTexto(operacion.ruta);
161
+ else if (operacion.tipo === "texto") {
162
+ await puerto.escribirTexto(operacion.ruta, readFileSync(join(raiz, operacion.ruta), "utf8"));
163
+ }
164
+ else {
165
+ await puerto.subirBinario(operacion.ruta, readFileSync(join(raiz, operacion.ruta)));
166
+ }
167
+ informe.ok.push(operacion.ruta);
168
+ }
169
+ catch (error) {
170
+ informe.fallos.push({ ruta: operacion.ruta, motivo: error.message });
171
+ }
172
+ }
173
+ }
174
+ finally {
175
+ // La rama que estaba de VERDAD, no la que suponíamos: por eso se lee `contexto`
176
+ // antes. Este `finally` corre TAMBIÉN si `cambiarRama` revienta antes
177
+ // de llegar al plan — es precisamente el camino para el que existe: un fallo
178
+ // posicionando la rama no puede dejar el suelo movido bajo quien tenga Studio
179
+ // abierto en el navegador.
180
+ await puerto.cambiarRama(antes.rama);
181
+ }
182
+ }
183
+ catch (error) {
184
+ // No se pudo ni intentar el plan (crear/cambiar de rama falló): se registra el
185
+ // intento —es la clase de fallo, de red o servidor, para la que existe el log— y
186
+ // se relanza, porque a diferencia de un fichero suelto que falla, aquí no hay
187
+ // informe de fallos por ruta que devolver: la sesión de subida ni llegó a empezar.
188
+ registrar(error.message);
189
+ throw error;
190
+ }
191
+ if (informe.fallos.length === 0) {
192
+ await marcarSubido(raiz, ramaOrigen, `sync: ${informe.ok.length} ficheros a ${ramaOrigen}`);
193
+ }
194
+ else {
195
+ // La ref no se mueve: el siguiente `/sync` recalcula el plan entero desde ahí y lo
196
+ // reenvía completo, incluido lo que sí subió esta vez (ver la nota de cabecera).
197
+ informar(`${informe.fallos.length} ficheros no subieron; la ref no se mueve y el próximo /sync reintenta\n`);
198
+ }
199
+ registrar();
200
+ return informe;
201
+ }
202
+ //# sourceMappingURL=subida.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subida.js","sourceRoot":"","sources":["../../src/agent/subida.ts"],"names":[],"mappings":"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"}