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,90 @@
1
+ /**
2
+ * Eventos que nacen FUERA del flujo del grafo, entrelazados con él.
3
+ *
4
+ * Existe por un silencio medido: un agente EXTERNO (Claude Code) corre en otro proceso, así
5
+ * que ni una de sus tools cruza el stream de langgraph — entre la línea de delegación y su
6
+ * respuesta final hay minutos sin nada que mirar, y una pantalla quieta se lee como que se
7
+ * ha colgado. Lo que hace falta no es una piel nueva: es que su actividad entre por el
8
+ * MISMO sitio que la de todos, para que el colapsador la agrupe igual (`core/notify.ts`),
9
+ * la bitácora la cuente igual y las tres pieles no se enteren de que hay dos orígenes.
10
+ *
11
+ * Es la misma forma que `conVerificacion`: un generador que envuelve a `aEventos`. La
12
+ * diferencia es que aquél añade AL FINAL y este tiene que intercalar MIENTRAS, que es lo
13
+ * único delicado de este fichero.
14
+ */
15
+ /**
16
+ * El buzón por el que se empujan esos eventos. Quien lo llena no sabe nada del flujo, y
17
+ * quien lo vacía no sabe nada de quién lo llena — que es lo que permite que el adaptador
18
+ * del agente externo viva en `agent/` sin conocer el turno.
19
+ */
20
+ export class ColaDeEventos {
21
+ cola = [];
22
+ avisar;
23
+ /** Encola y despierta a quien esté esperando. Nunca bloquea a quien lo llama. */
24
+ empujar(evento) {
25
+ this.cola.push(evento);
26
+ const avisar = this.avisar;
27
+ this.avisar = undefined;
28
+ avisar?.();
29
+ }
30
+ /** Se lleva lo que haya, de una vez. Vacío es una respuesta válida. */
31
+ vaciar() {
32
+ const salida = this.cola;
33
+ this.cola = [];
34
+ return salida;
35
+ }
36
+ /**
37
+ * Una promesa que se resuelve cuando hay algo. Se guarda UN solo resolutor: si hubiera una
38
+ * cola de esperas, la de una vuelta anterior seguiría viva y despertaría de más.
39
+ */
40
+ esperar() {
41
+ if (this.cola.length > 0)
42
+ return Promise.resolve();
43
+ return new Promise((resuelto) => {
44
+ this.avisar = resuelto;
45
+ });
46
+ }
47
+ }
48
+ /**
49
+ * El flujo del grafo más lo que se vaya encolando, en el orden en que ocurre.
50
+ *
51
+ * **La trampa de este fichero, y la razón de que `siguiente` sea una variable:** un
52
+ * `AsyncIterator` no admite dos `next()` vivos a la vez —el segundo se comería un valor o
53
+ * reventaría según la implementación—, así que se pide UNA vez, se guarda la promesa y se
54
+ * vuelve a esperar la MISMA en cada vuelta de la carrera. Solo cuando esa promesa se ha
55
+ * consumido de verdad se pide la siguiente. Volver a llamar a `it.next()` en cada vuelta
56
+ * sería el bug clásico de este patrón: se pierden eventos justo cuando hay actividad en los
57
+ * dos lados, que es cuando esto se usa.
58
+ *
59
+ * Y lo que quede encolado cuando el flujo se agota se dice IGUAL, antes de terminar: un
60
+ * evento que llegó tarde no es un evento que no ocurrió.
61
+ */
62
+ export async function* entrelazar(fuente, cola) {
63
+ const it = fuente[Symbol.asyncIterator]();
64
+ let siguiente = it.next();
65
+ try {
66
+ for (;;) {
67
+ const cual = await Promise.race([
68
+ siguiente.then((r) => ({ de: "fuente", r })),
69
+ cola.esperar().then(() => ({ de: "cola" })),
70
+ ]);
71
+ if (cual.de === "cola") {
72
+ for (const ev of cola.vaciar())
73
+ yield ev;
74
+ continue;
75
+ }
76
+ if (cual.r.done === true)
77
+ break;
78
+ yield cual.r.value;
79
+ siguiente = it.next();
80
+ }
81
+ }
82
+ finally {
83
+ // También si quien consume se va por un `break` o una excepción: el generador de dentro
84
+ // tiene que cerrarse, o el stream de langgraph se queda abierto.
85
+ await it.return?.();
86
+ }
87
+ for (const ev of cola.vaciar())
88
+ yield ev;
89
+ }
90
+ //# sourceMappingURL=entrelazar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entrelazar.js","sourceRoot":"","sources":["../../src/core/entrelazar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;;;GAIG;AACH,MAAM,OAAO,aAAa;IAChB,IAAI,GAAkB,EAAE,CAAC;IACzB,MAAM,CAA2B;IAEzC,iFAAiF;IACjF,OAAO,CAAC,MAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,MAAM,EAAE,EAAE,CAAC;IACb,CAAC;IAED,uEAAuE;IACvE,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,IAAI,OAAO,CAAO,CAAC,QAAQ,EAAE,EAAE;YACpC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,CAC/B,MAAkC,EAClC,IAAmB;IAEnB,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IAC1C,IAAI,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBAC9B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;gBACrD,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAe,EAAE,CAAC,CAAC;aACrD,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;gBACvB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;oBAAE,MAAM,EAAE,CAAC;gBACzC,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI;gBAAE,MAAM;YAChC,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YACnB,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,wFAAwF;QACxF,iEAAiE;QACjE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;IACtB,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,CAAC;AAC3C,CAAC"}
@@ -66,6 +66,14 @@ HideSplash=false
66
66
  // Regla crítica de XOne: aquí SOLO Empresas y Usuarios. Las colecciones de
