xonecode 0.3.0 → 0.5.1

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 (408) hide show
  1. package/README.md +50 -8
  2. package/THIRD_PARTY_NOTICES.md +160 -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/sqliteSaver.js +389 -0
  300. package/dist/vendor/sqliteSaver.js.map +1 -0
  301. package/dist/vendor/tokenTracking.js +22 -1
  302. package/dist/vendor/tokenTracking.js.map +1 -1
  303. package/dist/web/servidor/arranque.js +3964 -0
  304. package/dist/web/servidor/arranque.js.map +1 -0
  305. package/dist/web/servidor/consolaDeTarea.js +161 -0
  306. package/dist/web/servidor/consolaDeTarea.js.map +1 -0
  307. package/dist/web/servidor/consolaWeb.js +389 -0
  308. package/dist/web/servidor/consolaWeb.js.map +1 -0
  309. package/dist/web/servidor/corredorDeTareas.js +1119 -0
  310. package/dist/web/servidor/corredorDeTareas.js.map +1 -0
  311. package/dist/web/servidor/pielWeb.js +269 -0
  312. package/dist/web/servidor/pielWeb.js.map +1 -0
  313. package/dist/web/servidor/servidor.js +257 -0
  314. package/dist/web/servidor/servidor.js.map +1 -0
  315. package/dist/web/servidor/sesiones.js +440 -0
  316. package/dist/web/servidor/sesiones.js.map +1 -0
  317. package/dist/web/servidor/transporte.js +169 -0
  318. package/dist/web/servidor/transporte.js.map +1 -0
  319. package/dist/web/servidor/vestibulo.js +1276 -0
  320. package/dist/web/servidor/vestibulo.js.map +1 -0
  321. package/package.json +33 -9
  322. package/skills/archify/LICENSE +22 -0
  323. package/skills/archify/SKILL.md +109 -0
  324. package/skills/archify/THIRD_PARTY_NOTICES.md +56 -0
  325. package/skills/archify/assets/template.html +14787 -0
  326. package/skills/archify/bin/archify.mjs +1990 -0
  327. package/skills/archify/bin/open-artifact.mjs +86 -0
  328. package/skills/archify/bin/preview.mjs +648 -0
  329. package/skills/archify/bin/visual-check.mjs +829 -0
  330. package/skills/archify/brand-marks/README.md +31 -0
  331. package/skills/archify/brand-marks/catalog.json +131 -0
  332. package/skills/archify/delta/architecture-delta.mjs +1214 -0
  333. package/skills/archify/examples/agent-run.lifecycle.json +71 -0
  334. package/skills/archify/examples/agent-tool-call.workflow.json +94 -0
  335. package/skills/archify/examples/async-job-roundtrip.sequence.json +61 -0
  336. package/skills/archify/examples/brand-aware-delivery.architecture.json +47 -0
  337. package/skills/archify/examples/cache-miss-request.sequence.json +81 -0
  338. package/skills/archify/examples/checkout-platform.base.architecture.json +31 -0
  339. package/skills/archify/examples/checkout-platform.head.architecture.json +31 -0
  340. package/skills/archify/examples/dataflow-product-analytics.html +14898 -0
  341. package/skills/archify/examples/deployment-release.lifecycle.json +49 -0
  342. package/skills/archify/examples/event-stream.dataflow.json +57 -0
  343. package/skills/archify/examples/incident-response.workflow.json +64 -0
  344. package/skills/archify/examples/lifecycle-agent-run.html +14847 -0
  345. package/skills/archify/examples/product-analytics.dataflow.json +76 -0
  346. package/skills/archify/examples/production-deployment.architecture.json +71 -0
  347. package/skills/archify/examples/release-delivery.workflow.json +62 -0
  348. package/skills/archify/examples/sequence-cache-miss-request.html +14913 -0
  349. package/skills/archify/examples/web-app-rendered.html +14862 -0
  350. package/skills/archify/examples/web-app.architecture.json +46 -0
  351. package/skills/archify/examples/workflow-agent-tool-call-rendered.html +14904 -0
  352. package/skills/archify/migrations/workflow-v2.mjs +279 -0
  353. package/skills/archify/package.json +17 -0
  354. package/skills/archify/recipes/scenarios.mjs +391 -0
  355. package/skills/archify/references/authoring-contract.md +198 -0
  356. package/skills/archify/references/brand-marks.md +69 -0
  357. package/skills/archify/references/delivery-contract.md +116 -0
  358. package/skills/archify/references/viewer-runtime.md +45 -0
  359. package/skills/archify/renderers/architecture/grid.mjs +62 -0
  360. package/skills/archify/renderers/architecture/render-architecture.mjs +1078 -0
  361. package/skills/archify/renderers/dataflow/README.md +104 -0
  362. package/skills/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  363. package/skills/archify/renderers/lifecycle/README.md +115 -0
  364. package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  365. package/skills/archify/renderers/sequence/README.md +114 -0
  366. package/skills/archify/renderers/sequence/render-sequence.mjs +453 -0
  367. package/skills/archify/renderers/shared/brand-marks.mjs +563 -0
  368. package/skills/archify/renderers/shared/cli.mjs +218 -0
  369. package/skills/archify/renderers/shared/desktop-readability.mjs +26 -0
  370. package/skills/archify/renderers/shared/diagnostics.mjs +127 -0
  371. package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
  372. package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  373. package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
  374. package/skills/archify/renderers/shared/geometry.mjs +1423 -0
  375. package/skills/archify/renderers/shared/i18n.mjs +594 -0
  376. package/skills/archify/renderers/shared/layout-report.mjs +40 -0
  377. package/skills/archify/renderers/shared/legend.mjs +217 -0
  378. package/skills/archify/renderers/shared/output-path.mjs +321 -0
  379. package/skills/archify/renderers/shared/repository-evidence.mjs +235 -0
  380. package/skills/archify/renderers/shared/text-fit.mjs +49 -0
  381. package/skills/archify/renderers/shared/utils.mjs +232 -0
  382. package/skills/archify/renderers/shared/validator.mjs +86 -0
  383. package/skills/archify/renderers/workflow/README.md +223 -0
  384. package/skills/archify/renderers/workflow/render-workflow.mjs +35 -0
  385. package/skills/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  386. package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  387. package/skills/archify/schemas/README.md +211 -0
  388. package/skills/archify/schemas/architecture.schema.json +176 -0
  389. package/skills/archify/schemas/common.schema.json +115 -0
  390. package/skills/archify/schemas/dataflow.schema.json +243 -0
  391. package/skills/archify/schemas/lifecycle.schema.json +266 -0
  392. package/skills/archify/schemas/sequence.schema.json +223 -0
  393. package/skills/archify/schemas/workflow.schema.json +428 -0
  394. package/skills/archify/scripts/check-render-output.mjs +835 -0
  395. package/skills/archify/scripts/check-update.mjs +1667 -0
  396. package/skills/archify/scripts/render-examples.mjs +26 -0
  397. package/skills/archify/scripts/update-contract.mjs +182 -0
  398. package/skills/archify/skill-release.json +10 -0
  399. package/skills/artifacts-builder/SKILL.md +120 -0
  400. package/skills/artifacts-builder/reference/diagramas.md +123 -0
  401. package/skills/artifacts-builder/reference/estilo.md +123 -0
  402. package/skills/artifacts-builder/reference/exportar-pdf.md +56 -0
  403. package/skills/artifacts-builder/reference/graficas.md +22 -0
  404. package/skills/artifacts-builder/scripts/bundle_artifact.py +109 -0
  405. package/skills/artifacts-builder/scripts/validate_artifact.py +345 -0
  406. package/skills/xone-hotswap/SKILL.md +185 -0
  407. package/skills/xone-hotswap/references/comandos.md +706 -0
  408. package/skills/xone-hotswap/references/conexion-y-despliegue.md +226 -0
