9router 0.4.1 → 0.4.3

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 (294) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/app-path-routes-manifest.json +6 -6
  3. package/app/.next/build-manifest.json +2 -2
  4. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  5. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/_global-error.html +1 -1
  25. package/app/.next/server/app/_global-error.rsc +1 -1
  26. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  27. package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  28. package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  29. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  30. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  31. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  32. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/_not-found.html +1 -1
  34. package/app/.next/server/app/_not-found.rsc +4 -4
  35. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  36. package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  37. package/app/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  38. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  39. package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  40. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  41. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +1 -1
  42. package/app/.next/server/app/api/cloud/auth/route.js +1 -1
  43. package/app/.next/server/app/api/cloud/credentials/update/route.js +1 -1
  44. package/app/.next/server/app/api/cloud/model/resolve/route.js +1 -1
  45. package/app/.next/server/app/api/cloud/models/alias/route.js +1 -1
  46. package/app/.next/server/app/api/models/alias/route.js +1 -1
  47. package/app/.next/server/app/api/models/availability/route.js +1 -1
  48. package/app/.next/server/app/api/models/custom/route.js +1 -1
  49. package/app/.next/server/app/api/models/route.js +1 -1
  50. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  51. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  52. package/app/.next/server/app/api/oauth/cursor/import/route.js +1 -1
  53. package/app/.next/server/app/api/oauth/gitlab/pat/route.js +1 -1
  54. package/app/.next/server/app/api/oauth/iflow/cookie/route.js +1 -1
  55. package/app/.next/server/app/api/oauth/kiro/import/route.js +1 -1
  56. package/app/.next/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
  57. package/app/.next/server/app/api/provider-nodes/[id]/route.js +1 -1
  58. package/app/.next/server/app/api/provider-nodes/route.js +1 -1
  59. package/app/.next/server/app/api/providers/[id]/models/route.js +1 -1
  60. package/app/.next/server/app/api/providers/[id]/route.js +1 -1
  61. package/app/.next/server/app/api/providers/client/route.js +1 -1
  62. package/app/.next/server/app/api/providers/client/route.js.nft.json +1 -1
  63. package/app/.next/server/app/api/providers/route.js +1 -1
  64. package/app/.next/server/app/api/providers/validate/route.js +1 -1
  65. package/app/.next/server/app/api/proxy-pools/[id]/route.js +1 -1
  66. package/app/.next/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  67. package/app/.next/server/app/api/proxy-pools/route.js +1 -1
  68. package/app/.next/server/app/api/proxy-pools/vercel-deploy/route.js +1 -1
  69. package/app/.next/server/app/api/translator/console-logs/route.js +1 -1
  70. package/app/.next/server/app/api/translator/console-logs/stream/route.js +2 -2
  71. package/app/.next/server/app/api/translator/translate/route.js +1 -1
  72. package/app/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  73. package/app/.next/server/app/api/v1/api/chat/route.js +1 -1
  74. package/app/.next/server/app/api/v1/audio/speech/route.js +1 -1
  75. package/app/.next/server/app/api/v1/chat/completions/route.js +1 -1
  76. package/app/.next/server/app/api/v1/embeddings/route.js +1 -1
  77. package/app/.next/server/app/api/v1/images/generations/route.js +1 -1
  78. package/app/.next/server/app/api/v1/messages/route.js +1 -1
  79. package/app/.next/server/app/api/v1/responses/compact/route.js +1 -1
  80. package/app/.next/server/app/api/v1/responses/route.js +1 -1
  81. package/app/.next/server/app/api/v1beta/models/[...path]/route.js +1 -1
  82. package/app/.next/server/app/api/version/route.js +1 -1
  83. package/app/.next/server/app/api/version/update/route.js +1 -35
  84. package/app/.next/server/app/api/version/update/route.js.nft.json +1 -1
  85. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  86. package/app/.next/server/app/callback.html +1 -1
  87. package/app/.next/server/app/callback.rsc +4 -4
  88. package/app/.next/server/app/callback.segments/_full.segment.rsc +4 -4
  89. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  90. package/app/.next/server/app/callback.segments/_index.segment.rsc +4 -4
  91. package/app/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
  92. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  93. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  94. package/app/.next/server/app/dashboard/basic-chat.html +1 -1
  95. package/app/.next/server/app/dashboard/basic-chat.rsc +6 -6
  96. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  97. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  98. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  99. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  100. package/app/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  101. package/app/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  102. package/app/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
  103. package/app/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  104. package/app/.next/server/app/dashboard/cli-tools.html +1 -1
  105. package/app/.next/server/app/dashboard/cli-tools.rsc +6 -6
  106. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  107. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  108. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  109. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  110. package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
  111. package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  112. package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
  113. package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  114. package/app/.next/server/app/dashboard/combos.html +1 -1
  115. package/app/.next/server/app/dashboard/combos.rsc +6 -6
  116. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  117. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  118. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  119. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  120. package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  121. package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  122. package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
  123. package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  124. package/app/.next/server/app/dashboard/endpoint.html +1 -1
  125. package/app/.next/server/app/dashboard/endpoint.rsc +6 -6
  126. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  127. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  128. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  129. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  130. package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
  131. package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  132. package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
  133. package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  134. package/app/.next/server/app/dashboard/mitm.html +1 -1
  135. package/app/.next/server/app/dashboard/mitm.rsc +6 -6
  136. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  137. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  138. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  139. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  140. package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  141. package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  142. package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
  143. package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  144. package/app/.next/server/app/dashboard/profile.html +1 -1
  145. package/app/.next/server/app/dashboard/profile.rsc +6 -6
  146. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  147. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  148. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  149. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  150. package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  151. package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  152. package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
  153. package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  154. package/app/.next/server/app/dashboard/providers/new.html +1 -1
  155. package/app/.next/server/app/dashboard/providers/new.rsc +6 -6
  156. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  157. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  158. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  159. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  160. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  161. package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  162. package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  163. package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
  164. package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  165. package/app/.next/server/app/dashboard/providers.html +1 -1
  166. package/app/.next/server/app/dashboard/providers.rsc +6 -6
  167. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  168. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  169. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  170. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  171. package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  172. package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  173. package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
  174. package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  175. package/app/.next/server/app/dashboard/proxy-pools.html +1 -1
  176. package/app/.next/server/app/dashboard/proxy-pools.rsc +6 -6
  177. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  178. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  179. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  180. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  181. package/app/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  182. package/app/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  183. package/app/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
  184. package/app/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  185. package/app/.next/server/app/dashboard/quota.html +2 -2
  186. package/app/.next/server/app/dashboard/quota.rsc +7 -7
  187. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  188. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  189. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  190. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  191. package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
  192. package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  193. package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
  194. package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  195. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  196. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  197. package/app/.next/server/app/dashboard/settings/pricing.rsc +4 -4
  198. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  199. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  200. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  201. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  202. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  203. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  204. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  205. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  206. package/app/.next/server/app/dashboard/translator.html +1 -1
  207. package/app/.next/server/app/dashboard/translator.rsc +6 -6
  208. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  209. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  210. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  211. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  212. package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  213. package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  214. package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
  215. package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  216. package/app/.next/server/app/dashboard/usage.html +1 -1
  217. package/app/.next/server/app/dashboard/usage.rsc +6 -6
  218. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  219. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  220. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  221. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  222. package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  223. package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  224. package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
  225. package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  226. package/app/.next/server/app/dashboard.html +1 -1
  227. package/app/.next/server/app/dashboard.rsc +6 -6
  228. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  229. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  230. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  231. package/app/.next/server/app/dashboard.segments/_full.segment.rsc +6 -6
  232. package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  233. package/app/.next/server/app/dashboard.segments/_index.segment.rsc +4 -4
  234. package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  235. package/app/.next/server/app/index.html +1 -1
  236. package/app/.next/server/app/index.rsc +4 -4
  237. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  238. package/app/.next/server/app/index.segments/_full.segment.rsc +4 -4
  239. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  240. package/app/.next/server/app/index.segments/_index.segment.rsc +4 -4
  241. package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  242. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  243. package/app/.next/server/app/landing.html +1 -1
  244. package/app/.next/server/app/landing.rsc +4 -4
  245. package/app/.next/server/app/landing.segments/_full.segment.rsc +4 -4
  246. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  247. package/app/.next/server/app/landing.segments/_index.segment.rsc +4 -4
  248. package/app/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
  249. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  250. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  251. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  252. package/app/.next/server/app/login.html +1 -1
  253. package/app/.next/server/app/login.rsc +5 -5
  254. package/app/.next/server/app/login.segments/_full.segment.rsc +5 -5
  255. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  256. package/app/.next/server/app/login.segments/_index.segment.rsc +4 -4
  257. package/app/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  258. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  259. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  260. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  261. package/app/.next/server/app-paths-manifest.json +6 -6
  262. package/app/.next/server/chunks/126.js +1 -1
  263. package/app/.next/server/chunks/1389.js +1 -1
  264. package/app/.next/server/chunks/253.js +1 -1
  265. package/app/.next/server/chunks/2947.js +1 -1
  266. package/app/.next/server/chunks/3159.js +1 -1
  267. package/app/.next/server/chunks/450.js +1 -1
  268. package/app/.next/server/chunks/4627.js +1 -1
  269. package/app/.next/server/chunks/5290.js +1 -1
  270. package/app/.next/server/chunks/6379.js +2 -2
  271. package/app/.next/server/chunks/7770.js +1 -1
  272. package/app/.next/server/chunks/7973.js +1 -1
  273. package/app/.next/server/chunks/8202.js +44 -44
  274. package/app/.next/server/chunks/9737.js +1 -1
  275. package/app/.next/server/chunks/9981.js +1 -0
  276. package/app/.next/server/middleware-build-manifest.js +1 -1
  277. package/app/.next/server/pages/404.html +1 -1
  278. package/app/.next/server/pages/500.html +1 -1
  279. package/app/.next/static/chunks/{4156-248370408c88bd96.js → 4156-ac69d9fed0825642.js} +2 -2
  280. package/app/.next/static/chunks/505-3ffce20748d2fc09.js +1 -0
  281. package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-77016ac325d94df5.js +1 -0
  282. package/app/.next/static/chunks/app/(dashboard)/dashboard/quota/page-394a2f89caf8c08f.js +1 -0
  283. package/app/.next/static/css/7ba68f4fd52a1ae0.css +1 -0
  284. package/app/package.json +1 -1
  285. package/app/public/providers/volcengine-ark.png +0 -0
  286. package/app/src/lib/updater/updater.js +187 -0
  287. package/cli.js +10 -75
  288. package/package.json +1 -1
  289. package/app/.next/static/chunks/505-bcba76c2986ead79.js +0 -1
  290. package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-202eec8d33670a47.js +0 -1
  291. package/app/.next/static/chunks/app/(dashboard)/dashboard/quota/page-2485ee7c89798a7b.js +0 -1
  292. package/app/.next/static/css/522efebf318b326f.css +0 -1
  293. /package/app/.next/static/{Xr14miYQZWY3f5wfS5IEq → Ihds3DOj3yt0tC1dSf2Hc}/_buildManifest.js +0 -0
  294. /package/app/.next/static/{Xr14miYQZWY3f5wfS5IEq → Ihds3DOj3yt0tC1dSf2Hc}/_ssgManifest.js +0 -0
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9router-app",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "description": "9Router web dashboard",
5
5
  "private": true,
6
6
  "scripts": {
@@ -0,0 +1,187 @@
1
+ // Standalone detached updater process.
2
+ // Spawns `npm i -g <pkg>@latest`, exposes progress via tiny HTTP server.
3
+ // Survives after parent Next server exits (detached + unref by spawner).
4
+
5
+ const { spawn } = require("child_process");
6
+ const http = require("http");
7
+ const net = require("net");
8
+ const path = require("path");
9
+ const fs = require("fs");
10
+ const os = require("os");
11
+
12
+ const packageName = process.env.UPDATER_PKG_NAME || "9router";
13
+ const port = parseInt(process.env.UPDATER_PORT || "20129", 10);
14
+ const tailLines = parseInt(process.env.UPDATER_TAIL_LINES || "8", 10);
15
+ const maxRetries = parseInt(process.env.UPDATER_RETRIES || "3", 10);
16
+ const retryDelayMs = parseInt(process.env.UPDATER_RETRY_DELAY_MS || "5000", 10);
17
+ const lingerMs = parseInt(process.env.UPDATER_LINGER_MS || "30000", 10);
18
+ const waitMinMs = parseInt(process.env.UPDATER_WAIT_MIN_MS || "3000", 10);
19
+ const waitMaxMs = parseInt(process.env.UPDATER_WAIT_MAX_MS || "15000", 10);
20
+ const waitCheckMs = parseInt(process.env.UPDATER_WAIT_CHECK_MS || "500", 10);
21
+ const appPort = parseInt(process.env.UPDATER_APP_PORT || "20128", 10);
22
+
23
+ // Data directory (match mitm/paths.js logic)
24
+ function getDataDir() {
25
+ if (process.env.DATA_DIR) return process.env.DATA_DIR;
26
+ if (process.platform === "win32") {
27
+ return path.join(process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming"), "9router");
28
+ }
29
+ return path.join(os.homedir(), ".9router");
30
+ }
31
+ const updateDir = path.join(getDataDir(), "update");
32
+ try { fs.mkdirSync(updateDir, { recursive: true }); } catch { /* best effort */ }
33
+ const statusFile = path.join(updateDir, "status.json");
34
+ const logFile = path.join(updateDir, "install.log");
35
+
36
+ const state = {
37
+ phase: "starting",
38
+ packageName,
39
+ startedAt: Date.now(),
40
+ finishedAt: null,
41
+ attempt: 0,
42
+ maxRetries,
43
+ done: false,
44
+ success: false,
45
+ exitCode: null,
46
+ error: null,
47
+ logTail: [],
48
+ };
49
+
50
+ function pushLog(line) {
51
+ const trimmed = line.replace(/\r?\n$/, "");
52
+ if (!trimmed) return;
53
+ state.logTail.push(trimmed);
54
+ if (state.logTail.length > tailLines) state.logTail = state.logTail.slice(-tailLines);
55
+ try { fs.appendFileSync(logFile, `${trimmed}\n`); } catch { /* best effort */ }
56
+ }
57
+
58
+ function persistStatus() {
59
+ try { fs.writeFileSync(statusFile, JSON.stringify(state, null, 2)); } catch { /* best effort */ }
60
+ }
61
+
62
+ function setPhase(phase) {
63
+ state.phase = phase;
64
+ persistStatus();
65
+ }
66
+
67
+ // HTTP server exposing status (browser polls this while Next server is dead)
68
+ const server = http.createServer((req, res) => {
69
+ res.setHeader("Access-Control-Allow-Origin", "*");
70
+ res.setHeader("Cache-Control", "no-store");
71
+ if (req.url === "/update/status" || req.url === "/") {
72
+ res.setHeader("Content-Type", "application/json");
73
+ res.end(JSON.stringify(state));
74
+ return;
75
+ }
76
+ res.statusCode = 404;
77
+ res.end("not found");
78
+ });
79
+
80
+ server.on("error", (e) => {
81
+ state.error = `status server error: ${e.message}`;
82
+ persistStatus();
83
+ });
84
+
85
+ server.listen(port, "127.0.0.1", () => {
86
+ persistStatus();
87
+ waitForAppExit().then(runInstall);
88
+ });
89
+
90
+ // Check if app port is still being listened on (= app server still alive)
91
+ function isAppPortBusy() {
92
+ return new Promise((resolve) => {
93
+ const socket = new net.Socket();
94
+ const done = (busy) => {
95
+ socket.destroy();
96
+ resolve(busy);
97
+ };
98
+ socket.setTimeout(300);
99
+ socket.once("connect", () => done(true));
100
+ socket.once("timeout", () => done(false));
101
+ socket.once("error", () => done(false));
102
+ socket.connect(appPort, "127.0.0.1");
103
+ });
104
+ }
105
+
106
+ // Wait for app process to fully exit before running npm (avoids Windows file-lock)
107
+ async function waitForAppExit() {
108
+ setPhase("waitingForExit");
109
+ pushLog(`[updater] waiting for app to exit (min ${Math.round(waitMinMs / 1000)}s)...`);
110
+
111
+ // Hard minimum delay: OS needs time to release file handles
112
+ await sleep(waitMinMs);
113
+
114
+ // Poll app port until free or max timeout
115
+ const deadline = Date.now() + (waitMaxMs - waitMinMs);
116
+ while (Date.now() < deadline) {
117
+ const busy = await isAppPortBusy();
118
+ if (!busy) {
119
+ pushLog(`[updater] app port :${appPort} is free, proceeding`);
120
+ return;
121
+ }
122
+ await sleep(waitCheckMs);
123
+ }
124
+ pushLog(`[updater] timeout waiting for app, proceeding anyway`);
125
+ }
126
+
127
+ function sleep(ms) {
128
+ return new Promise((r) => setTimeout(r, ms));
129
+ }
130
+
131
+ function runInstall() {
132
+ state.attempt += 1;
133
+ setPhase("installing");
134
+ pushLog(`[updater] attempt ${state.attempt}/${maxRetries} — npm i -g ${packageName}`);
135
+
136
+ const isWin = process.platform === "win32";
137
+ const cmd = isWin ? "npm.cmd" : "npm";
138
+ const args = ["i", "-g", packageName];
139
+
140
+ const child = spawn(cmd, args, {
141
+ stdio: ["ignore", "pipe", "pipe"],
142
+ windowsHide: true,
143
+ shell: isWin,
144
+ });
145
+
146
+ child.stdout.on("data", (buf) => {
147
+ buf.toString().split(/\r?\n/).forEach(pushLog);
148
+ persistStatus();
149
+ });
150
+ child.stderr.on("data", (buf) => {
151
+ buf.toString().split(/\r?\n/).forEach(pushLog);
152
+ persistStatus();
153
+ });
154
+
155
+ child.on("error", (e) => {
156
+ pushLog(`[updater] spawn error: ${e.message}`);
157
+ finalize(false, null, e.message);
158
+ });
159
+
160
+ child.on("close", (code) => {
161
+ pushLog(`[updater] npm exited with code ${code}`);
162
+ if (code === 0) {
163
+ finalize(true, code, null);
164
+ return;
165
+ }
166
+ if (state.attempt < maxRetries) {
167
+ pushLog(`[updater] retrying in ${Math.round(retryDelayMs / 1000)}s...`);
168
+ setTimeout(runInstall, retryDelayMs);
169
+ return;
170
+ }
171
+ finalize(false, code, `Install failed after ${maxRetries} attempts`);
172
+ });
173
+ }
174
+
175
+ function finalize(success, exitCode, error) {
176
+ state.done = true;
177
+ state.success = success;
178
+ state.exitCode = exitCode;
179
+ state.error = error;
180
+ state.finishedAt = Date.now();
181
+ setPhase(success ? "done" : "error");
182
+ // Linger so browser can poll final status, then exit & close the port
183
+ setTimeout(() => {
184
+ try { server.close(); } catch { /* ignore */ }
185
+ process.exit(success ? 0 : 1);
186
+ }, lingerMs);
187
+ }
package/cli.js CHANGED
@@ -47,6 +47,7 @@ const args = process.argv.slice(2);
47
47
 
48
48
  // Configuration constants
49
49
  const APP_NAME = pkg.name; // Use from package.json
50
+ const GLOBAL_INSTALL_CMD = `npm i -g ${APP_NAME} --prefer-online`;
50
51
  const DEFAULT_PORT = 20128;
51
52
  const DEFAULT_HOST = "0.0.0.0";
52
53
  const MAX_PORT_ATTEMPTS = 10;
@@ -349,79 +350,6 @@ function checkForUpdate() {
349
350
  });
350
351
  }