67
67
  // negocio van en `.xne` separados, y esa es justamente la primera conversación
68
68
  // que el agente puede tener con el usuario sobre su proyecto.
69
+ // `progid` en Empresas y Usuarios, y solo ahí. No viene del Hola Mundo de la documentación
70
+ // —de ahí el resto de este fichero— sino de la regla de las propias skills
71
+ // (`xone-project-generator/references/fases-4-5-estructura-y-configuracion.md`: «progid solo
72
+ // en Empresas y Usuarios; ASGestion.CASEmpresa / ASGestion.CASUser»). Sin él, el simulador
73
+ // rechaza el esqueleto con dos `COLL_MISSING_PROGID` («tiene objname pero falta progid»):
74
+ // medido al pasar por primera vez el proyecto recién creado por `xone-simulator validate`,
75
+ // que es algo que `esqueleto.test.ts` nunca había hecho — comprobaba que el texto coincidía
76
+ // con los docs, no que el proyecto fuera válido.
69
77
  const mappingsXne = `<?xml version="1.0" encoding="utf-8"?>
70
78
  <xml>
71
79
  <app prefix="gen" version="1.0.0" debug="true" default-language="javascript">
@@ -76,6 +84,7 @@ HideSplash=false
76
84
  <coll name="Empresas"
77
85
  sql="SELECT * FROM ##PREF##Empresas"
78
86
  objname="Empresas"
87
+ progid="ASGestion.CASEmpresa"
79
88
  updateobj="Empresas"
80
89
  loadall="true">
81
90
  <group name="General" id="1">
@@ -89,6 +98,7 @@ HideSplash=false
89
98
  <coll name="Usuarios"
90
99
  sql="SELECT * FROM ##PREF##Usuarios"
91
100
  objname="Usuarios"
101
+ progid="ASGestion.CASUser"
92
102
  updateobj="Usuarios"
93
103
  loadall="true">
94
104
  <group name="General" id="1">
@@ -1 +1 @@
1
- {"version":3,"file":"esqueleto.js","sourceRoot":"","sources":["../../src/core/esqueleto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkBH;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAuB;IACtD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAErD,MAAM,MAAM,GAAG;;;;;;qBAMI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;8BACf,WAAW;;;;;;;;;;;;EAYvC,KAAK,CAAC,CAAC,CAAC;;;;;CAKT,CAAC,CAAC,CAAC,EAAE;;;;;CAKL,CAAC;IAEA,MAAM,MAAM,GAAG,QAAQ,MAAM;QACvB,MAAM;UACJ,MAAM;;;;;CAKf,CAAC;IAEA,2EAA2E;IAC3E,+EAA+E;IAC/E,8DAA8D;IAC9D,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCrB,CAAC;IAEA,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DpB,CAAC;IAEA,MAAM,WAAW,GAAG;0BACI,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmC9B,KAAK,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCT,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAEP,MAAM,aAAa,GAAG;iCACS,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BtC,CAAC;IAEA,4EAA4E;IAC5E,0EAA0E;IAC1E,MAAM,gBAAgB,GAAG;;;;;;;;;2BASA,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BhC,CAAC;IAEA,MAAM,QAAQ,GAAY;QACxB,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE;QAChD,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE;QAC9C,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE;QAChD,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE;QACpD,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,gBAAgB,EAAE;KAC3D,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ;IACf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"esqueleto.js","sourceRoot":"","sources":["../../src/core/esqueleto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkBH;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAuB;IACtD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAErD,MAAM,MAAM,GAAG;;;;;;qBAMI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;8BACf,WAAW;;;;;;;;;;;;EAYvC,KAAK,CAAC,CAAC,CAAC;;;;;CAKT,CAAC,CAAC,CAAC,EAAE;;;;;CAKL,CAAC;IAEA,MAAM,MAAM,GAAG,QAAQ,MAAM;QACvB,MAAM;UACJ,MAAM;;;;;CAKf,CAAC;IAEA,2EAA2E;IAC3E,+EAA+E;IAC/E,8DAA8D;IAC9D,2FAA2F;IAC3F,2EAA2E;IAC3E,6FAA6F;IAC7F,2FAA2F;IAC3F,0FAA0F;IAC1F,2FAA2F;IAC3F,4FAA4F;IAC5F,iDAAiD;IACjD,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCrB,CAAC;IAEA,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DpB,CAAC;IAEA,MAAM,WAAW,GAAG;0BACI,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmC9B,KAAK,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCT,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAEP,MAAM,aAAa,GAAG;iCACS,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BtC,CAAC;IAEA,4EAA4E;IAC5E,0EAA0E;IAC1E,MAAM,gBAAgB,GAAG;;;;;;;;;2BASA,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BhC,CAAC;IAEA,MAAM,QAAQ,GAAY;QACxB,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE;QAChD,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE;QAC9C,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE;QAChD,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE;QACpD,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,gBAAgB,EAAE;KAC3D,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ;IACf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BR,CAAC;AACF,CAAC"}
@@ -1,7 +1,201 @@
1
1
  export const PAPELES = ["rapido", "trabajo", "afilado"];
2
+ export const PREFIJO_PERSONALIZADO = "custom:";
3
+ /**
4
+ * El slug de un proveedor personalizado: minúsculas, cifras y guiones.
5
+ *
6
+ * No es cosmética. El slug acaba en tres sitios donde un carácter de más rompe algo: es
7
+ * la segunda mitad de un id que se parte por la PRIMERA barra (así que no puede llevar
8
+ * `/`), es la clave de una entrada de `auth.json`, y de él se deriva el nombre de una
9
+ * variable de entorno (así que no puede llevar `:` ni espacios). Treinta y un caracteres
10
+ * es de sobra para nombrar un servidor.
11
+ */
12
+ const SLUG = /^[a-z0-9][a-z0-9-]{0,30}$/;
13
+ export function motivoDeSlugInaceptable(slug) {
14
+ if (slug === "")
15
+ return "el identificador está vacío";
16
+ if (!SLUG.test(slug)) {
17
+ return "el identificador solo puede llevar minúsculas, cifras y guiones, empezar por letra o cifra y no pasar de 31 caracteres";
18
+ }
19
+ return undefined;
20
+ }
21
+ /**
22
+ * El identificador que le toca a un proveedor por su NOMBRE.
23
+ *
24
+ * Se deriva en vez de pedirse: un tercer campo en el formulario —«nombre», «id», «URL»—
25
+ * solo puede escribirse mal, y quien da de alta «Mi LM Studio» no tiene por qué saber que
26
+ * eso va a acabar siendo un segmento de un id y un trozo del nombre de una variable de
27
+ * entorno. Se quitan los acentos (`NFD` + la marca combinante), lo que no sea letra o
28
+ * cifra pasa a guion, y se recorta a lo que admite `SLUG`.
29
+ *
30
+ * Puede salir vacío —un nombre de solo signos— y entonces devuelve cadena vacía, que
31
+ * `motivoDeSlugInaceptable` rechaza con su motivo: adivinar un id ahí sería inventarlo.
32
+ */
33
+ export function slugDesdeNombre(nombre) {
34
+ return nombre
35
+ .normalize("NFD")
36
+ .replace(/[\u0300-\u036f]/g, "")
37
+ .toLowerCase()
38
+ .replace(/[^a-z0-9]+/g, "-")
39
+ .replace(/^-+|-+$/g, "")
40
+ .slice(0, 31)
41
+ .replace(/-+$/g, "");
42
+ }
43
+ export function esProveedorPersonalizado(valor) {
44
+ return valor.startsWith(PREFIJO_PERSONALIZADO)
45
+ && motivoDeSlugInaceptable(valor.slice(PREFIJO_PERSONALIZADO.length)) === undefined;
46
+ }
47
+ export function slugDeProveedor(proveedor) {
48
+ return proveedor.slice(PREFIJO_PERSONALIZADO.length);
49
+ }
50
+ export function idDeProveedorPersonalizado(slug) {
51
+ return `${PREFIJO_PERSONALIZADO}${slug}`;
52
+ }
53
+ /**
54
+ * Los hosts en los que se admite `http://` sin cifrar.
55
+ *
56
+ * Copiada de `agent/cloudstudioMcp.ts#LOOPBACK`, que es la misma decisión por el mismo
57
+ * motivo, y puesta aquí porque `core/` no puede importar de `agent/` (sí al revés): la
58
+ * regla canónica vive ahora en datos puros y aquel módulo tira de ésta.
59
+ */
60
+ const LOOPBACK = new Set(["127.0.0.1", "localhost", "::1", "[::1]"]);
61
+ /**
62
+ * ¿Vale eso como endpoint? Devuelve el MOTIVO del rechazo, o `undefined` si pasa.
63
+ *
64
+ * La misma regla que la URL de un MCP, y por la misma razón: HTTPS fuera de la máquina,
65
+ * `http://` solo en loopback, y nunca credenciales dentro de la URL —una URL con usuario
66
+ * y contraseña acaba escrita en `config.json` y en cada traza que la enseñe—.
67
+ *
68
+ * Que loopback pase NO es una concesión: es el caso principal. Un LM Studio, un
69
+ * `llama.cpp --server` o un vLLM escuchan en `http://localhost:1234/v1`, y ahí el texto
70
+ * plano no cruza ninguna red — el mismo trato que ya reciben el `redirect_uri` del
71
+ * callback de OAuth y esta propia consola.
72
+ */
73
+ export function motivoDeEndpointInaceptable(valor) {
74
+ let url;
75
+ try {
76
+ url = new URL(valor);
77
+ }
78
+ catch {
79
+ return "eso no es una URL: escribe algo como https://mi-servidor/v1";
80
+ }
81
+ if (url.username !== "" || url.password !== "") {
82
+ return "la URL no puede llevar usuario ni contraseña dentro: la clave se pide aparte";
83
+ }
84
+ if (url.protocol === "https:")
85
+ return undefined;
86
+ if (url.protocol === "http:" && LOOPBACK.has(url.hostname))
87
+ return undefined;
88
+ return "la URL debe ser https — solo se admite http:// en 127.0.0.1 o localhost, para un servidor local";
89
+ }
2
90
  export const PROVEEDORES = [
3
- "gemini", "openai", "anthropic", "ollama",
91
+ "gemini", "openai", "anthropic", "ollama", "ollama-cloud",
92
+ "nvidia", "groq", "xai",
4
93
  ];