@@ -1,8 +1,10 @@
1
- import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
2
1
  import { ChatOpenAI } from "@langchain/openai";
3
2
  import { ChatAnthropic } from "@langchain/anthropic";
4
3
  import { ChatOllama } from "@langchain/ollama";
5
- import { resolver } from "../core/modelos.js";
4
+ import { COMPATIBLES_OPENAI, compatibleConOpenAi, esProveedorPersonalizado, parsear, resolver, pideThinkingAdaptativo, } from "../core/modelos.js";
5
+ import { topeDeSalida } from "../core/contextos.js";
6
+ import { baseUrlDeOllama, baseUrlDeOllamaCloud } from "./catalogoModelos.js";
7
+ import { ChatGoogleGenerativeAICompatible } from "./gemini.js";
6
8
  /**
7
9
  * Construye el modelo de cada papel. NO lleva la marca de doble: es real.
8
10
  *
@@ -12,24 +14,34 @@ import { resolver } from "../core/modelos.js";
12
14
  */
13
15
  export class Modelos {
14
16
  eleccion;
15
- constructor(fuentes = {}) {
17
+ /**
18
+ * Los proveedores personalizados, y es una FUNCIÓN y no una lista a propósito.
19
+ *
20
+ * `fuentes` se lee UNA vez, al arrancar el proceso, así que una lista capturada aquí
21
+ * dejaba muerto el flujo que el usuario hace primero: dar de alta un proveedor en
22
+ * Ajustes, ponerle la clave, elegir su modelo y hablar — y el turno reventaba con «no
23
+ * está dado de alta; añádelo en Ajustes», que es justo lo que acababa de hacer. Quien
24
+ * construye pasa `proveedoresPersonalizados` (`agent/configEnDisco.ts`), que relee el
25
+ * config global; sin nada, se cae a lo que trajera `fuentes`, que es lo que había.
26
+ *
27
+ * Del `config.json` GLOBAL y de ningún otro: la regla la impone `core/config.ts` al
28
+ * validar, y aquí no se vuelve a mirar el del proyecto ni por descuido.
29
+ */
30
+ personalizados;
31
+ constructor(fuentes = {}, personalizados) {
16
32
  this.eleccion = resolver(fuentes);
33
+ this.personalizados = personalizados ?? (() => fuentes.global?.proveedores ?? []);
17
34
  }
18
35
  paraPapel(papel) {
19
- const { proveedor, modelo } = this.eleccion[papel];
20
- switch (proveedor) {
21
- case "openai":
22
- return new ChatOpenAI({ model: modelo, apiKey: process.env.OPENAI_API_KEY });
23
- case "anthropic":
24
- return new ChatAnthropic({ model: modelo, apiKey: process.env.ANTHROPIC_API_KEY });
25
- case "ollama":
26
- return new ChatOllama({
27
- model: modelo,
28
- baseUrl: process.env.OLLAMA_BASE_URL ?? "http://localhost:11434",
29
- });
30
- case "gemini":
31
- return new ChatGoogleGenerativeAI({ model: modelo, apiKey: process.env.GOOGLE_API_KEY });
32
- }
36
+ return construirModelo(this.eleccion[papel], this.personalizados());
37
+ }
38
+ /**
39
+ * Un modelo concreto por su «proveedor/modelo». `parsear` es la MISMA función que valida
40
+ * `--modelo` y `/modelo`, no una copia: un id mal escrito en el `.md` de un agente tiene
41
+ * que fallar igual y con el mismo mensaje que uno mal escrito en la línea de comandos.
42
+ */
43
+ paraModelo(id) {
44
+ return construirModelo(parsear(id), this.personalizados());
33
45
  }
34
46
  descripcion() {
35
47
  const salida = {};
@@ -39,4 +51,80 @@ export class Modelos {
39
51
  return salida;
40
52
  }
41
53
  }
54
+ /**
55
+ * El cliente de OpenAI apuntado a otro host: NVIDIA, Groq y xAI publican la misma API.
56
+ *
57
+ * La clave se exige AQUÍ y no se deja en `undefined`, que es lo que hace el caso de
58
+ * `openai`. No es simetría rota: `ChatOpenAI` sin `apiKey` se la busca él en
59
+ * `OPENAI_API_KEY`, así que un `NVIDIA_API_KEY` sin poner haría que la clave de OpenAI
60
+ * del usuario viajara a `integrate.api.nvidia.com` con la primera petición. El mensaje es
61
+ * el mismo que da el catálogo cuando falta la credencial, porque es el mismo problema.
62
+ */
63
+ function construirCompatibleOpenAi(proveedor, modelo, { baseUrl, variable }) {
64
+ const apiKey = process.env[variable];
65
+ if (apiKey === undefined || apiKey.trim() === "") {
66
+ throw new Error(`falta la credencial para ${proveedor} (${variable}); usa /provider ${proveedor}`);
67
+ }
68
+ return new ChatOpenAI({ model: modelo, apiKey, configuration: { baseURL: baseUrl } });
69
+ }
70
+ /** El cliente de un `{proveedor, modelo}`, venga de un papel o de la elección de un agente. */
71
+ function construirModelo({ proveedor, modelo }, personalizados = []) {
72
+ // Un personalizado se resuelve ANTES del switch, contra el registro: sin él no hay URL
73
+ // base, y eso es un alta que falta y no un proveedor roto. El switch de abajo sigue
74
+ // siendo exhaustivo sobre los de serie.
75
+ if (esProveedorPersonalizado(proveedor)) {
76
+ const fila = compatibleConOpenAi(proveedor, personalizados);
77
+ if (fila === undefined) {
78
+ throw new Error(`el proveedor personalizado «${proveedor}» no está dado de alta; añádelo en Ajustes → Proveedores`);
79
+ }
80
+ return construirCompatibleOpenAi(proveedor, modelo, fila);
81
+ }
82
+ switch (proveedor) {
83
+ case "nvidia":
84
+ case "groq":
85
+ case "xai":
86
+ // Enumerados uno a uno, y no un `default`, para que el switch siga siendo
87
+ // exhaustivo: el día que se añada un proveedor, esto tiene que dar un error de
88
+ // compilación y no construir un cliente equivocado en silencio.
89
+ return construirCompatibleOpenAi(proveedor, modelo, COMPATIBLES_OPENAI[proveedor]);
90
+ case "openai":
91
+ return new ChatOpenAI({ model: modelo, apiKey: process.env.OPENAI_API_KEY });
92
+ case "anthropic":
93
+ // El tope de salida se fija A MANO y el razonamiento se pide cuando hace falta;
94
+ // las dos decisiones son datos de `core/` (`topeDeSalida`,
95
+ // `pideThinkingAdaptativo`) y están ahí documentadas con lo que se midió.
96
+ //
97
+ // En corto: el `max_tokens` por omisión de la dependencia sale de una tabla por
98
+ // prefijo y un id que no conoce cae en 4096 SIN DECIRLO —medido con
99
+ // `claude-sonnet-5`—, que en un harness que escribe ficheros corta a media
100
+ // escritura; y omitir `thinking` corre sin pensar en la generación 4.6-4.8,
101
+ // mientras que pedirlo a Haiku o a lo anterior a 4.6 sería un 400.
102
+ return new ChatAnthropic({
103
+ model: modelo,
104
+ apiKey: process.env.ANTHROPIC_API_KEY,
105
+ ...(topeDeSalida("anthropic", modelo) === undefined
106
+ ? {}
107
+ : { maxTokens: topeDeSalida("anthropic", modelo) }),
108
+ ...(pideThinkingAdaptativo("anthropic", modelo)
109
+ ? { thinking: { type: "adaptive" } }
110
+ : {}),
111
+ });
112
+ case "ollama":
113
+ return new ChatOllama({
114
+ model: modelo,
115
+ baseUrl: baseUrlDeOllama(),
116
+ });
117
+ case "ollama-cloud":
118
+ return new ChatOllama({
119
+ model: modelo,
120
+ baseUrl: baseUrlDeOllamaCloud(),
121
+ headers: { authorization: `Bearer ${process.env.OLLAMA_API_KEY ?? ""}` },
122
+ });
123
+ case "gemini":
124
+ return new ChatGoogleGenerativeAICompatible({
125
+ model: modelo,
126
+ apiKey: process.env.GOOGLE_API_KEY,
127
+ });
128
+ }
129
+ }
42
130
  //# sourceMappingURL=modelos.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/agent/modelos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAyC,MAAM,oBAAoB,CAAC;AAErF;;;;;;GAMG;AACH,MAAM,OAAO,OAAO;IACD,QAAQ,CAA0B;IAEnD,YAAY,UAA6B,EAAE;QACzC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,CAAC,KAAY;QACpB,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnD,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACX,OAAO,IAAI,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;YAC/E,KAAK,WAAW;gBACd,OAAO,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACrF,KAAK,QAAQ;gBACX,OAAO,IAAI,UAAU,CAAC;oBACpB,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB;iBACjE,CAAC,CAAC;YACL,KAAK,QAAQ;gBACX,OAAO,IAAI,sBAAsB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,WAAW;QACT,MAAM,MAAM,GAAG,EAA2B,CAAC;QAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAwB,EAAE,CAAC;YAC9E,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;QAC9D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/agent/modelos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Qué modelos ofrece cada MOTOR de subagente.
3
+ *
4
+ * Un subagente corre de cuatro formas —dentro de xonecode, en Claude Code, en Codex o en
5
+ * OpenCode— y el modelo se elige distinto en cada una. Este módulo contesta la pregunta «¿entre
6
+ * qué puedo elegir?» para las tres externas; la del motor `modelo` ya la contesta el catálogo de
7
+ * proveedores de siempre (`agent/catalogoModelos.ts`), y duplicarla aquí sería una segunda
8
+ * lista que diverge.
9
+ *
10
+ * **Ninguna de las listas está inventada, y esa es la regla del fichero.** La de Claude Code
11
+ * son los ALIAS que documenta su propio SDK; las de Codex y OpenCode se les preguntan a ellos. Un
12
+ * desplegable con cinco nombres escritos a mano se queda viejo en la siguiente versión del
13
+ * producto, y el síntoma sería un modelo que el usuario elige y el hijo rechaza.
14
+ */
15
+ import { spawn } from "node:child_process";
16
+ /**
17
+ * Los alias de Claude Code, tal como los documenta su SDK instalado:
18
+ * «Model alias (e.g. 'fable', 'opus', 'sonnet', 'haiku') or full model ID».
19
+ *
20
+ * Alias y no ids pinchados: es lo que el producto ofrece justamente para que sobrevivan a
21
+ * sus versiones. Un `claude-opus-4-8` escrito aquí hoy se queda viejo solo, y el campo sigue
22
+ * aceptando un id entero para quien quiera fijar uno.
23
+ */
24
+ export const ALIAS_DE_CLAUDE_CODE = ["opus", "sonnet", "haiku", "fable"];
25
+ /** Cuánto se espera a que Codex conteste su lista antes de darlo por no disponible. */
26
+ export const TOPE_DE_MODELOS_MS = 15_000;
27
+ export async function modelosDeMotor(motor, deps = {}) {
28
+ if (motor === "claude-code") {
29
+ // Sin proceso: la lista es una tabla, y preguntarle al SDK costaría arrancar un hijo
30
+ // para leer algo que sus propios tipos declaran.
31
+ return { modelos: ALIAS_DE_CLAUDE_CODE.map((id) => ({ id, nombre: id })) };
32
+ }
33
+ if (motor !== "codex" && motor !== "opencode")
34
+ return { modelos: [] };
35
+ const preguntar = motor === "opencode"
36
+ ? (deps.preguntarAOpencode ?? preguntarAOpencodeDeVerdad)
37
+ : (deps.preguntarACodex ?? preguntarACodexDeVerdad);
38
+ try {
39
+ return { modelos: await preguntar() };
40
+ }
41
+ catch (error) {
42
+ // Se dice, y accionable: un desplegable vacío sin motivo se lee como que la ventana
43
+ // está rota, y lo que pasa es que falta instalar Codex o que no contesta.
44
+ return { modelos: [], error: error instanceof Error ? error.message : String(error) };
45
+ }
46
+ }
47
+ /**
48
+ * Lo que se guarda de la respuesta de `model/list`, y solo eso.
49
+ *
50
+ * Trae además esfuerzos de razonamiento, modalidades de entrada, tramos de servicio y avisos
51
+ * de crédito de la cuenta. Nada de eso hace falta para elegir un modelo, y arrastrarlo por
52
+ * el cable sería llevar datos de la cuenta de alguien sin ningún motivo — la misma regla con
53
+ * la que `proyectosDeResultado` se queda con dos campos y deja fuera el correo del
54
+ * propietario.
55
+ *
56
+ * Los que el propio Codex marca como `hidden` no se ofrecen: es él quien dice que no son
57
+ * para elegir.
58
+ */
59
+ export function modelosDeRespuestaDeCodex(respuesta) {
60
+ const datos = respuesta?.data;
61
+ if (!Array.isArray(datos))
62
+ return [];
63
+ const salida = [];
64
+ for (const fila of datos) {
65
+ if (typeof fila !== "object" || fila === null)
66
+ continue;
67
+ const { id, displayName, hidden } = fila;
68
+ if (typeof id !== "string" || id === "")
69
+ continue;
70
+ if (hidden === true)
71
+ continue;
72
+ salida.push({ id, nombre: typeof displayName === "string" && displayName !== "" ? displayName : id });
73
+ }
74
+ return salida;
75
+ }
76
+ /**
77
+ * `codex app-server --stdio`, el mismo camino que ya usa el subagente: `initialize` →
78
+ * `initialized` → `model/list`. JSON por línea, y una línea que no lo sea se descarta —el
79
+ * app-server mezcla trazas suyas por stdout en algunas versiones—.
80
+ */
81
+ async function preguntarACodexDeVerdad() {
82
+ const binario = process.env.CODEX_BIN ?? "codex";
83
+ return new Promise((resolver, rechazar) => {
84
+ const hijo = spawn(binario, ["app-server", "--stdio"], { stdio: ["pipe", "pipe", "pipe"] });
85
+ let acabado = false;
86
+ const acabar = (fn) => {
87
+ if (acabado)
88
+ return;
89
+ acabado = true;
90
+ clearTimeout(tope);
91
+ hijo.kill();
92
+ fn();
93
+ };
94
+ const tope = setTimeout(() => acabar(() => rechazar(new Error("codex no contestó su lista de modelos"))), TOPE_DE_MODELOS_MS);
95
+ const mandar = (m) => void hijo.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", ...m })}\n`);
96
+ hijo.on("error", (error) => acabar(() => rechazar(new Error(error.code === "ENOENT" ? "codex no está instalado" : error.message))));
97
+ hijo.on("close", () => acabar(() => rechazar(new Error("codex terminó sin dar su lista de modelos"))));
98
+ let buffer = "";
99
+ hijo.stdout.on("data", (trozo) => {
100
+ buffer += trozo.toString();
101
+ let corte;
102
+ while ((corte = buffer.indexOf("\n")) >= 0) {
103
+ const linea = buffer.slice(0, corte);
104
+ buffer = buffer.slice(corte + 1);
105
+ if (linea.trim() === "")
106
+ continue;
107
+ let m;
108
+ try {
109
+ m = JSON.parse(linea);
110
+ }
111
+ catch {
112
+ continue;
113
+ }
114
+ if (m.error !== undefined) {
115
+ acabar(() => rechazar(new Error(`codex: ${m.error?.message ?? "error sin mensaje"}`)));
116
+ return;
117
+ }
118
+ if (m.id === 1) {
119
+ mandar({ method: "initialized" });
120
+ mandar({ id: 2, method: "model/list", params: {} });
121
+ continue;
122
+ }
123
+ if (m.id === 2) {
124
+ const modelos = modelosDeRespuestaDeCodex(m.result);
125
+ acabar(() => resolver(modelos));
126
+ return;
127
+ }
128
+ }
129
+ });
130
+ mandar({
131
+ id: 1,
132
+ method: "initialize",
133
+ params: {
134
+ clientInfo: { name: "xonecode", title: "xonecode", version: "0.5.0" },
135
+ capabilities: { experimentalApi: false, requestAttestation: false },
136
+ },
137
+ });
138
+ });
139
+ }
140
+ /**
141
+ * Los modelos de OpenCode: se los pregunta a él con `opencode models`.
142
+ *
143
+ * Una línea por modelo, con la forma `proveedor/id` — que es exactamente lo que su campo
144
+ * `model` de configuración espera, así que no hay que componer nada. Se le pregunta en vez de
145
+ * escribir una tabla por el mismo motivo que a Codex: su catálogo cambia con cada versión y
146
+ * con las credenciales que el usuario tenga, y una lista a mano produciría un modelo que el
147
+ * usuario elige y el hijo rechaza.
148
+ *
149
+ * No hace falta ni servidor ni sesión: es un comando que imprime y termina.
150
+ */
151
+ export function modelosDeSalidaDeOpencode(salida) {
152
+ const vistos = new Set();
153
+ const modelos = [];
154
+ for (const cruda of salida.split("\n")) {
155
+ const linea = cruda.trim();
156
+ // Solo `proveedor/id`: el comando puede imprimir cabeceras o avisos, y una línea que no
157
+ // tenga esa forma no es un modelo que se pueda poner en la configuración.
158
+ if (!/^[A-Za-z0-9._-]+\/[A-Za-z0-9._:-]+$/.test(linea))
159
+ continue;
160
+ if (vistos.has(linea))
161
+ continue;
162
+ vistos.add(linea);
163
+ modelos.push({ id: linea, nombre: linea });
164
+ }
165
+ return modelos;
166
+ }
167
+ async function preguntarAOpencodeDeVerdad() {
168
+ const binario = process.env.OPENCODE_BIN ?? "opencode";
169
+ return new Promise((resolver, rechazar) => {
170
+ let hijo;
171
+ try {
172
+ hijo = spawn(binario, ["models"], { stdio: ["ignore", "pipe", "pipe"] });
173
+ }
174
+ catch {
175
+ rechazar(new Error("opencode no está instalado"));
176
+ return;
177
+ }
178
+ let salida = "";
179
+ let cerrado = false;
180
+ const acabar = (que) => {
181
+ if (cerrado)
182
+ return;
183
+ cerrado = true;
184
+ clearTimeout(tope);
185
+ hijo.kill();
186
+ que();
187
+ };
188
+ const tope = setTimeout(() => acabar(() => rechazar(new Error("opencode no contestó su lista de modelos"))), TOPE_DE_MODELOS_MS);
189
+ hijo.on("error", (error) => acabar(() => rechazar(new Error(error.code === "ENOENT" ? "opencode no está instalado" : error.message))));
190
+ hijo.stdout?.on("data", (t) => {
191
+ salida += t.toString();
192
+ });
193
+ hijo.on("close", () => acabar(() => {
194
+ const modelos = modelosDeSalidaDeOpencode(salida);
195
+ // Una lista vacía se dice, no se devuelve como éxito: un desplegable vacío sin motivo
196
+ // se lee como que la ventana está rota.
197
+ if (modelos.length === 0)
198
+ rechazar(new Error("opencode no dio ninguna lista de modelos"));
199
+ else
200
+ resolver(modelos);
201
+ }));
202
+ });
203
+ }
204
+ //# sourceMappingURL=modelosDeMotor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelosDeMotor.js","sourceRoot":"","sources":["../../src/agent/modelosDeMotor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AASlF,uFAAuF;AACvF,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AASzC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,OAA8B,EAAE;IAEhC,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAC5B,qFAAqF;QACrF,iDAAiD;QACjD,OAAO,EAAE,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;IAC7E,CAAC;IACD,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACtE,MAAM,SAAS,GACb,KAAK,KAAK,UAAU;QAClB,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,IAAI,0BAA0B,CAAC;QACzD,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,IAAI,uBAAuB,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,EAAE,EAAE,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oFAAoF;QACpF,0EAA0E;QAC1E,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACxF,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAkB;IAC1D,MAAM,KAAK,GAAI,SAAmD,EAAE,IAAI,CAAC;IACzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QACxD,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAiE,CAAC;QACtG,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QAClD,IAAI,MAAM,KAAK,IAAI;YAAE,SAAS;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,uBAAuB;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC;IACjD,OAAO,IAAI,OAAO,CAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5F,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,EAAc,EAAQ,EAAE;YACtC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,EAAE,EAAE,CAAC;QACP,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAE9H,MAAM,MAAM,GAAG,CAAC,CAAU,EAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAI,CAAY,EAAE,CAAC,IAAI,CAAC,CAAC;QACxH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE,CAChD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CACvG,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvG,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,KAAa,CAAC;YAClB,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACrC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACjC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;oBAAE,SAAS;gBAClC,IAAI,CAAkE,CAAC;gBACvE,IAAI,CAAC;oBACH,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAa,CAAC;gBACpC,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC;oBACvF,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;oBAClC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;oBACpD,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,OAAO,GAAG,yBAAyB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBACpD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;oBAChC,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC;YACL,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE;gBACN,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE;gBACrE,YAAY,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE;aACpE;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,wFAAwF;QACxF,0EAA0E;QAC1E,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS;QACjE,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QAChC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,0BAA0B;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,UAAU,CAAC;IACvD,OAAO,IAAI,OAAO,CAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE;QACzD,IAAI,IAA8B,CAAC;QACnC,IAAI,CAAC;YACH,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,GAAe,EAAQ,EAAE;YACvC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,GAAG,EAAE,CAAC;QACR,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,UAAU,CACrB,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC,EACnF,kBAAkB,CACnB,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE,CAChD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAC1G,CAAC;QACF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YACpC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CACpB,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClD,sFAAsF;YACtF,wCAAwC;YACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;;gBACrF,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * El paquete que se sube a un dispositivo: el ZIP del proyecto, montado EN MEMORIA.
3
+ *
4
+ * El nombre `debug_app_update.zip` es el de la query del endpoint de hotswap, no el de un
5
+ * fichero temporal: aquí no se escribe nada en disco. Son los bytes que se le pasan al
6
+ * `file_upload`, y por eso el recorrido es síncrono y sin puertos — no hay red, no hay
7
+ * simulador y `npm test` puede montar un proyecto de mentira en un temporal.
8
+ *
9
+ * Las reglas del filtro, y las que se REUTILIZAN en vez de reescribirse:
10
+ *
11
+ * - **`.xonecode/**` y `.git/**` los corta `puedeLeerRuta`** (`agent/perfiles.ts`), la
12
+ * misma barrera que usan las tools propias y el lector de la pestaña Ficheros. Un
13
+ * segundo `startsWith` aquí sería el segundo sitio donde esa regla puede dejar de estar.
14
+ * - **La basura del SO también sale, con la misma constante que la de git**
15
+ * (`BASURA_DEL_SO`): el motivo, abajo, en `nombreQueNoViaja`.
16
+ * - **Las vistas aplanadas SÍ entran.** Lo que `esVistaAplanada` protege es el fichero que
17
+ * el agente puede EDITAR —el `.xne` es la fuente, el `.xml` lo regenera XOne Studio—,
18
+ * no lo que la app necesita tener al lado en el dispositivo. Filtrarlas aquí dejaría la
19
+ * app rota por un fichero que el framework espera encontrar.
20
+ * - **`bd/` no viaja, y no es por ahorrar: es por no romper nada.** Tres razones, la
21
+ * primera medida en este repo: (1) `bd/gestion.db` lo genera el simulador FUERA de
22
+ * xonecode —lo que hay en el proyecto es la copia de haberlo arrancado aquí, no la
23
+ * fuente—; (2) la base del dispositivo va cifrada con SQLCipher, así que subir un `.db`
24
+ * en claro termina en `database disk image is malformed (code 11)`; y (3) **el ZIP no
25
+ * limpia el destino** —añade y sobrescribe—, de modo que los `-wal`/`-shm` de la base
26
+ * vieja se quedan ahí y mezclar dos bases deja un estado que la app descubre al
27
+ * arrancar. La app que se prueba **ya tiene su base en el dispositivo**: lo que se
28
+ * despliega es el código, no los datos. Por eso el tope por NOMBRE —`*.db` y sus
29
+ * auxiliares, `db.key`— vale en cualquier carpeta y no solo dentro de `bd/`: una base
30
+ * suelta en `files/` es la misma base.
31
+ */
32
+ import { lstatSync, readFileSync, readdirSync } from "node:fs";
33
+ import { join } from "node:path";
34
+ import { zipSync } from "fflate";
35
+ import { BASURA_DEL_SO } from "./gitSync.js";
36
+ import { puedeLeerRuta } from "./perfiles.js";
37
+ /** Bytes a partir de los cuales el endpoint contesta `413` y no se sube nada. */
38
+ export const TOPE_DE_PAQUETE = 512 * 1024 * 1024;
39
+ /**
40
+ * Nivel de deflate. El 6 y no el 9: lo que más pesa en un proyecto XOne son las imágenes,
41
+ * y un PNG o un JPG no comprimen mejor con más esfuerzo —el 9 se gasta segundos de CPU en
42
+ * intentarlo delante de una persona que acaba de pulsar «subir»—.
43
+ */
44
+ const NIVEL_DE_COMPRESION = 6;
45
+ /** La fecha más antigua que el formato ZIP sabe escribir (ver `fechaDelZip`). */
46
+ const FECHA_MINIMA_DEL_ZIP = Date.UTC(1980, 0, 1);
47
+ /** El `.db` de SQLite y sus dos auxiliares del WAL y el `journal` de rollback. */
48
+ const BASE_SQLITE = /\.db(-wal|-shm|-journal)?$/i;
49
+ /**
50
+ * Los nombres que no viajan aunque estén sueltos, fuera de `bd/`.
51
+ *
52
+ * **La basura del SO es LA MISMA constante que usa la exclusión de git** (`BASURA_DEL_SO`,
53
+ * `agent/gitSync.ts`), no una copia con los tres nombres escritos otra vez: una segunda
54
+ * lista divergiría el día que se añada el cuarto, y ese día el fichero del Finder volvería
55
+ * a colarse —en el repo o en la app del cliente, según cuál de las dos se actualizara—.
56
+ *
57
+ * Y aquí hace más falta que allí, si cabe: el ZIP aterriza en `app_<nombre>/` **del
58
+ * dispositivo**, así que un `.DS_Store` que entre no se queda en una carpeta de trabajo,
59
+ * se despliega en la app del cliente. Es la misma razón por la que el repo lo saca del
60
+ * índice —`.gitignore` es un fichero del proyecto y subirlo acaba igual— aplicada al
61
+ * paquete en vez de al repo.
62
+ */
63
+ function nombreQueNoViaja(nombre) {
64
+ if (BASE_SQLITE.test(nombre) || nombre === "db.key")
65
+ return true;
66
+ return BASURA_DEL_SO.includes(nombre);
67
+ }
68
+ /**
69
+ * Si una ruta del proyecto viaja al dispositivo. Se pregunta por la ruta VIRTUAL —con `/`
70
+ * delante y relativa a la raíz—, que es la forma que esperan `puedeLeerRuta`,
71
+ * `arbolDeProyecto` y `escrituraExterna`.
72
+ *
73
+ * Vale para ficheros Y para carpetas, y ahí está lo único que hay que saber: una carpeta
74
+ * que no viaja se PODA entera. Filtrar hojas una a una dejaría entrar
75
+ * `datos.db/informe.xml` —el nombre del fichero no dice nada de la carpeta que lo
76
+ * contiene—, y recorrer `.git/` entero para tirar sus miles de objetos de uno en uno es
77
+ * trabajo tirado. La regla es la misma en los dos sitios a propósito: un segundo predicado
78
+ * para carpetas sería el sitio donde los dos criterios divergen sin que nadie lo note.
79
+ *
80
+ * Y una carpeta que se queda SIN nada dentro no deja rastro: el ZIP solo lleva entradas
81
+ * de FICHERO, así que un `doc/` con un `.DS_Store` dentro desaparece entero —igual que
82
+ * `bd/`, cuyos ficheros caen todos por su nombre— en vez de quedar como una carpeta vacía
83
+ * que nadie pidió. Al extraer, cada entrada crea sus carpetas padre, como en
84
+ * `extraerZipBase64`.
85
+ */
86
+ function viaja(virtual) {
87
+ if (!puedeLeerRuta(virtual))
88
+ return false; // /.env, /.git, /.xonecode
89
+ const partes = virtual.split("/").slice(1); // sin el "/" inicial
90
+ if (partes[0] === "bd")
91
+ return false;
92
+ return !nombreQueNoViaja(partes[partes.length - 1] ?? "");
93
+ }
94
+ /**
95
+ * El recorrido, modelado en `ficherosDelProyecto` (`agent/turnoReal.ts`): `readdirSync`
96
+ * por nombres y `lstatSync` por entrada. `lstat` y no `stat` porque **no se sigue ningún
97
+ * enlace simbólico**: el paquete lo lee el disco de verdad (`readFileSync`), así que un
98
+ * enlace que apunte fuera del proyecto metería en el ZIP un fichero que el proyecto no
99
+ * tiene —la lección de `virtualMode: true` y el `dir-fuera/id_rsa` que ya se midió en la
100
+ * pestaña Ficheros—. Al no seguirlos tampoco hay ciclos que temer, y no se pierde nada: el
101
+ * destino de un enlace de dentro ya viaja por su nombre real.
102
+ *
103
+ * Se filtra ANTES de mirar la entrada: lo que no viaja ni se lista, y así `.xonecode/`
104
+ * —cientos de megas de checkpoints— no se recorre para nada.
105
+ */
106
+ function recorrer(directorio, prefijo, salida) {
107
+ // Sin `try`: un proyecto que no se puede leer no se empaqueta. Tragares el error sería
108
+ // subir un paquete incompleto y no decirlo, que es peor que fallar.
109
+ for (const nombre of readdirSync(directorio)) {
110
+ const ruta = prefijo === "" ? nombre : `${prefijo}/${nombre}`;
111
+ if (!viaja(`/${ruta}`))
112
+ continue;
113
+ const info = lstatSync(join(directorio, nombre));
114
+ if (info.isDirectory()) {
115
+ recorrer(join(directorio, nombre), ruta, salida);
116
+ continue;
117
+ }
118
+ if (!info.isFile())
119
+ continue; // enlaces, sockets, FIFOs: no hay bytes que subir
120
+ salida.push({ ruta, absoluta: join(directorio, nombre), bytes: info.size, mtime: info.mtimeMs });
121
+ }
122
+ }
123
+ /**
124
+ * La fecha que se escribe en el ZIP. **Sin esto `fflate` estampa `Date.now()`** —«Defaults
125
+ * to the current time», dice su tipo—, así que el mismo árbol daría bytes distintos en
126
+ * cada ejecución. Y el test que vigila eso no lo vería siempre: el formato DOS guarda los
127
+ * segundos partidos por dos, de modo que dos ejecuciones dentro de la misma ventana de dos
128
+ * segundos salen idénticas y la siguiente no. La mtime del fichero es el sustituto
129
+ * honesto: es un dato que existe y no depende de cuándo se llamó.
130
+ *
131
+ * El suelo de 1980 no es un redondeo: por debajo de esa fecha `fflate` lanza `date not in
132
+ * range 1980-2099` sin decir de qué fichero, y una mtime a 0 —la que dejan algunas
133
+ * herramientas al extraer— convertiría la subida entera en un error incomprensible.
134
+ */
135
+ function fechaDelZip(mtime) {
136
+ return Math.max(mtime, FECHA_MINIMA_DEL_ZIP);
137
+ }
138
+ /**
139
+ * Un tamaño en MB con un decimal y en coma: es una cifra que lee una persona.
140
+ *
141
+ * Se EXPORTA porque la línea del recorrido de lanzamiento enseña los mismos tamaños
142
+ * (`lanzamientoEnMaquina.ts`): un segundo formateador allí diría `12.3 MB` donde aquí se dice
143
+ * `12,3 MB`, y dos formatos para la misma cifra enseñan a desconfiar de los dos.
144
+ */
145
+ export function enMegas(bytes) {
146
+ return `${(bytes / (1024 * 1024)).toFixed(1).replace(".", ",")} MB`;
147
+ }
148
+ /**
149
+ * Los bytes del paquete. El `tope` entra por parámetro para poder probar el rechazo sin
150
+ * fabricar medio giga —el mismo recurso que el reloj de `MS_ENTRE_PARCIALES`—: un tope
151
+ * que solo se puede ejercitar con 512 MB de verdad es un tope que nadie prueba.
152
+ */
153
+ export function empaquetarProyecto(raiz, tope = TOPE_DE_PAQUETE) {
154
+ const candidatos = [];
155
+ recorrer(raiz, "", candidatos);
156
+ // El orden lo fija la RUTA, y el ZIP se escribe en el orden en que recibe sus entradas:
157
+ // sin esto el mismo árbol daría bytes distintos en cada ejecución y dos paquetes iguales
158
+ // parecerían dos despliegues distintos. Es `sort` a secas —orden de code units, igual en
159
+ // cualquier máquina— y no el `ordenarRutas` del árbol de la web, que usa un
160
+ // `Intl.Collator` para poner carpetas antes que ficheros: eso es una regla de
161
+ // PRESENTACIÓN, y un collator que cambia con la versión de ICU sería una fuente de bytes
162
+ // distintos que nadie sabría de dónde viene.
163
+ candidatos.sort((a, b) => (a.ruta < b.ruta ? -1 : a.ruta > b.ruta ? 1 : 0));
164
+ const total = candidatos.reduce((suma, c) => suma + c.bytes, 0);
165
+ if (total > tope) {
166
+ // Se mira ANTES de leer: el recorrido solo ha mirado cabeceras, así que el tamaño del
167
+ // mensaje es el real y no el de un corte a medias —y no se pide un giga de memoria
168
+ // para acabar diciendo que no—.
169
+ throw new Error(`el proyecto ocupa ${enMegas(total)} y el paquete admite ${enMegas(tope)}: no se sube nada`);
170
+ }
171
+ const entradas = {};
172
+ for (const c of candidatos) {
173
+ entradas[c.ruta] = [readFileSync(c.absoluta), { mtime: fechaDelZip(c.mtime) }];
174
+ }
175
+ return {
176
+ bytes: zipSync(entradas, { level: NIVEL_DE_COMPRESION }),
177
+ ficheros: candidatos.map((c) => c.ruta),
178
+ total,
179
+ };
180
+ }
181
+ //# sourceMappingURL=paqueteDelProyecto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paqueteDelProyecto.js","sourceRoot":"","sources":["../../src/agent/paqueteDelProyecto.ts"],"names":[],"mappings":"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"}