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
+ * La `Consola` (`cli/consola.ts:38`) alimentada por el navegador: la MISMA que implementan
3
+ * stdio y la TUI, con el SSE como salida y `POST /accion` como entrada. El lazo de
4
+ * `correrConsola`, los comandos de barra y el motor de turno no se enteran de que hay una
5
+ * web al otro lado — es una piel más.
6
+ *
7
+ * **La aprobación es fail-closed POR TRANSPORTE, y ese es el motivo de existir de este
8
+ * fichero.** En la TUI el fail-closed es por TECLA (solo `s`/`S` aprueba; `n`, Enter,
9
+ * Escape, Ctrl-C y desmontar sin responder son rechazo). Aquí las formas de fallar son
10
+ * otras y son más: el SSE se cae, la pestaña se cierra, el plazo expira, llega una
11
+ * decisión ilegible, llega una respuesta que solo cubre parte de los pendientes, o no
12
+ * llega nunca nada. Ninguna de esas tiene rama propia: el mapa de decisiones **nace
13
+ * rechazado entero** y una entrada solo se ASCIENDE con una aprobación explícita para ese
14
+ * id. Así no existe camino que deje un pendiente sin rechazar — no hay que acordarse de
15
+ * cubrirlos, porque el valor por omisión ya los cubre.
16
+ *
17
+ * **Aquí NO se llama a `interpretAnswer`**, y no es un descuido. Esa función interpreta
18
+ * TEXTO QUE TECLEA UN HUMANO: todo lo que la hace sutil —el conjunto `{s, si, sí, y, yes}`,
19
+ * el corte entre TTY y no-TTY, el Enter a secas valiendo por un sí— va de teclear. Por este
20
+ * socket no llega texto tecleado: llega el enum `Decision["type"]` que el propio pendiente
21
+ * declara en `decisionesPermitidas`, porque el cliente son botones. Un enum no tiene nada
22
+ * que interpretar. Traducirlo a `"s"` para hacerle pasar por `interpretAnswer` no aportaba
23
+ * ni un bit de decisión —el predicado de aquí abajo ya la había tomado— y engañaba a quien
24
+ * auditara: leería `interpretAnswer` y creería que el vocabulario aceptado es `{s, si, sí,
25
+ * y, yes}`, cuando es exactamente `"approve"`. Y ataba este fichero a que `"s"` siguiera
26
+ * dentro de `APPROVALS_NO_TTY`. El fail-closed no se mueve un milímetro por esto: vive en
27
+ * el prellenado del mapa, no en quién compara la cadena.
28
+ */
29
+ import { crearPielWeb } from "./pielWeb.js";
30
+ import { crearTransporte } from "./transporte.js";
31
+ import { CatalogoModelosEnMemoria } from "../../core/ports.js";
32
+ import { REJECT_MESSAGE } from "../../vendor/hitl.js";
33
+ /**
34
+ * Plazo de TODO lo que espera a un humano: la aprobación, la pregunta de texto libre, el
35
+ * secreto y la selección. Generoso porque al otro lado hay una persona leyendo un diff, y
36
+ * corto comparado con «para siempre»: un turno que se queda esperando a una pestaña que ya
37
+ * nadie mira bloquea la sesión entera. Vencer es RECHAZAR (o contestar cadena vacía, o
38
+ * cancelar, que aguas abajo es lo mismo), y un rechazo se puede volver a pedir; una
39
+ * aprobación por cansancio, no.
40
+ *
41
+ * Es UN plazo y no cuatro porque las cuatro esperas son la misma espera —una persona que
42
+ * decide— y cuatro números distintos serían cuatro cosas que mantener de acuerdo sin ninguna
43
+ * razón que las separe.
44
+ */
45
+ const MS_DE_ESPERA_POR_OMISION = 10 * 60_000;
46
+ function comoRegistro(mapa) {
47
+ return Object.fromEntries(mapa);
48
+ }
49
+ /**
50
+ * Una espera de humano, con plazo. Las tres —la pregunta de texto libre, el secreto y la
51
+ * selección— son la MISMA espera, y por eso comparten función en vez de tres copias: con la
52
+ * pestaña abierta ninguna vencía, y el lazo de `correrConsola` se quedaba `await`-ado ahí
53
+ * dentro para siempre. Y no son hipotéticas: `/modelos`, `/themes` y `/provider` llegan a
54
+ * `seleccionar` y a `leerSecreto` desde el compositor, con el registro de comandos que este
55
+ * mismo servidor manda por el cable.
56
+ *
57
+ * `alVencer` es lo que cada una responde ya al desconectarse (cadena vacía, o `undefined`
58
+ * para cancelar el selector): vencer y quedarse sin cliente son la misma respuesta, porque
59
+ * en los dos casos no hay nadie contestando.
60
+ *
61
+ * La trampa que obliga a sacar el resolutor de la cola: `cola` es FIFO, así que uno muerto
62
+ * en cabeza se comería la respuesta de la espera SIGUIENTE —que sí está viva— y la dejaría
63
+ * colgada hasta su propio plazo.
64
+ */
65
+ function esperarAUnHumano(cola, alVencer, ms) {
66
+ return new Promise((resuelto) => {
67
+ const responder = (valor) => {
68
+ clearTimeout(temporizador);
69
+ resuelto(valor);
70
+ };
71
+ const temporizador = setTimeout(() => {
72
+ const indice = cola.indexOf(responder);
73
+ if (indice >= 0)
74
+ cola.splice(indice, 1);
75
+ resuelto(alVencer);
76
+ }, ms);
77
+ cola.push(responder);
78
+ });
79
+ }
80
+ export function crearConsolaWeb(opciones = {}) {
81
+ const msDeEspera = opciones.msDeEspera ?? MS_DE_ESPERA_POR_OMISION;
82
+ // El transcript FUSIONADO: lo que pinta la piel del turno y lo que escriben los
83
+ // comandos de barra, en el orden en que ocurrió. La piel lleva su propia lista; aquí se
84
+ // guarda dónde cayó su último acto para poder sustituirlo cuando se ACTUALIZA.
85
+ const actos = [];
86
+ const pielWeb = crearPielWeb(undefined, opciones.consumoAcumulado);
87
+ const transporte = crearTransporte(() => actos);
88
+ let actosDePiel = 0;
89
+ let indiceDelUltimoDePiel = -1;
90
+ const anotar = (acto) => {
91
+ actos.push(acto);
92
+ transporte.emitir({ clase: "acto", acto });
93
+ };
94
+ pielWeb.alActo((acto) => {
95
+ // `alActo` avisa de altas Y de actualizaciones: el cierre de una racha de tools
96
+ // sustituye a su apertura dentro del mismo acto. Distinguirlas por la LONGITUD de la
97
+ // lista de la piel es lo que hace que el cliente no acabe con las dos líneas.
98
+ const total = pielWeb.actos().length;
99
+ if (total > actosDePiel || indiceDelUltimoDePiel < 0) {
100
+ actosDePiel = total;
101
+ indiceDelUltimoDePiel = actos.length;
102
+ actos.push(acto);
103
+ transporte.emitir({ clase: "acto", acto });
104
+ return;
105
+ }
106
+ actos[indiceDelUltimoDePiel] = acto;
107
+ if (indiceDelUltimoDePiel === actos.length - 1) {
108
+ transporte.emitir({ clase: "sustitucion", acto });
109
+ return;
110
+ }
111
+ // Un `escribir` se coló detrás del grupo: «sustituye el último» tocaría el acto
112
+ // equivocado en el cliente, así que se le manda el transcript entero.
113
+ transporte.emitir({ clase: "reemision", actos: [...actos] });
114
+ });
115
+ // La cola de `lineas`. Si nadie espera todavía, la línea aguarda en `cola`; si hay un
116
+ // `next` colgado, se despierta. `cerrada` es EOF: agota el iterador en vez de colgarlo.
117
+ const cola = [];
118
+ const esperandoLinea = [];
119
+ let cerrada = false;
120
+ // Colas FIFO de quien espera respuesta. Son colas y no una ranura única porque dos
121
+ // preguntas encadenadas (el alta de proyecto las hace) no pueden pisarse.
122
+ const esperandoTexto = [];
123
+ const esperandoSecreto = [];
124
+ const esperandoSeleccion = [];
125
+ let aprobacionEnVuelo;
126
+ // Sin cliente, TODO el que espera responde lo que responde un readline cerrado: cadena
127
+ // vacía (o `undefined`, que es cancelar el selector). Medido en el e2e de un pipe que se
128
+ // agota a mitad de turno: `aprobar.ts` ya trata esa cadena vacía como rechazo.
129
+ transporte.alDesconectar(() => {
130
+ while (esperandoTexto.length > 0)
131
+ esperandoTexto.shift()("");
132
+ while (esperandoSecreto.length > 0)
133
+ esperandoSecreto.shift()("");
134
+ while (esperandoSeleccion.length > 0)
135
+ esperandoSeleccion.shift()(undefined);
136
+ aprobacionEnVuelo?.terminar();
137
+ });
138
+ const consola = {
139
+ interactivo: true,
140
+ lineas: {
141
+ [Symbol.asyncIterator]() {
142
+ return {
143
+ next: () => {
144
+ if (cola.length > 0)
145
+ return Promise.resolve({ value: cola.shift(), done: false });
146
+ if (cerrada)
147
+ return Promise.resolve({ value: undefined, done: true });
148
+ return new Promise((resuelto) => esperandoLinea.push(resuelto));
149
+ },
150
+ };
151
+ },
152
+ },
153
+ /**
154
+ * Sin cliente no hay humano, y decirlo aquí NO es redundante con `aprobacionesTui`.
155
+ * `pedirDecisiones` calcula lo interactivo como `interactive && !eof()`, o sea que
156
+ * «ausente» significa «hay alguien» — la dirección insegura. Y esta piel es la única
157
+ * que cumple las DOS precondiciones de la fuga que arregló `crearDetectorDeEof`:
158
+ * `interactivo: true` y un `preguntar` que devuelve cadena vacía al desconectarse, que
159
+ * con TTY aprueba. Hoy no llega ahí porque `main.ts` prefiere `aprobacionesTui` cuando
160
+ * existe; eso es dónde cae un `if`, no un diseño, y otra tarea puede moverlo sin
161
+ * enterarse. Esto es la red debajo.
162
+ */
163
+ eof: () => !transporte.conectado(),
164
+ escribir: (texto) => {
165
+ // El guard cubre whitespace, no solo la cadena vacía: un `escribir("\n")` (la forma
166
+ // de «línea sin contenido») partía en un acto sistema vacío — medido en la TUI.
167
+ if (texto.trim() === "")
168
+ return;
169
+ // Un chunk puede traer varias líneas (los comandos escriben bloques): cada una es un
170
+ // acto, como lo sería en el scrollback de stdio.
171
+ for (const linea of texto.replace(/\n$/, "").split("\n"))
172
+ anotar({ tipo: "sistema", texto: linea });
173
+ },
174
+ /**
175
+ * Una operación de sincronización entera, ya contada por `/sync`, al registro de la sesión.
176
+ *
177
+ * Es la ÚNICA piel que la implementa, y por eso `/sync` aquí no escribe ni una línea por
178
+ * `escribir`: el recorrido de una subida —el plan, el `→ APROBADO`, las cuentas, las
179
+ * negativas— no es una mitad de conversación, es un suceso del proyecto, y en el hilo eran
180
+ * nueve renglones de consola cruda entre dos mensajes de verdad. Va como ACTO porque el
181
+ * acto es lo que ya viaja, se pinta y se persiste en el `.jsonl` de la sesión: el registro
182
+ * que pide Revisión sale de ahí sin inventar un mensaje nuevo del cable, un fichero nuevo ni
183
+ * un campo nuevo en el índice.
184
+ */
185
+ anotarSincronizacion: (operacion) => {
186
+ anotar({ tipo: "sincronizacion", ...operacion });
187
+ },
188
+ preguntar: async (pregunta, decision) => {
189
+ // El enunciado queda en el transcript, como el prompt de stdio; la RESPUESTA no
190
+ // pasa por aquí.
191
+ //
192
+ // **Salvo cuando la pregunta es una DECISIÓN**, y ahí no se anota. El enunciado de una
193
+ // decisión no es una mitad de conversación: es el título de un diálogo —`Pregunta.tsx`
194
+ // lo pinta con el plan y dos botones— y viaja entero en el mensaje `pregunta`. Anotarlo
195
+ // además dejaba en el hilo justo lo que la banda de la sincronización ya no escribe:
196
+ // medido, el «¿Subir a CloudStudio?» era la última línea de una subida que se colaba
197
+ // entre dos mensajes de verdad. La pregunta de texto libre y el secreto SÍ se anotan:
198
+ // ahí el enunciado es el rótulo de un campo que se contesta dentro del hilo, y sin él
199
+ // quedaría una respuesta sin pregunta.
200
+ if (decision === undefined)
201
+ anotar({ tipo: "sistema", texto: pregunta });
202
+ if (!transporte.conectado())
203
+ return "";
204
+ // El MISMO plazo que `aprobacionesTui`, que era el único que lo tenía: la pregunta de
205
+ // texto libre la ponen `politicaInteractiva` antes de subir y `/connect-studio` sin
206
+ // URL, y sin plazo colgaban la sesión web entera. Cadena vacía al vencer, que es lo
207
+ // que `interpretAnswer` trata como rechazo.
208
+ const espera = esperarAUnHumano(esperandoTexto, "", msDeEspera);
209
+ // La FORMA viaja con la pregunta, o no viaja: `decision` ausente es una pregunta de
210
+ // texto libre y el cliente le pone su campo. No se manda un `{lineas: []}` — una
211
+ // decisión sin plan no es una pregunta abierta, y una pregunta abierta con una lista
212
+ // vacía es la que ofrecería dos botones sobre algo que hay que escribir.
213
+ transporte.emitir(decision === undefined
214
+ ? { clase: "pregunta", texto: pregunta }
215
+ : { clase: "pregunta", texto: pregunta, decision });
216
+ return espera;
217
+ },
218
+ leerSecreto: async (pregunta) => {
219
+ // Solo la PREGUNTA entra en el transcript. El valor viaja del navegador a quien
220
+ // llamó y a ningún sitio más: ni acto, ni traza de emisión, ni sesión en disco.
221
+ anotar({ tipo: "sistema", texto: pregunta });
222
+ if (!transporte.conectado())
223
+ return "";
224
+ const espera = esperarAUnHumano(esperandoSecreto, "", msDeEspera);
225
+ transporte.emitir({ clase: "secreto", pregunta });
226
+ return espera;
227
+ },
228
+ seleccionar: async (selector) => {
229
+ if (!transporte.conectado())
230
+ return undefined;
231
+ const espera = esperarAUnHumano(esperandoSeleccion, undefined, msDeEspera);
232
+ transporte.emitir({ clase: "selector", selector });
233
+ return espera;
234
+ },
235
+ piel: () => pielWeb.piel,
236
+ aprobacionesTui: (pendientes, ficheros, diffs) => {
237
+ // El mapa NACE rechazado entero. Todo lo que sigue solo puede ascender entradas.
238
+ const decisiones = new Map(pendientes.map((p) => [p.id, { type: "reject", message: REJECT_MESSAGE }]));
239
+ if (!transporte.conectado())
240
+ return Promise.resolve(decisiones);
241
+ return new Promise((resuelto) => {
242
+ const temporizador = setTimeout(() => enVuelo.terminar(), msDeEspera);
243
+ const enVuelo = {
244
+ decisiones,
245
+ pendientes: new Map(pendientes.map((p) => [p.id, p])),
246
+ // El ÚNICO mensaje con contenido de fichero y diff. `transporte.emitir` no lo
247
+ // anota en su traza: vive aquí y solo mientras se decide.
248
+ mensaje: {
249
+ clase: "aprobacion",
250
+ pendientes,
251
+ ficheros: comoRegistro(ficheros),
252
+ diffs: comoRegistro(diffs),
253
+ },
254
+ terminar: () => {
255
+ clearTimeout(temporizador);
256
+ // Soltarlo ANTES de resolver es lo que hace que una decisión tardía no tenga
257
+ // nada que ascender, y que el contenido no sobreviva a la decisión.
258
+ aprobacionEnVuelo = undefined;
259
+ resuelto(decisiones);
260
+ },
261
+ };
262
+ aprobacionEnVuelo = enVuelo;
263
+ transporte.emitir(enVuelo.mensaje);
264
+ });
265
+ },
266
+ // Un catálogo VIVO no se puede inventar: sin uno inyectado queda el doble de
267
+ // `core/ports.ts`, que lleva la marca `ES_DOBLE` y por tanto `describe` lo delata.
268
+ catalogoModelos: opciones.catalogoModelos ?? new CatalogoModelosEnMemoria(),
269
+ // Sin persistencia inyectada esto NO puede fingir que guardó: un no-op silencioso
270
+ // dejaría al usuario creyendo que su elección quedó escrita.
271
+ guardarModeloGlobal: opciones.guardarModeloGlobal ??
272
+ ((_papel, _id) => {
273
+ throw new Error("consolaWeb sin persistencia: quien la monta debe inyectar guardarModeloGlobal");
274
+ }),
275
+ };
276
+ const recibir = (mensaje) => {
277
+ if (mensaje.clase === "prosa") {
278
+ if (cerrada)
279
+ return;
280
+ // El eco de lo tecleado, como hace la TUI (`store.usuario`): el transcript se lo
281
+ // debe a quien escribió la petición, y de ahí sale el título de la sesión.
282
+ anotar({ tipo: "usuario", texto: mensaje.texto });
283
+ const despertar = esperandoLinea.shift();
284
+ // `comoComando: false` y no una cadena pelada, y esta es TODA la diferencia: aquí
285
+ // escribe una persona, y en el navegador «/» no abre comandos — no hay ninguno al
286
+ // que apunte, porque cada acción tiene su botón. Una prosa que empiece por «/» (una
287
+ // ruta del proyecto, un `/artefactos/…`) viaja al modelo tal cual. Ver
288
+ // `cli/consola.ts#LineaDeConsola`.
289
+ const linea = { texto: mensaje.texto, comoComando: false };
290
+ if (despertar !== undefined)
291
+ despertar({ value: linea, done: false });
292
+ else
293
+ cola.push(linea);
294
+ return;
295
+ }
296
+ if (mensaje.clase === "respuesta") {
297
+ esperandoTexto.shift()?.(mensaje.texto);
298
+ return;
299
+ }
300
+ if (mensaje.clase === "secreto") {
301
+ esperandoSecreto.shift()?.(mensaje.valor);
302
+ return;
303
+ }
304
+ if (mensaje.clase === "eleccion") {
305
+ // La traducción de CANCELAR, y vive solo aquí: sin `id` —o con `null`— el humano se
306
+ // echó atrás, y eso es `undefined`, lo mismo que responden el plazo y la desconexión.
307
+ // Un id vacío o desconocido NO pasa por aquí: es una cadena, se entrega tal cual, y
308
+ // quien llamó descubrirá que no casa con ninguna opción. Confundir las dos cosas
309
+ // convertiría el bug de un cliente en un usuario que dijo «déjalo».
310
+ esperandoSeleccion.shift()?.(typeof mensaje.id === "string" ? mensaje.id : undefined);
311
+ return;
312
+ }
313
+ // Los pasos del alta no son de esta consola: los atiende el vestíbulo desde
314
+ // `web/servidor/arranque.ts`, que los aparta antes de llegar aquí. La guarda existe
315
+ // igual porque este `recibir` es público y lo que no se entiende no puede caer en la
316
+ // rama de aprobación — sería una decisión inventada sobre escrituras reales.
317
+ if (mensaje.clase !== "decision")
318
+ return;
319
+ // Decisión de aprobación.
320
+ const enVuelo = aprobacionEnVuelo;
321
+ if (enVuelo === undefined)
322
+ return;
323
+ // El `try/finally` es el fail-closed llevado hasta el final: pase lo que pase ahí
324
+ // dentro, la aprobación TERMINA con lo que tenga —y lo que tiene es el prellenado de
325
+ // rechazos—. Sin él, un lanzamiento dejaba la aprobación sin resolver hasta que
326
+ // venciera el plazo (diez minutos en producción) y sin forma de reintentar, porque la
327
+ // aprobación no se reemite al reconectar: acababa en rechazo por AGOTAMIENTO en vez de
328
+ // por decisión, que es la misma respuesta contada como si nadie hubiera fallado.
329
+ try {
330
+ // `decisiones` viene de un `JSON.parse` de la red: el tipo es una promesa que el
331
+ // cable no está obligado a cumplir. Medido: `Object.entries(null)` lanza
332
+ // «Cannot convert undefined or null to object» y `{clase:"decision"}` a secas
333
+ // tampoco trae la clave.
334
+ for (const [id, valor] of Object.entries(mensaje.decisiones ?? {})) {
335
+ const pendiente = enVuelo.pendientes.get(id);
336
+ // Un id que no pedimos no puede aprobar nada, y tampoco entra en el mapa: el
337
+ // resume de langgraph se construye con estas claves.
338
+ if (pendiente === undefined)
339
+ continue;
340
+ // La comparación es EXACTA y contra lo que el propio pendiente declara permitido:
341
+ // el cliente son botones, no hay erratas que perdonar, y todo lo demás es rechazo
342
+ // porque el mapa ya nació rechazado.
343
+ if (valor === "approve" && pendiente.decisionesPermitidas.includes("approve")) {
344
+ enVuelo.decisiones.set(id, { type: "approve" });
345
+ }
346
+ }
347
+ }
348
+ finally {
349
+ // Se termina AUNQUE la respuesta sea parcial o basura: los pendientes que no venían
350
+ // siguen rechazados, que es la respuesta correcta a «no me contestaste sobre esto».
351
+ enVuelo.terminar();
352
+ }
353
+ };
354
+ return {
355
+ consola,
356
+ recibir,
357
+ turno: (activo) => transporte.emitir({ clase: "turno", activo }),
358
+ encolar: (linea) => {
359
+ if (cerrada)
360
+ return;
361
+ // `comoComando: true`: esto lo pide un CONTROL, no una persona, y es la vía por la
362
+ // que el servidor sigue aplicando `/modelo …` — o `/sync …` — sin que nadie teclee
363
+ // la sintaxis. Es justo la mitad que «/» perdió en el compositor.
364
+ const encolada = { texto: linea, comoComando: true };
365
+ const despertar = esperandoLinea.shift();
366
+ if (despertar !== undefined)
367
+ despertar({ value: encolada, done: false });
368
+ else
369
+ cola.push(encolada);
370
+ },
371
+ conectar: (enviar) => transporte.conectar(enviar),
372
+ mirar: (enviar) => transporte.mirar(enviar),
373
+ dejarDeMirar: (enviar) => transporte.dejarDeMirar(enviar),
374
+ desconectar: (enviar) => transporte.desconectar(enviar),
375
+ soltar: (enviar) => transporte.soltar(enviar),
376
+ cerrar: () => {
377
+ // Primero el corte —despierta a quien esperaba respuesta— y luego el EOF de la
378
+ // cola, para que `correrConsola` retorne en vez de quedarse en el `next`.
379
+ transporte.desconectar();
380
+ cerrada = true;
381
+ while (esperandoLinea.length > 0)
382
+ esperandoLinea.shift()({ value: undefined, done: true });
383
+ },
384
+ actos: () => actos,
385
+ eventosEmitidos: () => transporte.emitidos(),
386
+ mensajesDeAprobacion: () => (aprobacionEnVuelo === undefined ? [] : [aprobacionEnVuelo.mensaje]),
387
+ };
388
+ }
389
+ //# sourceMappingURL=consolaWeb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolaWeb.js","sourceRoot":"","sources":["../../../src/web/servidor/consolaWeb.ts"],"names":[],"mappings":"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"}