351
352
 
352
- // Run update and exit (user must restart manually)
353
- function performUpdate() {
354
- console.log(`\n🔄 Updating ${pkg.name}...\n`);
355
-
356
- try {
357
- if (process.platform === "win32") {
358
- // Windows: spawn detached .bat then exit CLI to release all file locks
359
- const updateScript = `@echo off
360
- timeout /t 3 /nobreak >nul
361
- echo Installing new version...
362
- npm install -g ${pkg.name}@latest --prefer-online
363
- if %ERRORLEVEL% EQU 0 (
364
- echo.
365
- echo Update completed. Run "${pkg.name}" to start.
366
- ) else (
367
- echo.
368
- echo Update failed. Try manually: npm install -g ${pkg.name}@latest
369
- )
370
- pause
371
- `;
372
- const scriptPath = path.join(os.tmpdir(), `${APP_NAME}-update.bat`);
373
- fs.writeFileSync(scriptPath, updateScript);
374
-
375
- spawn("cmd", ["/c", "start", "", "cmd", "/c", scriptPath], {
376
- detached: true,
377
- stdio: "ignore",
378
- windowsHide: false
379
- }).unref();
380
-
381
- console.log("\n🔄 Update started in new window. This window will close...");
382
- process.exit(0);
383
- } else {
384
- // macOS/Linux: spawn detached update script (no file-lock issues on Unix)
385
- const updateScript = `#!/bin/bash
386
- echo "📥 Installing new version..."
387
- sleep 2
388
-
389
- npm cache clean --force 2>/dev/null
390
- EXIT_CODE=1
391
- for i in 1 2 3; do
392
- npm install -g ${pkg.name}@latest --prefer-online 2>&1
393
- EXIT_CODE=$?
394
- [ $EXIT_CODE -eq 0 ] && break
395
- echo "⏳ Retry $i/3..."
396
- sleep 5
397
- done
398
-
399
- if [ $EXIT_CODE -eq 0 ]; then
400
- echo ""
401
- echo "✅ Update completed. Run \\"${pkg.name}\\" to start."
402
- else
403
- echo ""
404
- echo "❌ Update failed (exit code: $EXIT_CODE)"
405
- echo "💡 Try manually: npm install -g ${pkg.name}@latest"
406
- fi
407
- `;
408
- const scriptPath = path.join(os.tmpdir(), `${APP_NAME}-update.sh`);
409
- fs.writeFileSync(scriptPath, updateScript, { mode: 0o755 });
410
-
411
- const child = spawn("sh", [scriptPath], {
412
- detached: true,
413
- stdio: "inherit",
414
- windowsHide: false
415
- });
416
- child.unref();
417
- process.exit(0);
418
- }
419
- } catch (err) {
420
- console.error(`⚠️ Update failed: ${err.message}`);
421
- console.log(` Run manually: npm install -g ${pkg.name}@latest\n`);
422
- }
423
- }
424
-
425
353
  // Open browser