94
+ export const COMPATIBLES_OPENAI = {
95
+ nvidia: { baseUrl: "https://integrate.api.nvidia.com/v1", variable: "NVIDIA_API_KEY" },
96
+ groq: { baseUrl: "https://api.groq.com/openai/v1", variable: "GROQ_API_KEY" },
97
+ xai: { baseUrl: "https://api.x.ai/v1", variable: "XAI_API_KEY" },
98
+ };
99
+ /**
100
+ * La variable de entorno donde vive la clave de cada proveedor, y el ÚNICO sitio donde
101
+ * se escribe.
102
+ *
103
+ * Hubo cuatro copias de esta tabla —`agent/configEnDisco.ts`, `agent/catalogoModelos.ts`,
104
+ * `cli/config.ts` y `cli/consola.ts`—, duplicadas para que `cli/` no tirase de `agent/`
105
+ * por un mapa de cuatro líneas. Ya habían divergido: la de `cli/config.ts` no tenía
106
+ * `OLLAMA_API_KEY`, así que `/config` decía «sin credencial» de Ollama Cloud aunque
107
+ * estuviera puesta. Puesta en `core/` —que es datos puros y de donde SÍ pueden tirar los
108
+ * dos lados— el problema desaparece por construcción.
109
+ *
110
+ * `ollama` no está: es local y no necesita clave. Esa ausencia es la misma que declara
111
+ * `SIN_CREDENCIAL`, y hay un test que exige que las dos cuenten lo mismo.
112
+ */
113
+ export const VARIABLES_POR_PROVEEDOR = {
114
+ anthropic: "ANTHROPIC_API_KEY",
115
+ openai: "OPENAI_API_KEY",
116
+ gemini: "GOOGLE_API_KEY",
117
+ "ollama-cloud": "OLLAMA_API_KEY",
118
+ ...Object.fromEntries(Object.entries(COMPATIBLES_OPENAI).map(([proveedor, { variable }]) => [proveedor, variable])),
119
+ };
120
+ /**
121
+ * Cómo se ESCRIBE el nombre de cada proveedor, que no es su id.
122
+ *
123
+ * El id es un identificador —minúsculas, sin espacios, el que se teclea en
124
+ * `/modelo <proveedor>/<modelo>`— y la ventana de Ajustes lo estaba enseñando tal cual:
125
+ * ocho filas diciendo «nvidia», «xai», «ollama-cloud». Un id crudo en una lista para leer
126
+ * es la misma clase de descuido que un `emulator-5554` en la pastilla de dispositivo.
127
+ *
128
+ * Los nombres son los que usa cada casa (NVIDIA en versales, xAI con la x minúscula), no
129
+ * una capitalización automática del id, que daría «Xai» y «Ollama-cloud». El id sigue
130
+ * viajando y sigue viéndose: en la fila va debajo, en mono, porque es dato de máquina.
131
+ */
132
+ const NOMBRES = {
133
+ gemini: "Google Gemini",
134
+ openai: "OpenAI",
135
+ anthropic: "Anthropic",
136
+ ollama: "Ollama",
137
+ "ollama-cloud": "Ollama Cloud",
138
+ nvidia: "NVIDIA",
139
+ groq: "Groq",
140
+ xai: "xAI",
141
+ };
142
+ /**
143
+ * Cómo se escribe un proveedor. Para uno personalizado, el nombre que puso quien lo dio
144
+ * de alta; sin registro —o con un slug que ya no está— se cae a su slug, que es lo único
145
+ * que se puede afirmar: inventarle un nombre sería peor que enseñar el identificador.
146
+ */
147
+ export function nombreDeProveedor(proveedor, declarados = []) {
148
+ if (esProveedorPersonalizado(proveedor)) {
149
+ const slug = slugDeProveedor(proveedor);
150
+ return declarados.find((d) => d.slug === slug)?.nombre ?? slug;
151
+ }
152
+ return NOMBRES[proveedor];
153
+ }
154
+ /**
155
+ * La variable de entorno donde vive la clave de un proveedor.
156
+ *
157
+ * Para los de serie, la tabla. Para uno personalizado se DERIVA del slug
158
+ * (`XONECODE_CLAVE_MI_LLM`) en vez de guardarse: una variable elegida por el usuario sería
159
+ * un cuarto campo del formulario que solo puede escribirse mal, y derivarla hace que todo
160
+ * lo que ya existe —`aplicarAuth`, `guardarCredencial`, el constructor del cliente y el
161
+ * catálogo— siga funcionando sin saber que estos proveedores existen.
162
+ */
163
+ export function variableDeProveedor(proveedor) {
164
+ if (esProveedorPersonalizado(proveedor)) {
165
+ return `XONECODE_CLAVE_${slugDeProveedor(proveedor).toUpperCase().replace(/-/g, "_")}`;
166
+ }
167
+ return VARIABLES_POR_PROVEEDOR[proveedor];
168
+ }
169
+ /**
170
+ * La fila de un proveedor compatible con OpenAI, o nada si no lo es.
171
+ *
172
+ * Un personalizado LO ES por definición —es lo único que se puede dar de alta—, pero solo
173
+ * si consta en el registro: sin su URL base no hay a dónde llamar, y devolver algo aquí
174
+ * sería fabricar un endpoint.
175
+ */
176
+ export function compatibleConOpenAi(proveedor, declarados = []) {
177
+ if (esProveedorPersonalizado(proveedor)) {
178
+ const slug = slugDeProveedor(proveedor);
179
+ const declarado = declarados.find((d) => d.slug === slug);
180
+ if (declarado === undefined)
181
+ return undefined;
182
+ return { baseUrl: declarado.baseUrl, variable: variableDeProveedor(proveedor) };
183
+ }
184
+ return COMPATIBLES_OPENAI[proveedor];
185
+ }
186
+ /**
187
+ * Los que NO llevan clave. Hoy solo Ollama local, que es la omisión del repo.
188
+ *
189
+ * Vive aquí, en datos puros, porque lo consultan dos sitios que no se conocen: el asistente
190
+ * de cuenta (`cli/wizardInicial.ts`, para no pedir una clave que no hace falta) y el estado
191
+ * de modelos de la consola web (`web/servidor/arranque.ts`, que necesita distinguir «no
192
+ * necesita credencial» de «la tiene» — pintarle a Ollama un punto verde sería concederle un
193
+ * permiso que nadie le dio, y uno rojo, inventarle un problema). Dos listas de esto ya
194
+ * habrían divergido: `hayCredencial` (`cli/consola.ts`) devuelve `true` para un proveedor
195
+ * sin variable de entorno, que para su pregunta —«¿puedo usarlo?»— es correcto y para ésta
196
+ * —«¿tiene credencial?»— sería falso.
197
+ */
198
+ export const SIN_CREDENCIAL = new Set(["ollama"]);
5
199
  /**
6
200
  * Los modelos por omisión de cada papel.
7
201
  *
@@ -36,8 +230,14 @@ export function parsear(texto) {
36
230
  }
37
231
  const proveedor = texto.slice(0, corte);
38
232
  const modelo = texto.slice(corte + 1);
39
- if (!PROVEEDORES.includes(proveedor)) {
40
- throw new ModeloMalEscrito(`proveedor «${proveedor}» desconocido. Los que hay: ${PROVEEDORES.join(", ")}`);
233
+ // Un personalizado se acepta por su FORMA, sin mirar ningún registro: así `parsear`
234
+ // sigue siendo pura y la usa igual el `.md` de un agente, la bandera `--modelo` y el
235
+ // cable. Que ese slug esté dado de alta se comprueba al construir el cliente y al pedir
236
+ // el catálogo, que es donde se puede decir «dalo de alta en Ajustes».
237
+ if (!PROVEEDORES.includes(proveedor)
238
+ && !esProveedorPersonalizado(proveedor)) {
239
+ throw new ModeloMalEscrito(`proveedor «${proveedor}» desconocido. Los que hay: ${PROVEEDORES.join(", ")}`
240
+ + " (o «custom:<id>» para uno personalizado, dado de alta en Ajustes)");
41
241
  }
42
242
  return { proveedor: proveedor, modelo };
43
243
  }
@@ -82,4 +282,36 @@ export function resolver(fuentes = {}) {
82
282
  }
83
283
  return salida;
84
284
  }
285
+ /**
286
+ * ¿Hay que pedirle a ESTE modelo de Claude el razonamiento adaptativo, a mano?
287
+ *
288
+ * Tres comportamientos distintos detrás de un mismo campo, y de ahí que esto sea una tabla
289
+ * y no un booleano fijo. Medido en `@langchain/anthropic` 1.5.2: si no se le fija
290
+ * `thinking`, manda `thinking: undefined`, o sea que **omite el parámetro**. Y omitirlo no
291
+ * significa lo mismo según el modelo:
292
+ *
293
+ * - **Opus 5 y Sonnet 5**: omitirlo ya corre adaptativo —el razonamiento está puesto por
294
+ * omisión—, así que no hace falta pedir nada. Mandar lo que no se necesita es superficie
295
+ * que hay que mantener.
296
+ * - **Opus 4.8, 4.7, 4.6 y Sonnet 4.6**: omitirlo corre **sin pensar**. Aquí sí hay que
297
+ * pedirlo, y es lo que este predicado existe para arreglar: hoy esos cuatro van sin
298
+ * razonamiento en un harness de código, que es justo donde más rinde.
299
+ * - **Haiku 4.5 y todo lo anterior a 4.6**: NO aceptan `adaptive` —lo suyo es
300
+ * `{type:"enabled", budget_tokens:N}`—, así que pedírselo sería un 400. Un `thinking`
301
+ * adaptativo a ciegas para «anthropic» rompería todos esos modelos.
302
+ *
303
+ * Lo que no se reconoce devuelve `false`, que es el lado conservador: se omite el parámetro
304
+ * y el modelo hace lo que haga por omisión, en vez de mandarle algo que puede rechazar.
305
+ */
306
+ const FAMILIAS_CON_ADAPTATIVO_A_MANO = [
307
+ "claude-opus-4-6",
308
+ "claude-opus-4-7",
309
+ "claude-opus-4-8",
310
+ "claude-sonnet-4-6",
311
+ ];
312
+ export function pideThinkingAdaptativo(proveedor, modelo) {
313
+ if (proveedor !== "anthropic")
314
+ return false;
315
+ return FAMILIAS_CON_ADAPTATIVO_A_MANO.some((prefijo) => modelo.startsWith(prefijo));
316
+ }
85
317
  //# sourceMappingURL=modelos.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/core/modelos.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/core/modelos.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,OAAO,GAAqB,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAqBnF,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,IAAI,GAAG,2BAA2B,CAAC;AAEzC,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,6BAA6B,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,wHAAwH,CAAC;IAClI,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM;SACV,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAO,KAAK,CAAC,UAAU,CAAC,qBAAqB,CAAC;WACzC,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,SAAS,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiC;IAC/D,OAAO,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,OAAO,GAAG,qBAAqB,GAAG,IAAI,EAA4B,CAAC;AACrE,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1F;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,6DAA6D,CAAC;IACvE,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC/C,OAAO,8EAA8E,CAAC;IACxF,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7E,OAAO,iGAAiG,CAAC;AAC3G,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAgC;IACtD,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc;IACzD,QAAQ,EAAE,MAAM,EAAE,KAAK;CACf,CAAC;AAqBX,MAAM,CAAC,MAAM,kBAAkB,GAG3B;IACF,MAAM,EAAE,EAAE,OAAO,EAAE,qCAAqC,EAAE,QAAQ,EAAE,gBAAgB,EAAE;IACtF,IAAI,EAAE,EAAE,OAAO,EAAE,gCAAgC,EAAE,QAAQ,EAAE,cAAc,EAAE;IAC7E,GAAG,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,aAAa,EAAE;CACjE,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA8C;IAChF,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;IACxB,cAAc,EAAE,gBAAgB;IAChC,GAAG,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAC7F;CACF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,GAAqC;IAChD,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,cAAc,EAAE,cAAc;IAC9B,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;CACX,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAoB,EACpB,aAA4C,EAAE;IAE9C,IAAI,wBAAwB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAoB;IACtD,IAAI,wBAAwB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,OAAO,kBAAkB,eAAe,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;IACzF,CAAC;IACD,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAoB,EACpB,aAA4C,EAAE;IAE9C,IAAI,wBAAwB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC1D,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC9C,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,CAAC,SAAS,CAAE,EAAE,CAAC;IACnF,CAAC;IACD,OAAQ,kBAA+F,CACrG,SAA6B,CAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,cAAc,GAA2B,IAAI,GAAG,CAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;AASrF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,WAAW,GAA4D;IAClF,MAAM,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,qBAAqB,EAAE;IAC9D,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,qBAAqB,EAAE;IAC/D,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE;CAC1D,CAAC;AAEF,MAAM,OAAO,gBAAiB,SAAQ,KAAK;CAAG;AAE9C;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,gBAAgB,CACxB,IAAI,KAAK,sDAAsD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxF,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACtC,oFAAoF;IACpF,qFAAqF;IACrF,wFAAwF;IACxF,sEAAsE;IACtE,IACE,CAAE,WAAiC,CAAC,QAAQ,CAAC,SAAS,CAAC;WACpD,CAAC,wBAAwB,CAAC,SAAS,CAAC,EACvC,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,cAAc,SAAS,+BAA+B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;cAC1E,oEAAoE,CACzE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAsB,EAAE,MAAM,EAAE,CAAC;AACvD,CAAC;AAeD;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ,CAAC,UAA6B,EAAE;IACtD,MAAM,MAAM,GAAG,EAA6B,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,mDAAmD;QACnD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC7E,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACrE,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACrF,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACtF,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC9E,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAClF,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,8BAA8B,GAAsB;IACxD,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;CACpB,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,SAAoB,EAAE,MAAc;IACzE,IAAI,SAAS,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,8BAA8B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AACtF,CAAC"}
