xonecode 0.2.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 +70 -10
  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
@@ -5,11 +5,16 @@
5
5
  * había. Por eso la base de la fusión es el objeto CRUDO tal cual (no el resultado
6
6
  * de `validarAuth`, que descarta en silencio entradas raras) y por eso ante un JSON
7
7
  * roto se PARA sin escribir, en vez de recuperar el fichero por su cuenta.
8
+ *
9
+ * Escribe TAMBIÉN en `process.env` (ver el final de `guardarCredencial`): el fichero es
10
+ * para la próxima ejecución y la variable es para ésta, y una credencial que solo existe
11
+ * en disco no la ve nada de lo que ya está corriendo.
8
12
  */
9
13
  import { chmodSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
10
14
  import { dirname } from "node:path";
11
15
  import { validarAuth } from "../core/config.js";
12
- import { rutaAuth } from "./configEnDisco.js";
16
+ import { aplicarCredencialAlProceso, rutaAuth } from "./configEnDisco.js";
17
+ import { variableDeProveedor } from "../core/modelos.js";
13
18
  /** Un `auth.json` existente que no se puede fusionar: no se escribe nada encima. */
14
19
  export class AuthRotoEnDisco extends Error {
15
20
  }
@@ -51,6 +56,76 @@ export function guardarCredencial(proveedor, clave) {
51
56
  // sigue siendo 0600 desde el primer byte.
52
57
  writeFileSync(ruta, JSON.stringify(fusionado, null, 2) + "\n", { mode: 0o600 });
53
58
  chmodSync(ruta, 0o600);
59
+ // Y se aplica al proceso VIVO, machacando lo que hubiera en la variable.
60
+ //
61
+ // `aplicarAuth` (`configEnDisco.ts`) hace lo contrario a propósito: en el arranque, una
62
+ // variable del entorno manda sobre el fichero. Aquí es al revés porque el fichero acaba
63
+ // de cambiar por orden explícita de un humano —`/provider` o el asistente de cuenta— y
64
+ // es lo último que se ha dicho sobre esa credencial.
65
+ //
66
+ // Sin esto, la clave escrita a media sesión no existía para nada de lo que corre después:
67
+ // `CatalogoModelos` la lee de `process.env` (`agent/catalogoModelos.ts`), así que el
68
+ // asistente de cuenta pedía la clave, la guardaba y a continuación fallaba con «falta la
69
+ // credencial para …; usa /provider …» — medido, y el motivo por el que la validación de
70
+ // la conexión no podía pasar en un arranque nuevo con ningún proveedor de pago.
71
+ aplicarCredencialAlProceso(proveedor, clave);
54
72
  return { ruta, avisos };
55
73
  }
74
+ /**
75
+ * Quita la credencial de un proveedor de `auth.json`. Devuelve dónde estaba y si TODAVÍA
76
+ * queda puesta por el entorno.
77
+ *
78
+ * Mismo contrato que escribir: se fusiona sobre el objeto CRUDO —lo que este fichero no
79
+ * entiende se conserva— y ante un JSON roto se PARA sin tocar nada. Borrar lo que no
80
+ * estaba no es un error: es el estado que se pedía, y decirlo dos veces no cambia el
81
+ * fichero.
82
+ *
83
+ * De `process.env` se quita SOLO si la variable llevaba exactamente la clave que se acaba
84
+ * de borrar. Ese es el caso de `aplicarAuth` (el arranque copió `auth.json` al entorno) y
85
+ * también el de quien exportó la misma clave a mano — para el proceso son lo mismo. Una
86
+ * variable con OTRO valor es del usuario, no nuestra: no se toca, y por eso se devuelve
87
+ * `quedaEnEntorno`, para que quien lo pidió pueda decir la verdad («se borró del fichero,
88
+ * pero sigue puesta por la variable»). Desexportar la shell de nadie no está a nuestro
89
+ * alcance.
90
+ */
91
+ export function borrarCredencial(proveedor, clave) {
92
+ const ruta = rutaAuth();
93
+ const variable = variableDeProveedor(proveedor);
94
+ if (!existsSync(ruta)) {
95
+ return { ruta, borrada: false, quedaEnEntorno: variable !== undefined && process.env[variable] !== undefined };
96
+ }
97
+ let bruto;
98
+ try {
99
+ bruto = JSON.parse(readFileSync(ruta, "utf8"));
100
+ }
101
+ catch {
102
+ throw new AuthRotoEnDisco(`«${ruta}»: el JSON es inválido; no se sobrescribe. Edita el fichero a mano.`);
103
+ }
104
+ if (!esObjeto(bruto)) {
105
+ throw new AuthRotoEnDisco(`«${ruta}»: el JSON raíz debe ser un objeto; no se sobrescribe. Edita el fichero a mano.`);
106
+ }
107
+ const borrada = proveedor in bruto;
108
+ const anterior = clave ?? claveDe(bruto[proveedor]);
109
+ if (borrada) {
110
+ const { [proveedor]: _fuera, ...resto } = bruto;
111
+ writeFileSync(ruta, JSON.stringify(resto, null, 2) + "\n", { mode: 0o600 });
112
+ chmodSync(ruta, 0o600);
113
+ }
114
+ if (variable !== undefined && anterior !== undefined && process.env[variable] === anterior) {
115
+ delete process.env[variable];
116
+ }
117
+ return {
118
+ ruta,
119
+ borrada,
120
+ quedaEnEntorno: variable !== undefined && process.env[variable] !== undefined,
121
+ };
122
+ }
123
+ /** Las dos formas que `auth.json` acepta para una credencial: `"clave"` y `{ key }`. */
124
+ function claveDe(valor) {
125
+ if (typeof valor === "string")
126
+ return valor;
127
+ if (esObjeto(valor) && typeof valor.key === "string")
128
+ return valor.key;
129
+ return undefined;
130
+ }
56
131
  //# sourceMappingURL=authEnDisco.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authEnDisco.js","sourceRoot":"","sources":["../../src/agent/authEnDisco.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,oFAAoF;AACpF,MAAM,OAAO,eAAgB,SAAQ,KAAK;CAAG;AAE7C,oFAAoF;AACpF,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAoB,EAAE,KAAa;IACnE,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IAExB,mFAAmF;IACnF,sDAAsD;IACtD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAE3D,IAAI,IAAI,GAA4B,EAAE,CAAC;IACvC,IAAI,MAAM,GAAY,EAAE,CAAC;IAEzB,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,oFAAoF;YACpF,MAAM,IAAI,eAAe,CACvB,IAAI,IAAI,qEAAqE,CAC9E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,eAAe,CACvB,IAAI,IAAI,iFAAiF,CAC1F,CAAC;QACJ,CAAC;QAED,mFAAmF;QACnF,qFAAqF;QACrF,yEAAyE;QACzE,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;QAC7C,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC/D,CAAC;IAED,uFAAuF;IACvF,4CAA4C;IAC5C,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;IAE3D,qFAAqF;IACrF,uFAAuF;IACvF,0CAA0C;IAC1C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"authEnDisco.js","sourceRoot":"","sources":["../../src/agent/authEnDisco.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { tool } from "@langchain/core/tools";
2
+ import { z } from "zod";
3
+ import { puedeLeerRuta } from "./perfiles.js";
4
+ /** Límites defensivos: la regex es una ayuda de localización, no un lector masivo. */
5
+ export const LIMITES_REGEX = {
6
+ archivos: 50,
7
+ bytesPorArchivo: 256 * 1024,
8
+ coincidencias: 100,
9
+ caracteresPorLinea: 1_000,
10
+ };
11
+ const ESQUEMA_REGEX = z.object({
12
+ pattern: z.string().min(1).max(256).describe("Expresión regular JavaScript aplicada línea a línea"),
13
+ path: z.string().min(1).default("/").describe("Directorio virtual desde el que buscar"),
14
+ glob: z
15
+ .string()
16
+ .min(1)
17
+ .max(200)
18
+ .default("**/*.{js,xne,xml,css}")
19
+ .describe("Glob que limita los ficheros candidatos"),
20
+ flags: z.string().regex(/^[imu]*$/).default("m").describe("Flags de regex permitidos: i, m, u"),
21
+ max_count: z.coerce
22
+ .number()
23
+ .int()
24
+ .positive()
25
+ .max(LIMITES_REGEX.coincidencias)
26
+ .default(30)
27
+ .describe("Máximo de líneas coincidentes a devolver (hasta 100)"),
28
+ });
29
+ /**
30
+ * Búsqueda regex confinada al backend virtual del proyecto.
31
+ *
32
+ * DeepAgents ofrece `grep` literal, que es preferible para la mayoría de
33
+ * búsquedas y usa ripgrep. Esta tool cubre patrones estructurales de XOne/ES5
34
+ * (funciones, atributos y eventos) sin conceder `execute` ni usar una shell.
35
+ * La coincidencia es por línea, como grep: no sirve para regex multilínea.
36
+ */
37
+ export function crearBusquedaRegex(backend) {
38
+ return tool(async (entrada) => {
39
+ let regex;
40
+ try {
41
+ regex = new RegExp(entrada.pattern, entrada.flags);
42
+ }
43
+ catch (error) {
44
+ return `Regex inválida: ${error instanceof Error ? error.message : String(error)}`;
45
+ }
46
+ const listado = await backend.glob(entrada.glob, entrada.path);
47
+ if (listado.error)
48
+ return `No se pudo listar candidatos: ${listado.error}`;
49
+ const candidatos = (listado.files ?? [])
50
+ .filter((fichero) => !fichero.is_dir && puedeLeerRuta(fichero.path))
51
+ .filter((fichero) => fichero.size === undefined || fichero.size <= LIMITES_REGEX.bytesPorArchivo)
52
+ .slice(0, LIMITES_REGEX.archivos);
53
+ const lineas = [];
54
+ for (const fichero of candidatos) {
55
+ if (lineas.length >= entrada.max_count)
56
+ break;
57
+ const leido = await backend.readRaw(fichero.path);
58
+ if (leido.error || !leido.data || typeof leido.data.content !== "string")
59
+ continue;
60
+ for (const [indice, linea] of leido.data.content.split(/\r?\n/).entries()) {
61
+ // Una regex con flag global no está permitida por el esquema; aun así se
62
+ // reinicia por línea para que futuras ampliaciones no introduzcan estado.
63
+ regex.lastIndex = 0;
64
+ if (!regex.test(linea))
65
+ continue;
66
+ const texto = linea.length > LIMITES_REGEX.caracteresPorLinea
67
+ ? `${linea.slice(0, LIMITES_REGEX.caracteresPorLinea)}…`
68
+ : linea;
69
+ lineas.push(`${fichero.path}:${indice + 1}: ${texto}`);
70
+ if (lineas.length >= entrada.max_count)
71
+ break;
72
+ }
73
+ }
74
+ const avisos = [];
75
+ if ((listado.files ?? []).length > LIMITES_REGEX.archivos) {
76
+ avisos.push(`se revisaron solo los primeros ${LIMITES_REGEX.archivos} ficheros; acota path o glob`);
77
+ }
78
+ if (lineas.length >= entrada.max_count) {
79
+ avisos.push(`se alcanzó max_count=${entrada.max_count}; afina el patrón o la ruta`);
80
+ }
81
+ if (lineas.length === 0)
82
+ return `No se encontraron coincidencias.${avisos.length ? ` Nota: ${avisos.join("; ")}.` : ""}`;
83
+ return `${lineas.join("\n")}${avisos.length ? `\n\nNota: ${avisos.join("; ")}.` : ""}`;
84
+ }, {
85
+ name: "regex_search",
86
+ description: "Busca una expresión regular JavaScript por LÍNEA en ficheros del proyecto. " +
87
+ "Úsala solo cuando grep literal no baste; acota path y glob, localiza líneas y después usa read_file paginado. " +
88
+ "No ejecuta shell, no admite regex multilínea y omite rutas protegidas y ficheros grandes.",
89
+ schema: ESQUEMA_REGEX,
90
+ });
91
+ }
92
+ //# sourceMappingURL=busquedaRegex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"busquedaRegex.js","sourceRoot":"","sources":["../../src/agent/busquedaRegex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,345 @@
1
+ import { compatibleConOpenAi, esProveedorPersonalizado, variableDeProveedor, } from "../core/modelos.js";
2
+ const MAX_PAGINAS = 20;
3
+ /** Un fallo publicable: nunca incluye una clave ni el cuerpo remoto. */
4
+ export class ErrorCatalogoModelos extends Error {
5
+ constructor(mensaje) {
6
+ super(mensaje);
7
+ this.name = "ErrorCatalogoModelos";
8
+ }
9
+ }
10
+ /** La única resolución de URL de Ollama que comparten sus dos consumidores. */
11
+ export function baseUrlDeOllama() {
12
+ return process.env.OLLAMA_BASE_URL ?? "http://localhost:11434";
13
+ }
14
+ /** El host remoto oficial de Ollama Cloud no se mezcla con el servidor local. */
15
+ export function baseUrlDeOllamaCloud() {
16
+ return "https://ollama.com";
17
+ }
18
+ function esRegistro(valor) {
19
+ return typeof valor === "object" && valor !== null && !Array.isArray(valor);
20
+ }
21
+ function texto(valor) {
22
+ return typeof valor === "string" && valor.length > 0 ? valor : undefined;
23
+ }
24
+ function numero(valor) {
25
+ return typeof valor === "number" && Number.isFinite(valor) && valor > 0 ? valor : undefined;
26
+ }
27
+ function modelosDe(registro, campo, proveedor) {
28
+ const valor = registro[campo];
29
+ if (!Array.isArray(valor) || !valor.every(esRegistro)) {
30
+ throw new ErrorCatalogoModelos(`respuesta incompatible de ${proveedor}`);
31
+ }
32
+ return valor;
33
+ }
34
+ function urlConParametro(url, nombre, valor) {
35
+ const resultado = new URL(url);
36
+ resultado.searchParams.set(nombre, valor);
37
+ return resultado.toString();
38
+ }
39
+ function unirUrlOllama(ruta) {
40
+ return `${baseUrlDeOllama().replace(/\/+$/, "")}${ruta}`;
41
+ }
42
+ function unirUrl(baseUrl, ruta) {
43
+ return `${baseUrl.replace(/\/+$/, "")}${ruta}`;
44
+ }
45
+ function esModeloOpenAiConversacional(id) {
46
+ const normalizado = id.toLowerCase();
47
+ if (!esIdConversacional(normalizado))
48
+ return false;
49
+ return /^(gpt|chatgpt|o[1-9]|codex)-/.test(normalizado);
50
+ }
51
+ /** Familias que un cliente de chat no debe ofrecer aunque una API las enumere. */
52
+ function esIdConversacional(id) {
53
+ return ![
54
+ // «embed» y no «embedding»: el catálogo de NVIDIA nombra los suyos `nv-embedqa-e5-v5`,
55
+ // que no contiene «embedding». Y «rerank» por lo mismo (`llama-3.2-nv-rerankqa-1b-v2`):
56
+ // los dos son modelos de recuperación, no de conversación, y la API los enumera al
57
+ // lado de los de chat.
58
+ "embed", "rerank",
59
+ "moderation", "transcri", "whisper", "tts", "audio", "voice",
60
+ "dall-e", "dalle", "image", "imagen", "sora", "video", "realtime",
61
+ ].some((familia) => id.toLowerCase().includes(familia));
62
+ }
63
+ function contextoOllama(modelInfo) {
64
+ if (!esRegistro(modelInfo))
65
+ return undefined;
66
+ for (const [campo, valor] of Object.entries(modelInfo)) {
67
+ if (campo === "context_length" || campo.endsWith(".context_length"))
68
+ return numero(valor);
69
+ }
70
+ return undefined;
71
+ }
72
+ export class CatalogoModelos {
73
+ fetchFn;
74
+ timeoutMs;
75
+ personalizados;
76
+ /**
77
+ * Los personalizados entran por una FUNCIÓN y no por una lista: la ventana de Ajustes
78
+ * los da de alta en caliente, y una lista leída al construir el catálogo se quedaría
79
+ * vieja hasta reiniciar el proceso — el mismo motivo por el que el modelo en vigor se
80
+ * re-resuelve en cada barra en vez de guardarse.
81
+ */
82
+ constructor(fetchFn = globalThis.fetch, timeoutMs = 8_000, personalizados = () => []) {
83
+ this.fetchFn = fetchFn;
84
+ this.timeoutMs = timeoutMs;
85
+ this.personalizados = personalizados;
86
+ }
87
+ async listar(proveedor) {
88
+ switch (proveedor) {
89
+ case "openai": return this.listarOpenAi();
90
+ case "anthropic": return this.listarAnthropic();
91
+ case "gemini": return this.listarGemini();
92
+ case "ollama": return this.listarOllama();
93
+ case "ollama-cloud": return this.listarOllamaCloud();
94
+ case "nvidia":
95
+ case "groq":
96
+ case "xai":
97
+ return this.listarCompatible(proveedor);
98
+ default:
99
+ // Un personalizado va por el mismo camino: es un endpoint compatible con OpenAI y
100
+ // punto. El `never` de abajo es lo que mantiene el switch exhaustivo — añadir un
101
+ // proveedor de serie sin case da un error de compilación en vez de caer aquí y
102
+ // preguntarle a un registro donde no está.
103
+ if (esProveedorPersonalizado(proveedor))
104
+ return this.listarCompatible(proveedor);
105
+ return ((nunca) => { throw new ErrorCatalogoModelos(`proveedor desconocido: ${String(nunca)}`); })(proveedor);
106
+ }
107
+ }
108
+ /**
109
+ * La clave de un proveedor, de la ÚNICA tabla que las nombra (`core/modelos.ts`).
110
+ *
111
+ * Un proveedor sin variable no puede llegar aquí —`ollama` es local y su listado no
112
+ * llama a esto—, pero si llegara, decirlo es mejor que leer `process.env[undefined]`.
113
+ */
114
+ clave(proveedor) {
115
+ const variable = variableDeProveedor(proveedor);
116
+ const clave = variable === undefined ? undefined : process.env[variable];
117
+ if (!clave) {
118
+ throw new ErrorCatalogoModelos(`falta la credencial para ${proveedor}; usa /provider ${proveedor}`);
119
+ }
120
+ return clave;
121
+ }
122
+ async pedir(proveedor, url, init = {}) {
123
+ const controlador = new AbortController();
124
+ let agotoElTiempo = false;
125
+ const temporizador = setTimeout(() => {
126
+ agotoElTiempo = true;
127
+ controlador.abort();
128
+ }, this.timeoutMs);
129
+ try {
130
+ const respuesta = await this.fetchFn(url, { ...init, signal: controlador.signal });
131
+ if (!respuesta.ok) {
132
+ if (respuesta.status === 401 || respuesta.status === 403) {
133
+ throw new ErrorCatalogoModelos(`credencial no autorizada para ${proveedor}`);
134
+ }
135
+ // El código HTTP va EN el mensaje. Sin él, un 410 («el modelo fue retirado») y un
136
+ // 500 («el servidor está roto») se leen igual —«respuesta no disponible»— y hay que
137
+ // salir a curl para distinguirlos. El código no es contenido remoto ni credencial:
138
+ // la regla de este error es no llevar la clave ni el cuerpo, no ser opaco.
139
+ throw new ErrorCatalogoModelos(`respuesta no disponible de ${proveedor} (HTTP ${respuesta.status})`);
140
+ }
141
+ try {
142
+ return await respuesta.json();
143
+ }
144
+ catch {
145
+ throw new ErrorCatalogoModelos(`respuesta incompatible de ${proveedor}`);
146
+ }
147
+ }
148
+ catch (error) {
149
+ if (error instanceof ErrorCatalogoModelos) {
150
+ throw error;
151
+ }
152
+ if (agotoElTiempo || controlador.signal.aborted) {
153
+ throw new ErrorCatalogoModelos(`timeout al consultar ${proveedor}`);
154
+ }
155
+ throw new ErrorCatalogoModelos(`no se puede contactar con ${proveedor}`);
156
+ }
157
+ finally {
158
+ clearTimeout(temporizador);
159
+ }
160
+ }
161
+ async listarOpenAi() {
162
+ const clave = this.clave("openai");
163
+ const respuesta = await this.pedir("openai", "https://api.openai.com/v1/models", {
164
+ headers: { authorization: `Bearer ${clave}` },
165
+ });
166
+ if (!esRegistro(respuesta))
167
+ throw new ErrorCatalogoModelos("respuesta incompatible de openai");
168
+ return modelosDe(respuesta, "data", "openai").flatMap((modelo) => {
169
+ const id = texto(modelo.id);
170
+ return id !== undefined && esModeloOpenAiConversacional(id) ? [{ proveedor: "openai", id }] : [];
171
+ });
172
+ }
173
+ async listarAnthropic() {
174
+ const clave = this.clave("anthropic");
175
+ const cabeceras = { "x-api-key": clave, "anthropic-version": "2023-06-01" };
176
+ let url = "https://api.anthropic.com/v1/models";
177
+ const salida = [];
178
+ const vistos = new Set();
179
+ for (let pagina = 0; pagina < MAX_PAGINAS; pagina++) {
180
+ const respuesta = await this.pedir("anthropic", url, { headers: cabeceras });
181
+ if (!esRegistro(respuesta))
182
+ throw new ErrorCatalogoModelos("respuesta incompatible de anthropic");
183
+ for (const modelo of modelosDe(respuesta, "data", "anthropic")) {
184
+ const id = texto(modelo.id);
185
+ if (id === undefined || !esIdConversacional(id))
186
+ continue;
187
+ const nombre = texto(modelo.display_name);
188
+ const contexto = numero(modelo.max_input_tokens);
189
+ salida.push({ proveedor: "anthropic", id, ...(nombre === undefined ? {} : { nombre }), ...(contexto === undefined ? {} : { contexto }) });
190
+ }
191
+ if (typeof respuesta.has_more !== "boolean") {
192
+ throw new ErrorCatalogoModelos("respuesta incompatible de anthropic");
193
+ }
194
+ if (!respuesta.has_more)
195
+ return salida;
196
+ const cursor = texto(respuesta.last_id);
197
+ if (cursor === undefined || vistos.has(cursor))
198
+ break;
199
+ vistos.add(cursor);
200
+ url = urlConParametro("https://api.anthropic.com/v1/models", "after_id", cursor);
201
+ }
202
+ throw new ErrorCatalogoModelos("respuesta incompatible de anthropic");
203
+ }
204
+ async listarGemini() {
205
+ const clave = this.clave("gemini");
206
+ const cabeceras = { "x-goog-api-key": clave };
207
+ let url = "https://generativelanguage.googleapis.com/v1beta/models";
208
+ const salida = [];
209
+ const vistos = new Set();
210
+ for (let pagina = 0; pagina < MAX_PAGINAS; pagina++) {
211
+ const respuesta = await this.pedir("gemini", url, { headers: cabeceras });
212
+ if (!esRegistro(respuesta))
213
+ throw new ErrorCatalogoModelos("respuesta incompatible de gemini");
214
+ for (const modelo of modelosDe(respuesta, "models", "gemini")) {
215
+ const nombreRemoto = texto(modelo.name);
216
+ const metodos = modelo.supportedGenerationMethods;
217
+ if (nombreRemoto === undefined || !Array.isArray(metodos) || !metodos.includes("generateContent"))
218
+ continue;
219
+ const id = nombreRemoto.startsWith("models/") ? nombreRemoto.slice("models/".length) : undefined;
220
+ if (id === undefined || id.length === 0 || !esIdConversacional(id))
221
+ continue;
222
+ const nombre = texto(modelo.displayName);
223
+ const contexto = numero(modelo.inputTokenLimit);
224
+ salida.push({ proveedor: "gemini", id, ...(nombre === undefined ? {} : { nombre }), ...(contexto === undefined ? {} : { contexto }) });
225
+ }
226
+ if (respuesta.nextPageToken === undefined)
227
+ return salida;
228
+ const siguiente = texto(respuesta.nextPageToken);
229
+ if (siguiente === undefined)
230
+ throw new ErrorCatalogoModelos("respuesta incompatible de gemini");
231
+ if (vistos.has(siguiente))
232
+ break;
233
+ vistos.add(siguiente);
234
+ url = urlConParametro("https://generativelanguage.googleapis.com/v1beta/models", "pageToken", siguiente);
235
+ }
236
+ throw new ErrorCatalogoModelos("respuesta incompatible de gemini");
237
+ }
238
+ /**
239
+ * El `GET /v1/models` de un proveedor compatible con OpenAI (NVIDIA, Groq, xAI).
240
+ *
241
+ * Tres decisiones, y las tres son la misma: no afirmar lo que no se sabe.
242
+ *
243
+ * - **El filtro es el genérico** (`esIdConversacional`), no el de OpenAI: aquí los ids
244
+ * no siguen sus familias (`meta/llama-3.3-70b-instruct`, `grok-4`,
245
+ * `llama-3.1-8b-instant`), así que exigir un prefijo conocido dejaría la lista vacía.
246
+ * Se descarta solo lo que con certeza no es de conversación —embeddings, rerankers,
247
+ * voz, imagen— y lo demás se ofrece: preferimos una lista con algo de más a una que
248
+ * esconde el modelo que el usuario venía a elegir.
249
+ * - **El contexto solo si el servidor lo dice.** Por su documentación, Groq manda
250
+ * `context_window` en cada fila y los otros dos no mandan nada — no está medido
251
+ * contra los tres endpoints, y por eso se LEE si viene en vez de darse por hecho que
252
+ * viene o que no. Sin dato no hay campo, y por tanto la barra no
253
+ * pinta porcentaje — que es lo correcto, no un hueco por rellenar
254
+ * (`core/contextos.ts` no tiene tabla para estas familias, y no se le inventa una).
255
+ * - **Sin paginación.** Ninguno de los tres la declara en `/v1/models`; inventar un
256
+ * bucle de cursores contra un campo que no existe sería código que nadie ejecuta.
257
+ */
258
+ async listarCompatible(proveedor) {
259
+ const fila = compatibleConOpenAi(proveedor, this.personalizados());
260
+ if (fila === undefined) {
261
+ // Solo llegan aquí los personalizados: los tres de serie están en la tabla. Y esto
262
+ // es lo que pasa cuando el slug no está dado de alta — el mensaje dice dónde darlo
263
+ // de alta en vez de hablar de una URL que no existe.
264
+ throw new ErrorCatalogoModelos(`el proveedor personalizado «${proveedor}» no está dado de alta; añádelo en Ajustes → Proveedores`);
265
+ }
266
+ const clave = this.clave(proveedor);
267
+ const respuesta = await this.pedir(proveedor, unirUrl(fila.baseUrl, "/models"), {
268
+ headers: { authorization: `Bearer ${clave}` },
269
+ });
270
+ if (!esRegistro(respuesta))
271
+ throw new ErrorCatalogoModelos(`respuesta incompatible de ${proveedor}`);
272
+ return modelosDe(respuesta, "data", proveedor).flatMap((modelo) => {
273
+ const id = texto(modelo.id);
274
+ if (id === undefined || !esIdConversacional(id))
275
+ return [];
276
+ const contexto = numero(modelo.context_window) ?? numero(modelo.context_length);
277
+ return [{ proveedor, id, ...(contexto === undefined ? {} : { contexto }) }];
278
+ });
279
+ }
280
+ async listarOllama() {
281
+ return this.listarOllamaDesde("ollama", baseUrlDeOllama());
282
+ }
283
+ async listarOllamaCloud() {
284
+ const clave = this.clave("ollama-cloud");
285
+ return this.listarOllamaDesde("ollama-cloud", baseUrlDeOllamaCloud(), {
286
+ authorization: `Bearer ${clave}`,
287
+ });
288
+ }
289
+ async listarOllamaDesde(proveedor, baseUrl, cabeceras) {
290
+ const etiquetas = await this.pedir(proveedor, unirUrl(baseUrl, "/api/tags"), cabeceras === undefined ? {} : { headers: cabeceras });
291
+ if (!esRegistro(etiquetas))
292
+ throw new ErrorCatalogoModelos(`respuesta incompatible de ${proveedor}`);
293
+ const salida = [];
294
+ let intentados = 0;
295
+ let ultimoFallo;
296
+ for (const etiqueta of modelosDe(etiquetas, "models", proveedor)) {
297
+ const id = texto(etiqueta.name);
298
+ if (id === undefined)
299
+ continue;
300
+ intentados += 1;
301
+ /**
302
+ * El `/api/show` de UN modelo no puede tumbar la lista de todos.
303
+ *
304
+ * Medido contra el Ollama del usuario: `/api/tags` devolvía 26 modelos y dos de ellos
305
+ * —`qwen3-vl:235b-cloud` y `deepseek-v3.1:671b-cloud`— contestaban **HTTP 410** con
306
+ * «was retired at …». Siguen en el manifiesto local, así que `tags` los sigue
307
+ * nombrando, pero ya no existen. Sin esta guarda el primer 410 lanzaba y el proveedor
308
+ * entero se reportaba como no disponible: elegir «ollama» en el asistente no listaba
309
+ * NADA y volvía al paso de proveedor, con 24 modelos perfectamente usables detrás.
310
+ *
311
+ * Saltárselo no es tragarse un fallo: un modelo que el servidor declara retirado no
312
+ * está DISPONIBLE, y esta lista es la de los disponibles. Lo que sí sería tragárselo
313
+ * es callar cuando fallan todos —eso no es «no hay modelos», es un servidor roto—, y
314
+ * por eso se cuenta y se relanza abajo.
315
+ */
316
+ let detalle;
317
+ try {
318
+ detalle = await this.pedir(proveedor, unirUrl(baseUrl, "/api/show"), {
319
+ method: "POST",
320
+ headers: { ...cabeceras, "content-type": "application/json" },
321
+ body: JSON.stringify({ model: id }),
322
+ });
323
+ }
324
+ catch (error) {
325
+ ultimoFallo = error;
326
+ continue;
327
+ }
328
+ if (!esRegistro(detalle))
329
+ throw new ErrorCatalogoModelos(`respuesta incompatible de ${proveedor}`);
330
+ const capacidades = detalle.capabilities;
331
+ if (!Array.isArray(capacidades)
332
+ || !capacidades.some((capacidad) => capacidad === "completion" || capacidad === "generate" || capacidad === "chat"))
333
+ continue;
334
+ const contexto = contextoOllama(detalle.model_info);
335
+ salida.push({ proveedor, id, ...(contexto === undefined ? {} : { contexto }) });
336
+ }
337
+ // Fallaron TODOS los que había: eso no es un catálogo vacío, es que no se puede hablar
338
+ // con el servidor. Devolver `[]` aquí diría «no tienes modelos» a quien tiene veinte, y
339
+ // el asistente lo trataría como un proveedor sin nada en vez de como una avería.
340
+ if (salida.length === 0 && intentados > 0 && ultimoFallo !== undefined)
341
+ throw ultimoFallo;
342
+ return salida;
343
+ }
344
+ }
345
+ //# sourceMappingURL=catalogoModelos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogoModelos.js","sourceRoot":"","sources":["../../src/agent/catalogoModelos.ts"],"names":[],"mappings":"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"}