426
354
  function openBrowser(url) {
427
355
  const platform = process.platform;
@@ -638,13 +566,20 @@ function startServer(latestVersion) {
638
566
  const choice = await showInterfaceMenu(latestVersion);
639
567
 
640
568
  if (choice === "update") {
569
+ isShuttingDown = true;
641
570
  cleanup();
642
571
  // Kill ALL lingering processes (server/next-server/cloudflared/tray) to release file locks on Windows
643
572
  await killAllAppProcesses();
644
573
  await killProcessOnPort(port);
645
574
  await new Promise(r => setTimeout(r, 1500));
646
- performUpdate();
647
- return;
575
+ const { clearScreen } = require("./src/cli/utils/display");
576
+ clearScreen();
577
+ console.log(`\n⬆ New version: v${latestVersion} · you are on v${pkg.version}\n`);
578
+ console.log("Run this command to update (9Router is stopped so file locks are released):\n");
579
+ console.log(` ${GLOBAL_INSTALL_CMD}\n`);
580
+ console.log("After npm finishes, start 9Router again with:\n");
581
+ console.log(` ${APP_NAME}\n`);
582
+ process.exit(0);
648
583
  } else if (choice === "web") {
649
584
  openBrowser(url);
650
585
  // Wait for user to come back
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9router",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "description": "9Router CLI - Start and manage 9Router server",
5
5
  "bin": {
6
6
  "9router": "./cli.js"
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[505],{36698:(e,i,a)=>{a.d(i,{pp:()=>r,jY:()=>d});let t={alloy:{id:"alloy",name:"Alloy"},ash:{id:"ash",name:"Ash"},ballad:{id:"ballad",name:"Ballad"},cedar:{id:"cedar",name:"Cedar"},coral:{id:"coral",name:"Coral"},echo:{id:"echo",name:"Echo"},fable:{id:"fable",name:"Fable"},marin:{id:"marin",name:"Marin"},nova:{id:"nova",name:"Nova"},onyx:{id:"onyx",name:"Onyx"},sage:{id:"sage",name:"Sage"},shimmer:{id:"shimmer",name:"Shimmer"},verse:{id:"verse",name:"Verse"}},n=(...e)=>e.map(e=>({...t[e],type:"tts"})),o=n("alloy","ash","coral","echo","fable","nova","onyx","sage","shimmer"),s=n("alloy","ash","ballad","cedar","coral","echo","fable","marin","nova","onyx","sage","shimmer","verse"),m={openai:{models:[{id:"gpt-4o-mini-tts",name:"GPT-4o Mini TTS",type:"tts"},{id:"tts-1-hd",name:"TTS-1 HD",type:"tts"},{id:"tts-1",name:"TTS-1",type:"tts"}],voices:{"gpt-4o-mini-tts":s,"tts-1":o,"tts-1-hd":o},allVoices:s},openrouter:{models:[{id:"openai/gpt-4o-mini-tts",name:"GPT-4o Mini TTS",type:"tts"},{id:"openai/tts-1-hd",name:"TTS-1 HD",type:"tts"},{id:"openai/tts-1",name:"TTS-1",type:"tts"}],voices:{"openai/gpt-4o-mini-tts":s,"openai/tts-1":o,"openai/tts-1-hd":o},allVoices:s},elevenlabs:{models:[{id:"eleven_flash_v2_5",name:"Flash v2.5 (Fastest)",type:"tts"},{id:"eleven_turbo_v2_5",name:"Turbo v2.5 (Fast)",type:"tts"},{id:"eleven_multilingual_v2",name:"Multilingual v2 (Quality)",type:"tts"},{id:"eleven_monolingual_v1",name:"Monolingual v1 (English)",type:"tts"}]},"edge-tts":{defaults:[{id:"en-US-AriaNeural",name:"Aria (en-US)",type:"tts"},{id:"en-US-GuyNeural",name:"Guy (en-US)",type:"tts"},{id:"en-GB-SoniaNeural",name:"Sonia (en-GB)",type:"tts"},{id:"vi-VN-HoaiMyNeural",name:"Hoai My (vi-VN)",type:"tts"},{id:"vi-VN-NamMinhNeural",name:"Nam Minh (vi-VN)",type:"tts"},{id:"zh-CN-XiaoxiaoNeural",name:"Xiaoxiao (zh-CN)",type:"tts"},{id:"zh-CN-YunxiNeural",name:"Yunxi (zh-CN)",type:"tts"},{id:"fr-FR-DeniseNeural",name:"Denise (fr-FR)",type:"tts"},{id:"de-DE-KatjaNeural",name:"Katja (de-DE)",type:"tts"},{id:"ja-JP-NanamiNeural",name:"Nanami (ja-JP)",type:"tts"},{id:"ko-KR-SunHiNeural",name:"SunHi (ko-KR)",type:"tts"}]},"local-device":{defaults:[{id:"default",name:"System Default Voice",type:"tts"}]},"google-tts":{defaults:[{id:"af",name:"Afrikaans",type:"tts"},{id:"ar",name:"Arabic",type:"tts"},{id:"bg",name:"Bulgarian",type:"tts"},{id:"bn",name:"Bengali",type:"tts"},{id:"bs",name:"Bosnian",type:"tts"},{id:"ca",name:"Catalan",type:"tts"},{id:"cs",name:"Czech",type:"tts"},{id:"cy",name:"Welsh",type:"tts"},{id:"da",name:"Danish",type:"tts"},{id:"de",name:"German",type:"tts"},{id:"el",name:"Greek",type:"tts"},{id:"en",name:"English",type:"tts"},{id:"eo",name:"Esperanto",type:"tts"},{id:"es",name:"Spanish",type:"tts"},{id:"et",name:"Estonian",type:"tts"},{id:"fi",name:"Finnish",type:"tts"},{id:"fr",name:"French",type:"tts"},{id:"gu",name:"Gujarati",type:"tts"},{id:"hi",name:"Hindi",type:"tts"},{id:"hr",name:"Croatian",type:"tts"},{id:"hu",name:"Hungarian",type:"tts"},{id:"hy",name:"Armenian",type:"tts"},{id:"id",name:"Indonesian",type:"tts"},{id:"is",name:"Icelandic",type:"tts"},{id:"it",name:"Italian",type:"tts"},{id:"ja",name:"Japanese",type:"tts"},{id:"jw",name:"Javanese",type:"tts"},{id:"km",name:"Khmer",type:"tts"},{id:"kn",name:"Kannada",type:"tts"},{id:"ko",name:"Korean",type:"tts"},{id:"la",name:"Latin",type:"tts"},{id:"lv",name:"Latvian",type:"tts"},{id:"mk",name:"Macedonian",type:"tts"},{id:"ml",name:"Malayalam",type:"tts"},{id:"mr",name:"Marathi",type:"tts"},{id:"my",name:"Myanmar (Burmese)",type:"tts"},{id:"ne",name:"Nepali",type:"tts"},{id:"nl",name:"Dutch",type:"tts"},{id:"no",name:"Norwegian",type:"tts"},{id:"pl",name:"Polish",type:"tts"},{id:"pt",name:"Portuguese",type:"tts"},{id:"ro",name:"Romanian",type:"tts"},{id:"ru",name:"Russian",type:"tts"},{id:"si",name:"Sinhala",type:"tts"},{id:"sk",name:"Slovak",type:"tts"},{id:"sq",name:"Albanian",type:"tts"},{id:"sr",name:"Serbian",type:"tts"},{id:"su",name:"Sundanese",type:"tts"},{id:"sv",name:"Swedish",type:"tts"},{id:"sw",name:"Swahili",type:"tts"},{id:"ta",name:"Tamil",type:"tts"},{id:"te",name:"Telugu",type:"tts"},{id:"th",name:"Thai",type:"tts"},{id:"tl",name:"Filipino",type:"tts"},{id:"tr",name:"Turkish",type:"tts"},{id:"uk",name:"Ukrainian",type:"tts"},{id:"ur",name:"Urdu",type:"tts"},{id:"vi",name:"Vietnamese",type:"tts"},{id:"zh-CN",name:"Chinese (Simplified)",type:"tts"},{id:"zh-TW",name:"Chinese (Traditional)",type:"tts"}]}};function d(e,i){let a=m[e];return a?.voices&&(a.voices[i]||a.allVoices)||null}function r(){let e={};for(let[i,a]of Object.entries(m))a.models&&(e[`${i}-tts-models`]=a.models),a.allVoices&&(e[`${i}-tts-voices`]=a.allVoices),a.defaults&&(e[i]=a.defaults);return e["openai-tts-voices"]=m.openai.allVoices,e["openrouter-tts-voices"]=m.openrouter.allVoices,e}},43202:(e,i,a)=>{a.d(i,{Q2:()=>t.Q2,fg:()=>t.fg,vQ:()=>n,MA:()=>t.MA,UY:()=>d,Nu:()=>o,zN:()=>t.zN,B2:()=>m,h0:()=>s});var t=a(82495);a(69633);let n={name:"9Router proxy",description:"AI Infrastructure Management",version:"0.4.1"},o={changelogUrl:"https://raw.githubusercontent.com/decolua/9router/refs/heads/master/CHANGELOG.md"},s={npmPackageName:"9router",installCmd:"npm i -g 9router",exitDelayMs:500},m={storageKey:"theme",defaultTheme:"system"},d={maxLines:200,pollIntervalMs:1e3}},55348:(e,i,a)=>{a.d(i,{CL:()=>o,QC:()=>s,Xn:()=>n,YZ:()=>t});let t=["en","vi","zh-CN","zh-TW","ja","pt-BR","pt-PT","ko","es","de","fr","he","ar","ru","pl","cs","nl","tr","uk","tl","id","th","hi","bn","ur","ro","sv","it","el","hu","fi","da","no"],n="en",o="locale";function s(e){return"zh"===e||"zh-CN"===e?"zh-CN":"en"===e?"en":"vi"===e?"vi":"zh-TW"===e?"zh-TW":"ja"===e?"ja":"pt-BR"===e?"pt-BR":"pt-PT"===e?"pt-PT":"ko"===e?"ko":"es"===e?"es":"de"===e?"de":"fr"===e?"fr":"he"===e?"he":"ar"===e?"ar":"ru"===e?"ru":"pl"===e?"pl":"cs"===e?"cs":"nl"===e?"nl":"tr"===e?"tr":"uk"===e?"uk":"tl"===e?"tl":"id"===e?"id":"th"===e?"th":"hi"===e?"hi":"bn"===e?"bn":"ur"===e?"ur":"ro"===e?"ro":"sv"===e?"sv":"it"===e?"it":"el"===e?"el":"hu"===e?"hu":"fi"===e?"fi":"da"===e?"da":"no"===e?"no":n}},69633:(e,i,a)=>{a.d(i,{KC:()=>t.KC,Xg:()=>t.Xg});var t=a(94718);Object.entries(a(82495).Q2).filter(([,e])=>e.passthroughModels).map(([e])=>e),Object.entries(t.vq).flatMap(([e,i])=>i.map(i=>({provider:e,model:i.id,name:i.name})))},82495:(e,i,a)=>{a.d(i,{DI:()=>c,IS:()=>t,JH:()=>l,MA:()=>g,Q2:()=>u,br:()=>d,fg:()=>m,gb:()=>h,mq:()=>p,nJ:()=>n,o5:()=>v,rj:()=>r,s9:()=>o,wG:()=>x,wb:()=>w,zN:()=>s,zt:()=>b});let t={kiro:{id:"kiro",alias:"kr",name:"Kiro AI",icon:"psychology_alt",color:"#FF6B35"},qwen:{id:"qwen",alias:"qw",name:"Qwen Code",icon:"psychology",color:"#10B981",deprecated:!0,deprecationNotice:"Qwen OAuth free tier was discontinued by Alibaba on 2026-04-15. New connections will not work."},"gemini-cli":{id:"gemini-cli",alias:"gc",name:"Gemini CLI",icon:"terminal",color:"#4285F4",deprecated:!0,deprecationNotice:"Gemini CLI is designed exclusively for Gemini CLI. Using it with other tools (OpenClaw, Claude, Codex...) may result in account restrictions or bans."},iflow:{id:"iflow",alias:"if",name:"iFlow AI",icon:"water_drop",color:"#6366F1"},opencode:{id:"opencode",alias:"oc",name:"OpenCode Free",icon:"terminal",color:"#E87040",textIcon:"OC",noAuth:!0,passthroughModels:!0,modelsFetcher:{url:"https://opencode.ai/zen/v1/models",type:"opencode-free"}}},n={openrouter:{id:"openrouter",alias:"openrouter",name:"OpenRouter",icon:"router",color:"#F97316",textIcon:"OR",website:"https://openrouter.ai",notice:{text:"Free tier: 27+ free models, no credit card needed, 200 req/day. After $10 credit: 1,000 req/day.",apiKeyUrl:"https://openrouter.ai/settings/keys"},modelsFetcher:{url:"https://openrouter.ai/api/v1/models",type:"openrouter-free"},passthroughModels:!0,serviceKinds:["llm","embedding","tts","imageToText"]},nvidia:{id:"nvidia",alias:"nvidia",name:"NVIDIA NIM",icon:"developer_board",color:"#76B900",textIcon:"NV",website:"https://developer.nvidia.com/nim",notice:{text:"Free access for NVIDIA Developer Program members (prototyping & testing).",apiKeyUrl:"https://build.nvidia.com/settings/api-keys"}},ollama:{id:"ollama",alias:"ollama",name:"Ollama Cloud",icon:"cloud",color:"#ffffffff",textIcon:"OL",website:"https://ollama.com",notice:{text:"Free tier: light usage, 1 cloud model at a time (limits reset every 5h & 7d). Pro $20/mo \xb7 Max $100/mo.",apiKeyUrl:"https://ollama.com/settings/keys"}},vertex:{id:"vertex",alias:"vx",name:"Vertex AI",icon:"cloud",color:"#4285F4",textIcon:"VX",website:"https://cloud.google.com/vertex-ai",notice:{text:"New Google Cloud accounts get $300 free credits. Requires GCP project + Service Account with Vertex AI API enabled.",apiKeyUrl:"https://console.cloud.google.com/iam-admin/serviceaccounts"}},gemini:{id:"gemini",alias:"gemini",name:"Gemini",icon:"diamond",color:"#4285F4",textIcon:"GE",website:"https://ai.google.dev",serviceKinds:["llm","embedding","image","imageToText","webSearch"]}},o={extended:{options:["auto","on","off"],defaultMode:"auto",defaultBudgetTokens:1e4},effort:{options:["auto","none","low","medium","high"],defaultMode:"auto"}},s={claude:{id:"claude",alias:"cc",name:"Claude Code",icon:"smart_toy",color:"#D97757"},antigravity:{id:"antigravity",alias:"ag",name:"Antigravity",icon:"rocket_launch",color:"#F59E0B",deprecated:!0,deprecationNotice:"AG is designed exclusively for Antigravity IDE. Using it with other tools (OpenClaw, Claude, Codex...) may result in account restrictions or bans."},codex:{id:"codex",alias:"cx",name:"OpenAI Codex",icon:"code",color:"#3B82F6",thinkingConfig:o.effort},github:{id:"github",alias:"gh",name:"GitHub Copilot",icon:"code",color:"#333333"},cursor:{id:"cursor",alias:"cu",name:"Cursor IDE",icon:"edit_note",color:"#00D4AA"},kilocode:{id:"kilocode",alias:"kc",name:"Kilo Code",icon:"code",color:"#FF6B35",textIcon:"KC"},cline:{id:"cline",alias:"cl",name:"Cline",icon:"smart_toy",color:"#5B9BD5",textIcon:"CL"}},m={glm:{id:"glm",alias:"glm",name:"GLM Coding",icon:"code",color:"#2563EB",textIcon:"GL",website:"https://open.bigmodel.cn"},"glm-cn":{id:"glm-cn",alias:"glm-cn",name:"GLM (China)",icon:"code",color:"#DC2626",textIcon:"GC",website:"https://open.bigmodel.cn"},kimi:{id:"kimi",alias:"kimi",name:"Kimi",icon:"psychology",color:"#1E3A8A",textIcon:"KM",website:"https://kimi.moonshot.cn",serviceKinds:["llm","webSearch"]},minimax:{id:"minimax",alias:"minimax",name:"Minimax Coding",icon:"memory",color:"#7C3AED",textIcon:"MM",website:"https://www.minimaxi.com",serviceKinds:["llm","image","imageToText","webSearch"]},"minimax-cn":{id:"minimax-cn",alias:"minimax-cn",name:"Minimax (China)",icon:"memory",color:"#DC2626",textIcon:"MC",website:"https://www.minimaxi.com"},alicode:{id:"alicode",alias:"alicode",name:"Alibaba",icon:"cloud",color:"#FF6A00",textIcon:"ALi"},"alicode-intl":{id:"alicode-intl",alias:"alicode-intl",name:"Alibaba Intl",icon:"cloud",color:"#FF6A00",textIcon:"ALi"},openai:{id:"openai",alias:"openai",name:"OpenAI",icon:"auto_awesome",color:"#10A37F",textIcon:"OA",website:"https://platform.openai.com",serviceKinds:["llm","embedding","tts","image","imageToText","webSearch"],thinkingConfig:o.effort},anthropic:{id:"anthropic",alias:"anthropic",name:"Anthropic",icon:"smart_toy",color:"#D97757",textIcon:"AN",website:"https://console.anthropic.com",serviceKinds:["llm","imageToText"]},"opencode-go":{id:"opencode-go",alias:"ocg",name:"OpenCode Go",icon:"terminal",color:"#E87040",textIcon:"OC",website:"https://opencode.ai/auth",notice:{text:"OpenCode Go subscription: $5/mo (then $10/mo). Access to Kimi, GLM, Qwen, MiMo, MiniMax models.",apiKeyUrl:"https://opencode.ai/auth"}},deepseek:{id:"deepseek",alias:"ds",name:"DeepSeek",icon:"bolt",color:"#4D6BFE",textIcon:"DS",website:"https://deepseek.com"},groq:{id:"groq",alias:"groq",name:"Groq",icon:"speed",color:"#F55036",textIcon:"GQ",website:"https://groq.com",serviceKinds:["llm","imageToText"]},xai:{id:"xai",alias:"xai",name:"xAI (Grok)",icon:"auto_awesome",color:"#1DA1F2",textIcon:"XA",website:"https://x.ai",serviceKinds:["llm","imageToText","webSearch"]},mistral:{id:"mistral",alias:"mistral",name:"Mistral",icon:"air",color:"#FF7000",textIcon:"MI",website:"https://mistral.ai",serviceKinds:["llm","imageToText"]},perplexity:{id:"perplexity",alias:"pplx",name:"Perplexity",icon:"search",color:"#20808D",textIcon:"PP",website:"https://www.perplexity.ai",serviceKinds:["llm","webSearch"]},together:{id:"together",alias:"together",name:"Together AI",icon:"group_work",color:"#0F6FFF",textIcon:"TG",website:"https://www.together.ai"},fireworks:{id:"fireworks",alias:"fireworks",name:"Fireworks AI",icon:"local_fire_department",color:"#7B2EF2",textIcon:"FW",website:"https://fireworks.ai"},cerebras:{id:"cerebras",alias:"cerebras",name:"Cerebras",icon:"memory",color:"#FF4F00",textIcon:"CB",website:"https://www.cerebras.ai"},cohere:{id:"cohere",alias:"cohere",name:"Cohere",icon:"hub",color:"#39594D",textIcon:"CO",website:"https://cohere.com"},nebius:{id:"nebius",alias:"nebius",name:"Nebius AI",icon:"cloud",color:"#6C5CE7",textIcon:"NB",website:"https://nebius.com"},siliconflow:{id:"siliconflow",alias:"siliconflow",name:"SiliconFlow",icon:"cloud_queue",color:"#5B6EF5",textIcon:"SF",website:"https://cloud.siliconflow.com"},hyperbolic:{id:"hyperbolic",alias:"hyp",name:"Hyperbolic",icon:"bolt",color:"#00D4FF",textIcon:"HY",website:"https://hyperbolic.xyz"},deepgram:{id:"deepgram",alias:"dg",name:"Deepgram",icon:"mic",color:"#13EF93",textIcon:"DG",website:"https://deepgram.com",serviceKinds:["stt","imageToText"]},assemblyai:{id:"assemblyai",alias:"aai",name:"AssemblyAI",icon:"record_voice_over",color:"#0062FF",textIcon:"AA",website:"https://assemblyai.com",serviceKinds:["stt"]},nanobanana:{id:"nanobanana",alias:"nb",name:"NanoBanana",icon:"image",color:"#FFD700",textIcon:"NB",website:"https://nanobananaapi.ai",serviceKinds:["image"]},elevenlabs:{id:"elevenlabs",alias:"el",name:"ElevenLabs",icon:"record_voice_over",color:"#6C47FF",textIcon:"EL",website:"https://elevenlabs.io",serviceKinds:["tts"]},cartesia:{id:"cartesia",alias:"cartesia",name:"Cartesia",icon:"spatial_audio",color:"#FF4F8B",textIcon:"CA",website:"https://cartesia.ai",serviceKinds:["tts"],hidden:!0},playht:{id:"playht",alias:"playht",name:"PlayHT",icon:"play_circle",color:"#00B4D8",textIcon:"PH",website:"https://play.ht",serviceKinds:["tts"],hidden:!0},"local-device":{id:"local-device",alias:"local-device",name:"Local Device",icon:"speaker",color:"#64748B",textIcon:"LD",serviceKinds:["tts"],noAuth:!0},"google-tts":{id:"google-tts",alias:"google-tts",name:"Google TTS",icon:"record_voice_over",color:"#4285F4",textIcon:"GT",serviceKinds:["tts"],noAuth:!0},"edge-tts":{id:"edge-tts",alias:"edge-tts",name:"Edge TTS",icon:"record_voice_over",color:"#0078D4",textIcon:"ET",serviceKinds:["tts"],noAuth:!0},sdwebui:{id:"sdwebui",alias:"sdwebui",name:"SD WebUI",icon:"brush",color:"#FF7043",textIcon:"SD",website:"https://github.com/AUTOMATIC1111/stable-diffusion-webui",serviceKinds:["image"]},comfyui:{id:"comfyui",alias:"comfyui",name:"ComfyUI",icon:"account_tree",color:"#4CAF50",textIcon:"CF",website:"https://github.com/comfyanonymous/ComfyUI",serviceKinds:["image"]},huggingface:{id:"huggingface",alias:"hf",name:"HuggingFace",icon:"face",color:"#FFD21E",textIcon:"HF",website:"https://huggingface.co",serviceKinds:["image","imageToText","tts"],hiddenKinds:["tts"]},blackbox:{id:"blackbox",alias:"bb",name:"Blackbox AI",icon:"smart_toy",color:"#5B5FEF",textIcon:"BB",website:"https://blackbox.ai",serviceKinds:["llm"]},chutes:{id:"chutes",alias:"ch",name:"Chutes AI",icon:"water_drop",color:"#ffffffff",textIcon:"CH",website:"https://chutes.ai"},"ollama-local":{id:"ollama-local",alias:"ollama-local",name:"Ollama Local",icon:"cloud",color:"#ffffffff",textIcon:"OL",website:"https://ollama.com"},"vertex-partner":{id:"vertex-partner",alias:"vxp",name:"Vertex Partner",icon:"cloud",color:"#34A853",textIcon:"VP",website:"https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models"},tavily:{id:"tavily",alias:"tavily",name:"Tavily",icon:"search",color:"#5B21B6",textIcon:"TV",website:"https://tavily.com",serviceKinds:["webSearch"]},"brave-search":{id:"brave-search",alias:"brave",name:"Brave Search",icon:"travel_explore",color:"#FB542B",textIcon:"BR",website:"https://brave.com/search/api",serviceKinds:["webSearch"]},serper:{id:"serper",alias:"serper",name:"Serper",icon:"search",color:"#4F46E5",textIcon:"SP",website:"https://serper.dev",serviceKinds:["webSearch"]},exa:{id:"exa",alias:"exa",name:"Exa",icon:"manage_search",color:"#2563EB",textIcon:"EX",website:"https://exa.ai",serviceKinds:["webSearch"]},searxng:{id:"searxng",alias:"searxng",name:"SearXNG",icon:"saved_search",color:"#3B82F6",textIcon:"SX",website:"https://docs.searxng.org",serviceKinds:["webSearch"],noAuth:!0},firecrawl:{id:"firecrawl",alias:"firecrawl",name:"Firecrawl",icon:"local_fire_department",color:"#F59E0B",textIcon:"FC",website:"https://firecrawl.dev",serviceKinds:["webFetch"]}},d={"grok-web":{id:"grok-web",alias:"gw",name:"Grok Web (Subscription)",icon:"auto_awesome",color:"#1DA1F2",textIcon:"GW",website:"https://grok.com",authType:"cookie",authHint:"Paste your sso= cookie value from grok.com",passthroughModels:!0,serviceKinds:["llm"]},"perplexity-web":{id:"perplexity-web",alias:"pw",name:"Perplexity Web (Pro/Max)",icon:"search",color:"#20808D",textIcon:"PW",website:"https://www.perplexity.ai",authType:"cookie",authHint:"Paste your __Secure-next-auth.session-token cookie value from perplexity.ai",serviceKinds:["llm"]}},r=[{id:"embedding",label:"Embedding",icon:"data_array",endpoint:{method:"POST",path:"/v1/embeddings"}},{id:"image",label:"Text to Image",icon:"brush",endpoint:{method:"POST",path:"/v1/images/generations"}},{id:"imageToText",label:"Image to Text",icon:"image_search",endpoint:{method:"POST",path:"/v1/images/understanding"}},{id:"tts",label:"Text To Speech",icon:"record_voice_over",endpoint:{method:"POST",path:"/v1/audio/speech"}},{id:"stt",label:"STT",icon:"mic",endpoint:{method:"POST",path:"/v1/audio/transcriptions"}},{id:"webSearch",label:"Web Search",icon:"travel_explore",endpoint:{method:"POST",path:"/v1/search"}},{id:"webFetch",label:"Web Fetch",icon:"language",endpoint:{method:"POST",path:"/v1/web/fetch"}},{id:"video",label:"Video",icon:"movie",endpoint:{method:"POST",path:"/v1/video/generations"}},{id:"music",label:"Music",icon:"music_note",endpoint:{method:"POST",path:"/v1/audio/music"}}],l="openai-compatible-",c="anthropic-compatible-";function p(e){return"string"==typeof e&&e.startsWith(l)}function h(e){return"string"==typeof e&&e.startsWith(c)}let u={...t,...n,...s,...m,...d},g={oauth:{id:"oauth",name:"OAuth",icon:"lock"},apikey:{id:"apikey",name:"API Key",icon:"key"},cookie:{id:"cookie",name:"Browser Cookie",icon:"cookie"}};function b(e){for(let i of Object.values(u))if(i.alias===e||i.id===e)return i;return null}function x(e){let i=u[e];return i?.alias||e}function v(e){return Object.values(u).filter(i=>!(!(i.serviceKinds??["llm"]).includes(e)||i.hidden||i.hiddenKinds?.includes(e)))}Object.values(u).reduce((e,i)=>(e[i.alias]=i.id,e),{}),Object.values(u).reduce((e,i)=>(e[i.id]=i.alias,e),{});let w=["claude","antigravity","kiro","github","codex","kimi-coding","ollama"]},83789:(e,i,a)=>{a.d(i,{A:()=>m});var t=a(2074),n=a(11472),o=a(43202);function s(e){let i=document.documentElement,a=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";"dark"===("system"===e?a:e)?i.classList.add("dark"):i.classList.remove("dark")}let m=(0,t.v)((0,n.Zr)((e,i)=>({theme:o.B2.defaultTheme,setTheme:i=>{e({theme:i}),s(i)},toggleTheme:()=>{let a="dark"===i().theme?"light":"dark";e({theme:a}),s(a)},initTheme:()=>{s(i().theme)}}),{name:o.B2.storageKey}))},84502:(e,i,a)=>{a.d(i,{FE:()=>p,Tl:()=>r,wn:()=>h});var t=a(55348);let n={},o=t.Xn,s=[];function m(){if("u"<typeof document)return t.Xn;let e=document.cookie.split(";").find(e=>e.trim().startsWith(`${t.CL}=`)),i=e?decodeURIComponent(e.split("=")[1]):t.Xn;return(0,t.QC)(i)}async function d(e){if("en"===e){n={};return}try{let i=await fetch(`/i18n/literals/${e}.json`);n=await i.json()}catch(e){console.error("Failed to load translations:",e),n={}}}function r(e){if(!e||"string"!=typeof e)return e;let i=e.trim();return i&&"en"!==o&&n[i]||e}function l(e){if(!e.nodeValue||!e.nodeValue.trim())return;let i=e.parentElement;if(!i)return;let a=i;for(;a;){if(a.hasAttribute&&a.hasAttribute("data-i18n-skip"))return;a=a.parentElement}if(["script","style","code","pre","colgroup","table","thead","tbody","tfoot","tr","select","datalist","optgroup"].includes(i.tagName?.toLowerCase()))return;e._originalText||(e._originalText=e.nodeValue);let t=r(e._originalText);t!==e.nodeValue&&(e.nodeValue=t)}function c(e){let i;if(!e)return;let a=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,null,!1),t=[];for(;i=a.nextNode();)t.push(i);t.forEach(l)}async function p(){o=m(),await d(o),c(document.body),new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e.nodeType===Node.ELEMENT_NODE?c(e):e.nodeType===Node.TEXT_NODE&&l(e)})})}).observe(document.body,{childList:!0,subtree:!0})}async function h(){o=m(),await d(o),s.forEach(e=>e()),c(document.body)}},94718:(e,i,a)=>{a.d(i,{Xg:()=>l,vq:()=>d,KC:()=>c});var t=a(390),n=a(89651);let o={"Anthropic-Version":"2023-06-01","Anthropic-Beta":"claude-code-20250219,interleaved-thinking-2025-05-14"},s="https://api.kimi.com/coding/v1/messages",m={claude:{baseUrl:"https://api.anthropic.com/v1/messages",format:"claude",headers:{"Anthropic-Version":"2023-06-01","Anthropic-Beta":"claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advanced-tool-use-2025-11-20,effort-2025-11-24,structured-outputs-2025-12-15,fast-mode-2026-02-01,redact-thinking-2026-02-12,token-efficient-tools-2026-03-28","Anthropic-Dangerous-Direct-Browser-Access":"true","User-Agent":"claude-cli/2.1.92 (external, sdk-cli)","X-App":"cli","X-Stainless-Helper-Method":"stream","X-Stainless-Retry-Count":"0","X-Stainless-Runtime-Version":"v24.14.0","X-Stainless-Package-Version":"0.80.0","X-Stainless-Runtime":"node","X-Stainless-Lang":"js","X-Stainless-Arch":function(){switch((0,t.arch)()){case"x64":return"x64";case"arm64":return"arm64";case"ia32":return"x86";default:return`other::${(0,t.arch)()}`}}(),"X-Stainless-Os":function(){switch((0,t.platform)()){case"darwin":return"MacOS";case"win32":return"Windows";case"linux":return"Linux";case"freebsd":return"FreeBSD";default:return`Other::${(0,t.platform)()}`}}(),"X-Stainless-Timeout":"600"},clientId:"9d1c250a-e61b-44d9-88ed-5944d1962f5e",tokenUrl:"https://api.anthropic.com/v1/oauth/token"},gemini:{baseUrl:"https://generativelanguage.googleapis.com/v1beta/models",format:"gemini",clientId:"681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com",clientSecret:"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"},"gemini-cli":{baseUrl:"https://cloudcode-pa.googleapis.com/v1internal",format:"gemini-cli",clientId:"681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com",clientSecret:"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"},codex:{baseUrl:"https://chatgpt.com/backend-api/codex/responses",format:"openai-responses",headers:{originator:"codex-cli","User-Agent":"codex-cli/1.0.18 (macOS; arm64)"},clientId:"app_EMoamEEZ73f0CkXaXp7hrann",tokenUrl:"https://auth.openai.com/oauth/token"},qwen:{baseUrl:"https://portal.qwen.ai/v1/chat/completions",format:"openai",clientId:"f0304373b74a44d2b584a3fb70ca9e56",tokenUrl:"https://chat.qwen.ai/api/v1/oauth2/token",authUrl:"https://chat.qwen.ai/api/v1/oauth2/device/code"},iflow:{baseUrl:"https://apis.iflow.cn/v1/chat/completions",format:"openai",headers:{"User-Agent":"iFlow-Cli"},clientId:"10009311001",clientSecret:"4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW",tokenUrl:"https://iflow.cn/oauth/token",authUrl:"https://iflow.cn/oauth"},qoder:{baseUrl:"https://api.qoder.com/v1/chat/completions",format:"openai",headers:{"User-Agent":"Qoder-Cli"},clientId:n.env.QODER_OAUTH_CLIENT_ID||"10009311001",clientSecret:n.env.QODER_OAUTH_CLIENT_SECRET||"4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW",tokenUrl:"https://api.qoder.com/oauth/token",authUrl:"https://qoder.com/oauth/authorize"},antigravity:{baseUrls:["https://daily-cloudcode-pa.googleapis.com","https://daily-cloudcode-pa.sandbox.googleapis.com"],format:"antigravity",headers:{"User-Agent":`antigravity/1.107.0 ${(0,t.platform)()}/${(0,t.arch)()}`},clientId:"1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com",clientSecret:"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"},openrouter:{baseUrl:"https://openrouter.ai/api/v1/chat/completions",format:"openai",headers:{"HTTP-Referer":"https://endpoint-proxy.local","X-Title":"Endpoint Proxy"}},openai:{baseUrl:"https://api.openai.com/v1/chat/completions",format:"openai"},glm:{baseUrl:"https://api.z.ai/api/anthropic/v1/messages",format:"claude",headers:{...o}},"glm-cn":{baseUrl:"https://open.bigmodel.cn/api/coding/paas/v4/chat/completions",format:"openai",headers:{}},kimi:{baseUrl:s,format:"claude",headers:{...o}},minimax:{baseUrl:"https://api.minimax.io/anthropic/v1/messages",format:"claude",headers:{...o}},"minimax-cn":{baseUrl:"https://api.minimaxi.com/anthropic/v1/messages",format:"claude",headers:{...o}},alicode:{baseUrl:"https://coding.dashscope.aliyuncs.com/v1/chat/completions",format:"openai",headers:{}},"alicode-intl":{baseUrl:"https://coding-intl.dashscope.aliyuncs.com/v1/chat/completions",format:"openai",headers:{}},github:{baseUrl:"https://api.githubcopilot.com/chat/completions",responsesUrl:"https://api.githubcopilot.com/responses",format:"openai",headers:{"copilot-integration-id":"vscode-chat","editor-version":"vscode/1.110.0","editor-plugin-version":"copilot-chat/0.38.0","user-agent":"GitHubCopilotChat/0.38.0","openai-intent":"conversation-panel","x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"electron-fetch","X-Initiator":"user",Accept:"application/json","Content-Type":"application/json"},clientId:"Iv1.b507a08c87ecfe98"},kiro:{baseUrl:"https://codewhisperer.us-east-1.amazonaws.com/generateAssistantResponse",format:"kiro",retry:{429:2},headers:{"Content-Type":"application/json",Accept:"application/vnd.amazon.eventstream","X-Amz-Target":"AmazonCodeWhispererStreamingService.GenerateAssistantResponse","User-Agent":"AWS-SDK-JS/3.0.0 kiro-ide/1.0.0","X-Amz-User-Agent":"aws-sdk-js/3.0.0 kiro-ide/1.0.0"},tokenUrl:"https://prod.us-east-1.auth.desktop.kiro.dev/refreshToken",authUrl:"https://prod.us-east-1.auth.desktop.kiro.dev"},cursor:{baseUrl:"https://api2.cursor.sh",chatPath:"/aiserver.v1.ChatService/StreamUnifiedChatWithTools",format:"cursor",headers:{"connect-accept-encoding":"gzip","connect-protocol-version":"1","Content-Type":"application/connect+proto","User-Agent":"connect-es/1.6.1"},clientVersion:"3.1.0"},"kimi-coding":{baseUrl:s,format:"claude",headers:{...o},clientId:"17e5f671-d194-4dfb-9706-5516cb48c098",tokenUrl:"https://auth.kimi.com/api/oauth/token",refreshUrl:"https://auth.kimi.com/api/oauth/token"},kilocode:{baseUrl:"https://api.kilo.ai/api/openrouter/chat/completions",format:"openai",headers:{}},opencode:{baseUrl:"http://localhost:4096/v1/chat/completions",format:"openai",headers:{}},cline:{baseUrl:"https://api.cline.bot/api/v1/chat/completions",format:"openai",headers:{"HTTP-Referer":"https://cline.bot","X-Title":"Cline"},tokenUrl:"https://api.cline.bot/api/v1/auth/token",refreshUrl:"https://api.cline.bot/api/v1/auth/refresh"},nvidia:{baseUrl:"https://integrate.api.nvidia.com/v1/chat/completions",format:"openai"},anthropic:{baseUrl:"https://api.anthropic.com/v1/messages",format:"claude",headers:{...o}},deepseek:{baseUrl:"https://api.deepseek.com/chat/completions",format:"openai"},groq:{baseUrl:"https://api.groq.com/openai/v1/chat/completions",format:"openai"},xai:{baseUrl:"https://api.x.ai/v1/chat/completions",format:"openai"},mistral:{baseUrl:"https://api.mistral.ai/v1/chat/completions",format:"openai"},perplexity:{baseUrl:"https://api.perplexity.ai/chat/completions",format:"openai"},together:{baseUrl:"https://api.together.xyz/v1/chat/completions",format:"openai"},fireworks:{baseUrl:"https://api.fireworks.ai/inference/v1/chat/completions",format:"openai"},cerebras:{baseUrl:"https://api.cerebras.ai/v1/chat/completions",format:"openai"},cohere:{baseUrl:"https://api.cohere.ai/v1/chat/completions",format:"openai"},nebius:{baseUrl:"https://api.studio.nebius.ai/v1/chat/completions",format:"openai"},siliconflow:{baseUrl:"https://api.siliconflow.cn/v1/chat/completions",format:"openai"},hyperbolic:{baseUrl:"https://api.hyperbolic.xyz/v1/chat/completions",format:"openai"},deepgram:{baseUrl:"https://api.deepgram.com/v1/listen",format:"openai"},assemblyai:{baseUrl:"https://api.assemblyai.com/v1/audio/transcriptions",format:"openai"},nanobanana:{baseUrl:"https://api.nanobananaapi.ai/v1/chat/completions",format:"openai"},chutes:{baseUrl:"https://llm.chutes.ai/v1/chat/completions",format:"openai"},ollama:{baseUrl:"https://ollama.com/api/chat",format:"ollama"},"ollama-local":{baseUrl:"http://localhost:11434/api/chat",format:"ollama"},vertex:{baseUrl:"https://aiplatform.googleapis.com",format:"vertex"},"vertex-partner":{baseUrl:"https://aiplatform.googleapis.com",format:"openai"},gitlab:{baseUrl:"https://gitlab.com/api/v4/chat/completions",format:"openai"},codebuddy:{baseUrl:"https://copilot.tencent.com/v1/chat/completions",format:"openai"},opencode:{baseUrl:"https://opencode.ai",format:"openai",headers:{"x-opencode-client":"desktop"},noAuth:!0},"opencode-go":{baseUrl:"https://opencode.ai/zen/go/v1/chat/completions",format:"openai",headers:{}},"grok-web":{baseUrl:"https://grok.com/rest/app-chat/conversations/new",format:"grok-web",authType:"cookie"},"perplexity-web":{baseUrl:"https://www.perplexity.ai/rest/sse/perplexity_ask",format:"perplexity-web",authType:"cookie"}},d={cc:[{id:"claude-opus-4-7",name:"Claude Opus 4.7"},{id:"claude-opus-4-6",name:"Claude Opus 4.6"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6"},{id:"claude-opus-4-5-20251101",name:"Claude 4.5 Opus"},{id:"claude-sonnet-4-5-20250929",name:"Claude 4.5 Sonnet"},{id:"claude-haiku-4-5-20251001",name:"Claude 4.5 Haiku"}],cx:[{id:"gpt-5.4",name:"GPT 5.4"},{id:"gpt-5.3-codex",name:"GPT 5.3 Codex"},{id:"gpt-5.3-codex-xhigh",name:"GPT 5.3 Codex (xHigh)"},{id:"gpt-5.3-codex-high",name:"GPT 5.3 Codex (High)"},{id:"gpt-5.3-codex-low",name:"GPT 5.3 Codex (Low)"},{id:"gpt-5.3-codex-none",name:"GPT 5.3 Codex (None)"},{id:"gpt-5.3-codex-spark",name:"GPT 5.3 Codex Spark"},{id:"gpt-5.1-codex-mini",name:"GPT 5.1 Codex Mini"},{id:"gpt-5.1-codex-mini-high",name:"GPT 5.1 Codex Mini (High)"},{id:"gpt-5.2-codex",name:"GPT 5.2 Codex"},{id:"gpt-5.2",name:"GPT 5.2"},{id:"gpt-5.1-codex-max",name:"GPT 5.1 Codex Max"},{id:"gpt-5.1-codex",name:"GPT 5.1 Codex"},{id:"gpt-5.1",name:"GPT 5.1"},{id:"gpt-5-codex",name:"GPT 5 Codex"},{id:"gpt-5-codex-mini",name:"GPT 5 Codex Mini"}],gc:[{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gemini-3-pro-preview",name:"Gemini 3 Pro Preview"}],qw:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"qwen3-coder-flash",name:"Qwen3 Coder Flash"},{id:"vision-model",name:"Qwen3 Vision Model"},{id:"coder-model",name:"Qwen3.6 Coder Model"}],if:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"qwen3-max",name:"Qwen3 Max"},{id:"qwen3-vl-plus",name:"Qwen3 VL Plus"},{id:"qwen3-max-preview",name:"Qwen3 Max Preview"},{id:"qwen3-235b",name:"Qwen3 235B A22B"},{id:"qwen3-235b-a22b-instruct",name:"Qwen3 235B A22B Instruct"},{id:"qwen3-235b-a22b-thinking-2507",name:"Qwen3 235B A22B Thinking"},{id:"qwen3-32b",name:"Qwen3 32B"},{id:"kimi-k2",name:"Kimi K2"},{id:"deepseek-v3.2",name:"DeepSeek V3.2 Exp"},{id:"deepseek-v3.1",name:"DeepSeek V3.1 Terminus"},{id:"deepseek-v3",name:"DeepSeek V3 671B"},{id:"deepseek-r1",name:"DeepSeek R1"},{id:"glm-4.7",name:"GLM 4.7"},{id:"iflow-rome-30ba3b",name:"iFlow ROME"}],ag:[{id:"gemini-3.1-pro-high",name:"Gemini 3 Pro High"},{id:"gemini-3.1-pro-low",name:"Gemini 3 Pro Low"},{id:"gemini-3-flash",name:"Gemini 3 Flash",thinking:!1},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6"},{id:"claude-opus-4-6-thinking",name:"Claude Opus 4.6 Thinking"},{id:"gpt-oss-120b-medium",name:"GPT OSS 120B Medium"}],gh:[{id:"gpt-3.5-turbo",name:"GPT-3.5 Turbo"},{id:"gpt-4",name:"GPT-4"},{id:"gpt-4o",name:"GPT-4o"},{id:"gpt-4o-mini",name:"GPT-4o mini"},{id:"gpt-4.1",name:"GPT-4.1"},{id:"gpt-5-mini",name:"GPT-5 Mini"},{id:"gpt-5.2",name:"GPT-5.2"},{id:"gpt-5.2-codex",name:"GPT-5.2 Codex"},{id:"gpt-5.3-codex",name:"GPT-5.3 Codex"},{id:"gpt-5.4",name:"GPT-5.4"},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5"},{id:"claude-opus-4.5",name:"Claude Opus 4.5"},{id:"claude-sonnet-4",name:"Claude Sonnet 4"},{id:"claude-sonnet-4.5",name:"Claude Sonnet 4.5"},{id:"claude-sonnet-4.6",name:"Claude Sonnet 4.6"},{id:"claude-opus-4.6",name:"Claude Opus 4.6"},{id:"claude-opus-4.7",name:"Claude Opus 4.7"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash"},{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro"},{id:"grok-code-fast-1",name:"Grok Code Fast 1"},{id:"oswe-vscode-prime",name:"Raptor Mini"},{id:"goldeneye-free-auto",name:"GoldenEye"}],kr:[{id:"claude-sonnet-4.5",name:"Claude Sonnet 4.5"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5"},{id:"deepseek-3.2",name:"DeepSeek 3.2",strip:["image","audio"]},{id:"qwen3-coder-next",name:"Qwen3 Coder Next",strip:["image","audio"]},{id:"glm-5",name:"GLM 5"},{id:"MiniMax-M2.5",name:"MiniMax M2.5"}],cu:[{id:"default",name:"Auto (Server Picks)"},{id:"claude-4.5-opus-high-thinking",name:"Claude 4.5 Opus High Thinking"},{id:"claude-4.5-opus-high",name:"Claude 4.5 Opus High"},{id:"claude-4.5-sonnet-thinking",name:"Claude 4.5 Sonnet Thinking"},{id:"claude-4.5-sonnet",name:"Claude 4.5 Sonnet"},{id:"claude-4.5-haiku",name:"Claude 4.5 Haiku"},{id:"claude-4.5-opus",name:"Claude 4.5 Opus"},{id:"gpt-5.2-codex",name:"GPT 5.2 Codex"},{id:"claude-4.6-opus-max",name:"Claude 4.6 Opus Max"},{id:"claude-4.6-sonnet-medium-thinking",name:"Claude 4.6 Sonnet Medium Thinking"},{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gpt-5.2",name:"GPT 5.2"},{id:"gpt-5.3-codex",name:"GPT 5.3 Codex"}],kmc:[{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"kimi-k2.5-thinking",name:"Kimi K2.5 Thinking"},{id:"kimi-latest",name:"Kimi Latest"}],kc:[{id:"anthropic/claude-sonnet-4-20250514",name:"Claude Sonnet 4"},{id:"anthropic/claude-opus-4-20250514",name:"Claude Opus 4"},{id:"google/gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"google/gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"openai/gpt-4.1",name:"GPT-4.1"},{id:"openai/o3",name:"o3"},{id:"deepseek/deepseek-chat",name:"DeepSeek Chat"},{id:"deepseek/deepseek-reasoner",name:"DeepSeek Reasoner"}],"opencode-go":[{id:"kimi-k2.6",name:"Kimi K2.6"},{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"glm-5.1",name:"GLM 5.1"},{id:"glm-5",name:"GLM 5"},{id:"qwen3.5-plus",name:"Qwen 3.5 Plus"},{id:"qwen3.6-plus",name:"Qwen 3.6 Plus"},{id:"mimo-v2-pro",name:"MiMo V2 Pro"},{id:"mimo-v2-omni",name:"MiMo V2 Omni"},{id:"minimax-m2.7",name:"MiniMax M2.7",targetFormat:"claude"},{id:"minimax-m2.5",name:"MiniMax M2.5",targetFormat:"claude"}],oc:[],cl:[{id:"anthropic/claude-opus-4.7",name:"Claude Opus 4.7"},{id:"anthropic/claude-sonnet-4.6",name:"Claude Sonnet 4.6"},{id:"anthropic/claude-opus-4.6",name:"Claude Opus 4.6"},{id:"openai/gpt-5.3-codex",name:"GPT-5.3 Codex"},{id:"openai/gpt-5.4",name:"GPT-5.4"},{id:"google/gemini-3.1-pro-preview",name:"Gemini 3.1 Pro Preview"},{id:"google/gemini-3.1-flash-lite-preview",name:"Gemini 3.1 Flash Lite Preview"},{id:"kwaipilot/kat-coder-pro",name:"KAT Coder Pro"}],openai:[{id:"gpt-5.4",name:"GPT-5.4"},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini"},{id:"gpt-5.4-nano",name:"GPT-5.4 Nano"},{id:"gpt-5.2",name:"GPT-5.2"},{id:"gpt-5.1",name:"GPT-5.1"},{id:"gpt-5",name:"GPT-5"},{id:"gpt-5-mini",name:"GPT-5 Mini"},{id:"gpt-5-nano",name:"GPT-5 Nano"},{id:"gpt-4o",name:"GPT-4o"},{id:"gpt-4o-mini",name:"GPT-4o Mini"},{id:"gpt-4-turbo",name:"GPT-4 Turbo"},{id:"gpt-4.1",name:"GPT-4.1"},{id:"gpt-4.1-mini",name:"GPT-4.1 Mini"},{id:"gpt-4.1-nano",name:"GPT-4.1 Nano"},{id:"o3",name:"O3"},{id:"o3-mini",name:"O3 Mini"},{id:"o3-pro",name:"O3 Pro"},{id:"o4-mini",name:"O4 Mini"},{id:"o1",name:"O1"},{id:"o1-mini",name:"O1 Mini"},{id:"text-embedding-3-large",name:"Text Embedding 3 Large",type:"embedding"},{id:"text-embedding-3-small",name:"Text Embedding 3 Small",type:"embedding"},{id:"text-embedding-ada-002",name:"Text Embedding Ada 002",type:"embedding"},{id:"tts-1",name:"TTS-1",type:"tts"},{id:"tts-1-hd",name:"TTS-1 HD",type:"tts"},{id:"gpt-4o-mini-tts",name:"GPT-4o Mini TTS",type:"tts"},{id:"gpt-image-1",name:"GPT Image 1",type:"image"},{id:"dall-e-3",name:"DALL-E 3",type:"image"},{id:"dall-e-2",name:"DALL-E 2",type:"image"}],anthropic:[{id:"claude-sonnet-4-20250514",name:"Claude Sonnet 4"},{id:"claude-opus-4-20250514",name:"Claude Opus 4"},{id:"claude-3-5-sonnet-20241022",name:"Claude 3.5 Sonnet"}],gemini:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro Preview"},{id:"gemini-3.1-flash-lite-preview",name:"Gemini 3.1 Flash Lite Preview"},{id:"gemini-3.1-flash-image-preview",name:"Gemini 3.1 Flash Image Preview"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"gemini-2.5-flash-lite",name:"Gemini 2.5 Flash Lite"},{id:"gemini-2.0-flash",name:"Gemini 2.0 Flash"},{id:"gemini-2.0-flash-lite",name:"Gemini 2.0 Flash Lite"},{id:"gemma-4-31b-it",name:"Gemma 4 31B IT"},{id:"gemini-embedding-2-preview",name:"Gemini Embedding 2 Preview",type:"embedding"},{id:"gemini-embedding-001",name:"Gemini Embedding 001",type:"embedding"},{id:"text-embedding-005",name:"Text Embedding 005",type:"embedding"},{id:"text-embedding-004",name:"Text Embedding 004 (Legacy)",type:"embedding"},{id:"gemini-3.1-flash-image-preview",name:"Gemini 3.1 Flash Image (Nano Banana 2)",type:"image"},{id:"gemini-3-pro-image-preview",name:"Gemini 3 Pro Image (Nano Banana Pro)",type:"image"},{id:"gemini-2.5-flash-image",name:"Gemini 2.5 Flash Image (Nano Banana)",type:"image"}],openrouter:[{id:"openai/text-embedding-3-large",name:"OpenAI Text Embedding 3 Large",type:"embedding"},{id:"openai/text-embedding-3-small",name:"OpenAI Text Embedding 3 Small",type:"embedding"},{id:"openai/text-embedding-ada-002",name:"OpenAI Text Embedding Ada 002",type:"embedding"},{id:"qwen/qwen3-embedding-8b",name:"Qwen3 Embedding 8B",type:"embedding"},{id:"perplexity/pplx-embed-v1-4b",name:"Perplexity Embed V1 4B",type:"embedding"},{id:"perplexity/pplx-embed-v1-0.6b",name:"Perplexity Embed V1 0.6B",type:"embedding"},{id:"nvidia/llama-nemotron-embed-vl-1b-v2:free",name:"NVIDIA Nemotron Embed VL 1B V2 (Free)",type:"embedding"},{id:"openai/gpt-4o-mini-tts",name:"GPT-4o Mini TTS",type:"tts"},{id:"openai/tts-1-hd",name:"TTS-1 HD",type:"tts"},{id:"openai/tts-1",name:"TTS-1",type:"tts"},{id:"openai/dall-e-3",name:"DALL-E 3 (via OpenRouter)",type:"image"},{id:"openai/gpt-image-1",name:"GPT Image 1 (via OpenRouter)",type:"image"},{id:"google/imagen-3.0-generate-002",name:"Imagen 3 (via OpenRouter)",type:"image"},{id:"black-forest-labs/FLUX.1-schnell",name:"FLUX.1 Schnell (via OpenRouter)",type:"image"}],glm:[{id:"glm-5.1",name:"GLM 5.1"},{id:"glm-5",name:"GLM 5"},{id:"glm-4.7",name:"GLM 4.7"},{id:"glm-4.6v",name:"GLM 4.6V (Vision)"}],"glm-cn":[{id:"glm-5.1",name:"GLM 5.1"},{id:"glm-5",name:"GLM 5"},{id:"glm-4.7",name:"GLM-4.7"},{id:"glm-4.6",name:"GLM-4.6"},{id:"glm-4.5-air",name:"GLM-4.5-Air"}],kimi:[{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"kimi-k2.5-thinking",name:"Kimi K2.5 Thinking"},{id:"kimi-latest",name:"Kimi Latest"}],minimax:[{id:"MiniMax-M2.7",name:"MiniMax M2.7"},{id:"MiniMax-M2.5",name:"MiniMax M2.5"},{id:"MiniMax-M2.1",name:"MiniMax M2.1"},{id:"minimax-image-01",name:"MiniMax Image 01",type:"image"}],blackbox:[{id:"gpt-4o",name:"GPT-4o"},{id:"gpt-4o-mini",name:"GPT-4o mini"},{id:"claude-sonnet-4.6",name:"Claude Sonnet 4.6"},{id:"claude-sonnet-4.5",name:"Claude Sonnet 4.5"},{id:"claude-opus-4.6",name:"Claude Opus 4.6"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6 (Legacy)"},{id:"claude-opus-4-6",name:"Claude Opus 4.6 (Legacy)"},{id:"deepseek-chat",name:"DeepSeek Chat"},{id:"deepseek-v3-671b",name:"DeepSeek V3 671B"},{id:"deepseek-r1",name:"DeepSeek R1"},{id:"o1",name:"OpenAI o1"},{id:"o3-mini",name:"OpenAI o3-mini"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"qwen3-max",name:"Qwen3 Max"},{id:"qwen3-vl-plus",name:"Qwen3 VL Plus"}],"minimax-cn":[{id:"MiniMax-M2.7",name:"MiniMax M2.7"},{id:"MiniMax-M2.5",name:"MiniMax M2.5"},{id:"MiniMax-M2.1",name:"MiniMax M2.1"}],alicode:[{id:"qwen3.5-plus",name:"Qwen3.5 Plus"},{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"glm-5",name:"GLM 5"},{id:"MiniMax-M2.5",name:"MiniMax M2.5"},{id:"qwen3-max-2026-01-23",name:"Qwen3 Max"},{id:"qwen3-coder-next",name:"Qwen3 Coder Next"},{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"glm-4.7",name:"GLM 4.7"}],"alicode-intl":[{id:"qwen3.5-plus",name:"Qwen3.5 Plus"},{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"glm-5",name:"GLM 5"},{id:"MiniMax-M2.5",name:"MiniMax M2.5"},{id:"qwen3-coder-next",name:"Qwen3 Coder Next"},{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"glm-4.7",name:"GLM 4.7"}],deepseek:[{id:"deepseek-chat",name:"DeepSeek V3.2 Chat"},{id:"deepseek-reasoner",name:"DeepSeek V3.2 Reasoner"}],groq:[{id:"llama-3.3-70b-versatile",name:"Llama 3.3 70B"},{id:"meta-llama/llama-4-maverick-17b-128e-instruct",name:"Llama 4 Maverick"},{id:"qwen/qwen3-32b",name:"Qwen3 32B"},{id:"openai/gpt-oss-120b",name:"GPT-OSS 120B"}],xai:[{id:"grok-4",name:"Grok 4"},{id:"grok-4-fast-reasoning",name:"Grok 4 Fast Reasoning"},{id:"grok-code-fast-1",name:"Grok Code Fast"},{id:"grok-3",name:"Grok 3"}],mistral:[{id:"mistral-large-latest",name:"Mistral Large 3"},{id:"codestral-latest",name:"Codestral"},{id:"mistral-medium-latest",name:"Mistral Medium 3"}],perplexity:[{id:"sonar-pro",name:"Sonar Pro"},{id:"sonar",name:"Sonar"}],together:[{id:"meta-llama/Llama-3.3-70B-Instruct-Turbo",name:"Llama 3.3 70B Turbo"},{id:"deepseek-ai/DeepSeek-R1",name:"DeepSeek R1"},{id:"Qwen/Qwen3-235B-A22B",name:"Qwen3 235B"},{id:"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8",name:"Llama 4 Maverick"}],fireworks:[{id:"accounts/fireworks/models/deepseek-v3p1",name:"DeepSeek V3.1"},{id:"accounts/fireworks/models/llama-v3p3-70b-instruct",name:"Llama 3.3 70B"},{id:"accounts/fireworks/models/qwen3-235b-a22b",name:"Qwen3 235B"}],cerebras:[{id:"gpt-oss-120b",name:"GPT OSS 120B"},{id:"zai-glm-4.7",name:"ZAI GLM 4.7"},{id:"llama-3.3-70b",name:"Llama 3.3 70B"},{id:"llama-4-scout-17b-16e-instruct",name:"Llama 4 Scout"},{id:"qwen-3-235b-a22b-instruct-2507",name:"Qwen3 235B A22B"},{id:"qwen-3-32b",name:"Qwen3 32B"}],cohere:[{id:"command-r-plus-08-2024",name:"Command R+ (Aug 2024)"},{id:"command-r-08-2024",name:"Command R (Aug 2024)"},{id:"command-a-03-2025",name:"Command A (Mar 2025)"}],nvidia:[{id:"moonshotai/kimi-k2.5",name:"Kimi K2.5"},{id:"z-ai/glm4.7",name:"GLM 4.7"}],nebius:[{id:"meta-llama/Llama-3.3-70B-Instruct",name:"Llama 3.3 70B Instruct"}],siliconflow:[{id:"deepseek-ai/DeepSeek-V3.2",name:"DeepSeek V3.2"},{id:"deepseek-ai/DeepSeek-V3.1",name:"DeepSeek V3.1"},{id:"deepseek-ai/DeepSeek-R1",name:"DeepSeek R1"},{id:"Qwen/Qwen3-235B-A22B-Instruct-2507",name:"Qwen3 235B"},{id:"Qwen/Qwen3-Coder-480B-A35B-Instruct",name:"Qwen3 Coder 480B"},{id:"Qwen/Qwen3-32B",name:"Qwen3 32B"},{id:"moonshotai/Kimi-K2.5",name:"Kimi K2.5"},{id:"zai-org/GLM-4.7",name:"GLM 4.7"},{id:"openai/gpt-oss-120b",name:"GPT OSS 120B"},{id:"baidu/ERNIE-4.5-300B-A47B",name:"ERNIE 4.5 300B"}],hyperbolic:[{id:"Qwen/QwQ-32B",name:"QwQ 32B"},{id:"deepseek-ai/DeepSeek-R1",name:"DeepSeek R1"},{id:"deepseek-ai/DeepSeek-V3",name:"DeepSeek V3"},{id:"meta-llama/Llama-3.3-70B-Instruct",name:"Llama 3.3 70B"},{id:"meta-llama/Llama-3.2-3B-Instruct",name:"Llama 3.2 3B"},{id:"Qwen/Qwen2.5-72B-Instruct",name:"Qwen 2.5 72B"},{id:"Qwen/Qwen2.5-Coder-32B-Instruct",name:"Qwen 2.5 Coder 32B"},{id:"NousResearch/Hermes-3-Llama-3.1-70B",name:"Hermes 3 70B"}],ollama:[{id:"gpt-oss:120b",name:"GPT OSS 120B"},{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"glm-5",name:"GLM 5"},{id:"minimax-m2.5",name:"MiniMax M2.5"},{id:"glm-4.7-flash",name:"GLM 4.7 Flash"},{id:"qwen3.5",name:"Qwen3.5"}],vertex:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro Preview"},{id:"gemini-3.1-flash-lite-preview",name:"Gemini 3.1 Flash Lite Preview"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"}],"vertex-partner":[{id:"deepseek-ai/deepseek-v3.2-maas",name:"DeepSeek V3.2 (Vertex)"},{id:"qwen/qwen3-next-80b-a3b-thinking-maas",name:"Qwen3 Next 80B Thinking (Vertex)"},{id:"qwen/qwen3-next-80b-a3b-instruct-maas",name:"Qwen3 Next 80B Instruct (Vertex)"},{id:"zai-org/glm-5-maas",name:"GLM-5 (Vertex)"}],"grok-web":[{id:"grok-3",name:"Grok 3"},{id:"grok-3-mini",name:"Grok 3 Mini (Thinking)"},{id:"grok-3-thinking",name:"Grok 3 Thinking"},{id:"grok-4",name:"Grok 4"},{id:"grok-4-mini",name:"Grok 4 Mini (Thinking)"},{id:"grok-4-thinking",name:"Grok 4 Thinking"},{id:"grok-4-heavy",name:"Grok 4 Heavy (SuperGrok)"},{id:"grok-4.1-mini",name:"Grok 4.1 Mini (Thinking)"},{id:"grok-4.1-fast",name:"Grok 4.1 Fast"},{id:"grok-4.1-expert",name:"Grok 4.1 Expert"},{id:"grok-4.1-thinking",name:"Grok 4.1 Thinking"},{id:"grok-4.2",name:"Grok 4.2 (4.20 Beta)"}],"perplexity-web":[{id:"pplx-auto",name:"Perplexity Auto (Free)"},{id:"pplx-sonar",name:"Perplexity Sonar"},{id:"pplx-gpt",name:"GPT-5.4 (via Perplexity)"},{id:"pplx-gemini",name:"Gemini 3.1 Pro (via Perplexity)"},{id:"pplx-sonnet",name:"Claude Sonnet 4.6 (via Perplexity)"},{id:"pplx-opus",name:"Claude Opus 4.6 (via Perplexity)"},{id:"pplx-nemotron",name:"Nemotron 3 Super (via Perplexity)"}],...(0,a(36698).pp)(),nanobanana:[{id:"nanobanana-flash",name:"NanoBanana Flash",type:"image"},{id:"nanobanana-pro",name:"NanoBanana Pro",type:"image"}],sdwebui:[{id:"stable-diffusion-v1-5",name:"Stable Diffusion v1.5",type:"image"},{id:"sdxl-base-1.0",name:"SDXL Base 1.0",type:"image"}],comfyui:[{id:"flux-dev",name:"FLUX Dev",type:"image"},{id:"sdxl",name:"SDXL",type:"image"}],huggingface:[{id:"black-forest-labs/FLUX.1-schnell",name:"FLUX.1 Schnell",type:"image"},{id:"stabilityai/stable-diffusion-xl-base-1.0",name:"SDXL Base 1.0",type:"image"}]},r={claude:"cc",codex:"cx","gemini-cli":"gc",qwen:"qw",iflow:"if",antigravity:"ag",github:"gh",kiro:"kr",cursor:"cu","kimi-coding":"kmc",kilocode:"kc",cline:"cl",opencode:"oc",vertex:"vertex","vertex-partner":"vertex-partner"},l=Object.fromEntries(Object.keys(m).map(e=>[e,r[e]||e]));function c(e){return d[l[e]||e]||[]}},98814:(e,i,a)=>{a.d(i,{ThemeProvider:()=>s});var t=a(73365),n=a(1521),o=a(83789);function s({children:e}){let{initTheme:i}=(0,o.A)();return(0,n.useEffect)(()=>{i()},[i]),(0,t.jsx)(t.Fragment,{children:e})}}}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2134],{7207:(e,t,s)=>{Promise.resolve().then(s.bind(s,60717))},60717:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>C});var i=s(73365),a=s(1521),r=s(29717),l=s(99568),o=s.n(l),n=s(58872),d=s(74156),c=s(82495),p=s(69633),x=s(96459);let m=new Map;async function u(e){if(!e?.url||!e?.type)return[];let t=m.get(e.url);if(t&&Date.now()<t.expiresAt)return t.data;try{let t=new URLSearchParams({url:e.url,type:e.type}),s=await fetch(`/api/providers/suggested-models?${t}`);if(!s.ok)return[];let i=(await s.json()).data??[];return m.set(e.url,{data:i,expiresAt:Date.now()+6e5}),i}catch{return[]}}var h=s(86447),y=s.n(h);function f({model:e,fullModel:t,alias:s,copied:a,onCopy:r,testStatus:l,isCustom:o,isFree:n,onDeleteAlias:d,onTest:c,isTesting:p}){let x="ok"===l?"#22c55e":"error"===l?"#ef4444":void 0;return(0,i.jsx)("div",{className:`group px-3 py-2 rounded-lg border ${"ok"===l?"border-green-500/40":"error"===l?"border-red-500/40":"border-border"} hover:bg-sidebar/50`,children:(0,i.jsxs)("div",{className:"flex items-center gap-2",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-base",style:x?{color:x}:void 0,children:"ok"===l?"check_circle":"error"===l?"cancel":"smart_toy"}),(0,i.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,i.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:t}),e.name&&(0,i.jsx)("span",{className:"text-[9px] text-text-muted/70 italic pl-1",children:e.name})]}),c&&(0,i.jsxs)("div",{className:"relative group/btn",children:[(0,i.jsx)("button",{onClick:c,disabled:p,className:`p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary transition-opacity ${p?"opacity-100":"opacity-0 group-hover:opacity-100"}`,children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",style:p?{animation:"spin 1s linear infinite"}:void 0,children:p?"progress_activity":"science"})}),(0,i.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:p?"Testing...":"Test"})]}),(0,i.jsxs)("div",{className:"relative group/btn",children:[(0,i.jsx)("button",{onClick:()=>r(t,`model-${e.id}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:a===`model-${e.id}`?"check":"content_copy"})}),(0,i.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:a===`model-${e.id}`?"Copied!":"Copy"})]}),o&&(0,i.jsx)("button",{onClick:d,className:"p-0.5 hover:bg-red-500/10 rounded text-text-muted hover:text-red-500 opacity-0 group-hover:opacity-100 transition-opacity ml-auto",title:"Remove custom model",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:"close"})})]})})}function g({modelId:e,fullModel:t,copied:s,onCopy:a,onDeleteAlias:r,onTest:l,testStatus:o,isTesting:n}){let d="ok"===o?"#22c55e":"error"===o?"#ef4444":void 0;return(0,i.jsxs)("div",{className:`flex items-center gap-3 p-3 rounded-lg border ${"ok"===o?"border-green-500/40":"error"===o?"border-red-500/40":"border-border"} hover:bg-sidebar/50`,children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",style:d?{color:d}:void 0,children:"ok"===o?"check_circle":"error"===o?"cancel":"smart_toy"}),(0,i.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,i.jsx)("p",{className:"text-sm font-medium truncate",children:e}),(0,i.jsxs)("div",{className:"flex items-center gap-1 mt-1",children:[(0,i.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:t}),(0,i.jsxs)("div",{className:"relative group/btn",children:[(0,i.jsx)("button",{onClick:()=>a(t,`model-${e}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:s===`model-${e}`?"check":"content_copy"})}),(0,i.jsx)("span",{className:"pointer-events-none absolute top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:s===`model-${e}`?"Copied!":"Copy"})]}),l&&(0,i.jsxs)("div",{className:"relative group/btn",children:[(0,i.jsx)("button",{onClick:l,disabled:n,className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary transition-colors",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",style:n?{animation:"spin 1s linear infinite"}:void 0,children:n?"progress_activity":"science"})}),(0,i.jsx)("span",{className:"pointer-events-none absolute top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:n?"Testing...":"Test"})]})]})]}),(0,i.jsx)("button",{onClick:r,className:"p-1 hover:bg-red-50 rounded text-red-500",title:"Remove model",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:"delete"})})]})}function b({providerStorageAlias:e,providerDisplayAlias:t,modelAliases:s,copied:r,onCopy:l,onSetAlias:o,onDeleteAlias:n,connections:c,isAnthropic:p}){let[x,m]=(0,a.useState)(""),[u,h]=(0,a.useState)(!1),[y,f]=(0,a.useState)(!1),[v,j]=(0,a.useState)(null),[N,k]=(0,a.useState)({}),w=async t=>{if(!v){j(t);try{let s=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${e}/${t}`})}),i=await s.json();k(e=>({...e,[t]:i.ok?"ok":"error"}))}catch{k(e=>({...e,[t]:"error"}))}finally{j(null)}}},C=Object.entries(s).filter(([,t])=>t.startsWith(`${e}/`)).map(([t,s])=>({modelId:s.replace(`${e}/`,""),fullModel:s,alias:t})),S=i=>{let a,r=`${e}/${i}`;if(Object.values(s).includes(r))return null;let l=(a=i.split("/"))[a.length-1];if(!s[l])return l;let o=`${t}-${l}`;return s[o]?null:o},A=async()=>{if(!x.trim()||u)return;let t=x.trim(),s=S(t);if(!s)return void alert("All suggested aliases already exist. Please choose a different model or remove conflicting aliases.");h(!0);try{await o(t,s,e),m("")}catch(e){console.log("Error adding model:",e)}finally{h(!1)}},$=async()=>{if(y)return;let t=c.find(e=>!1!==e.isActive);if(t){f(!0);try{let s=await fetch(`/api/providers/${t.id}/models`),i=await s.json();if(!s.ok)return void alert(i.error||"Failed to import models");let a=i.models||[];if(0===a.length)return void alert("No models returned from /models.");let r=0;for(let t of a){let s=t.id||t.name||t.model;if(!s)continue;let i=S(s);i&&(await o(s,i,e),r+=1)}0===r&&alert("No new models were added.")}catch(e){console.log("Error importing models:",e)}finally{f(!1)}}},P=c.some(e=>!1!==e.isActive);return(0,i.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,i.jsxs)("p",{className:"text-sm text-text-muted",children:["Add ",p?"Anthropic":"OpenAI","-compatible models manually or import them from the /models endpoint."]}),(0,i.jsxs)("div",{className:"flex items-end gap-2 flex-wrap",children:[(0,i.jsxs)("div",{className:"flex-1 min-w-[240px]",children:[(0,i.jsx)("label",{htmlFor:"new-compatible-model-input",className:"text-xs text-text-muted mb-1 block",children:"Model ID"}),(0,i.jsx)("input",{id:"new-compatible-model-input",type:"text",value:x,onChange:e=>m(e.target.value),onKeyDown:e=>"Enter"===e.key&&A(),placeholder:p?"claude-3-opus-20240229":"gpt-4o",className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,i.jsx)(d.$n,{size:"sm",icon:"add",onClick:A,disabled:!x.trim()||u,children:u?"Adding...":"Add"}),(0,i.jsx)(d.$n,{size:"sm",variant:"secondary",icon:"download",onClick:$,disabled:!P||y,children:y?"Importing...":"Import from /models"})]}),!P&&(0,i.jsx)("p",{className:"text-xs text-text-muted",children:"Add a connection to enable importing models."}),C.length>0&&(0,i.jsx)("div",{className:"flex flex-col gap-3",children:C.map(({modelId:e,fullModel:s,alias:a})=>(0,i.jsx)(g,{modelId:e,fullModel:`${t}/${e}`,copied:r,onCopy:l,onDeleteAlias:()=>n(a),onTest:c.length>0?()=>w(e):void 0,testStatus:N[e],isTesting:v===e},s))})]})}function v({until:e}){let[t,s]=(0,a.useState)("");return((0,a.useEffect)(()=>{let t=()=>{let t=new Date(e).getTime()-Date.now();if(t<=0)return void s("");let i=Math.floor(t/1e3);if(i<60)s(`${i}s`);else if(i<3600)s(`${Math.floor(i/60)}m ${i%60}s`);else{let e=Math.floor(i/3600),t=Math.floor(i%3600/60);s(`${e}h ${t}m`)}};t();let i=setInterval(t,1e3);return()=>clearInterval(i)},[e]),t)?(0,i.jsxs)("span",{className:"text-xs text-orange-500 font-mono",children:["⏱ ",t]}):null}function j({connection:e,proxyPools:t,isOAuth:s,isFirst:r,isLast:l,onMoveUp:o,onMoveDown:n,onToggleActive:c,onUpdateProxy:p,onEdit:x,onDelete:m}){let[u,h]=(0,a.useState)(!1),[y,f]=(0,a.useState)(!1),g=(0,a.useRef)(null),b=new Map((t||[]).map(e=>[e.id,e])),N=e.providerSpecificData?.proxyPoolId||null,k=N?b.get(N):null,w=e.providerSpecificData?.connectionProxyEnabled===!0&&!!e.providerSpecificData?.connectionProxyUrl,C=!!N||w,S=k?`Pool: ${k.name}`:N?`Pool: ${N} (inactive/missing)`:w?`Legacy: ${e.providerSpecificData?.connectionProxyUrl}`:"",A="";if(k?.proxyUrl||e.providerSpecificData?.connectionProxyUrl){let t=k?.proxyUrl||e.providerSpecificData?.connectionProxyUrl;try{let e=new URL(t);A=`${e.protocol}//${e.hostname}${e.port?`:${e.port}`:""}`}catch{A=t}}let $=k?.noProxy||e.providerSpecificData?.connectionNoProxy||"",P="default";k?.isActive===!0?P="success":(N||w)&&(P="error"),(0,a.useEffect)(()=>{if(!u)return;let e=e=>{g.current&&!g.current.contains(e.target)&&h(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[u]);let T=async e=>{f(!0);try{await p("__none__"===e?null:e)}finally{f(!1),h(!1)}},O=s?e.name||e.email||e.displayName||"OAuth Account":e.name,[R,_]=(0,a.useState)(!1),E=Object.entries(e).filter(([e])=>e.startsWith("modelLock_")).map(([,e])=>e).filter(e=>!!e).sort()[0]||null;(0,a.useEffect)(()=>{let t=()=>{_(!!Object.entries(e).filter(([e])=>e.startsWith("modelLock_")).map(([,e])=>e).filter(e=>e&&new Date(e).getTime()>Date.now()).sort()[0])};t();let s=E?setInterval(t,1e3):null;return()=>{s&&clearInterval(s)}},[E]);let I="unavailable"!==e.testStatus||R?e.testStatus:"active";return(0,i.jsxs)("div",{className:`group flex items-center justify-between p-2 rounded-lg hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors ${!1===e.isActive?"opacity-60":""}`,children:[(0,i.jsxs)("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:[(0,i.jsxs)("div",{className:"flex flex-col",children:[(0,i.jsx)("button",{onClick:o,disabled:r,className:`p-0.5 rounded ${r?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_up"})}),(0,i.jsx)("button",{onClick:n,disabled:l,className:`p-0.5 rounded ${l?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_down"})})]}),(0,i.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",children:s?"lock":"key"}),(0,i.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,i.jsx)("p",{className:"text-sm font-medium truncate",children:O}),(0,i.jsxs)("div",{className:"flex items-center gap-2 mt-1",children:[(0,i.jsx)(d.Ex,{variant:!1===e.isActive?"default":"active"===I||"success"===I?"success":"error"===I||"expired"===I||"unavailable"===I?"error":"default",size:"sm",dot:!0,children:!1===e.isActive?"disabled":I||"Unknown"}),C&&(0,i.jsx)(d.Ex,{variant:P,size:"sm",children:"Proxy"}),R&&!1!==e.isActive&&(0,i.jsx)(v,{until:E}),e.lastError&&!1!==e.isActive&&(0,i.jsx)("span",{className:"text-xs text-red-500 truncate max-w-[300px]",title:e.lastError,children:e.lastError}),(0,i.jsxs)("span",{className:"text-xs text-text-muted",children:["#",e.priority]}),e.globalPriority&&(0,i.jsxs)("span",{className:"text-xs text-text-muted",children:["Auto: ",e.globalPriority]})]}),C&&(0,i.jsxs)("div",{className:"mt-1 flex items-center gap-2 flex-wrap",children:[(0,i.jsx)("span",{className:"text-[11px] text-text-muted truncate max-w-[420px]",title:S,children:S}),A&&(0,i.jsx)("code",{className:"text-[10px] font-mono bg-black/5 dark:bg-white/5 px-1 py-0.5 rounded text-text-muted",children:A}),$&&(0,i.jsxs)("span",{className:"text-[11px] text-text-muted truncate max-w-[320px]",title:$,children:["no_proxy: ",$]})]})]})]}),(0,i.jsxs)("div",{className:"flex items-center gap-2",children:[(0,i.jsxs)("div",{className:"flex gap-1",children:[(t||[]).length>0&&(0,i.jsxs)("div",{className:"relative",ref:g,children:[(0,i.jsxs)("button",{onClick:()=>h(e=>!e),className:`flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 transition-colors ${C?"text-primary":"text-text-muted hover:text-primary"}`,disabled:y,children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:y?"progress_activity":"lan"}),(0,i.jsx)("span",{className:"text-[10px] leading-tight",children:"Proxy"})]}),u&&(0,i.jsxs)("div",{className:"absolute right-0 top-full mt-1 z-50 bg-bg border border-border rounded-lg shadow-lg py-1 min-w-[160px]",children:[(0,i.jsx)("button",{onClick:()=>T("__none__"),className:`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${!N?"text-primary font-medium":"text-text-main"}`,children:"None"}),(t||[]).map(e=>(0,i.jsx)("button",{onClick:()=>T(e.id),className:`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${N===e.id?"text-primary font-medium":"text-text-main"}`,children:e.name},e.id))]})]}),(0,i.jsxs)("button",{onClick:x,className:"flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 text-text-muted hover:text-primary",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"}),(0,i.jsx)("span",{className:"text-[10px] leading-tight",children:"Edit"})]}),(0,i.jsxs)("button",{onClick:m,className:"flex flex-col items-center px-2 py-1 rounded hover:bg-red-500/10 text-red-500",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"}),(0,i.jsx)("span",{className:"text-[10px] leading-tight",children:"Delete"})]})]}),(0,i.jsx)(d.lM,{size:"sm",checked:e.isActive??!0,onChange:c,title:e.isActive??!0?"Disable connection":"Enable connection"})]})]})}function N({isOpen:e,provider:t,providerName:s,isCompatible:r,isAnthropic:l,authType:o,authHint:n,website:c,proxyPools:p,onSave:x,onClose:m}){let u="__none__",h="ollama-local"===t,y="cookie"===o,f=y?"Cookie Value":"API Key",[g,b]=(0,a.useState)({name:"",apiKey:"",priority:1,proxyPoolId:u,ollamaHostUrl:""}),[v,j]=(0,a.useState)(!1),[k,w]=(0,a.useState)(null),[C,S]=(0,a.useState)(!1),A=()=>{if(h&&g.ollamaHostUrl.trim())return{baseUrl:g.ollamaHostUrl.trim()}},$=async()=>{j(!0);try{let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t,apiKey:g.apiKey,providerSpecificData:A()})}),s=await e.json();w(s.valid?"success":"failed")}catch{w("failed")}finally{j(!1)}},P=async()=>{if(t&&(h||g.apiKey)&&(h||g.name)){S(!0);try{let e=!1;try{j(!0),w(null);let s=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t,apiKey:g.apiKey,providerSpecificData:A()})});e=!!(await s.json()).valid,w(e?"success":"failed")}catch{w("failed")}finally{j(!1)}await x({name:g.name||(h?"Ollama Local":""),apiKey:g.apiKey,priority:g.priority,proxyPoolId:g.proxyPoolId===u?null:g.proxyPoolId,testStatus:e?"active":"unknown",providerSpecificData:A()})}finally{S(!1)}}};return t?(0,i.jsx)(d.aF,{isOpen:e,title:`Add ${s||t} ${f}`,onClose:m,children:(0,i.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,i.jsx)(d.pd,{label:"Name",value:g.name,onChange:e=>b({...g,name:e.target.value}),placeholder:h?"Ollama Local":"Production Key"}),h&&(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.pd,{label:"Ollama Host URL",value:g.ollamaHostUrl,onChange:e=>b({...g,ollamaHostUrl:e.target.value}),placeholder:"http://localhost:11434",className:"flex-1"}),(0,i.jsx)("div",{className:"pt-6",children:(0,i.jsx)(d.$n,{onClick:$,disabled:v||C,variant:"secondary",children:v?"Checking...":"Check"})})]}),!h&&(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.pd,{label:f,type:y?"text":"password",value:g.apiKey,onChange:e=>b({...g,apiKey:e.target.value}),placeholder:y?"grok-web"===t?"sso=xxxxx... or just the raw value":"eyJhbGciOi...":"",className:"flex-1"}),(0,i.jsx)("div",{className:"pt-6",children:(0,i.jsx)(d.$n,{onClick:$,disabled:!g.apiKey||v||C,variant:"secondary",children:v?"Checking...":"Check"})})]}),y&&n&&(0,i.jsxs)("p",{className:"text-xs text-text-muted",children:[n,c&&(0,i.jsxs)(i.Fragment,{children:[" ",(0,i.jsxs)("a",{href:c,target:"_blank",rel:"noopener noreferrer",className:"text-primary underline",children:["Open ",c.replace(/^https?:\/\//,"")]})]})]}),h&&(0,i.jsxs)("p",{className:"text-xs text-text-muted",children:["Leave blank to use ",(0,i.jsx)("code",{children:"http://localhost:11434"}),". For remote Ollama, enter the full host URL (e.g. ",(0,i.jsx)("code",{children:"http://192.168.1.10:11434"}),")."]}),k&&(0,i.jsx)(d.Ex,{variant:"success"===k?"success":"error",children:"success"===k?"Valid":"Invalid"}),r&&(0,i.jsx)("p",{className:"text-xs text-text-muted",children:l?`Validation checks ${s||"Anthropic Compatible"} by verifying the API key.`:`Validation checks ${s||"OpenAI Compatible"} via /models on your base URL.`}),(0,i.jsx)(d.pd,{label:"Priority",type:"number",value:g.priority,onChange:e=>b({...g,priority:Number.parseInt(e.target.value)||1})}),(0,i.jsx)(d.l6,{label:"Proxy Pool",value:g.proxyPoolId,onChange:e=>b({...g,proxyPoolId:e.target.value}),options:[{value:u,label:"None"},...(p||[]).map(e=>({value:e.id,label:e.name}))],placeholder:"None"}),0===(p||[]).length&&(0,i.jsx)("p",{className:"text-xs text-text-muted",children:"No active proxy pools available. Create one in Proxy Pools page first."}),(0,i.jsx)("p",{className:"text-xs text-text-muted",children:"Legacy manual proxy fields are still accepted by API for backward compatibility."}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.$n,{onClick:P,fullWidth:!0,disabled:C||!h&&(!g.name||!g.apiKey),children:C?"Saving...":"Save"}),(0,i.jsx)(d.$n,{onClick:m,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}):null}function k({isOpen:e,node:t,onSave:s,onClose:r,isAnthropic:l}){let[o,n]=(0,a.useState)({name:"",prefix:"",apiType:"chat",baseUrl:"https://api.openai.com/v1"}),[c,p]=(0,a.useState)(!1),[x,m]=(0,a.useState)(""),[u,h]=(0,a.useState)(""),[y,f]=(0,a.useState)(!1),[g,b]=(0,a.useState)(null);(0,a.useEffect)(()=>{t&&n({name:t.name||"",prefix:t.prefix||"",apiType:t.apiType||"chat",baseUrl:t.baseUrl||(l?"https://api.anthropic.com/v1":"https://api.openai.com/v1")})},[t,l]);let v=async()=>{if(o.name.trim()&&o.prefix.trim()&&o.baseUrl.trim()){p(!0);try{let e={name:o.name,prefix:o.prefix,baseUrl:o.baseUrl};l||(e.apiType=o.apiType),await s(e)}finally{p(!1)}}},j=async()=>{f(!0);try{let e=await fetch("/api/provider-nodes/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({baseUrl:o.baseUrl,apiKey:x,type:l?"anthropic-compatible":"openai-compatible",modelId:u.trim()||void 0})}),t=await e.json();b(t.valid?"success":"failed")}catch{b("failed")}finally{f(!1)}};return t?(0,i.jsx)(d.aF,{isOpen:e,title:`Edit ${l?"Anthropic":"OpenAI"} Compatible`,onClose:r,children:(0,i.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,i.jsx)(d.pd,{label:"Name",value:o.name,onChange:e=>n({...o,name:e.target.value}),placeholder:`${l?"Anthropic":"OpenAI"} Compatible (Prod)`,hint:"Required. A friendly label for this node."}),(0,i.jsx)(d.pd,{label:"Prefix",value:o.prefix,onChange:e=>n({...o,prefix:e.target.value}),placeholder:l?"ac-prod":"oc-prod",hint:"Required. Used as the provider prefix for model IDs."}),!l&&(0,i.jsx)(d.l6,{label:"API Type",options:[{value:"chat",label:"Chat Completions"},{value:"responses",label:"Responses API"}],value:o.apiType,onChange:e=>n({...o,apiType:e.target.value})}),(0,i.jsx)(d.pd,{label:"Base URL",value:o.baseUrl,onChange:e=>n({...o,baseUrl:e.target.value}),placeholder:l?"https://api.anthropic.com/v1":"https://api.openai.com/v1",hint:`Use the base URL (ending in /v1) for your ${l?"Anthropic":"OpenAI"}-compatible API.`}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.pd,{label:"API Key (for Check)",type:"password",value:x,onChange:e=>m(e.target.value),className:"flex-1"}),(0,i.jsx)("div",{className:"pt-6",children:(0,i.jsx)(d.$n,{onClick:j,disabled:!x||y||!o.baseUrl.trim(),variant:"secondary",children:y?"Checking...":"Check"})})]}),(0,i.jsx)(d.pd,{label:"Model ID (optional)",value:u,onChange:e=>h(e.target.value),placeholder:"e.g. my-model-id",hint:"If provider lacks /models endpoint, enter a model ID to validate via chat/completions instead."}),g&&(0,i.jsx)(d.Ex,{variant:"success"===g?"success":"error",children:"success"===g?"Valid":"Invalid"}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.$n,{onClick:v,fullWidth:!0,disabled:!o.name.trim()||!o.prefix.trim()||!o.baseUrl.trim()||c,children:c?"Saving...":"Save"}),(0,i.jsx)(d.$n,{onClick:r,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}):null}function w({isOpen:e,providerAlias:t,providerDisplayAlias:s,onSave:r,onClose:l}){let[o,n]=(0,a.useState)(""),[c,p]=(0,a.useState)(null),[x,m]=(0,a.useState)(""),[u,h]=(0,a.useState)(!1);(0,a.useEffect)(()=>{e&&(n(""),p(null),m(""))},[e]);let y=async()=>{if(o.trim()){p("testing"),m("");try{let e=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${t}/${o.trim()}`})}),s=await e.json();p(s.ok?"ok":"error"),m(s.error||"")}catch(e){p("error"),m(e.message)}}},f=async()=>{if(o.trim()&&!u){h(!0);try{await r(o.trim())}finally{h(!1)}}};return(0,i.jsx)(d.aF,{isOpen:e,onClose:l,title:"Add Custom Model",children:(0,i.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("label",{className:"text-sm font-medium mb-1.5 block",children:"Model ID"}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)("input",{type:"text",value:o,onChange:e=>{n(e.target.value),p(null),m("")},onKeyDown:e=>{"Enter"===e.key&&y()},placeholder:"e.g. claude-opus-4-5",className:"flex-1 px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",autoFocus:!0}),(0,i.jsx)(d.$n,{variant:"secondary",icon:"science",loading:"testing"===c,onClick:y,disabled:!o.trim()||"testing"===c,children:"testing"===c?"Testing...":"Test"})]}),(0,i.jsxs)("p",{className:"text-xs text-text-muted mt-1",children:["Sent to provider as: ",(0,i.jsx)("code",{className:"font-mono bg-sidebar px-1 rounded",children:o.trim()||"model-id"})]})]}),"ok"===c&&(0,i.jsxs)("div",{className:"flex items-center gap-2 text-sm text-green-600",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-base",children:"check_circle"}),"Model is reachable"]}),"error"===c&&(0,i.jsxs)("div",{className:"flex items-start gap-2 text-sm text-red-500",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-base shrink-0",children:"cancel"}),(0,i.jsx)("span",{children:x||"Model not reachable"})]}),(0,i.jsxs)("div",{className:"flex gap-2 pt-1",children:[(0,i.jsx)(d.$n,{onClick:l,variant:"ghost",fullWidth:!0,size:"sm",children:"Cancel"}),(0,i.jsx)(d.$n,{onClick:f,fullWidth:!0,size:"sm",disabled:!o.trim()||u,children:u?"Adding...":"Add Model"})]})]})})}function C(){let e=(0,r.useParams)(),t=(0,r.useRouter)(),s=e.id,[l,m]=(0,a.useState)([]),[h,y]=(0,a.useState)(!0),[g,v]=(0,a.useState)(null),[C,S]=(0,a.useState)([]),[A,$]=(0,a.useState)(!1),[P,T]=(0,a.useState)(!1),[O,R]=(0,a.useState)(!1),[_,E]=(0,a.useState)(!1),[I,U]=(0,a.useState)(!1),[D,q]=(0,a.useState)(!1),[M,L]=(0,a.useState)(null),[K,F]=(0,a.useState)({}),[J,z]=(0,a.useState)(!1),[W,H]=(0,a.useState)({}),[V,G]=(0,a.useState)(""),[Z,B]=(0,a.useState)(null),[Q,X]=(0,a.useState)(!1),[Y,ee]=(0,a.useState)([]),[et,es]=(0,a.useState)("__none__"),[ei,ea]=(0,a.useState)(!1),[er,el]=(0,a.useState)(null),[eo,en]=(0,a.useState)(""),[ed,ec]=(0,a.useState)("auto"),[ep,ex]=(0,a.useState)([]),[em,eu]=(0,a.useState)([]),{copied:eh,copy:ey}=(0,x.C)(),ef=g?{id:g.id,name:g.name||("anthropic-compatible"===g.type?"Anthropic Compatible":"OpenAI Compatible"),color:"anthropic-compatible"===g.type?"#D97757":"#10A37F",textIcon:"anthropic-compatible"===g.type?"AC":"OC",apiType:g.apiType,baseUrl:g.baseUrl,type:g.type}:c.zN[s]||c.fg[s]||c.IS[s]||c.nJ[s]||c.br[s],eg=!!c.zN[s]||!!c.IS[s],eb=!!c.IS[s]?.noAuth,ev=(0,p.KC)(s),ej=(0,c.wG)(s),eN=(0,c.mq)(s),ek=(0,c.gb)(s),ew=eN||ek;c.Q2[s]?.thinkingConfig||c.s9.extended;let eC=ew?s:ej,eS=ew?g?.prefix||s:ej,eA=(0,a.useCallback)(async()=>{try{let e=await fetch("/api/models/alias"),t=await e.json();e.ok&&F(t.aliases||{})}catch(e){console.log("Error fetching aliases:",e)}},[]);(0,a.useEffect)(()=>{"kilocode"===s&&fetch("/api/providers/kilo/free-models").then(e=>e.json()).then(e=>{e.models?.length&&eu(e.models)}).catch(()=>{})},[s]);let e$=(0,a.useCallback)(async()=>{try{let[e,t,i,a]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/provider-nodes",{cache:"no-store"}),fetch("/api/proxy-pools?isActive=true",{cache:"no-store"}),fetch("/api/settings",{cache:"no-store"})]),r=await e.json(),l=await t.json(),o=await i.json(),n=a.ok?await a.json():{};if(e.ok){let e=(r.connections||[]).filter(e=>e.provider===s);m(e)}i.ok&&S(o.proxyPools||[]);let d=(n.providerStrategies||{})[s]||{};el(d.fallbackStrategy||null),en(null!=d.stickyRoundRobinLimit?String(d.stickyRoundRobinLimit):"1");let c=(n.providerThinking||{})[s]||{};if(ec(c.mode||"auto"),t.ok){let e=(l.nodes||[]).find(e=>e.id===s)||null;if(!e&&ew)for(let t=0;t<3;t+=1){await new Promise(e=>setTimeout(e,150));let t=await fetch("/api/provider-nodes",{cache:"no-store"});if(t.ok&&(e=((await t.json()).nodes||[]).find(e=>e.id===s)||null))break}v(e)}}catch(e){console.log("Error fetching connections:",e)}finally{y(!1)}},[s,ew]),eP=async e=>{try{let t=await fetch(`/api/provider-nodes/${s}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),i=await t.json();t.ok&&(v(i.node),await e$(),U(!1))}catch(e){console.log("Error updating provider node:",e)}},eT=async(e,t)=>{try{let i=await fetch("/api/settings",{cache:"no-store"}),a=(i.ok?await i.json():{}).providerStrategies||{},r={};e&&(r.fallbackStrategy=e),"round-robin"===e&&""!==t&&(r.stickyRoundRobinLimit=Number(t)||3);let l={...a};0===Object.keys(r).length?delete l[s]:l[s]=r,await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerStrategies:l})})}catch(e){console.log("Error saving provider strategy:",e)}};(0,a.useEffect)(()=>{e$(),eA()},[e$,eA]),(0,a.useEffect)(()=>{let e=(c.zN[s]||c.fg[s]||c.IS[s]||c.nJ[s])?.modelsFetcher;e&&u(e).then(ex)},[s]);let eO=async(e,t,s=ej)=>{let i=`${s}/${e}`;try{let e=await fetch("/api/models/alias",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:i,alias:t})});if(e.ok)await eA();else{let t=await e.json();alert(t.error||"Failed to set alias")}}catch(e){console.log("Error setting alias:",e)}},eR=async e=>{try{(await fetch(`/api/models/alias?alias=${encodeURIComponent(e)}`,{method:"DELETE"})).ok&&await eA()}catch(e){console.log("Error deleting alias:",e)}},e_=async e=>{if(confirm("Delete this connection?"))try{(await fetch(`/api/providers/${e}`,{method:"DELETE"})).ok&&m(l.filter(t=>t.id!==e))}catch(e){console.log("Error deleting connection:",e)}},eE=()=>{e$(),$(!1)},eI=async e=>{try{(await fetch("/api/providers",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:s,...e})})).ok&&(await e$(),R(!1))}catch(e){console.log("Error saving connection:",e)}},eU=async e=>{try{(await fetch(`/api/providers/${M.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok&&(await e$(),E(!1))}catch(e){console.log("Error updating connection:",e)}},eD=async(e,t)=>{try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:t})})).ok&&m(s=>s.map(s=>s.id===e?{...s,isActive:t}:s))}catch(e){console.log("Error updating connection status:",e)}},eq=async(e,t)=>{let s=[...l];[s[e],s[t]]=[s[t],s[e]],m(s);try{await Promise.all([fetch(`/api/providers/${s[e].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:e})}),fetch(`/api/providers/${s[t].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:t})})])}catch(e){console.log("Error swapping priority:",e),await e$()}},eM=l.filter(e=>Y.includes(e.id));l.length>0&&(Y.length,l.length),(0,a.useEffect)(()=>{ee(e=>e.filter(e=>l.some(t=>t.id===e)))},[l]);let eL=(()=>{if(0===eM.length)return"";let e=new Set(eM.map(e=>e.providerSpecificData?.proxyPoolId||"__none__"));if(1===e.size){let t=[...e][0];if("__none__"===t)return"All selected currently unbound";let s=C.find(e=>e.id===t);return`All selected currently bound to ${s?.name||t}`}return"Selected connections have mixed proxy bindings"})(),eK=()=>{ei||q(!1)},eF=async()=>{if(0===Y.length)return;let e="__none__"===et?null:et;ea(!0);try{let t=[];for(let s of Y)try{let i=await fetch(`/api/providers/${s}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyPoolId:e})});t.push(i.ok)}catch(e){console.log("Error applying bulk proxy pool for",s,e),t.push(!1)}let s=t.filter(e=>!e).length;s>0&&alert(`Updated with ${s} failed request(s).`),await e$(),ee([]),es("__none__"),q(!1)}catch(e){console.log("Error applying bulk proxy pool:",e)}finally{ea(!1)}},eJ=(0,i.jsx)("div",{className:"flex flex-col divide-y divide-black/[0.03] dark:divide-white/[0.03]",children:l.map((e,t)=>(0,i.jsx)("div",{className:"flex items-stretch",children:(0,i.jsx)("div",{className:"flex-1 min-w-0",children:(0,i.jsx)(j,{connection:e,proxyPools:C,isOAuth:eg,isFirst:0===t,isLast:t===l.length-1,onMoveUp:()=>eq(t,t-1),onMoveDown:()=>eq(t,t+1),onToggleActive:t=>eD(e.id,t),onUpdateProxy:async t=>{try{(await fetch(`/api/providers/${e.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyPoolId:t||null})})).ok&&m(s=>s.map(s=>s.id===e.id?{...s,providerSpecificData:{...s.providerSpecificData,proxyPoolId:t||null}}:s))}catch(e){console.log("Error updating proxy:",e)}},onEdit:()=>{L(e),E(!0)},onDelete:()=>e_(e.id)})})},e.id))}),ez=[{value:"__none__",label:"None"},...C.map(e=>({value:e.id,label:e.name}))],eW=0===Y.length?"Select one or more connections, then click Proxy Action.":eL,eH=Y.length>0&&!ei,eV=(0,i.jsx)(d.aF,{isOpen:D,onClose:eK,title:`Proxy Action (${Y.length} selected)`,children:(0,i.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,i.jsx)(d.l6,{label:"Proxy Pool",value:et,onChange:e=>es(e.target.value),options:ez,placeholder:"None"}),(0,i.jsx)("p",{className:"text-xs text-text-muted",children:eW}),(0,i.jsx)("p",{className:"text-xs text-text-muted",children:"Selecting None will unbind selected connections from proxy pool."}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.$n,{onClick:eF,fullWidth:!0,disabled:!eH,children:ei?"Applying...":"Apply"}),(0,i.jsx)(d.$n,{onClick:eK,variant:"ghost",fullWidth:!0,disabled:ei,children:"Cancel"})]})]})}),eG=async e=>{if(!Z){B(e);try{let t=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${eC}/${e}`})}),s=await t.json();H(t=>({...t,[e]:s.ok?"ok":"error"})),G(s.ok?"":s.error||"Model not reachable")}catch{H(t=>({...t,[e]:"error"})),G("Network error")}finally{B(null)}}};return h?(0,i.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,i.jsx)(d.Qv,{}),(0,i.jsx)(d.Qv,{})]}):ef?(0,i.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,i.jsxs)("div",{children:[(0,i.jsxs)(o(),{href:"/dashboard/providers",className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary transition-colors mb-4",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-lg",children:"arrow_back"}),"Back to Providers"]}),(0,i.jsxs)("div",{className:"flex items-center gap-4",children:[(0,i.jsx)("div",{className:"rounded-lg flex items-center justify-center",style:{backgroundColor:`${ef.color}15`},children:J?(0,i.jsx)("span",{className:"text-sm font-bold",style:{color:ef.color},children:ef.textIcon||ef.id.slice(0,2).toUpperCase()}):(0,i.jsx)(n.default,{src:eN&&ef.apiType?"responses"===ef.apiType?"/providers/oai-r.png":"/providers/oai-cc.png":ek?"/providers/anthropic-m.png":`/providers/${ef.id}.png`,alt:ef.name,width:48,height:48,className:"object-contain rounded-lg max-w-[48px] max-h-[48px]",sizes:"48px",onError:()=>z(!0)})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("h1",{className:"text-3xl font-semibold tracking-tight",children:ef.name}),(0,i.jsxs)("p",{className:"text-text-muted",children:[l.length," connection",1===l.length?"":"s"]})]})]})]}),ef.deprecated&&(0,i.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-yellow-500/10 border border-yellow-500/30",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[16px] text-yellow-500 mt-0.5 shrink-0",children:"warning"}),(0,i.jsx)("p",{className:"text-xs text-red-600 dark:text-yellow-400 leading-relaxed",children:ef.deprecationNotice})]}),ef.notice&&!ef.deprecated&&(0,i.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-blue-500/10 border border-blue-500/30",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[16px] text-blue-500 shrink-0",children:"info"}),(0,i.jsx)("p",{className:"text-xs text-blue-600 dark:text-blue-400 leading-relaxed",children:ef.notice.text}),ef.notice.apiKeyUrl&&(0,i.jsx)("a",{href:ef.notice.apiKeyUrl,target:"_blank",rel:"noopener noreferrer",className:"text-xs font-medium text-white bg-blue-500 hover:bg-blue-600 px-2 py-0.5 rounded shrink-0 transition-colors",children:"Get API Key →"})]}),ew&&g&&(0,i.jsxs)(d.Zp,{children:[(0,i.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("h2",{className:"text-lg font-semibold",children:ek?"Anthropic Compatible Details":"OpenAI Compatible Details"}),(0,i.jsxs)("p",{className:"text-sm text-text-muted",children:[ek?"Messages API":"responses"===g.apiType?"Responses API":"Chat Completions"," \xb7 ",(g.baseUrl||"").replace(/\/$/,""),"/",ek?"messages":"responses"===g.apiType?"responses":"chat/completions"]})]}),(0,i.jsxs)("div",{className:"flex items-center gap-2",children:[(0,i.jsx)(d.$n,{size:"sm",icon:"add",onClick:()=>R(!0),disabled:l.length>0,children:"Add"}),(0,i.jsx)(d.$n,{size:"sm",variant:"secondary",icon:"edit",onClick:()=>U(!0),children:"Edit"}),(0,i.jsx)(d.$n,{size:"sm",variant:"secondary",icon:"delete",onClick:async()=>{if(confirm(`Delete this ${ek?"Anthropic":"OpenAI"} Compatible node?`))try{(await fetch(`/api/provider-nodes/${s}`,{method:"DELETE"})).ok&&t.push("/dashboard/providers")}catch(e){console.log("Error deleting provider node:",e)}},children:"Delete"})]})]}),l.length>0&&(0,i.jsx)("p",{className:"text-sm text-text-muted",children:"Only one connection is allowed per compatible node. Add another node if you need more connections."})]}),eb?(0,i.jsx)(d.Zp,{children:(0,i.jsxs)("div",{className:"flex items-center gap-3",children:[(0,i.jsx)("div",{className:"inline-flex items-center justify-center w-10 h-10 rounded-full bg-green-500/10 text-green-500",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"lock_open"})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("p",{className:"text-sm font-medium",children:"No authentication required"}),(0,i.jsx)("p",{className:"text-xs text-text-muted",children:"This provider is ready to use."})]})]})}):(0,i.jsxs)(d.Zp,{children:[(0,i.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,i.jsx)("h2",{className:"text-lg font-semibold",children:"Connections"}),(0,i.jsx)("div",{className:"flex items-center gap-4",children:(0,i.jsxs)("div",{className:"flex items-center gap-2",children:[(0,i.jsx)("span",{className:"text-xs text-text-muted font-medium",children:"Round Robin"}),(0,i.jsx)(d.lM,{checked:"round-robin"===er,onChange:e=>{let t=e?"round-robin":null,s=e?eo||"1":eo;e&&!eo&&en("1"),el(t),eT(t,s)}}),"round-robin"===er&&(0,i.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,i.jsx)("span",{className:"text-xs text-text-muted",children:"Sticky:"}),(0,i.jsx)("input",{type:"number",min:1,value:eo,onChange:e=>{var t;en(t=e.target.value),eT("round-robin",t)},placeholder:"1",className:"w-14 px-2 py-1 text-xs border border-border rounded-md bg-background focus:outline-none focus:border-primary"})]})]})})]}),0===l.length?(0,i.jsxs)("div",{className:"text-center py-12",children:[(0,i.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-[32px]",children:eg?"lock":"key"})}),(0,i.jsx)("p",{className:"text-text-main font-medium mb-1",children:"No connections yet"}),(0,i.jsx)("p",{className:"text-sm text-text-muted mb-4",children:"Add your first connection to get started"}),!ew&&(0,i.jsxs)("div",{className:"flex gap-2 justify-center",children:["iflow"===s&&(0,i.jsx)(d.$n,{icon:"cookie",variant:"secondary",onClick:()=>T(!0),children:"Cookie Auth"}),(0,i.jsx)(d.$n,{icon:"add",onClick:()=>eg?$(!0):R(!0),children:"iflow"===s?"OAuth":"Add Connection"})]})]}):(0,i.jsxs)(i.Fragment,{children:[eJ,!ew&&(0,i.jsxs)("div",{className:"flex gap-2 mt-4",children:["iflow"===s&&(0,i.jsx)(d.$n,{size:"sm",icon:"cookie",variant:"secondary",onClick:()=>T(!0),title:"Add connection using browser cookie",children:"Cookie"}),(0,i.jsx)(d.$n,{size:"sm",icon:"add",onClick:()=>eg?$(!0):R(!0),children:"Add"})]})]})]}),(0,i.jsxs)(d.Zp,{children:[(0,i.jsx)("div",{className:"flex items-center justify-between mb-4",children:(0,i.jsx)("h2",{className:"text-lg font-semibold",children:"Available Models"})}),!!V&&(0,i.jsx)("p",{className:"text-xs text-red-500 mb-3 break-words",children:V}),(()=>{let e,t,a;if(ew)return(0,i.jsx)(b,{providerStorageAlias:eC,providerDisplayAlias:eS,modelAliases:K,copied:eh,onCopy:ey,onSetAlias:eO,onDeleteAlias:eR,connections:l,isAnthropic:ek});let r=[...ev,...em.filter(e=>!ev.some(t=>t.id===e.id))].filter(e=>!e.type||"llm"===e.type),o=Object.entries(K).filter(([e,t])=>{let s=`${eC}/`;if(!t.startsWith(s))return!1;let i=t.slice(s.length);return ef.passthroughModels?!ev.some(e=>e.id===i):!ev.some(e=>e.id===i)&&e===i}).map(([e,t])=>({id:t.slice(`${eC}/`.length),alias:e,fullModel:t}));return(0,i.jsxs)("div",{className:"flex flex-wrap gap-3",children:[r.map(e=>{let t=`${eC}/${e.id}`,a=`${s}/${e.id}`,r=Object.entries(K).find(([,e])=>e===t||e===a)?.[0];return(0,i.jsx)(f,{model:e,fullModel:`${eS}/${e.id}`,alias:r,copied:eh,onCopy:ey,onSetAlias:t=>eO(e.id,t,eC),onDeleteAlias:()=>eR(r),testStatus:W[e.id],onTest:l.length>0||eb?()=>eG(e.id):void 0,isTesting:Z===e.id,isFree:e.isFree},e.id)}),o.map(e=>(0,i.jsx)(f,{model:{id:e.id},fullModel:`${eS}/${e.id}`,alias:e.alias,copied:eh,onCopy:ey,onSetAlias:()=>{},onDeleteAlias:()=>eR(e.alias),testStatus:W[e.id],onTest:l.length>0||eb?()=>eG(e.id):void 0,isTesting:Z===e.id,isCustom:!0,isFree:!1},e.id)),(0,i.jsxs)("button",{onClick:()=>X(!0),className:"flex items-center gap-1.5 px-3 py-2 rounded-lg border border-dashed border-black/15 dark:border-white/15 text-xs text-text-muted hover:text-primary hover:border-primary/40 transition-colors",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:"add"}),"Add Model"]}),ep.length>0&&(e=new Set(Object.values(K)),t=new Set(ev.map(e=>e.id)),0===(a=ep.filter(s=>!e.has(`${eC}/${s.id}`)&&!t.has(s.id))).length?null:(0,i.jsxs)("div",{className:"w-full mt-2",children:[(0,i.jsx)("p",{className:"text-xs text-text-muted mb-2",children:"Suggested free models (≥200k context):"}),(0,i.jsx)("div",{className:"flex flex-wrap gap-2",children:a.map(e=>(0,i.jsxs)("button",{onClick:async()=>{let t=e.id.split("/").pop();await eO(e.id,t,eC)},className:"flex items-center gap-1 px-2.5 py-1.5 rounded-lg border border-black/10 dark:border-white/10 text-xs text-text-muted hover:text-primary hover:border-primary/40 hover:bg-primary/5 transition-colors",title:`${e.name} \xb7 ${(e.contextLength/1e3).toFixed(0)}k ctx`,children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"add"}),e.id.split("/").pop()]},e.id))})]}))]})})()]}),eV,"kiro"===s?(0,i.jsx)(d.Mh,{isOpen:A,providerInfo:ef,onSuccess:eE,onClose:()=>$(!1)}):"cursor"===s?(0,i.jsx)(d.G9,{isOpen:A,onSuccess:eE,onClose:()=>$(!1)}):"gitlab"===s?(0,i.jsx)(d.vj,{isOpen:A,providerInfo:ef,onSuccess:eE,onClose:()=>$(!1)}):(0,i.jsx)(d.LF,{isOpen:A,provider:s,providerInfo:ef,onSuccess:eE,onClose:()=>$(!1)}),"iflow"===s&&(0,i.jsx)(d.vE,{isOpen:P,onSuccess:()=>{e$(),T(!1)},onClose:()=>T(!1)}),(0,i.jsx)(N,{isOpen:O,provider:s,providerName:ef.name,isCompatible:ew,isAnthropic:ek,authType:ef?.authType,authHint:ef?.authHint,website:ef?.website,proxyPools:C,onSave:eI,onClose:()=>R(!1)}),(0,i.jsx)(d.wI,{isOpen:_,connection:M,proxyPools:C,onSave:eU,onClose:()=>E(!1)}),ew&&(0,i.jsx)(k,{isOpen:I,node:g,onSave:eP,onClose:()=>U(!1),isAnthropic:ek}),!ew&&(0,i.jsx)(w,{isOpen:Q,providerAlias:eC,providerDisplayAlias:eS,onSave:async e=>{let t=ef?.passthroughModels?e.split("/").pop():e;await eO(e,t,eC),X(!1)},onClose:()=>X(!1)})]}):(0,i.jsxs)("div",{className:"text-center py-20",children:[(0,i.jsx)("p",{className:"text-text-muted",children:"Provider not found"}),(0,i.jsx)(o(),{href:"/dashboard/providers",className:"text-primary mt-4 inline-block",children:"Back to Providers"})]})}f.propTypes={model:y().shape({id:y().string.isRequired}).isRequired,fullModel:y().string.isRequired,alias:y().string,copied:y().string,onCopy:y().func.isRequired,testStatus:y().oneOf(["ok","error"]),isCustom:y().bool,isFree:y().bool,onDeleteAlias:y().func,onTest:y().func,isTesting:y().bool},y().string.isRequired,y().string.isRequired,y().string,y().func.isRequired,y().func.isRequired,y().func,y().oneOf(["ok","error"]),y().bool,y().string.isRequired,y().object.isRequired,y().string,y().func.isRequired,y().func.isRequired,y().func.isRequired,b.propTypes={providerStorageAlias:y().string.isRequired,providerDisplayAlias:y().string.isRequired,modelAliases:y().object.isRequired,copied:y().string,onCopy:y().func.isRequired,onSetAlias:y().func.isRequired,onDeleteAlias:y().func.isRequired,connections:y().arrayOf(y().shape({id:y().string,isActive:y().bool})).isRequired,isAnthropic:y().bool},v.propTypes={until:y().string.isRequired},j.propTypes={connection:y().shape({id:y().string,name:y().string,email:y().string,displayName:y().string,modelLockUntil:y().string,testStatus:y().string,isActive:y().bool,lastError:y().string,priority:y().number,globalPriority:y().number}).isRequired,proxyPools:y().arrayOf(y().shape({id:y().string,name:y().string,proxyUrl:y().string,noProxy:y().string,isActive:y().bool})),isOAuth:y().bool.isRequired,isFirst:y().bool.isRequired,isLast:y().bool.isRequired,onMoveUp:y().func.isRequired,onMoveDown:y().func.isRequired,onToggleActive:y().func.isRequired,onUpdateProxy:y().func,onEdit:y().func.isRequired,onDelete:y().func.isRequired},N.propTypes={isOpen:y().bool.isRequired,provider:y().string,providerName:y().string,isCompatible:y().bool,isAnthropic:y().bool,authType:y().string,authHint:y().string,website:y().string,proxyPools:y().arrayOf(y().shape({id:y().string,name:y().string})),onSave:y().func.isRequired,onClose:y().func.isRequired},k.propTypes={isOpen:y().bool.isRequired,node:y().shape({id:y().string,name:y().string,prefix:y().string,apiType:y().string,baseUrl:y().string}),onSave:y().func.isRequired,onClose:y().func.isRequired,isAnthropic:y().bool},w.propTypes={isOpen:y().bool.isRequired,providerAlias:y().string.isRequired,providerDisplayAlias:y().string.isRequired,onSave:y().func.isRequired,onClose:y().func.isRequired}}},e=>{e.O(0,[7848,4335,6795,8872,505,4156,2347,5158,7358],()=>e(e.s=7207)),_N_E=e.O()}]);