@@ -23,6 +23,8 @@ const ICONO = {
23
23
  edit_file: "←",
24
24
  glob: "✱",
25
25
  grep: "✱",
26
+ regex_search: "✱",
27
+ task: "⊙",
26
28
  };
27
29
  /** El verbo de cada tool conocida, en español. */
28
30
  const VERBO = {
@@ -32,25 +34,34 @@ const VERBO = {
32
34
  edit_file: "edita",
33
35
  glob: "busca",
34
36
  grep: "busca",
37
+ regex_search: "regex",
38
+ task: "delega en",
35
39
  };
36
40
  /** `→ lee app.xne` para una conocida; `⚙ studio_edit_file` para el resto. */
37
41
  function frase(nombre, detalle) {
38
42
  const icono = ICONO[nombre];
39
- if (icono === undefined)
40
- return `⚙ ${nombre}`;
43
+ // La genérica también enseña su detalle cuando lo hay. Antes lo TIRABA, y eso dejaba
44
+ // mudo justo lo que más falta hace: con `task` fuera de la tabla, la línea decía
45
+ // «⚙ task» y no a quién se delegaba. No filtra nada nuevo — un `detalle` solo existe si
46
+ // `resumenDeTool.ts` lo eligió a mano de su lista blanca.
47
+ if (icono === undefined) {
48
+ return detalle === undefined || detalle === "" ? `⚙ ${nombre}` : `⚙ ${nombre} ${detalle}`;
49
+ }
41
50
  const verbo = VERBO[nombre];
42
51
  return detalle === undefined || detalle === "" ? `${icono} ${verbo}` : `${icono} ${verbo} ${detalle}`;
43
52
  }
44
53
  /**
45
- * La lista de ficheros del cierre: los tres primeros y «y N más» el número completo
46
- * ya lo dijo el `×N`, la lista es para reconocer, no para leerla entera. El mismo
47
- * fichero dos veces (relecturas) se cuenta una.
54
+ * La lista de ficheros del cierre: los tres primeros y «y N ficheros más». El `×N` cuenta
55
+ * LLAMADAS y la lista cuenta ficheros DISTINTOS (una relectura se cuenta una), así que las
56
+ * dos cifras no suman: medido en pantalla, «lee ×35 — a, b, c y 29 más» enumeraba 32 y se
57
+ * leía como una cuenta que no cuadra. Decir «ficheros» es lo que separa las dos cifras.
48
58
  */
49
59
  function listaDe(detalles) {
50
60
  const unicos = [...new Set(detalles)];
51
61
  if (unicos.length <= 3)
52
62
  return unicos.join(", ");
53
- return `${unicos.slice(0, 3).join(", ")} y ${unicos.length - 3} más`;
63
+ const resto = unicos.length - 3;
64
+ return `${unicos.slice(0, 3).join(", ")} y ${resto} ${resto === 1 ? "fichero" : "ficheros"} más`;
54
65
  }
55
66
  export class Colapsador {
56
67
  nombre = "";
@@ -64,7 +75,11 @@ export class Colapsador {
64
75
  const pendiente = this.cerrarRacha();
65
76
  if (pendiente)
66
77
  salida.push(pendiente);
67
- salida.push(`✗ ${frase(evento.nombre, evento.detalle).slice(2)}: ${evento.error}`);
78
+ salida.push({
79
+ texto: `✗ ${frase(evento.nombre, evento.detalle).slice(2)}: ${evento.error}`,
80
+ nombre: evento.nombre,
81
+ error: evento.error,
82
+ });
68
83
  return salida;
69
84
  }
70
85
  if (evento.nombre === this.nombre) {
@@ -79,7 +94,7 @@ export class Colapsador {
79
94
  this.nombre = evento.nombre;
80
95
  this.cuenta = 1;
81
96
  this.detalles = evento.detalle === undefined ? [] : [evento.detalle];
82
- salida.push(frase(evento.nombre, evento.detalle));
97
+ salida.push({ texto: frase(evento.nombre, evento.detalle), nombre: evento.nombre });
83
98
  return salida;
84
99
  }
85
100
  /** La cuenta de la última racha. Se llama al terminar el turno, incluso si reventó. */
@@ -93,7 +108,10 @@ export class Colapsador {
93
108
  return null;
94
109
  }
95
110
  const base = frase(this.nombre);
96
- const cierre = this.detalles.length > 0 ? `${base} ×${this.cuenta} — ${listaDe(this.detalles)}` : `${base} ×${this.cuenta}`;
111
+ const texto = this.detalles.length > 0 ? `${base} ×${this.cuenta} — ${listaDe(this.detalles)}` : `${base} ×${this.cuenta}`;
112
+ // El nombre se lee ANTES de reiniciar: es el de la racha que se cierra, no el de la
113
+ // que viene.
114
+ const cierre = { texto, nombre: this.nombre };
97
115
  this.reiniciar();
98
116
  return cierre;
99
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/core/notify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/core/notify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /** Medido: `studio_upload_file` en modo base64 admite hasta 5 MB decodificados. */
2
+ export const TOPE_BASE64 = 5 * 1024 * 1024;
3
+ /**
4
+ * Medido contra el servidor: `studio_get_file` (y por tanto `studio_edit_file`) solo
5
+ * trata estas extensiones como texto. Todo lo demás es binario y va por `upload_file`.
6
+ */
7
+ export const EXTENSIONES_DE_TEXTO = new Set([
8
+ ".config", ".css", ".htm", ".html", ".ini", ".js", ".json", ".md",
9
+ ".properties", ".resx", ".sql", ".svg", ".txt", ".vbs", ".xml", ".xne",
10
+ ]);
11
+ /**
12
+ * La extensión de una ruta POSIX, en minúsculas, o `""` si no tiene.
13
+ *
14
+ * Dos trampas que la versión ingenua (`ruta.lastIndexOf(".")` sobre la ruta entera) no
15
+ * veía, y que se exporta para que no vuelva a haber dos copias divergentes de esta regla:
16
+ *
17
+ * - **Un punto en la posición 0 no es una extensión**: es un fichero OCULTO sin ella.
18
+ * `".env".lastIndexOf(".")` es 0, así que devolvía `".env"` como si `.env` fuera un tipo
19
+ * de fichero. No está en la lista de texto, con lo cual `.env` se clasificaba como
20
+ * BINARIO y podía subirse al proyecto del cliente entero.
21
+ * - **El punto puede estar en un DIRECTORIO**: en `iconos.v2/logo` el último punto está en
22
+ * el directorio, y devolvía `".v2/logo"`. Se mira solo el último segmento.
23
+ */
24
+ export const extensionDe = (ruta) => {
25
+ const nombre = ruta.slice(ruta.lastIndexOf("/") + 1);
26
+ const punto = nombre.lastIndexOf(".");
27
+ return punto <= 0 ? "" : nombre.slice(punto).toLowerCase();
28
+ };
29
+ /**
30
+ * Lo que no sale de esta máquina NUNCA, mire quien lo mire.
31
+ *
32
+ * Es la misma denegación que `agent/perfiles.ts` le impone al AGENTE
33
+ * (`permisosDe`/`puedeLeerRuta` deniegan `/.env` y `/.git`, invariante explícito de
34
+ * `CLAUDE.md`), replicada en la ruta de SUBIDA, que no pasa por aquellos permisos y por
35
+ * tanto no la heredaba. Que el agente no pueda leer `.env` no sirve de nada si el `/sync`
36
+ * lo empuja a CloudStudio por su cuenta.
37
+ *
38
+ * Se comprueba por SEGMENTO, no solo en la raíz: un `.env` dentro de un subdirectorio
39
+ * guarda exactamente los mismos secretos que uno arriba.
40
+ */
41
+ const esRutaProhibida = (ruta) => ruta.split("/").some((segmento) => segmento === ".xonecode" ||
42
+ segmento === ".git" ||
43
+ segmento === ".env" ||
44
+ segmento.startsWith(".env."));
45
+ /**
46
+ * `X.xml` es vista aplanada si existe `X.xne`. `app.xml` no tiene hermano: es fuente.
47
+ *
48
+ * La extensión se mira con `extensionDe` (normalizada a minúsculas) para que haya UNA sola
49
+ * forma de decidir "es un .xml" en todo el fichero — si no, un `Foo.XML` se colaba como texto
50
+ * en vez de excluirse, y XOne no avisa: sube un XML viejo junto al `.xne` nuevo, en silencio.
51
+ * El hermano se compone sobre la RUTA ORIGINAL (no la minusculizada): el nombre en disco importa.
52
+ */
53
+ const esVistaAplanada = (ruta, fuentes) => extensionDe(ruta) === ".xml" && fuentes.has(`${ruta.slice(0, -4)}.xne`);
54
+ export function planDeSubida(entrada) {
55
+ const fuentes = entrada.fuentesXne ?? new Set();
56
+ const plan = [];
57
+ const omitidas = [];
58
+ for (const cambio of entrada.cambios) {
59
+ // 1. Lo prohibido no sube NUNCA. Va primero porque ninguna otra regla debe poder
60
+ // colarlo: en `.xonecode/` viven memoria, sesiones y planes, y en `.env` las
61
+ // credenciales del usuario. `.xonecode/` se calla (es nuestro y no sincroniza
62
+ // jamás: declararlo sería ruido en cada `/sync`); `.env` y `.git` se DECLARAN,
63
+ // porque son ficheros del usuario que él sí podría esperar ver subir.
64
+ if (esRutaProhibida(cambio.ruta)) {
65
+ if (!cambio.ruta.split("/").includes(".xonecode")) {
66
+ omitidas.push({
67
+ ruta: cambio.ruta,
68
+ motivo: "no se sincroniza nunca: credenciales o metadatos locales (misma denegación que tiene el agente)",
69
+ });
70
+ }
71
+ continue;
72
+ }
73
+ // 2. La fuente es el `.xne`; el `.xml` lo regenera Studio.
74
+ if (esVistaAplanada(cambio.ruta, fuentes))
75
+ continue;
76
+ if (cambio.clase === "borrado") {
77
+ // 3. EL CANDADO. Con una copia parcial, git ve como borrado todo lo que no se pudo
78
+ // bajar (binarios, sobre todo). Emitir esos borrados vaciaría el proyecto en
79
+ // Studio. Solo se borra lo que llegamos a tener.
80
+ if (!entrada.descargados.has(cambio.ruta)) {
81
+ omitidas.push({
82
+ ruta: cambio.ruta,
83
+ motivo: "no consta descargado (copia parcial): no se borra en Studio, bórralo allí a mano",
84
+ });
85
+ continue;
86
+ }
87
+ // 3b. El borrado se ejecuta con `borrarTexto` (`studio_edit_file` en modo
88
+ // `delete`), que es una tool de TEXTO. No hay ninguna forma de borrar un
89
+ // binario por MCP hoy, así que un icono borrado en local es una operación
90
+ // IMPOSIBLE, no una pendiente: dejarla en el plan atascaba la subida entera.
91
+ if (!EXTENSIONES_DE_TEXTO.has(extensionDe(cambio.ruta))) {
92
+ omitidas.push({
93
+ ruta: cambio.ruta,
94
+ motivo: "el servidor no borra binarios (solo hay borrado de texto): bórralo en Studio a mano",
95
+ });
96
+ continue;
97
+ }
98
+ plan.push({ tipo: "borrado", ruta: cambio.ruta });
99
+ continue;
100
+ }
101
+ if (EXTENSIONES_DE_TEXTO.has(extensionDe(cambio.ruta))) {
102
+ plan.push({ tipo: "texto", ruta: cambio.ruta, clase: cambio.clase });
103
+ continue;
104
+ }
105
+ const bytes = entrada.tamanos.get(cambio.ruta);
106
+ // 4. Sin tamaño no se decide el modo de subida, e inventarlo es cómo se sube un
107
+ // fichero a medias. Se omite Y SE DECLARA: antes se omitía en silencio y quien
108
+ // ejecutaba no tenía con qué declararlo.
109
+ if (bytes === undefined) {
110
+ omitidas.push({ ruta: cambio.ruta, motivo: "no se pudo leer su tamaño en disco" });
111
+ continue;
112
+ }
113
+ // 5. El modo `chunked` del servidor NO está implementado en xonecode: el puerto ni
114
+ // lleva el modo y el adaptador manda siempre base64 (ver `core/cloudstudio.ts`).
115
+ // Así que por encima del tope es imposible, no pendiente.
116
+ if (bytes > TOPE_BASE64) {
117
+ omitidas.push({
118
+ ruta: cambio.ruta,
119
+ motivo: `pesa ${bytes} bytes y la subida en base64 admite hasta ${TOPE_BASE64}; el modo troceado no está implementado: súbelo desde Studio`,
120
+ });
121
+ continue;
122
+ }
123
+ plan.push({ tipo: "binario", ruta: cambio.ruta, bytes, modo: "base64", clase: cambio.clase });
124
+ }
125
+ return { operaciones: plan, omitidas };
126
+ }
127
+ //# sourceMappingURL=planDeSubida.js.map